author | Tero Marttila <terom@paivola.fi> |
Mon, 02 Jun 2014 18:27:08 +0300 | |
changeset 88 | c923295ee520 |
parent 36 | 06e1e554acbb |
permissions | -rw-r--r-- |
17
a7c668003a19
split led7seg.s into .inc modules, and update Makefile to use .s -> .hex, and above .inc's for led7seg
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
1 |
;; vim: filetype=avr |
18 | 2 |
;; |
3 |
;; SPI interface control and use |
|
4 |
;; |
|
17
a7c668003a19
split led7seg.s into .inc modules, and update Makefile to use .s -> .hex, and above .inc's for led7seg
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
5 |
|
33 | 6 |
;; I/O Port |
17
a7c668003a19
split led7seg.s into .inc modules, and update Makefile to use .s -> .hex, and above .inc's for led7seg
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
7 |
.equ SPI_DDR = DDRB |
a7c668003a19
split led7seg.s into .inc modules, and update Makefile to use .s -> .hex, and above .inc's for led7seg
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
8 |
.equ SPI_PORT = PORTB |
a7c668003a19
split led7seg.s into .inc modules, and update Makefile to use .s -> .hex, and above .inc's for led7seg
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
9 |
.equ SPI_SCK = PORTB5 |
a7c668003a19
split led7seg.s into .inc modules, and update Makefile to use .s -> .hex, and above .inc's for led7seg
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
10 |
.equ SPI_MISO = PORTB4 |
a7c668003a19
split led7seg.s into .inc modules, and update Makefile to use .s -> .hex, and above .inc's for led7seg
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
11 |
.equ SPI_MOSI = PORTB3 |
a7c668003a19
split led7seg.s into .inc modules, and update Makefile to use .s -> .hex, and above .inc's for led7seg
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
12 |
.equ SPI_SS = PORTB2 |
a7c668003a19
split led7seg.s into .inc modules, and update Makefile to use .s -> .hex, and above .inc's for led7seg
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
13 |
|
33 | 14 |
;; Internal status flags |
17
a7c668003a19
split led7seg.s into .inc modules, and update Makefile to use .s -> .hex, and above .inc's for led7seg
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
15 |
.equ SPI_FLAGS = GPIOR0 |
a7c668003a19
split led7seg.s into .inc modules, and update Makefile to use .s -> .hex, and above .inc's for led7seg
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
16 |
.equ SPI_BUSY = 0 |
a7c668003a19
split led7seg.s into .inc modules, and update Makefile to use .s -> .hex, and above .inc's for led7seg
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
17 |
|
33 | 18 |
;; Settings |
19 |
.set SPI_DORD = 0 ; word order |
|
20 |
.set SPI_CPOL = 0 ; clock polarity |
|
21 |
.set SPI_CPHA = 0 ; clock phase |
|
22 |
.set SPI_CLOCK = 0b01 ; clock speed |
|
23 |
||
24 |
;; Internal state |
|
26
db2ec641c955
refactor code to move buffers to SPI
Tero Marttila <terom@fixme.fi>
parents:
24
diff
changeset
|
25 |
; Number of in/out bytes |
db2ec641c955
refactor code to move buffers to SPI
Tero Marttila <terom@fixme.fi>
parents:
24
diff
changeset
|
26 |
.set SPI_BUFLEN = 2 |
db2ec641c955
refactor code to move buffers to SPI
Tero Marttila <terom@fixme.fi>
parents:
24
diff
changeset
|
27 |
|
db2ec641c955
refactor code to move buffers to SPI
Tero Marttila <terom@fixme.fi>
parents:
24
diff
changeset
|
28 |
.dseg |
33 | 29 |
; Buffer for incoming frames |
26
db2ec641c955
refactor code to move buffers to SPI
Tero Marttila <terom@fixme.fi>
parents:
24
diff
changeset
|
30 |
spi_inbuf: .byte SPI_BUFLEN |
33 | 31 |
|
32 |
; Buffer for outgoing frames |
|
26
db2ec641c955
refactor code to move buffers to SPI
Tero Marttila <terom@fixme.fi>
parents:
24
diff
changeset
|
33 |
spi_outbuf: .byte SPI_BUFLEN |
db2ec641c955
refactor code to move buffers to SPI
Tero Marttila <terom@fixme.fi>
parents:
24
diff
changeset
|
34 |
|
db2ec641c955
refactor code to move buffers to SPI
Tero Marttila <terom@fixme.fi>
parents:
24
diff
changeset
|
35 |
.cseg |
db2ec641c955
refactor code to move buffers to SPI
Tero Marttila <terom@fixme.fi>
parents:
24
diff
changeset
|
36 |
|
17
a7c668003a19
split led7seg.s into .inc modules, and update Makefile to use .s -> .hex, and above .inc's for led7seg
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
37 |
;; Initialize SPI subsystem for master operation |
a7c668003a19
split led7seg.s into .inc modules, and update Makefile to use .s -> .hex, and above .inc's for led7seg
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
38 |
SPI_Init: |
a7c668003a19
split led7seg.s into .inc modules, and update Makefile to use .s -> .hex, and above .inc's for led7seg
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
39 |
; Set modes |
a7c668003a19
split led7seg.s into .inc modules, and update Makefile to use .s -> .hex, and above .inc's for led7seg
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
40 |
sbi SPI_DDR, SPI_SCK ; Out |
a7c668003a19
split led7seg.s into .inc modules, and update Makefile to use .s -> .hex, and above .inc's for led7seg
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
41 |
sbi SPI_DDR, SPI_MOSI ; Out |
a7c668003a19
split led7seg.s into .inc modules, and update Makefile to use .s -> .hex, and above .inc's for led7seg
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
42 |
sbi SPI_DDR, SPI_SS ; Out |
a7c668003a19
split led7seg.s into .inc modules, and update Makefile to use .s -> .hex, and above .inc's for led7seg
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
43 |
|
a7c668003a19
split led7seg.s into .inc modules, and update Makefile to use .s -> .hex, and above .inc's for led7seg
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
44 |
; Drive SS high (off) |
a7c668003a19
split led7seg.s into .inc modules, and update Makefile to use .s -> .hex, and above .inc's for led7seg
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
45 |
sbi SPI_PORT, SPI_SS |
a7c668003a19
split led7seg.s into .inc modules, and update Makefile to use .s -> .hex, and above .inc's for led7seg
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
46 |
|
a7c668003a19
split led7seg.s into .inc modules, and update Makefile to use .s -> .hex, and above .inc's for led7seg
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
47 |
; Set control mode |
23
a6afc0eb347f
synchronous SPI, two-digit led7
Tero Marttila <terom@fixme.fi>
parents:
18
diff
changeset
|
48 |
; XXX: Enable interrupt |
17
a7c668003a19
split led7seg.s into .inc modules, and update Makefile to use .s -> .hex, and above .inc's for led7seg
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
49 |
; Enable SPI |
a7c668003a19
split led7seg.s into .inc modules, and update Makefile to use .s -> .hex, and above .inc's for led7seg
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
50 |
; MSB first |
a7c668003a19
split led7seg.s into .inc modules, and update Makefile to use .s -> .hex, and above .inc's for led7seg
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
51 |
; Master mode |
a7c668003a19
split led7seg.s into .inc modules, and update Makefile to use .s -> .hex, and above .inc's for led7seg
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
52 |
; Polarity/phase: Mode 0 (sample on rising edge) |
a7c668003a19
split led7seg.s into .inc modules, and update Makefile to use .s -> .hex, and above .inc's for led7seg
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
53 |
; Clock rate 1/16 |
33 | 54 |
ldi r16, (0 << SPIE) | (1 << SPE) | (SPI_DORD << DORD) | (1 << MSTR) | (SPI_CPOL << CPOL) | (SPI_CPHA << CPHA) | (SPI_CLOCK << SPR0) |
17
a7c668003a19
split led7seg.s into .inc modules, and update Makefile to use .s -> .hex, and above .inc's for led7seg
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
55 |
out SPCR, r16 |
a7c668003a19
split led7seg.s into .inc modules, and update Makefile to use .s -> .hex, and above .inc's for led7seg
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
56 |
|
a7c668003a19
split led7seg.s into .inc modules, and update Makefile to use .s -> .hex, and above .inc's for led7seg
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
57 |
; Flags |
a7c668003a19
split led7seg.s into .inc modules, and update Makefile to use .s -> .hex, and above .inc's for led7seg
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
58 |
clr r0 |
a7c668003a19
split led7seg.s into .inc modules, and update Makefile to use .s -> .hex, and above .inc's for led7seg
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
59 |
out SPI_FLAGS, r0 |
30
5226e512755c
Use Timer0 for async SPI updates (semi-useful)
Tero Marttila <terom@fixme.fi>
parents:
26
diff
changeset
|
60 |
|
5226e512755c
Use Timer0 for async SPI updates (semi-useful)
Tero Marttila <terom@fixme.fi>
parents:
26
diff
changeset
|
61 |
; Start update timer |
31 | 62 |
; XXX: also used for ADC |
63 |
; ldi r16, 64 ; every 64k cycles |
|
64 |
; rcall Timer0_Start |
|
17
a7c668003a19
split led7seg.s into .inc modules, and update Makefile to use .s -> .hex, and above .inc's for led7seg
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
65 |
|
a7c668003a19
split led7seg.s into .inc modules, and update Makefile to use .s -> .hex, and above .inc's for led7seg
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
66 |
; Done |
a7c668003a19
split led7seg.s into .inc modules, and update Makefile to use .s -> .hex, and above .inc's for led7seg
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
67 |
ret |
a7c668003a19
split led7seg.s into .inc modules, and update Makefile to use .s -> .hex, and above .inc's for led7seg
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
68 |
|
30
5226e512755c
Use Timer0 for async SPI updates (semi-useful)
Tero Marttila <terom@fixme.fi>
parents:
26
diff
changeset
|
69 |
;; Triggered by Timer0, updates the spi_bufs |
5226e512755c
Use Timer0 for async SPI updates (semi-useful)
Tero Marttila <terom@fixme.fi>
parents:
26
diff
changeset
|
70 |
;; Run from timer interrupt context |
5226e512755c
Use Timer0 for async SPI updates (semi-useful)
Tero Marttila <terom@fixme.fi>
parents:
26
diff
changeset
|
71 |
SPI_Update: |
5226e512755c
Use Timer0 for async SPI updates (semi-useful)
Tero Marttila <terom@fixme.fi>
parents:
26
diff
changeset
|
72 |
; skip if updating |
5226e512755c
Use Timer0 for async SPI updates (semi-useful)
Tero Marttila <terom@fixme.fi>
parents:
26
diff
changeset
|
73 |
sbic SPI_FLAGS, SPI_BUSY |
5226e512755c
Use Timer0 for async SPI updates (semi-useful)
Tero Marttila <terom@fixme.fi>
parents:
26
diff
changeset
|
74 |
ret |
5226e512755c
Use Timer0 for async SPI updates (semi-useful)
Tero Marttila <terom@fixme.fi>
parents:
26
diff
changeset
|
75 |
|
5226e512755c
Use Timer0 for async SPI updates (semi-useful)
Tero Marttila <terom@fixme.fi>
parents:
26
diff
changeset
|
76 |
;; Continue |
5226e512755c
Use Timer0 for async SPI updates (semi-useful)
Tero Marttila <terom@fixme.fi>
parents:
26
diff
changeset
|
77 |
; XXX: blocks too much? |
5226e512755c
Use Timer0 for async SPI updates (semi-useful)
Tero Marttila <terom@fixme.fi>
parents:
26
diff
changeset
|
78 |
|
26
db2ec641c955
refactor code to move buffers to SPI
Tero Marttila <terom@fixme.fi>
parents:
24
diff
changeset
|
79 |
;; Send/Recv from/to SPI buffers |
17
a7c668003a19
split led7seg.s into .inc modules, and update Makefile to use .s -> .hex, and above .inc's for led7seg
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
80 |
SPI_SendRecv: |
a7c668003a19
split led7seg.s into .inc modules, and update Makefile to use .s -> .hex, and above .inc's for led7seg
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
81 |
; Flag |
a7c668003a19
split led7seg.s into .inc modules, and update Makefile to use .s -> .hex, and above .inc's for led7seg
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
82 |
sbi SPI_FLAGS, SPI_BUSY |
a7c668003a19
split led7seg.s into .inc modules, and update Makefile to use .s -> .hex, and above .inc's for led7seg
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
83 |
|
26
db2ec641c955
refactor code to move buffers to SPI
Tero Marttila <terom@fixme.fi>
parents:
24
diff
changeset
|
84 |
; Start of packet |
17
a7c668003a19
split led7seg.s into .inc modules, and update Makefile to use .s -> .hex, and above .inc's for led7seg
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
85 |
cbi SPI_PORT, SPI_SS |
a7c668003a19
split led7seg.s into .inc modules, and update Makefile to use .s -> .hex, and above .inc's for led7seg
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
86 |
|
26
db2ec641c955
refactor code to move buffers to SPI
Tero Marttila <terom@fixme.fi>
parents:
24
diff
changeset
|
87 |
; Init buffers |
db2ec641c955
refactor code to move buffers to SPI
Tero Marttila <terom@fixme.fi>
parents:
24
diff
changeset
|
88 |
ldi r16, SPI_BUFLEN |
db2ec641c955
refactor code to move buffers to SPI
Tero Marttila <terom@fixme.fi>
parents:
24
diff
changeset
|
89 |
|
db2ec641c955
refactor code to move buffers to SPI
Tero Marttila <terom@fixme.fi>
parents:
24
diff
changeset
|
90 |
; send/recv in reverse order |
db2ec641c955
refactor code to move buffers to SPI
Tero Marttila <terom@fixme.fi>
parents:
24
diff
changeset
|
91 |
ldi XL, low(spi_inbuf + SPI_BUFLEN) |
db2ec641c955
refactor code to move buffers to SPI
Tero Marttila <terom@fixme.fi>
parents:
24
diff
changeset
|
92 |
ldi XH, high(spi_inbuf + SPI_BUFLEN) |
db2ec641c955
refactor code to move buffers to SPI
Tero Marttila <terom@fixme.fi>
parents:
24
diff
changeset
|
93 |
ldi YL, low(spi_outbuf + SPI_BUFLEN) |
db2ec641c955
refactor code to move buffers to SPI
Tero Marttila <terom@fixme.fi>
parents:
24
diff
changeset
|
94 |
ldi YH, high(spi_outbuf + SPI_BUFLEN) |
17
a7c668003a19
split led7seg.s into .inc modules, and update Makefile to use .s -> .hex, and above .inc's for led7seg
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
95 |
|
26
db2ec641c955
refactor code to move buffers to SPI
Tero Marttila <terom@fixme.fi>
parents:
24
diff
changeset
|
96 |
; Write |
db2ec641c955
refactor code to move buffers to SPI
Tero Marttila <terom@fixme.fi>
parents:
24
diff
changeset
|
97 |
spi_sr_next: |
db2ec641c955
refactor code to move buffers to SPI
Tero Marttila <terom@fixme.fi>
parents:
24
diff
changeset
|
98 |
; load+send tail byte |
db2ec641c955
refactor code to move buffers to SPI
Tero Marttila <terom@fixme.fi>
parents:
24
diff
changeset
|
99 |
ld r1, -Y |
db2ec641c955
refactor code to move buffers to SPI
Tero Marttila <terom@fixme.fi>
parents:
24
diff
changeset
|
100 |
out SPDR, r1 |
db2ec641c955
refactor code to move buffers to SPI
Tero Marttila <terom@fixme.fi>
parents:
24
diff
changeset
|
101 |
|
db2ec641c955
refactor code to move buffers to SPI
Tero Marttila <terom@fixme.fi>
parents:
24
diff
changeset
|
102 |
; Wait |
db2ec641c955
refactor code to move buffers to SPI
Tero Marttila <terom@fixme.fi>
parents:
24
diff
changeset
|
103 |
spi_sr_wait: |
23
a6afc0eb347f
synchronous SPI, two-digit led7
Tero Marttila <terom@fixme.fi>
parents:
18
diff
changeset
|
104 |
in r1, SPSR |
a6afc0eb347f
synchronous SPI, two-digit led7
Tero Marttila <terom@fixme.fi>
parents:
18
diff
changeset
|
105 |
sbrs r1, SPIF |
a6afc0eb347f
synchronous SPI, two-digit led7
Tero Marttila <terom@fixme.fi>
parents:
18
diff
changeset
|
106 |
rjmp spi_sr_wait |
a6afc0eb347f
synchronous SPI, two-digit led7
Tero Marttila <terom@fixme.fi>
parents:
18
diff
changeset
|
107 |
|
a6afc0eb347f
synchronous SPI, two-digit led7
Tero Marttila <terom@fixme.fi>
parents:
18
diff
changeset
|
108 |
; Read |
36
06e1e554acbb
Rename Matrix_ShiftRight to ShiftLeft, improve matrix.inc documentation
Tero Marttila <terom@fixme.fi>
parents:
33
diff
changeset
|
109 |
; XXX: wrong, should be head byte? |
26
db2ec641c955
refactor code to move buffers to SPI
Tero Marttila <terom@fixme.fi>
parents:
24
diff
changeset
|
110 |
; read+store tail byte |
db2ec641c955
refactor code to move buffers to SPI
Tero Marttila <terom@fixme.fi>
parents:
24
diff
changeset
|
111 |
in r1, SPDR |
db2ec641c955
refactor code to move buffers to SPI
Tero Marttila <terom@fixme.fi>
parents:
24
diff
changeset
|
112 |
st -X, r1 |
23
a6afc0eb347f
synchronous SPI, two-digit led7
Tero Marttila <terom@fixme.fi>
parents:
18
diff
changeset
|
113 |
|
a6afc0eb347f
synchronous SPI, two-digit led7
Tero Marttila <terom@fixme.fi>
parents:
18
diff
changeset
|
114 |
; Done? |
a6afc0eb347f
synchronous SPI, two-digit led7
Tero Marttila <terom@fixme.fi>
parents:
18
diff
changeset
|
115 |
dec r16 |
26
db2ec641c955
refactor code to move buffers to SPI
Tero Marttila <terom@fixme.fi>
parents:
24
diff
changeset
|
116 |
brne spi_sr_next ; if nonzero |
23
a6afc0eb347f
synchronous SPI, two-digit led7
Tero Marttila <terom@fixme.fi>
parents:
18
diff
changeset
|
117 |
|
26
db2ec641c955
refactor code to move buffers to SPI
Tero Marttila <terom@fixme.fi>
parents:
24
diff
changeset
|
118 |
; End of packet |
23
a6afc0eb347f
synchronous SPI, two-digit led7
Tero Marttila <terom@fixme.fi>
parents:
18
diff
changeset
|
119 |
sbi SPI_PORT, SPI_SS |
30
5226e512755c
Use Timer0 for async SPI updates (semi-useful)
Tero Marttila <terom@fixme.fi>
parents:
26
diff
changeset
|
120 |
|
5226e512755c
Use Timer0 for async SPI updates (semi-useful)
Tero Marttila <terom@fixme.fi>
parents:
26
diff
changeset
|
121 |
cbi SPI_FLAGS, SPI_BUSY |
23
a6afc0eb347f
synchronous SPI, two-digit led7
Tero Marttila <terom@fixme.fi>
parents:
18
diff
changeset
|
122 |
|
17
a7c668003a19
split led7seg.s into .inc modules, and update Makefile to use .s -> .hex, and above .inc's for led7seg
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
123 |
; Done |
a7c668003a19
split led7seg.s into .inc modules, and update Makefile to use .s -> .hex, and above .inc's for led7seg
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
124 |
ret |
a7c668003a19
split led7seg.s into .inc modules, and update Makefile to use .s -> .hex, and above .inc's for led7seg
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
125 |
|
33 | 126 |
;; Wait for SPI to be ready for send |
127 |
SPI_Wait: |
|
128 |
; Test |
|
129 |
in r1, SPSR |
|
130 |
sbrs r1, SPIF |
|
131 |
rjmp SPI_Wait |
|
132 |
||
133 |
; Read SPDR to clear SPIF |
|
134 |
in r10, SPDR |
|
135 |
||
136 |
; Done |
|
137 |
ret |
|
138 |
||
17
a7c668003a19
split led7seg.s into .inc modules, and update Makefile to use .s -> .hex, and above .inc's for led7seg
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
139 |
;; Service SPI interrupt |
a7c668003a19
split led7seg.s into .inc modules, and update Makefile to use .s -> .hex, and above .inc's for led7seg
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
140 |
SPI_Interrupt: |
23
a6afc0eb347f
synchronous SPI, two-digit led7
Tero Marttila <terom@fixme.fi>
parents:
18
diff
changeset
|
141 |
; XXX: disabled |
17
a7c668003a19
split led7seg.s into .inc modules, and update Makefile to use .s -> .hex, and above .inc's for led7seg
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
142 |
reti |
a7c668003a19
split led7seg.s into .inc modules, and update Makefile to use .s -> .hex, and above .inc's for led7seg
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
143 |
|
a7c668003a19
split led7seg.s into .inc modules, and update Makefile to use .s -> .hex, and above .inc's for led7seg
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
144 |