spi.inc
changeset 23 a6afc0eb347f
parent 18 79b25e81721f
child 24 8100038e3d58
--- 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