--- a/spi.inc Sat May 08 20:08:33 2010 +0300
+++ b/spi.inc Sat May 08 20:09:08 2010 +0300
@@ -24,13 +24,13 @@
sbi SPI_PORT, SPI_SS
; Set control mode
- ; Enable interrupt
+ ; XXX: Enable interrupt
; Enable SPI
; MSB first
; Master mode
; Polarity/phase: Mode 0 (sample on rising edge)
; Clock rate 1/16
- ldi r16, (1 << SPIE) | (1 << SPE) | (0 << DORD) | (1 << MSTR) | (0 << CPOL) | (0 << CPHA) | (0b01 << SPR0)
+ ldi r16, (0 << SPIE) | (1 << SPE) | (0 << DORD) | (1 << MSTR) | (0 << CPOL) | (0 << CPHA) | (0b01 << SPR0)
out SPCR, r16
; Flags
@@ -40,9 +40,10 @@
; Done
ret
-;; Send byte
+;; Send/recv one byte
;; Input: r16
-;; XXX: should not be busy...
+;; Output: r10
+;; Note: should not be busy...
SPI_SendRecv:
; Flag
sbi SPI_FLAGS, SPI_BUSY
@@ -53,34 +54,59 @@
; Write byte (starts SCK)
out SPDR, r16
- ; Wait for interrupt
+ ; Wait for byte to be sent
+spi_sr_wait:
+ in r1, SPSR
+ sbrs r1, SPIF
+ rjmp spi_sr_wait
+
+ ; Read
+ in r10, SPDR
+
+ ; Drive SS high (end of packet)
+ sbi SPI_PORT, SPI_SS
+
; Done
ret
-;; Wait for byte to be sent
-SPI_Wait:
- sbic SPI_FLAGS, SPI_BUSY ; Test for busy flag
- rjmp SPI_Wait ; loop
-
+;; Send buffer bytes
+;; Input: post-buffer byte in X, buffer length in r16
+;; Output: r10
+;; Note: should not be busy...
+SPI_SendBuf:
+ ; Flag
+ sbi SPI_FLAGS, SPI_BUSY
+
+ ; Enable slave (low)
+ cbi SPI_PORT, SPI_SS
+
+ ; Write byte from X (starts SCK)
+spi_srb_next:
+ ld r1, -X
+ out SPDR, r1
+
+ ; Wait for byte to be sent
+spi_srb_wait:
+ in r1, SPSR
+ sbrs r1, SPIF
+ rjmp spi_srb_wait
+
+ ; Read
+ in r10, SPDR
+
+ ; Done?
+ dec r16
+ brne spi_srb_next
+
+ ; Drive SS high (end of packet)
+ sbi SPI_PORT, SPI_SS
+
; Done
ret
;; Service SPI interrupt
SPI_Interrupt:
- ; Store SREG
- in r16, SREG
-
- ; Drive SS high (off)
- sbi SPI_PORT, SPI_SS
-
- ; Read
- in r10, SPDR
-
- ; Flag
- cbi SPI_FLAGS, SPI_BUSY
-
- ; Done
- out SREG, r16
+ ; XXX: disabled
reti