📄 flash.lst
字号:
C51 COMPILER V8.16 FLASH 12/09/2009 15:02:55 PAGE 1
C51 COMPILER V8.16, COMPILATION OF MODULE FLASH
OBJECT MODULE PLACED IN flash.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE flash.c BROWSE
line level source
1 /*****************************************
2 *
3 *
4 *****************************************/
5 #include <reg52.h>
6 #include <string.h>
7 #include <intrins.h>
8 #include <stdio.h>
9 #include <absacc.h>
10 #include "FlashRam.h"
11
12 unsigned char xdata eeprom[0x2000] _at_ 0x0000;
13 unsigned char xdata pageSel _at_ 0x6000;
14
15 unsigned char data FlashType; // Flash型号
16 unsigned long fAddr = 0;
17
18 extern void dog();
19 //=========================================
20 //
21 //=========================================
22 void Check_Toggle_Ready(unsigned int addr)
23 {
24 1 unsigned char data preTmp;
25 1 unsigned char data currTmp;
26 1 preTmp = eeprom[addr] & 0x40;
27 1 while(1)
28 1 {
29 2 currTmp = eeprom[addr] & 0x40;
30 2 if (preTmp == currTmp)
31 2 {
32 3 break;
33 3 }
34 2 preTmp = currTmp;
35 2 }
36 1 }
37
38 //=========================================
39 // 解锁SST28SF040A
40 //=========================================
41 void eepUnlock(void)
42 {
43 1 unsigned char data tmp;
44 1 tmp = eeprom[0x1823];
45 1 tmp = eeprom[0x1820];
46 1 tmp = eeprom[0x1822];
47 1 tmp = eeprom[0x0418];
48 1 tmp = eeprom[0x041B];
49 1 tmp = eeprom[0x0419];
50 1 tmp = eeprom[0x041A];
51 1 }
52
53 //=========================================
54 // 读取器件ID
55 // 成功: 返回1,否则返回0
C51 COMPILER V8.16 FLASH 12/09/2009 15:02:55 PAGE 2
56 //=========================================
57 char eepGetChipId(void)
58 {
59 1 unsigned char data cId[2];
60 1 pageSel = 0x00; // 页址
61 1
62 1 eeprom[0] = 0xff; // reset command
63 1 _nop_();
64 1 eeprom[0] = 0x90; // read id
65 1 _nop_();
66 1 cId[0] = eeprom[0];
67 1 cId[1] = eeprom[1];
68 1 eeprom[0] = 0xff;
69 1 if ((cId[0] == 0xbf) && (cId[1] == 0x04))
70 1 {
71 2 eepUnlock();
72 2 FlashType = cId[1];
73 2 return 1;
74 2 }
75 1
76 1 eeprom[0] = 0xf0; // 取消所有操作
77 1 _nop_();
78 1 _nop_();
79 1 eeprom[0x0555] = 0xAA;
80 1 eeprom[0x02AA] = 0x55;
81 1 eeprom[0x0555] = 0x90; // Software ID Entry Command
82 1 _nop_(); // Wait TIDA
83 1 _nop_();
84 1 cId[0] = eeprom[0x0000]; // Manufacturer’s ID = BFH
85 1 cId[1] = eeprom[0x0001]; // SST29SF040 Device ID = 13H
86 1
87 1 eeprom[0x0555] = 0xAA;
88 1 eeprom[0x02AA] = 0x55;
89 1 eeprom[0x0555] = 0xF0; // Software ID Entry Command
90 1 _nop_(); // Wait TIDA
91 1 if (cId[0] == 0xbf)
92 1 {
93 2 FlashType = cId[1];
94 2 return 1;
95 2 }
96 1 FlashType = NONE_FLASH;
97 1 return 0;
98 1 }
99 //=========================================
100 //
101 //=========================================
102 void eepEraseChip(void)
103 {
104 1 pageSel = 0;
105 1 switch(FlashType)
106 1 {
107 2 case SST28SF040A:
108 2 eeprom[0] = 0x30;
109 2 eeprom[0] = 0x30;
110 2 Check_Toggle_Ready(0);
111 2 break;
112 2 case SST29SF040:
113 2 eeprom[0x0555] = 0xAA;
114 2 eeprom[0x02AA] = 0x55;
115 2 eeprom[0x0555] = 0x80;
116 2 eeprom[0x0555] = 0xAA;
117 2 eeprom[0x02AA] = 0x55;
C51 COMPILER V8.16 FLASH 12/09/2009 15:02:55 PAGE 3
118 2 eeprom[0x0555] = 0x10;
119 2 Check_Toggle_Ready(0);
120 2 break;
121 2 default:
122 2 break;
123 2 }
124 1
125 1 }
126
127 //==================================================
128 // 擦除扇区
129 // input: 扇区起始地址
130 // output: 1=成功
131 //==================================================
132 char eepEraseSector(unsigned int addr)
133 {
134 1 unsigned char data try;
135 1 int data cnt, block_size;
136 1 unsigned data addr_mask;
137 1 try = 0;
138 1 while (try<3)
139 1 {
140 2 switch(FlashType)
141 2 {
142 3 case SST28SF040A:
143 3 addr_mask=0x1f00;
144 3 addr=addr&0x1f00;
145 3 block_size = 256;
146 3
147 3 eeprom[addr] = 0x20;
148 3 eeprom[addr] = 0xD0;
149 3 Check_Toggle_Ready(addr);
150 3 break;
151 3
152 3 case SST29SF040:
153 3 addr_mask=0x1f80;
154 3 addr=addr&0x1f80;
155 3 block_size=128;
156 3
157 3 eeprom[0x0555] = 0xAA;
158 3 eeprom[0x02AA] = 0x55;
159 3 eeprom[0x0555] = 0x80;
160 3 eeprom[0x0555] = 0xAA;
161 3 eeprom[0x02AA] = 0x55;
162 3 eeprom[addr] = 0x20;
163 3 Check_Toggle_Ready(addr);
164 3 break;
165 3 default:
166 3 return 0; // 失败
167 3 }
168 2
169 2 for (cnt=0; cnt<block_size; cnt++)
170 2 {
171 3 if (eeprom[addr&addr_mask + cnt] != 0xff) // 检查扇区是否全部擦空
172 3 {
173 4 break;
174 4 }
175 3 }
176 2 if ( cnt > block_size-1)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -