Forum: Mikrocontroller und Digitale Elektronik SPI Slave über USI bei ATtiny4313


von Oz z. (ozzy)


Lesenswert?

Moin,

ich möchte einen ATtiny4313 als SPI-Slave über USI mit einem anderen 
ATmega kommunizieren lassen. Die Geschwindigkeit soll dabei mit clk/2 
ablaufen (also dem Maximum). Dabei möchte ich pro Kommunikation 2 Byte 
hintereinander übertragen. Jedoch ist mir aus dem Datenblatt nicht 
wirklich klar, wie das zu erfolgen hat. Meine beiden Bytes stehen dabei 
in R16 und R17.
Also zunächst warte ich auf eine fallende Flanke am SlaveSelect (SS) 
Pin:
1
  ldi  R18, (1<<USIOIF)
2
3
wait_for_SS:
4
  sbic  USI_DDR, USI_SS      ; Skip if SlaveSelect is low
5
  rjmp  wait_for_SS
Sobald das geschehen ist, lade ich das erste Datum in USIDR:
1
  out  USIDR, R16        ; write first byte in Shift-Register
Jetzt müsste ich ja eigentlich warten, bis USIOIF-Flag gesetzt ist:
1
  out  USISR, R18
2
loop:
3
  in  R16, USISR
4
  sbrs  R16, USIOIF
5
  rjmp  loop
doch wie mache ich das mit dem zweiten Byte? Wenn ich jetzt wieder
1
  out  USIDR, R17        ; write second byte in Shift-Register
2
  out  USISR, R18
aufrufe, dann sind das ja schon zwei Takte, abgesehen davon, dass die 
loop-Schleife ja auch nicht direkt nach dem letzen Takt beendet ist.

Habt Ihr da eine Idee/implementation, wie man das besser machen könnte? 
Oder hilft da wirklich nur 2x1 Byte lesen?
Vielen Dank im Voraus!!!
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.