22 |
22 |
23 ; Drive SS high (off) |
23 ; Drive SS high (off) |
24 sbi SPI_PORT, SPI_SS |
24 sbi SPI_PORT, SPI_SS |
25 |
25 |
26 ; Set control mode |
26 ; Set control mode |
27 ; Enable interrupt |
27 ; XXX: Enable interrupt |
28 ; Enable SPI |
28 ; Enable SPI |
29 ; MSB first |
29 ; MSB first |
30 ; Master mode |
30 ; Master mode |
31 ; Polarity/phase: Mode 0 (sample on rising edge) |
31 ; Polarity/phase: Mode 0 (sample on rising edge) |
32 ; Clock rate 1/16 |
32 ; Clock rate 1/16 |
33 ldi r16, (1 << SPIE) | (1 << SPE) | (0 << DORD) | (1 << MSTR) | (0 << CPOL) | (0 << CPHA) | (0b01 << SPR0) |
33 ldi r16, (0 << SPIE) | (1 << SPE) | (0 << DORD) | (1 << MSTR) | (0 << CPOL) | (0 << CPHA) | (0b01 << SPR0) |
34 out SPCR, r16 |
34 out SPCR, r16 |
35 |
35 |
36 ; Flags |
36 ; Flags |
37 clr r0 |
37 clr r0 |
38 out SPI_FLAGS, r0 |
38 out SPI_FLAGS, r0 |
39 |
39 |
40 ; Done |
40 ; Done |
41 ret |
41 ret |
42 |
42 |
43 ;; Send byte |
43 ;; Send/recv one byte |
44 ;; Input: r16 |
44 ;; Input: r16 |
45 ;; XXX: should not be busy... |
45 ;; Output: r10 |
|
46 ;; Note: should not be busy... |
46 SPI_SendRecv: |
47 SPI_SendRecv: |
47 ; Flag |
48 ; Flag |
48 sbi SPI_FLAGS, SPI_BUSY |
49 sbi SPI_FLAGS, SPI_BUSY |
49 |
50 |
50 ; Enable slave (low) |
51 ; Enable slave (low) |
51 cbi SPI_PORT, SPI_SS |
52 cbi SPI_PORT, SPI_SS |
52 |
53 |
53 ; Write byte (starts SCK) |
54 ; Write byte (starts SCK) |
54 out SPDR, r16 |
55 out SPDR, r16 |
55 |
56 |
56 ; Wait for interrupt |
57 ; Wait for byte to be sent |
|
58 spi_sr_wait: |
|
59 in r1, SPSR |
|
60 sbrs r1, SPIF |
|
61 rjmp spi_sr_wait |
|
62 |
|
63 ; Read |
|
64 in r10, SPDR |
|
65 |
|
66 ; Drive SS high (end of packet) |
|
67 sbi SPI_PORT, SPI_SS |
|
68 |
57 ; Done |
69 ; Done |
58 ret |
70 ret |
59 |
71 |
60 ;; Wait for byte to be sent |
72 ;; Send buffer bytes |
61 SPI_Wait: |
73 ;; Input: post-buffer byte in X, buffer length in r16 |
62 sbic SPI_FLAGS, SPI_BUSY ; Test for busy flag |
74 ;; Output: r10 |
63 rjmp SPI_Wait ; loop |
75 ;; Note: should not be busy... |
64 |
76 SPI_SendBuf: |
|
77 ; Flag |
|
78 sbi SPI_FLAGS, SPI_BUSY |
|
79 |
|
80 ; Enable slave (low) |
|
81 cbi SPI_PORT, SPI_SS |
|
82 |
|
83 ; Write byte from X (starts SCK) |
|
84 spi_srb_next: |
|
85 ld r1, -X |
|
86 out SPDR, r1 |
|
87 |
|
88 ; Wait for byte to be sent |
|
89 spi_srb_wait: |
|
90 in r1, SPSR |
|
91 sbrs r1, SPIF |
|
92 rjmp spi_srb_wait |
|
93 |
|
94 ; Read |
|
95 in r10, SPDR |
|
96 |
|
97 ; Done? |
|
98 dec r16 |
|
99 brne spi_srb_next |
|
100 |
|
101 ; Drive SS high (end of packet) |
|
102 sbi SPI_PORT, SPI_SS |
|
103 |
65 ; Done |
104 ; Done |
66 ret |
105 ret |
67 |
106 |
68 ;; Service SPI interrupt |
107 ;; Service SPI interrupt |
69 SPI_Interrupt: |
108 SPI_Interrupt: |
70 ; Store SREG |
109 ; XXX: disabled |
71 in r16, SREG |
|
72 |
|
73 ; Drive SS high (off) |
|
74 sbi SPI_PORT, SPI_SS |
|
75 |
|
76 ; Read |
|
77 in r10, SPDR |
|
78 |
|
79 ; Flag |
|
80 cbi SPI_FLAGS, SPI_BUSY |
|
81 |
|
82 ; Done |
|
83 out SREG, r16 |
|
84 reti |
110 reti |
85 |
111 |
86 |
112 |