📄 flash.lst
字号:
C51 COMPILER V7.20 FLASH 07/26/2008 22:22:01 PAGE 1
C51 COMPILER V7.20, COMPILATION OF MODULE FLASH
OBJECT MODULE PLACED IN .\Flash.obj
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE ..\src\Flash.C BROWSE DEFINE(DEVICE_TYPE_ICIDRECORD) DEBUG OBJECTEXTEND PRI
-NT(.\Flash.lst) OBJECT(.\Flash.obj)
line level source
1 #include <reg51.h>
2 #include <intrins.h>
3 #include <absacc.h>
4 #include "..\Include\FLASHDEF.h"
5
6 #ifndef FLASH_ONLY_READ
7 //us 延时函数
8 void Delayus(unsigned char time)
9 {
10 1 unsigned char idata i;
11 1 for(i=0;i<time;i++);
12 1 }
13 //查询是否已经完成写操作
14 //byteaddr:查询的地址
15 void CheckToggleReady(unsigned int byteaddr)
16 {
17 1 unsigned long xdata timeout = 0x07FFFFFF;
18 1 unsigned char PreData, CurData;
19 1 PreData = ReadIO(byteaddr) & 0x40;
20 1 while ( timeout-- )
21 1 {
22 2 CurData = ReadIO(byteaddr) & 0x40;
23 2 if (CurData == PreData)
24 2 break;
25 2 PreData = CurData;
26 2 }
27 1 }
28
29 void Flash_wb(unsigned int ChipAddr, unsigned char byte)
30 {
31 1 WriteFlashIO(ChipAddr, 0x5555, 0xaa);
32 1 WriteFlashIO(ChipAddr, 0x2aaa, 0x55);
33 1 WriteFlashIO(ChipAddr, 0x5555, byte);
34 1 }
35
36 /*************************************************************************************/
37 //检查ID函数
38 // Flash_chipseletaddr:片选地址(0x0000,0x1000,0x2000,0x3000,0x4000.....)
39 unsigned char Flash_check(unsigned int ChipAddr)
40 {
41 1 unsigned char Flash_ID;
42 1 Flash_wb(ChipAddr, 0x90); //ID ENTRY
43 1 _nop_();
44 1 *(&Flash_ID)=ReadFlashIO(ChipAddr, 0);
45 1 if(Flash_ID != SSTID)
46 1 return 0;
47 1 *(&Flash_ID)=ReadFlashIO(ChipAddr, 1);
48 1 Flash_wb(ChipAddr, 0xf0); //ID EXIT
49 1 _nop_();
50 1 return Flash_ID; //返回ID号
51 1 }
52 /****************************************************************************/
53 //初始化函数
54 //输入参数num:FLASH的片数
C51 COMPILER V7.20 FLASH 07/26/2008 22:22:01 PAGE 2
55 //输出参数Flash_page:输出页地址大小
56 unsigned char Flash_Init(unsigned int ChipAddr, unsigned char *PageCount, unsigned char *ChipCount)
57 {
58 1 unsigned char Flash_page=0;
59 1 #if FlashChipCount > 1
60 1 unsigned char i, ChipType, FlashSta=0;
61 1 FlashALE = 0;
62 1 *ChipCount = 0;
63 1 for(i=0;i<FlashChipCount;i++)
64 1 {
65 2 ChipType = Flash_check(ChipAddr); //取FLASH ID号
66 2 FlashSta >>= 1;
67 2 if(ChipType == 0) //为0时标识错误状态位
68 2 FlashSta |= 0x80;
69 2 else //正常时执行
70 2 {
71 3 (*ChipCount)++;
72 3 if(Flash_page == 0)//第一片赋芯片ID
73 3 Flash_page = ChipType;
74 3 else if (Flash_page != ChipType)//不是第一片且芯片ID不一致
75 3 return DifferFlashERR; //存在不同型号芯片
76 3 if(FlashSta != 0)
77 3 return JumpFlashERR; //存在跳空芯片
78 3 }
79 2 ChipAddr += 1<<12; //A12——A14为片选地址位 片选位加1
80 2 }
81 1 #else
FlashALE = 0;
Flash_page = Flash_check(ChipAddr); //取FLASH ID号
if(Flash_page == 0)
return NoFlashERR; //第1片Flash缺或故障
*ChipCount = 1;
#endif
88 1 switch (Flash_page)
89 1 {
90 2 case SST39SF040ID:
91 2 Flash_page = 0x80; //返回128页
92 2 break;
93 2 case SST39SF020ID:
94 2 Flash_page = 0x40; //返回64页
95 2 break;
96 2 case SST39SF010ID:
97 2 Flash_page = 0x20; //返回32页
98 2 break;
99 2 default:
100 2 Flash_page = 0;
101 2 }
102 1 *PageCount = Flash_page;
103 1 #if FlashChipCount > 1
104 1 if(FlashSta & (1>>(FlashChipCount-1)))
105 1 return NoFlashERR; //第1片Flash缺或故障
106 1 else
107 1 #endif
108 1 return FlashOK; //初始化成功返回0
109 1 }
110
111 /*************************************************************************************/
112 //片擦除程序
113 // Flash_chipseletaddr:片选地址(0x0000,0x1000,0x2000,0x3000,0x4000.....)
114 #ifdef FLASH_EN_ALLEraseChip
void Flash_EraseEntirChip(unsigned int ChipAddr)
{
C51 COMPILER V7.20 FLASH 07/26/2008 22:22:01 PAGE 3
Flash_wb(ChipAddr, 0x80); //ERASE
Flash_wb(ChipAddr, 0x10); //CHIPERASE
}
#endif
121 /*************************************************************************************/
122 //扇区擦除程序
123 //page:要擦除的页地址
124 // Flash_chipseletaddr:片选地址(0x0000,0x1000,0x2000,0x3000,0x4000.....)
125
126 void Flash_EraseOneSector(unsigned char page,unsigned int ChipAddr) //ok
127 {
128 1
129 1 Flash_wb(ChipAddr, 0x80); //ERASE
130 1 WriteFlashIO(ChipAddr, 0x5555, 0xaa);
131 1 WriteFlashIO(ChipAddr, 0x2aaa, 0x55);
132 1 // WriteFlashIO(ChipAddr, page, 0x30);//SECTORERASE
133 1 Flash_WAddrH(page);
134 1 XBYTE[(page & 0x0fff) | ChipAddr] = 0x30;
135 1 }
136
137 /************************************************************************/
138 //写函数
139 //*bytedata:写缓冲 page:页地址 addr:便移地址 len:写字节长度
140 // Flash_chipseletaddr:片选地址(0x0000,0x1000,0x2000,0x3000,0x4000....
141 void Flash_ProgramData (unsigned char *bytedata, unsigned char page,unsigned int addr, unsigned int len,u
-nsigned int ChipAddr)
142 {
143 1 unsigned int tempaddr;
144 1 while(len--)
145 1 {
146 2 Flash_wb(ChipAddr, 0xA0); //PROGRAM
147 2 #ifdef FlashChipAtP2Port
148 2 Flash_WAddrH(page);
149 2 tempaddr = (addr & 0x0fff) | ChipAddr;
150 2 #else
Flash_WAddrH(addr>>12);
tempaddr = addr | ChipAddr;
#endif
154 2 WriteIO(tempaddr, *bytedata);
155 2
156 2 Delayus(6);
157 2 CheckToggleReady(tempaddr); //查询是否完成写操作
158 2 if(addr == 0x0FFF) //偏移地址大于4095页地址加1
159 2 {
160 3 addr = 0;
161 3 page++;
162 3 }
163 2 else
164 2 addr++;
165 2 bytedata++;
166 2 }
167 1 }
168 #endif
169
170 /**********************************************************************************/
171 //指定页地址和便移地址读函数
172 //*bytedata:读缓冲 page:页地址 addr:便移地址 len:数据字节长度
173 // Flash_chipseletaddr:片选地址(0x0000,0x1000,0x2000,0x3000,0x4000.....)
174 void Flash_ReadData (unsigned char *bytedata, unsigned char page,unsigned int addr, unsigned int len,unsi
-gned int ChipAddr)
175 {
176 1 Flash_WAddrH(page);
C51 COMPILER V7.20 FLASH 07/26/2008 22:22:01 PAGE 4
177 1 while(len--)
178 1 {
179 2 *bytedata=ReadFlashIO(ChipAddr,addr);
180 2 bytedata++;
181 2 if(addr == 0x0FFF) //偏移地址大于4095页地址加1
182 2 {
183 3 addr = 0;
184 3 Flash_WAddrH(++page);
185 3 }
186 2 else
187 2 addr++;
188 2 }
189 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 599 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- 4
PDATA SIZE = ---- ----
DATA SIZE = ---- 36
IDATA SIZE = ---- 1
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -