📄 flash.lst
字号:
C51 COMPILER V7.50 FLASH 03/16/2006 09:11:13 PAGE 1
C51 COMPILER V7.50, 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 <string.h>
25 #include "flash.h"
26 #include "uart.h"
27
28 xdata BYTE rKM29UXDATA _at_ 0x4000;
29
30
31
32 unsigned int Check_Flash_Id(void)
33 {
34 1 int i;
35 1 unsigned int id;
36 1
37 1 FC_CMD;
38 1 rKM29UXDATA = 0x90;
39 1
40 1 FC_ADDR;
41 1 rKM29UXDATA = 0;
42 1 FC_DATA;
43 1
44 1 for (i=0; i<5; i++); //wait 100ns
45 1 id = rKM29UXDATA << 8;
46 1
47 1 for (i=0; i<5; i++); //wait 100ns
48 1 id += rKM29UXDATA;
49 1 FC_INACTIVE;
50 1 return id;
51 1 }
52
53 void Flash_Reset() //flash reset
54 {
55 1 int i;
C51 COMPILER V7.50 FLASH 03/16/2006 09:11:13 PAGE 2
56 1 // rPDATC = rPDATC | WP; //write unprotect
57 1 FC_CMD;
58 1 rKM29UXDATA = 0xff; //reset command
59 1 for (i=0; i<3000; i++); //delay
60 1 }
61 /********************************************************/
62 /*功能:擦除FLASH的1Block(对应文件系统为1Cluster) */
63 /* 每一个簇为16KB,因此KM29U128共有1024个簇 */
64 /*输入:unsigned int cluster/block(需要擦除的Block Number)*/
65 /*返回:OK或FAIL */
66 /********************************************************/
67
68 unsigned char Erase_Cluster(unsigned int cluster)
69 {
70 1 unsigned int blockPage = (cluster << 5);
71 1 int i;
72 1
73 1 FC_CMD;
74 1 rKM29UXDATA = 0x60;
75 1
76 1 FC_ADDR;
77 1 rKM29UXDATA = blockPage & 0xff;
78 1 rKM29UXDATA = (blockPage >> 8) & 0xff;
79 1
80 1 for (i=0; i<2; i++); //tWC 50ns
81 1
82 1 FC_CMD;
83 1 rKM29UXDATA = 0xd0;
84 1
85 1 for (i=0; i<3; i++);
86 1
87 1 FC_DATA;
88 1 WAITRB; //wait max 3ms
89 1
90 1 FC_CMD;
91 1 rKM29UXDATA = 0x70;
92 1 FC_DATA;
93 1 if (rKM29UXDATA & 0x1) //erase error
94 1 {
95 2 FC_INACTIVE;
96 2 return FALSE;
97 2 }
98 1 else
99 1 {
100 2 FC_INACTIVE;
101 2 return TRUE;
102 2 }
103 1 }
104
105 /********************************************************/
106 /*
107 int VerifyPage(unsigned int block,unsigned int page,unsigned char *buffer)
108 {
109 ReadPage(block,page,databuff);
110 if(strncmp((char *)databuff,(char *)buffer,528)==0)
111 return 1;
112 else
113 return 0;
114 }
115 */
116 /*****************************************************************/
117 /*功能:读取FLASH的某个Block中的1page数据 */
C51 COMPILER V7.50 FLASH 03/16/2006 09:11:13 PAGE 3
118 /* 在文件系统中,有如下对应关系:Block=Cluster */
119 /* Page =Sector */
120 /*输入:unsigned int block,page,unsigned char *pPage(存放数据的地址)*/
121 /*****************************************************************/
122
123 void ReadPage(unsigned int block, unsigned int page, unsigned char *pPage)
124 {
125 1 int i;
126 1 unsigned int blockPage = (block << 5) + page;
127 1
128 1 FC_CMD;
129 1 rKM29UXDATA = 0x00;
130 1 FC_ADDR;
131 1 rKM29UXDATA = 0;
132 1 rKM29UXDATA = blockPage & 0xff;
133 1 rKM29UXDATA = (blockPage >> 8) & 0xff;
134 1
135 1 for (i=0; i<3; i++);
136 1 FC_DATA;
137 1 WAITRB; //random access ,wait max. 10us
138 1 // __RdPage528(pPage); //which is written with assemble in flash.s
139 1
140 1 for (i=0; i<SectorLength; i++)
141 1 {
142 2 *pPage++ = rKM29UXDATA;
143 2 }
144 1 FC_INACTIVE;
145 1 }
146
147 /*****************************************************************/
148 /*功能:向FLASH的某个Block中的1page写入数据 */
149 /* 在文件系统中,有如下对应关系:Block=Cluster */
150 /* Page =Sector */
151 /*输入:unsigned int block,page,unsigned char *pPage(存放数据的地址)*/
152 /*输出:0:Fail;1:OK */
153 /*****************************************************************/
154
155 int WritePage(unsigned int block, unsigned int page, unsigned char *pPage)
156 {
157 1 unsigned int blockPage = (block << 5) + page;
158 1 int i;
159 1 unsigned char *Source; //the begin addr of data to write
160 1 Source = pPage;
161 1 FC_CMD;
162 1 rKM29UXDATA = 0x80;
163 1 FC_ADDR;
164 1 rKM29UXDATA = 0;
165 1 rKM29UXDATA = blockPage & 0xff;
166 1 rKM29UXDATA = (blockPage >> 8) & 0xff;
167 1 FC_DATA;
168 1
169 1 for (i=0; i<528; i++)
170 1 {
171 2 rKM29UXDATA = *pPage++;
172 2 } //data input->as the same as _WrPage528()
173 1 // __WrPage528(pPage); //which is written with assemble in flash.s
174 1
175 1 FC_CMD;
176 1 rKM29UXDATA = 0x10;
177 1 for (i=0; i<10; i++); //twb=100ns. why is it 10? spec is false?
178 1 //No. It's because of LED of PE1.
179 1 WAITRB; //wait max 500us;
C51 COMPILER V7.50 FLASH 03/16/2006 09:11:13 PAGE 4
180 1 rKM29UXDATA = 0x70;
181 1 FC_DATA;
182 1 for (i=0; i<3; i++); //twhr=60ns
183 1 if ((rKM29UXDATA & 0x1)) // 注销掉的程序行有问题,会导致堆栈出错!!!戎海峰
184 1 {
185 2 FC_INACTIVE;
186 2 return 0;
187 2 }
188 1 else
189 1 {
190 2 FC_INACTIVE;
191 2
192 2 }
193 1 }
194
195
196
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 523 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- 9
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 + -