📄 54rdeeprom.lst
字号:
C51 COMPILER V8.01 54RDEEPROM 12/16/2005 22:10:43 PAGE 1
C51 COMPILER V8.01, COMPILATION OF MODULE 54RDEEPROM
OBJECT MODULE PLACED IN 54rdEeprom.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE 54rdEeprom.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /*=======================================================================================
2 STC89C54RD+ eeprom读写模块,读出部分由于需要从中搜索出有效数据所以采取整个扇区读出,便于
3 调用方从中分析。其他常用的字节、字、字节数组都编写了读写函数,方便各种应用场合。
4 ----------------- 调用方必须作如下说明和定义:
5 uchar xdata data_buffer[512]; // 片内xdata RAM内定义一个扇区缓存
6
7 // 外部函数列表:
8 extern void SectorErase(uint sector_addr); // 扇区擦除
9 extern uchar byte_read(uint byte_addr); // byte读
10 extern void byte_write(uint byte_addr, uchar original_data); // byte写
11 extern uchar byte_write_verify(uint byte_addr, uchar original_data);// byte写并校验
12 extern uchar ArrayWrite(uint begin_addr, uint len, uchar code *array); // byte数组写并校验
13 extern void ArrayRead(uint begin_addr, uchar len); // 读出, 保存在Ttotal[]中
14
15 晓奇工作室 http://www.xiao-qi.com/
16 --- 晓奇 info@xiao-qi.com 12.15.2005
17 ====================================================================================== */
18 #include "src51rd.h"
19 #include <intrins.h>
20
21 #define uchar unsigned char
22 #define uint unsigned int
23
24 /* --------------- 命令定义 --------------- */
25 #define RdCommand 0x01 /* 字节读 */
26 #define PrgCommand 0x02 /* 字节写 */
27 #define EraseCommand 0x03 /* 扇区擦除 */
28
29 /* 定义常量 */
30 #define Error 1
31 #define Ok 0
32
33 /* 定义Flash对应于20MHz晶振系统的操作等待时间 */
34 #define WaitTime 0x01
35
36 /* ------------- 定义扇区大小 ------------- */
37 #define PerSector 512
38
39 /* STC89C54RD+的flash空间从0x4000~0xf3ff 共90个扇区,每扇区512字节 */
40 #define BaseAddr 0x4000
41 #define EndSectoraddr 0xf200
42 #define EndAddr 0xf3ff
43
44 //extern uchar xdata data_buffer[512];
45 extern uchar Ttotal[16];
46
47 /* ================ 打开 ISP,IAP 功能 ================= */
48 void ISP_IAP_enable(void)
49 {
50 1 EA = 0; /* 关中断 */
51 1 ISP_CONTR = ISP_CONTR & 0x18; /* 0001,1000 */
52 1 ISP_CONTR = ISP_CONTR | WaitTime; /* 写入硬件延时 */
53 1 ISP_CONTR = ISP_CONTR | 0x80; /* ISPEN=1 */
54 1 }
55
C51 COMPILER V8.01 54RDEEPROM 12/16/2005 22:10:43 PAGE 2
56 /* =============== 关闭 ISP,IAP 功能 ================== */
57 void ISP_IAP_disable(void)
58 {
59 1 ISP_CONTR = ISP_CONTR & 0x7f; /* ISPEN = 0 */
60 1 ISP_TRIG = 0x00;
61 1 EA = 1; /* 开中断 */
62 1 }
63 /* ================ 公用的触发代码 ==================== */
64 void ISPgoon(void)
65 {
66 1 ISP_IAP_enable(); /* 打开 ISP,IAP 功能 */
67 1 ISP_TRIG = 0x46; /* 触发ISP_IAP命令字节1 */
68 1 ISP_TRIG = 0xb9; /* 触发ISP_IAP命令字节2 */
69 1 _nop_();
70 1 }
71
72 /* ==================== 字节读 ======================== */
73 uchar byte_read(uint byte_addr)
74 {
75 1 ISP_ADDRH = (uchar)(byte_addr >> 8); /* 地址赋值 */
76 1 ISP_ADDRL = (uchar)(byte_addr & 0x00ff);
77 1
78 1 ISP_CMD = ISP_CMD & 0xf8; /* 清除低3位 */
79 1 ISP_CMD = ISP_CMD | RdCommand; /* 写入读命令 */
80 1
81 1 ISPgoon(); /* 触发执行 */
82 1 ISP_IAP_disable(); /* 关闭ISP,IAP功能 */
83 1
84 1 return (ISP_DATA); /* 返回读到的数据 */
85 1 }
86
87 /* ================== 扇区擦除 ======================== */
88 void SectorErase(uint sector_addr)
89 {
90 1 uint iSectorAddr;
91 1 iSectorAddr = (sector_addr & 0xfe00); /* 取扇区地址 */
92 1 ISP_ADDRH = (uchar)(iSectorAddr >> 8);
93 1 ISP_ADDRL = 0x00;
94 1
95 1 ISP_CMD = ISP_CMD & 0xf8; /* 清空低3位 */
96 1 ISP_CMD = ISP_CMD | EraseCommand; /* 擦除命令3 */
97 1
98 1 ISPgoon(); /* 触发执行 */
99 1 ISP_IAP_disable(); /* 关闭ISP,IAP功能 */
100 1
101 1 }
102
103 /* ==================== 字节写 ======================== */
104 void byte_write(uint byte_addr, uchar original_data)
105 {
106 1 ISP_ADDRH = (uchar)(byte_addr >> 8); /* 取地址 */
107 1 ISP_ADDRL = (uchar)(byte_addr & 0x00ff);
108 1
109 1 ISP_CMD = ISP_CMD & 0xf8; /* 清低3位 */
110 1 ISP_CMD = ISP_CMD | PrgCommand; /* 写命令2 */
111 1 ISP_DATA = original_data; /* 写入数据准备 */
112 1
113 1 ISPgoon(); /* 触发执行 */
114 1 ISP_IAP_disable(); /* 关闭IAP功能 */
115 1 }
116
117 /* =================== 字节写并校验 =================== */
C51 COMPILER V8.01 54RDEEPROM 12/16/2005 22:10:43 PAGE 3
118 uchar byte_write_verify(uint byte_addr, uchar original_data)
119 {
120 1 ISP_ADDRH = (uchar)(byte_addr >> 8); /* 取地址 */
121 1 ISP_ADDRL = (uchar)(byte_addr & 0xff);
122 1
123 1 ISP_CMD = ISP_CMD & 0xf8; /* 清低3位 */
124 1 ISP_CMD = ISP_CMD | PrgCommand; /* 写命令2 */
125 1 ISP_DATA = original_data;
126 1
127 1 ISPgoon(); /* 触发执行 */
128 1
129 1 /* 开始读,没有在此重复给地址,地址不会被自动改变 */
130 1 ISP_DATA = 0x00; /* 清数据传递寄存器 */
131 1
132 1 ISP_CMD = ISP_CMD & 0xf8; /* 清低3位 */
133 1 ISP_CMD = ISP_CMD | RdCommand; /* 读命令1 */
134 1
135 1 ISP_TRIG = 0x46; /* 触发ISP_IAP命令字节1 */
136 1 ISP_TRIG = 0xb9; /* 触发ISP_IAP命令字节2 */
137 1 _nop_(); /* 延时 */
138 1
139 1 ISP_IAP_disable(); /* 关闭IAP功能 */
140 1
141 1 if(ISP_DATA == original_data) /* 读写数据校验 */
142 1 return Ok; /* 返回校验结果 */
143 1 else
144 1 return Error;
145 1 }
146
147
148 /* ===================== 数组写入 ===================== */
149 uchar ArrayWrite(uint begin_addr, uint len, uchar *array)
150 {
151 1 uint i;
152 1 uint in_addr;
153 1
154 1 /* 判是否是有效范围,此函数不允许跨扇区操作 */
155 1 if(len > PerSector)
156 1 return Error;
157 1 in_addr = begin_addr & 0x01ff; /* 扇区内偏移量 */
158 1 if((in_addr + len) > PerSector)
159 1 return Error;
160 1
161 1 in_addr = begin_addr;
162 1 /* 逐个写入并校对 */
163 1 ISP_IAP_enable(); /* 打开IAP功能 */
164 1 for(i = 0; i< len; i++)
165 1 {
166 2 /* 写一个字节 */
167 2 ISP_ADDRH = (uchar)(in_addr >> 8);
168 2 ISP_ADDRL = (uchar)(in_addr & 0x00ff);
169 2 ISP_DATA = array[i]; /* 取数据 */
170 2 ISP_CMD = ISP_CMD & 0xf8; /* 清低3位 */
171 2 ISP_CMD = ISP_CMD | PrgCommand; /* 写命令2 */
172 2
173 2 ISP_TRIG = 0x46; /* 触发ISP_IAP命令字节1 */
174 2 ISP_TRIG = 0xb9; /* 触发ISP_IAP命令字节2 */
175 2 _nop_();
176 2
177 2 /* 读回来 */
178 2 ISP_DATA = 0x00;
179 2
C51 COMPILER V8.01 54RDEEPROM 12/16/2005 22:10:43 PAGE 4
180 2 ISP_CMD = ISP_CMD & 0xf8; /* 清低3位 */
181 2 ISP_CMD = ISP_CMD | RdCommand; /* 读命令1 */
182 2
183 2 ISP_TRIG = 0x46; /* 触发ISP_IAP命令字节1 */
184 2 ISP_TRIG = 0xb9; /* 触发ISP_IAP命令字节2 */
185 2 _nop_();
186 2
187 2 /* 比较对错 */
188 2 if(ISP_DATA != array[i])
189 2 {
190 3 ISP_IAP_disable();
191 3 return Error;
192 3 }
193 2 in_addr++; /* 指向下一个字节 */
194 2 }
195 1 ISP_IAP_disable();
196 1 return Ok;
197 1 }
198
199 /* ========================= 扇区读出 ========================= */
200 /* 程序对地址没有作有效性判断,请调用方事先保证他在规定范围内 */
201 void ArrayRead(uint begin_addr, uchar len)
202 {
203 1 // uchar xdata data_buffer[]; /* 整个扇区读取缓存区 */
204 1 uint iSectorAddr;
205 1 uint i;
206 1 iSectorAddr = begin_addr; // & 0xfe00; /* 取扇区地址 */
207 1
208 1 ISP_IAP_enable();
209 1 for(i = 0; i < len; i++)
210 1 {
211 2 ISP_ADDRH = (uchar)(iSectorAddr >> 8);
212 2 ISP_ADDRL = (uchar)(iSectorAddr & 0x00ff);
213 2
214 2 ISP_CMD = ISP_CMD & 0xf8; /* 清低3位 */
215 2 ISP_CMD = ISP_CMD | RdCommand; /* 读命令1 */
216 2 ISP_DATA = 0;
217 2 ISP_TRIG = 0x46; /* 触发ISP_IAP命令字节1 */
218 2 ISP_TRIG = 0xb9; /* 触发ISP_IAP命令字节2 */
219 2 _nop_();
220 2
221 2 Ttotal[i] = ISP_DATA;
222 2 iSectorAddr++;
223 2 }
224 1 ISP_IAP_disable(); /* 关闭IAP功能 */
225 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 354 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 7
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 + -