📄 flash.lst
字号:
177 2 {
178 3 return 1;
179 3 }
C51 COMPILER V8.16 FLASH 12/09/2009 15:02:55 PAGE 4
180 2 ++try; // 未擦空,重擦
181 2 }
182 1 return 0;
183 1 }
184 //=========================================
185 // 字节编程
186 // input: addr=地址
187 // dat=数据
188 // output: ---
189 //=========================================
190 void eepProgramByte(unsigned int addr,unsigned char dat)
191 {
192 1 switch(FlashType)
193 1 {
194 2 case SST28SF040A:
195 2 eeprom[addr] = 0x10; // AUTO_PGRM
196 2 eeprom[addr] = dat;
197 2 Check_Toggle_Ready(addr);
198 2 break;
199 2 case SST29SF040:
200 2 eeprom[0x0555] = 0xAA;
201 2 eeprom[0x02AA] = 0x55;
202 2 eeprom[0x0555] = 0xA0;
203 2 eeprom[addr] = dat;
204 2 Check_Toggle_Ready(addr);
205 2 break;
206 2 default:
207 2 break;
208 2 }
209 1 }
210 //=========================================
211 //
212 //=========================================
213 unsigned char eepReadByte(unsigned long addr)
214 {
215 1 pageSel = (unsigned char)(addr>>13);
216 1 return (eeprom[addr&0x1fff]);
217 1 }
218
219 //=========================================
220 //
221 //=========================================
222 void eepWriteRam(unsigned long addr,unsigned char dat)
223 {
224 1 bit _ea_save;
225 1 int block_size;
226 1 _ea_save = EA;
227 1
228 1 EA = 0;
229 1 switch (FlashType)
230 1 {
231 2 case SST28SF040A:
232 2 block_size=256;
233 2 break;
234 2 case SST29SF040:
235 2 block_size=128;
236 2 break;
237 2 default:
238 2 EA = _ea_save;
239 2 return;
240 2 }
241 1 pageSel = (unsigned char)(addr>>13); // 页选
C51 COMPILER V8.16 FLASH 12/09/2009 15:02:55 PAGE 5
242 1
243 1 if (eeprom[addr&0x1fff] != 0xff) // 数据不为空
244 1 {
245 2 int data cnt;
246 2 unsigned char xdata tmpBuffer[256];
247 2 unsigned int mask;
248 2
249 2 if (FlashType == SST28SF040A)mask=0x1f00;
250 2 else mask=0x1f80;
251 2
252 2 for (cnt=0; cnt<block_size; cnt++)
253 2 {
254 3 tmpBuffer[cnt] = eeprom[ addr&mask + cnt]; // 读
255 3 }
256 2
257 2 eepEraseSector(addr); // 擦除扇区
258 2
259 2 // DOG = !DOG;
260 2 dog();
261 2 if (FlashType == SST28SF040A)tmpBuffer[addr&0x00ff] = dat; // 改
262 2 else tmpBuffer[addr&0x007f] = dat;
263 2
264 2 for (cnt=0; cnt<block_size; cnt++)
265 2 {
266 3 eepProgramByte(addr&mask + cnt, tmpBuffer[cnt]); // 写
267 3 }
268 2 }
269 1 else // 直接写入
270 1 {
271 2 eepProgramByte(addr & 0x1fff, dat);
272 2 }
273 1
274 1 EA = _ea_save;
275 1 }
276
277 //=========================================
278 //
279 //=========================================
280 void eepWrite(unsigned long addr,unsigned char dat)
281 {
282 1 bit _ea_save;
283 1 unsigned char mask;
284 1 _ea_save = EA;
285 1 EA = 0;
286 1 pageSel = (unsigned char)(addr>>13); // 页选
287 1
288 1 if (FlashType==SST28SF040A)mask=0xff;
289 1 else mask=0x7f;
290 1 if ((addr&mask)==0)
291 1 {
292 2 eepEraseSector(addr); // 擦除扇区
293 2 }
294 1 dog();
295 1 eepProgramByte(addr & 0x1fff, dat);
296 1 EA = _ea_save;
297 1 }
298
299 int fopen(void)
300 {
301 1 fAddr = 0;
302 1 if (FlashType != NONE_FLASH)
303 1 return 1;
C51 COMPILER V8.16 FLASH 12/09/2009 15:02:55 PAGE 6
304 1 return -1;
305 1 }
306
307 int fread(unsigned char *buff, int len)
308 {
309 1 int rlen;
310 1 int cnt;
311 1
312 1 if (fAddr>0x7ffff)return -1;
313 1
314 1 rlen = 0;
315 1 for (cnt=0; cnt<len; cnt++)
316 1 {
317 2 ++rlen;
318 2 buff[cnt] = eepReadByte(fAddr++);
319 2 if (fAddr>0x7ffff)break;
320 2 }
321 1 return rlen;
322 1 }
323
324 int fwrite(unsigned char *buff, int len)
325 {
326 1 int wlen;
327 1 int cnt;
328 1 if (fAddr>0x7ffff)return -1;
329 1 wlen = 0;
330 1 for (cnt=0; cnt<len; cnt++)
331 1 {
332 2 eepWrite(fAddr, buff[cnt]);
333 2
334 2 ++wlen;
335 2 ++fAddr;
336 2 if (fAddr>0x7ffff)break;
337 2 }
338 1 return wlen;
339 1 }
340 void fclose(void)
341 {
342 1 fAddr=0;
343 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1245 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- 256
PDATA SIZE = ---- ----
DATA SIZE = 5 47
IDATA SIZE = ---- ----
BIT SIZE = ---- 2
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -