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!!!