author | Tero Marttila <terom@fixme.fi> |
Sat, 08 May 2010 21:19:53 +0300 | |
changeset 26 | db2ec641c955 |
parent 24 | 8100038e3d58 |
child 30 | 5226e512755c |
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 |
|
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
|
6 |
.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
|
7 |
.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
|
8 |
.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
|
9 |
.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
|
10 |
.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
|
11 |
.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
|
12 |
|
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 |
.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
|
14 |
.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
|
15 |
|
26
db2ec641c955
refactor code to move buffers to SPI
Tero Marttila <terom@fixme.fi>
parents:
24
diff
changeset
|
16 |
; Number of in/out bytes |
db2ec641c955
refactor code to move buffers to SPI
Tero Marttila <terom@fixme.fi>
parents:
24
diff
changeset
|
17 |
.set SPI_BUFLEN = 2 |
db2ec641c955
refactor code to move buffers to SPI
Tero Marttila <terom@fixme.fi>
parents:
24
diff
changeset
|
18 |
|
db2ec641c955
refactor code to move buffers to SPI
Tero Marttila <terom@fixme.fi>
parents:
24
diff
changeset
|
19 |
.dseg |
db2ec641c955
refactor code to move buffers to SPI
Tero Marttila <terom@fixme.fi>
parents:
24
diff
changeset
|
20 |
spi_inbuf: .byte SPI_BUFLEN |
db2ec641c955
refactor code to move buffers to SPI
Tero Marttila <terom@fixme.fi>
parents:
24
diff
changeset
|
21 |
spi_outbuf: .byte SPI_BUFLEN |
db2ec641c955
refactor code to move buffers to SPI
Tero Marttila <terom@fixme.fi>
parents:
24
diff
changeset
|
22 |
|
db2ec641c955
refactor code to move buffers to SPI
Tero Marttila <terom@fixme.fi>
parents:
24
diff
changeset
|
23 |
.cseg |
db2ec641c955
refactor code to move buffers to SPI
Tero Marttila <terom@fixme.fi>
parents:
24
diff
changeset
|
24 |
|
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
|
25 |
;; 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
|
26 |
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
|
27 |
; 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
|
28 |
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
|
29 |
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
|
30 |
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
|
31 |
|
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
|
32 |
; 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
|
33 |
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
|
34 |
|
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
|
35 |
; Set control mode |
23
a6afc0eb347f
synchronous SPI, two-digit led7
Tero Marttila <terom@fixme.fi>
parents:
18
diff
changeset
|
36 |
; 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
|
37 |
; 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
|
38 |
; 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
|
39 |
; 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
|
40 |
; 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
|
41 |
; Clock rate 1/16 |
23
a6afc0eb347f
synchronous SPI, two-digit led7
Tero Marttila <terom@fixme.fi>
parents:
18
diff
changeset
|
42 |
ldi r16, (0 << SPIE) | (1 << SPE) | (0 << DORD) | (1 << MSTR) | (0 << CPOL) | (0 << CPHA) | (0b01 << 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
|
43 |
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
|
44 |
|
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 |
; 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
|
46 |
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
|
47 |
out SPI_FLAGS, 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
|
48 |
|
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 |
; 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
|
50 |
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
|
51 |
|
26
db2ec641c955
refactor code to move buffers to SPI
Tero Marttila <terom@fixme.fi>
parents:
24
diff
changeset
|
52 |
;; 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
|
53 |
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
|
54 |
; 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
|
55 |
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
|
56 |
|
26
db2ec641c955
refactor code to move buffers to SPI
Tero Marttila <terom@fixme.fi>
parents:
24
diff
changeset
|
57 |
; 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
|
58 |
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
|
59 |
|
26
db2ec641c955
refactor code to move buffers to SPI
Tero Marttila <terom@fixme.fi>
parents:
24
diff
changeset
|
60 |
; Init buffers |
db2ec641c955
refactor code to move buffers to SPI
Tero Marttila <terom@fixme.fi>
parents:
24
diff
changeset
|
61 |
ldi r16, SPI_BUFLEN |
db2ec641c955
refactor code to move buffers to SPI
Tero Marttila <terom@fixme.fi>
parents:
24
diff
changeset
|
62 |
|
db2ec641c955
refactor code to move buffers to SPI
Tero Marttila <terom@fixme.fi>
parents:
24
diff
changeset
|
63 |
; send/recv in reverse order |
db2ec641c955
refactor code to move buffers to SPI
Tero Marttila <terom@fixme.fi>
parents:
24
diff
changeset
|
64 |
ldi XL, low(spi_inbuf + SPI_BUFLEN) |
db2ec641c955
refactor code to move buffers to SPI
Tero Marttila <terom@fixme.fi>
parents:
24
diff
changeset
|
65 |
ldi XH, high(spi_inbuf + SPI_BUFLEN) |
db2ec641c955
refactor code to move buffers to SPI
Tero Marttila <terom@fixme.fi>
parents:
24
diff
changeset
|
66 |
ldi YL, low(spi_outbuf + SPI_BUFLEN) |
db2ec641c955
refactor code to move buffers to SPI
Tero Marttila <terom@fixme.fi>
parents:
24
diff
changeset
|
67 |
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
|
68 |
|
26
db2ec641c955
refactor code to move buffers to SPI
Tero Marttila <terom@fixme.fi>
parents:
24
diff
changeset
|
69 |
; Write |
db2ec641c955
refactor code to move buffers to SPI
Tero Marttila <terom@fixme.fi>
parents:
24
diff
changeset
|
70 |
spi_sr_next: |
db2ec641c955
refactor code to move buffers to SPI
Tero Marttila <terom@fixme.fi>
parents:
24
diff
changeset
|
71 |
; load+send tail byte |
db2ec641c955
refactor code to move buffers to SPI
Tero Marttila <terom@fixme.fi>
parents:
24
diff
changeset
|
72 |
ld r1, -Y |
db2ec641c955
refactor code to move buffers to SPI
Tero Marttila <terom@fixme.fi>
parents:
24
diff
changeset
|
73 |
out SPDR, r1 |
db2ec641c955
refactor code to move buffers to SPI
Tero Marttila <terom@fixme.fi>
parents:
24
diff
changeset
|
74 |
|
db2ec641c955
refactor code to move buffers to SPI
Tero Marttila <terom@fixme.fi>
parents:
24
diff
changeset
|
75 |
; Wait |
db2ec641c955
refactor code to move buffers to SPI
Tero Marttila <terom@fixme.fi>
parents:
24
diff
changeset
|
76 |
spi_sr_wait: |
23
a6afc0eb347f
synchronous SPI, two-digit led7
Tero Marttila <terom@fixme.fi>
parents:
18
diff
changeset
|
77 |
in r1, SPSR |
a6afc0eb347f
synchronous SPI, two-digit led7
Tero Marttila <terom@fixme.fi>
parents:
18
diff
changeset
|
78 |
sbrs r1, SPIF |
a6afc0eb347f
synchronous SPI, two-digit led7
Tero Marttila <terom@fixme.fi>
parents:
18
diff
changeset
|
79 |
rjmp spi_sr_wait |
a6afc0eb347f
synchronous SPI, two-digit led7
Tero Marttila <terom@fixme.fi>
parents:
18
diff
changeset
|
80 |
|
a6afc0eb347f
synchronous SPI, two-digit led7
Tero Marttila <terom@fixme.fi>
parents:
18
diff
changeset
|
81 |
; Read |
26
db2ec641c955
refactor code to move buffers to SPI
Tero Marttila <terom@fixme.fi>
parents:
24
diff
changeset
|
82 |
; read+store tail byte |
db2ec641c955
refactor code to move buffers to SPI
Tero Marttila <terom@fixme.fi>
parents:
24
diff
changeset
|
83 |
in r1, SPDR |
db2ec641c955
refactor code to move buffers to SPI
Tero Marttila <terom@fixme.fi>
parents:
24
diff
changeset
|
84 |
st -X, r1 |
23
a6afc0eb347f
synchronous SPI, two-digit led7
Tero Marttila <terom@fixme.fi>
parents:
18
diff
changeset
|
85 |
|
a6afc0eb347f
synchronous SPI, two-digit led7
Tero Marttila <terom@fixme.fi>
parents:
18
diff
changeset
|
86 |
; Done? |
a6afc0eb347f
synchronous SPI, two-digit led7
Tero Marttila <terom@fixme.fi>
parents:
18
diff
changeset
|
87 |
dec r16 |
26
db2ec641c955
refactor code to move buffers to SPI
Tero Marttila <terom@fixme.fi>
parents:
24
diff
changeset
|
88 |
brne spi_sr_next ; if nonzero |
23
a6afc0eb347f
synchronous SPI, two-digit led7
Tero Marttila <terom@fixme.fi>
parents:
18
diff
changeset
|
89 |
|
26
db2ec641c955
refactor code to move buffers to SPI
Tero Marttila <terom@fixme.fi>
parents:
24
diff
changeset
|
90 |
; End of packet |
23
a6afc0eb347f
synchronous SPI, two-digit led7
Tero Marttila <terom@fixme.fi>
parents:
18
diff
changeset
|
91 |
sbi SPI_PORT, SPI_SS |
a6afc0eb347f
synchronous SPI, two-digit led7
Tero Marttila <terom@fixme.fi>
parents:
18
diff
changeset
|
92 |
|
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
|
93 |
; 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
|
94 |
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
|
95 |
|
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
|
96 |
;; 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
|
97 |
SPI_Interrupt: |
23
a6afc0eb347f
synchronous SPI, two-digit led7
Tero Marttila <terom@fixme.fi>
parents:
18
diff
changeset
|
98 |
; 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
|
99 |
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
|
100 |
|
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
|
101 |