📄 flash.lst
字号:
C51 COMPILER V7.20 FLASH 03/21/2007 13:34:34 PAGE 1
C51 COMPILER V7.20, COMPILATION OF MODULE FLASH
OBJECT MODULE PLACED IN FLASH.OBJ
COMPILER INVOKED BY: C:\Program Files\keil\C51\BIN\C51.EXE FLASH.C LARGE BROWSE DEBUG OBJECTEXTEND
line level source
1 /*
2 * Copyright (c) 2004,北京博创兴业科技有限公司
3 * All rights reserved.
4 *
5 * 文件名称:flash.c
6 * 文件标识:flash
7 * 摘 要:flash读写函数的实现
8 *
9 * 当前版本:2.0
10 * 作 者:Kent
11 * 完成日期:2004年5月20日
12 *
13 * 取代版本:1.1
14 * 原作者 :Frank
15 * 完成日期:2003年8月10日
16 */
17
18 #include <stdio.h>
19 #include <stdlib.h>
20 #include <string.h>
21
22
23 #include <REGSND1.H>
24 #include "flash.h"
25 #include "uart.h"
26
27 xdata BYTE rKM29UXDATA _at_ 0x4000;
28
29 extern unsigned char databuff[SectorLength];
30
31 long int Current_Cluster, DataRead = 0, DataRemain = 0;
32 unsigned short FAT_Table[SectorLength];
33
34 unsigned int Check_Flash_Id(void)
35 {
36 1 int i;
37 1 unsigned int id;
38 1
39 1 FC_CMD;
40 1 rKM29UXDATA = 0x90;
41 1
42 1 FC_ADDR;
43 1 rKM29UXDATA = 0;
44 1 FC_DATA;
45 1
46 1 for (i=0; i<5; i++); //wait 100ns
47 1 id = rKM29UXDATA << 8;
48 1
49 1 for (i=0; i<5; i++); //wait 100ns
50 1 id += rKM29UXDATA;
51 1 FC_INACTIVE;
52 1 return id;
53 1 }
54
55 void Flash_Reset() //flash reset
C51 COMPILER V7.20 FLASH 03/21/2007 13:34:34 PAGE 2
56 {
57 1 int i;
58 1 // rPDATC = rPDATC | WP; //write unprotect
59 1 FC_CMD;
60 1 rKM29UXDATA = 0xff; //reset command
61 1 for (i=0; i<3000; i++); //delay
62 1 }
63 /********************************************************/
64 /*功能:擦除FLASH的1Block(对应文件系统为1Cluster) */
65 /* 每一个簇为16KB,因此KM29U128共有1024个簇 */
66 /*输入:unsigned int cluster/block(需要擦除的Block Number)*/
67 /*返回:OK或FAIL */
68 /********************************************************/
69
70 unsigned char Erase_Cluster(unsigned int cluster)
71 {
72 1 unsigned int blockPage = (cluster << 5);
73 1
74 1 FC_CMD;
75 1 rKM29UXDATA = 0x60;
76 1
77 1 FC_ADDR;
78 1 rKM29UXDATA = blockPage & 0xff;
79 1 rKM29UXDATA = (blockPage >> 8) & 0xff;
80 1
81 1 // for(i=0;i<2;i++); //tWC 50ns
82 1
83 1 FC_CMD;
84 1 rKM29UXDATA = 0xd0;
85 1
86 1 // for(i=0;i<3;i++);
87 1
88 1 FC_DATA;
89 1 WAITRB; //wait max 3ms
90 1
91 1 FC_CMD;
92 1 rKM29UXDATA = 0x70;
93 1 FC_DATA;
94 1 if (rKM29UXDATA & 0x1) //erase error
95 1 {
96 2 FC_INACTIVE;
97 2 return FALSE;
98 2 }
99 1 else
100 1 {
101 2 FC_INACTIVE;
102 2 return TRUE;
103 2 }
104 1 }
105
106 /********************************************************/
107
108 int VerifyPage(unsigned int block,unsigned int page,unsigned char *buffer)
109 {
110 1 ReadPage(block, page, databuff);
111 1
112 1 if (strncmp((char *)databuff, (char *)buffer, 528) == 0)
113 1 return 1;
114 1 else
115 1 return 0;
116 1 }
117
C51 COMPILER V7.20 FLASH 03/21/2007 13:34:34 PAGE 3
118 /*****************************************************************/
119 /*功能:读取FLASH的某个Block中的1page数据 */
120 /* 在文件系统中,有如下对应关系:Block=Cluster */
121 /* Page =Sector */
122 /*输入:unsigned int block,page,unsigned char *pPage(存放数据的地址)*/
123 /*****************************************************************/
124
125 void ReadPage(unsigned int block, unsigned int page, unsigned char *pPage)
126 {
127 1 int i = 512;
128 1 unsigned int blockPage = (block << 5) + page;
129 1
130 1 FC_CMD;
131 1 rKM29UXDATA = 0x00;
132 1 FC_ADDR;
133 1 rKM29UXDATA = 0;
134 1 rKM29UXDATA = blockPage & 0xff;
135 1 rKM29UXDATA = (blockPage >> 8) & 0xff;
136 1 // for(i=0;i<3;i++);
137 1 FC_DATA;
138 1 WAITRB; //random access ,wait max. 10us
139 1 // __RdPage528(pPage); //which is written with assemble in flash.s
140 1
141 1 while (i--)
142 1 {
143 2 *pPage++ = rKM29UXDATA;
144 2 }
145 1 FC_INACTIVE;
146 1 }
147
148 /*****************************************************************/
149 /*功能:向FLASH的某个Block中的1page写入数据 */
150 /* 在文件系统中,有如下对应关系:Block=Cluster */
151 /* Page =Sector */
152 /*输入:unsigned int block,page,unsigned char *pPage(存放数据的地址)*/
153 /*输出:0:Fail;1:OK */
154 /*****************************************************************/
155
156 int WritePage(unsigned int block, unsigned int page, unsigned char *pPage)
157 {
158 1 int i = 512;
159 1 unsigned int blockPage = (block << 5) + page;
160 1 // unsigned char *Source; //the begin addr of data to write
161 1 // Source=pPage;
162 1 FC_CMD;
163 1 rKM29UXDATA = 0x80;
164 1 FC_ADDR;
165 1 rKM29UXDATA = 0;
166 1 rKM29UXDATA = blockPage & 0xff;
167 1 rKM29UXDATA = (blockPage >> 8) & 0xff;
168 1 FC_DATA;
169 1
170 1 while (i--)
171 1 {
172 2 rKM29UXDATA = *pPage++;
173 2 } //data input->as the same as _WrPage528()
174 1 // __WrPage528(pPage); //which is written with assemble in flash.s
175 1
176 1 FC_CMD;
177 1 rKM29UXDATA = 0x10;
178 1 // for(i=0;i<10;i++); //twb=100ns. why is it 10? spec is false?
179 1 //No. It's because of LED of PE1.
C51 COMPILER V7.20 FLASH 03/21/2007 13:34:34 PAGE 4
180 1 WAITRB; //wait max 500us;
181 1 rKM29UXDATA = 0x70;
182 1 FC_DATA;
183 1 // for(i=0;i<3;i++); //twhr=60ns
184 1 if ((rKM29UXDATA & 0x1)) //
185 1 {
186 2 FC_INACTIVE;
187 2 return 0;
188 2 }
189 1 else
190 1 {
191 2 FC_INACTIVE;
192 2 #if (WRITEVERIFY == 1)
193 2 return VerifyPage(block, page, pPage);
194 2 #else
return 1;
#endif
197 2 }
198 1 }
199
200
201
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 553 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = 1036 15
PDATA SIZE = ---- ----
DATA SIZE = ---- ----
IDATA SIZE = ---- ----
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 + -