SPI Slave über USI bei ATtiny4313

OP #2518562
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!!!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren