Forum: Mikrocontroller und Digitale Elektronik SPI am attiny2313 initialisieren


von georg (Gast)


Lesenswert?

Hallo zusammen.

Ich möchte SPI vom ATTiny2313 initialisieren und verwenden.
Der ATTiny 2313 soll dabei als Master und der MFRC531 als Slaver 
arbeiten.

Im Datenblatt hab ich gefunden dass das über USI geht. Darin steht, dass 
man als ersters einen Takt generiern muss.

Kleiner Auszug aus dem Datenblatt:
1
The clock is generated by the Master
2
device software by toggling the USCK pin via the PORT Register or by writing a one to
3
the USITC bit in USICR.

Klingt ja recht einfach, dürfte aber noch nicht alles gewesen sein.

Weiters hab ich ein schönes Beispiel im Datenblatt gefunden, wie man den 
ATTiny als Master initialisiert.
1
SPITransfer:
2
out USIDR,r16
3
ldi r16,(1<<USIOIF)
4
out USISR,r16
5
ldi r16,(1<<USIWM0)|(1<<USICS1)|(1<<USICLK)|(1<<USITC)
6
SPITransfer_loop:
7
out USICR,r16
8
sbis USISR,USIOIF
9
rjmp SPITransfer_loop
10
in r16,USIDR
11
ret

Ich prog aber in c und hab folgendes draus gemacht:
1
void init_master()
2
{
3
  DDRB =   (0<<5);      // Setzt DI auf Eingang
4
  DDRB =   (1<<6)|(1<<7);    //Setzt DO und SCK auf Ausgang
5
  PORTD = (1<<7);     //Setzt SCL auf HIGH
6
7
  USICR =             // Aktiviert USI
8
    (1<<USIWM0) |
9
    (0<<USIWM1) |
10
    (1<<USICS0) |
11
    (0<<USICS1) |
12
    (1<<USICLK) |
13
    (1<<USITC);        
14
}

Nur leider bekomme ich am SCL nur HIGH und keinen Takt.


Kann mir bitte jemand sagen, was noch zu ergänzen ist, am SCL einen Takt 
zu bekommen?

lg georg

von Andreas K. (a-k)


Lesenswert?

Ich denke doch dass im Datasheet auch C Sample Code dristeht. Und allein 
durch die Initialisierung kommt da sowieso kein Takt raus.

von georg (Gast)


Lesenswert?

ich bin zwar kein englisch guru aber folgender text sagt mir: wenn du 
USITC = 1 setzt dann generierst du einen takt.

The clock is generated by the Master
device software by toggling the USCK pin via the PORT Register or by 
writing a one to
the USITC bit in USICR.

das macht mich ein wenig stutzig. was muss dann machen, dass ich am SCL 
einen Takt habe.

Ich bin davon ausgegangen, wenn ich USI initialisiere, dann nutze ich 
die alternativen Funktionen der Ports(DI DO SCL) und generiere einen 
Takt.

Wo liegt da der Denkfehler.

lg georg

von Falk B. (falk)


Lesenswert?

@georg (Gast)

>The clock is generated by the Master
>device software by toggling the USCK pin via the PORT Register or by
>writing a one to
>the USITC bit in USICR.

>das macht mich ein wenig stutzig. was muss dann machen, dass ich am SCL
>einen Takt habe.

Acht mal USITC bit in USICR setzen. Das Ganze ist ein halber Soft-SPI.

MFG
Falk

von Andreas K. (a-k)


Lesenswert?

Als Master ist der Unterschied zwischen USI und Software-SPI eher 
gering. Jedes Bit wird einzeln angeschoben.

von georg (Gast)


Lesenswert?

danke für die antworten.

hab mal ein wenig gegoogled und habs jetzt wie folgt gelöst.
1
unsigned char master_trans(unsigned char byte)
2
{
3
 
4
  USIDR=byte;
5
  USISR=(1<<USIOIF);
6
  do
7
    {
8
    USICR=  (1<<USIWM0)|
9
        (1<<USICS1)|
10
        (1<<USICLK)|
11
        (1<<USITC);
12
    }
13
  while (!(USISR&(1<<USIOIF)));
14
  return USIDR;
15
}

Sendet wunderbar ein Byte über DO. Leider hat es nicht lange gedauert, 
bis ich jetzt das nächste Mal eure Hilfe brauche. Habe dazu einen neuen 
Thread gemacht, passt hier nicht ganz dazu.

Beitrag "MFRC531 als Slave über USI an ATTiny2313"

lg georg

lg georg

von Dimon11/09 (Gast)


Lesenswert?

Hallo Miteinander,

Bin gerade an einem änlichem Problem dran. Möcht mit folgendem Code eine 
TWO-WIRE-SPI Datenübertragung realesieren. Die Hardware dafür (Slave) 
ist noch nicht verschaltet. Der Master (µC) steckt in STK505.
1
...
2
#define CLEAR_A(x) PORTA = PORTA&(~(1<<x))
3
#define SET_A(x) PORTA = PORTA|(1<<x)
4
5
void spi_init(void)
6
{
7
    DDRA = (1<<DDA6) | (1<<DDA4)); /* Ausgänge: Pin PA6 SDA, PA4 SCL */
8
  DDRA  &= (1<<DDA6);      /* Pin PA6 als Ausgang */
9
  PORTA |= (1<<PA6);      /* internen Pull-Up an PA6 aktivieren */
10
11
  
12
// Timer 0 parametrieren:  CTC-Mode normal, keine Verbindung zur Pins, NUR! 8-Bit 
13
  TCCR0A = (1<<WGM01);  
14
15
  TCCR0B = (1<<CS01)|(1<<CS00);     // Prescaler = 64
16
17
  // Timer STOP  ->  TCCR0B &= ~((1<<CS01)|(1<<CS00));
18
19
  OCR0A = 2;      // T = OCR0A * F_CPU/64
20
21
22
 /* Counter0 Comp.Match aktiviert, Two-Wire Mode aktiviert, Toggle Clock Port Pin aktiviert */
23
    USICR = (1<<USICS0) | (1<<USIWM1) | (1<<USITC) ;
24
    
25
}
26
27
28
void spi_send(uint8_t data)
29
{
30
  USIDR = data;  
31
        while (!(USISR & (1<<USIPF))) {  }
32
 
33
}

Frage ergeben diese zwei Funktionen einen Sinn, wenn ich den Takt für 
die Übertragung per Timer0 realesiere und spi_send() gegenwärtige Form 
hat?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.