comparison src/external_flash.asm @ 0:11d4fc797f74

init
author heinrichsweikamp
date Wed, 24 Apr 2013 19:22:45 +0200
parents
children 13cda523891f
comparison
equal deleted inserted replaced
-1:000000000000 0:11d4fc797f74
1 ;=============================================================================
2 ;
3 ; File external_flash.asm
4 ;
5 ; External flash
6 ;
7 ; Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved.
8 ;=============================================================================
9 ; HISTORY
10 ; 2011-08-12 : [mH] creation
11
12 #include "ostc3.inc"
13 #include "wait.inc"
14
15 basic CODE
16 ;=============================================================================
17
18 global incf_ext_flash_address_p1
19 incf_ext_flash_address_p1: ; Increase by one
20 movlw .1
21
22 global incf_ext_flash_address0
23 incf_ext_flash_address0:
24 addwf ext_flash_address+0,F ; increase address
25 movlw d'0'
26 addwfc ext_flash_address+1,F
27 addwfc ext_flash_address+2,F
28
29 movlw 0x40
30 cpfseq ext_flash_address+2 ; at address 40FFFF?
31 return ; No, return
32 clrf ext_flash_address+0 ; Yes, rollover to 0x000000
33 clrf ext_flash_address+1
34 clrf ext_flash_address+2
35 return
36
37 global incf_ext_flash_address0_p1_0x20
38 incf_ext_flash_address0_p1_0x20: ; Increase by one
39 movlw .1
40
41 global incf_ext_flash_address0_0x20
42 incf_ext_flash_address0_0x20: ; with roll-over at 0x200000 to 0x000000
43 addwf ext_flash_address+0,F ; increase address
44 movlw d'0'
45 addwfc ext_flash_address+1,F
46 addwfc ext_flash_address+2,F
47
48 movlw 0x20
49 cpfseq ext_flash_address+2 ; at address 0x200000?
50 return ; No, return
51 clrf ext_flash_address+0 ; Yes, rollover to 0x000000
52 clrf ext_flash_address+1
53 clrf ext_flash_address+2
54 return
55
56 global decf_ext_flash_address0
57 decf_ext_flash_address0:
58 subwf ext_flash_address+0,F ; decrease address: do a 16-8bits substract.
59 movlw d'0'
60 subwfb ext_flash_address+1,F
61 movlw d'0'
62 subwfb ext_flash_address+2,F
63
64 btfss ext_flash_address+2,7 ; Rollover to 0xFFFFFF?
65 return ; No, return
66 clrf ext_flash_address+2 ; Set to 0x00FFFFF
67 setf ext_flash_address+1
68 setf ext_flash_address+0
69 return
70
71 global ext_flash_power_down
72 ext_flash_power_down:
73 movlw 0x04 ; Write disable
74 rcall write_spi
75 bsf flash_ncs ; CS=1
76 return
77
78 global ext_flash_byte_read_plus ; Return data read in WREG and SSP2BUF and
79 ext_flash_byte_read_plus: ; increase address after read
80 rcall ext_flash_byte_read
81 movwf temp1 ; store received data
82 bra incf_ext_flash_address_p1 ; +1 and return
83
84 global ext_flash_byte_read_plus_0x20; Return data read in WREG and SSP2BUF and
85 ext_flash_byte_read_plus_0x20: ; increase address after read with banking at 0x200000
86 rcall ext_flash_byte_read
87 movwf temp1 ; store received data
88 bra incf_ext_flash_address0_p1_0x20 ;+1 and return
89
90
91 global ext_flash_byte_read ; Return data read in WREG
92 ext_flash_byte_read:
93 movlw 0x03 ; Read command
94 rcall write_spi
95 rcall ext_flash_write_address ; Write 24bit address ext_flash_address:3 via SPI
96 rcall write_spi ; Dummy write to read data into WREG
97 bsf flash_ncs ; CS=1
98 movwf temp1
99 return ; Return data read in WREG and temp1
100
101 ext_flash_write_address: ; Write 24bit address ext_flash_address:3 via SPI
102 movf ext_flash_address+2,W ; 24Bit Address
103 rcall write_spi
104 movf ext_flash_address+1,W
105 rcall write_spi
106 movf ext_flash_address+0,W
107 bra write_spi ; And return....
108
109 global ext_flash_read_block_start ; Return data read in WREG
110 ext_flash_read_block_start:
111 movlw 0x03 ; Read command
112 rcall write_spi
113 rcall ext_flash_write_address ; Write 24bit address ext_flash_address:3 via SPI
114 rcall write_spi ; Dummy write to read data into WREG
115 return ; Return data read in WREG
116
117 global ext_flash_read_block ; Return data read in WREG
118 ext_flash_read_block:
119 rcall incf_ext_flash_address_p1 ; Increase address +1
120 bra write_spi1 ; Dummy write to read data into WREG and return
121
122 global ext_flash_read_block_stop ; Return data read in WREG
123 ext_flash_read_block_stop:
124 bsf flash_ncs ; CS=1
125 return ; NO data in WREG
126
127 global write_byte_ext_flash_plus_header
128 write_byte_ext_flash_plus_header: ; Write from WREG and increase address after write
129 movwf temp1 ; store data
130 ; test if write is done at first byte of 4kB block
131 ; if yes -> delete 4kB block first
132 tstfsz ext_flash_address+0 ; at 0x00?
133 bra write_byte_ext_flash_plus_h1 ; No, normal Write
134
135 movf ext_flash_address+1,W
136 andlw 0x0F ; Mask lower nibble
137 tstfsz WREG ; at 0x.0?
138 bra write_byte_ext_flash_plus_h1; No, normal Write
139
140 ; At beginning of 4kB block -> rease first!
141 rcall ext_flash_erase4kB ; Erases 4kB sector @ext_flash_address:3
142 write_byte_ext_flash_plus_h1:
143 movf temp1,W
144 rcall ext_flash_byte_write ; Write the byte
145 bra incf_ext_flash_address_p1 ; +1 and return
146
147 global write_byte_ext_flash_plus ; Write from WREG and increase address after write with banking at 0x200000
148 write_byte_ext_flash_plus:
149 movwf temp1 ; store data
150
151 ; First, increase dive length counter
152 incf ext_flash_dive_counter+0,F
153 movlw .0
154 addwfc ext_flash_dive_counter+1,F
155 addwfc ext_flash_dive_counter+2,F ; 24bit++
156
157 ; Now test if write is done at first byte of 4kB block
158 ; if yes -> delete 4kB block first
159 tstfsz ext_flash_address+0 ; at 0x00?
160 bra write_byte_ext_flash_plus1 ; No, normal Write
161
162 movf ext_flash_address+1,W
163 andlw 0x0F ; Mask lower nibble
164 tstfsz WREG ; at 0x.0?
165 bra write_byte_ext_flash_plus1 ; No, normal Write
166
167 ; At beginning of 4kB block -> erase first!
168 rcall ext_flash_erase4kB ; Erases 4kB sector @ext_flash_address:3
169 write_byte_ext_flash_plus1:
170 movf temp1,W
171 rcall ext_flash_byte_write ; Write the byte
172 bra incf_ext_flash_address0_p1_0x20 ; +1 and roll over at 0x200000 to 0x000000 and return
173
174 global ext_flash_byte_write ; Write from WREG
175 ext_flash_byte_write:
176 movwf temp1 ; store data byte
177 bsf flash_ncs ; CS=1
178 movlw 0x06 ; WREN command
179 rcall write_spi
180 bsf flash_ncs ; CS=1
181 movlw 0x02 ; Write command
182 rcall write_spi
183 rcall ext_flash_write_address ; Write 24bit address ext_flash_address:3 via SPI
184 movf temp1,W ; load data byte
185 rcall write_spi ; write one byte of data!
186 bsf flash_ncs ; CS=1
187 return
188
189 global ext_flash_disable_protection ; Disable write protection
190 ext_flash_disable_protection:
191 bsf flash_ncs ; CS=1
192 movlw 0x50 ; EWSR command
193 rcall write_spi
194 bsf flash_ncs ; CS=1
195
196 movlw 0x01 ; WRSR command
197 rcall write_spi
198 movlw b'00000000' ; New status
199 rcall write_spi
200 bsf flash_ncs ; CS=1
201 return
202
203 global ext_flash_enable_protection
204 ext_flash_enable_protection:
205 bsf flash_ncs ; CS=1
206 movlw 0x50 ; EWSR command
207 rcall write_spi
208 bsf flash_ncs ; CS=1
209
210 movlw 0x01 ; WRSR command
211 rcall write_spi
212 movlw b'00011100' ; New status (Write protect on)
213 rcall write_spi
214 bsf flash_ncs ; CS=1
215 return
216
217
218 global ext_flash_erase4kB ; Erases 4kB sector
219 ext_flash_erase4kB:
220 bsf flash_ncs ; CS=1
221 movlw 0x06 ; WREN command
222 rcall write_spi
223 bsf flash_ncs ; CS=1
224 movlw 0x20 ; Sector erase command
225 rcall write_spi
226 rcall ext_flash_write_address ; Write 24bit address ext_flash_address:3 via SPI
227 bsf flash_ncs ; CS=1
228 ; bra ext_flash_wait_write ; Wait for write... and return
229 ext_flash_wait_write:
230 WAITMS d'1' ; TBE=25ms...
231 movlw 0x05 ; RDSR command
232 rcall write_spi ; Read status
233 rcall write_spi ; Read status into WREG
234 bsf flash_ncs ; CS=1
235 btfsc SSP2BUF,0 ; Write operation in process?
236 bra ext_flash_wait_write ; Yes, wait more..
237 return
238
239 global ext_flash_erase_logbook ; erases logbook memory (000000h -> 2FFFFFh -> 3MByte)
240 ext_flash_erase_logbook:
241 bsf flash_ncs ; CS=1
242 clrf ext_flash_address+0
243 clrf ext_flash_address+1
244 clrf ext_flash_address+2
245
246 movlw d'48'
247 movwf temp1 ; 48*64kB=917504 Bytes
248 ext_flash_erase_logbook_loop:
249 movlw 0x06 ; WREN command
250 rcall write_spi
251 bsf flash_ncs ; CS=1
252 movlw 0xD8 ; 64kB erase command
253 rcall write_spi
254 rcall ext_flash_write_address ; Write 24bit address ext_flash_address:3 via SPI
255 bsf flash_ncs ; CS=1
256 rcall ext_flash_wait_write ; Wait for write...
257
258 incf ext_flash_address+2,F ; 64kB ahead
259 decfsz temp1,F
260 bra ext_flash_erase_logbook_loop
261 return
262
263
264 write_spi: ; With data in WREG...
265 bcf flash_ncs ; CS
266 global write_spi1
267 write_spi1: ; With data in WREG...
268 bcf SSP2STAT,WCOL ; Clear flag
269 movwf SSP2BUF ; Write to buffer
270 btfsc SSP2STAT,WCOL ; Was buffer full?
271 bra write_spi1 ; Yes, try again
272
273 write_spi2: ; Wait for write command
274 btfss SSP2STAT, BF ; Buffer full?
275 bra write_spi2 ; No, wait.
276 movf SSP2BUF,W
277 return ; Returns RX data in WREG and SSP2BUF
278
279 END