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