📄 eeprom.lst
字号:
188 1
189 1 ISP_CMD = ISP_CMD & 0xf8; /* 1111,1000 */
190 1 ISP_CMD = ISP_CMD | READ_AP_and_Data_Memory_Command; /* 0000,0001 */
191 1
192 1 ISP_TRIG = 0x46; /* 触发ISP_IAP命令 */
193 1 ISP_TRIG = 0xb9; /* 触发ISP_IAP命令 */
194 1 _nop_();
195 1
196 1 ISP_IAP_disable();
197 1
198 1 if(ISP_DATA == original_data)
199 1 return OK;
200 1 else
201 1 return ERROR;
202 1 }
203
204 /* 写数据进 数据Flash存储器, 只在同一个扇区内写,不保留原有数据 */
205 /* begin_addr,被写数据Flash开始地址;counter,连续写多少个字节; array[],数据来源 */
206 INT8U sequential_write_flash_in_one_sector(INT16U begin_addr, INT16U counter, INT8U array[])
207 {
208 1 INT16U i = 0;
209 1 INT16U in_sector_begin_addr = 0;
210 1 INT16U sector_addr = 0;
211 1
212 1 /* 判是否是有效范围,此函数不允许跨扇区操作 */
213 1 if(counter > USED_BYTE_QTY_IN_ONE_SECTOR)
214 1 return ERROR;
215 1 in_sector_begin_addr = begin_addr & 0x01ff; /* 0000,0001,1111,1111 */
216 1 if( (in_sector_begin_addr + counter) > USED_BYTE_QTY_IN_ONE_SECTOR )
217 1 return ERROR;
218 1
219 1 /* 擦除 要修改/写入 的扇区 */
220 1 sector_addr = (begin_addr & 0xfe00); /* 1111,1110,0000,0000; 取扇区地址 */
221 1 ISP_ADDRH = (INT8U)(sector_addr >> 8);
222 1 ISP_ADDRL = 0x00;
223 1 ISP_CMD = ISP_CMD & 0xf8; /* 1111,1000 */
224 1 ISP_CMD = ISP_CMD | SECTOR_ERASE_AP_and_Data_Memory_Command; /* 0000,0011 */
225 1
226 1 ISP_IAP_enable();
227 1 ISP_TRIG = 0x46; /* 触发ISP_IAP命令 */
228 1 ISP_TRIG = 0xb9; /* 触发ISP_IAP命令 */
229 1 _nop_();
230 1
231 1 for(i = 0; i< counter; i++)
232 1 {
233 2 /* 写一个字节 */
234 2 ISP_ADDRH = (INT8U)(begin_addr >> 8);
235 2 ISP_ADDRL = (INT8U)(begin_addr & 0x00ff);
236 2 ISP_DATA = array[i];
237 2 ISP_CMD = ISP_CMD & 0xf8; /* 1111,1000 */
238 2 ISP_CMD = ISP_CMD | PROGRAM_AP_and_Data_Memory_Command; /* 0000,0010 */
239 2
240 2 ISP_TRIG = 0x46; /* 触发ISP_IAP命令 */
C51 COMPILER V7.06 EEPROM 04/10/2006 16:28:24 PAGE 5
241 2 ISP_TRIG = 0xb9; /* 触发ISP_IAP命令 */
242 2 _nop_();
243 2
244 2 /* 读回来 */
245 2 ISP_DATA = 0x00;
246 2
247 2 ISP_CMD = ISP_CMD & 0xf8; /* 1111,1000 */
248 2 ISP_CMD = ISP_CMD | READ_AP_and_Data_Memory_Command; /* 0000,0001 */
249 2
250 2 ISP_TRIG = 0x46; /* 触发ISP_IAP命令 */
251 2 ISP_TRIG = 0xb9; /* 触发ISP_IAP命令 */
252 2 _nop_();
253 2
254 2 /* 比较对错 */
255 2 if(ISP_DATA != array[i])
256 2 {
257 3 ISP_IAP_disable();
258 3 return ERROR;
259 3 }
260 2 begin_addr++;
261 2 }
262 1 ISP_IAP_disable();
263 1 return OK;
264 1 }
265
266 /* 写数据进数据Flash存储器(EEPROM), 只在同一个扇区内写,保留同一扇区中不需修改的数据 */
267 /* begin_addr,被写数据Flash开始地址;counter,连续写多少个字节; array[],数据来源 */
268 INT8U write_flash_with_protect_in_one_sector(INT16U begin_addr, INT16U counter, INT8U array[])
269 {
270 1 INT16U i = 0;
271 1 INT16U in_sector_begin_addr = 0;
272 1 INT16U sector_addr = 0;
273 1 INT16U byte_addr = 0;
274 1
275 1 /* 判是否是有效范围,此函数不允许跨扇区操作 */
276 1 if(counter > USED_BYTE_QTY_IN_ONE_SECTOR)
277 1 return ERROR;
278 1 in_sector_begin_addr = begin_addr & 0x01ff; /* 0000,0001,1111,1111 */
279 1 /* 假定从扇区的第0个字节开始,到USED_BYTE_QTY_IN_ONE_SECTOR-1个字节结束,后面部分不用,程序易编写 */
280 1 if( (in_sector_begin_addr + counter) > USED_BYTE_QTY_IN_ONE_SECTOR )
281 1 return ERROR;
282 1
283 1 /* 将该扇区数据 0 - (USED_BYTE_QTY_IN_ONE_SECTOR-1) 字节数据读入缓冲区保护 */
284 1 sector_addr = (begin_addr & 0xfe00); /* 1111,1110,0000,0000; 取扇区地址 */
285 1 byte_addr = sector_addr; /* 扇区地址为扇区首字节地址 */
286 1
287 1 ISP_IAP_enable();
288 1 for(i = 0; i < USED_BYTE_QTY_IN_ONE_SECTOR; i++)
289 1 {
290 2 ISP_ADDRH = (INT8U)(byte_addr >> 8);
291 2 ISP_ADDRL = (INT8U)(byte_addr & 0x00ff);
292 2
293 2 ISP_CMD = ISP_CMD & 0xf8; /* 1111,1000 */
294 2 ISP_CMD = ISP_CMD | READ_AP_and_Data_Memory_Command; /* 0000,0001 */
295 2
296 2 ISP_TRIG = 0x46;
297 2 ISP_TRIG = 0xb9;
298 2 _nop_();
299 2
300 2 protect_buffer[i] = ISP_DATA;
301 2 byte_addr++;
302 2 }
C51 COMPILER V7.06 EEPROM 04/10/2006 16:28:24 PAGE 6
303 1
304 1 /* 将要写入的数据写入保护缓冲区的相应区域,其余部分保留 */
305 1 for(i = 0; i < counter; i++)
306 1 {
307 2 protect_buffer[in_sector_begin_addr] = array[i];
308 2 in_sector_begin_addr++;
309 2 }
310 1
311 1 /* 擦除 要修改/写入 的扇区 */
312 1 ISP_ADDRH = (INT8U)(sector_addr >> 8);
313 1 ISP_ADDRL = 0x00;
314 1 ISP_CMD = ISP_CMD & 0xf8; /* 1111,1000 */
315 1 ISP_CMD = ISP_CMD | SECTOR_ERASE_AP_and_Data_Memory_Command; /* 0000,0011 */
316 1
317 1 ISP_TRIG = 0x46; /* 触发ISP_IAP命令 */
318 1 ISP_TRIG = 0xb9; /* 触发ISP_IAP命令 */
319 1 _nop_();
320 1
321 1 /* 将保护缓冲区的数据写入 Data Flash, EEPROM */
322 1 byte_addr = sector_addr; /* 扇区地址为扇区首字节地址 */
323 1 for(i = 0; i< USED_BYTE_QTY_IN_ONE_SECTOR; i++)
324 1 {
325 2 /* 写一个字节 */
326 2 ISP_ADDRH = (INT8U)(byte_addr >> 8);
327 2 ISP_ADDRL = (INT8U)(byte_addr & 0x00ff);
328 2 ISP_DATA = protect_buffer[i];
329 2 ISP_CMD = ISP_CMD & 0xf8; /* 1111,1000 */
330 2 ISP_CMD = ISP_CMD | PROGRAM_AP_and_Data_Memory_Command; /* 0000,0010 */
331 2
332 2 ISP_TRIG = 0x46; /* 触发ISP_IAP命令 */
333 2 ISP_TRIG = 0xb9; /* 触发ISP_IAP命令 */
334 2 _nop_();
335 2
336 2 /* 读回来 */
337 2 ISP_DATA = 0x00;
338 2
339 2 ISP_CMD = ISP_CMD & 0xf8; /* 1111,1000 */
340 2 ISP_CMD = ISP_CMD | READ_AP_and_Data_Memory_Command; /* 0000,0001 */
341 2
342 2 ISP_TRIG = 0x46; /* 触发ISP_IAP命令 */
343 2 ISP_TRIG = 0xb9; /* 触发ISP_IAP命令 */
344 2 _nop_();
345 2
346 2 /* 比较对错 */
347 2 if(ISP_DATA != protect_buffer[i])
348 2 {
349 3 ISP_IAP_disable();
350 3 return ERROR;
351 3 }
352 2 byte_addr++;
353 2 }
354 1 ISP_IAP_disable();
355 1 return OK;
356 1 }
357
358 /* 测试常量数组 */
359 INT8U code Test_array_total[512] =
360 {
361 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
362 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
363 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
364 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
C51 COMPILER V7.06 EEPROM 04/10/2006 16:28:24 PAGE 7
365 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
366 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
367 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
368 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
369 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
370 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
371 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
372 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
373 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
374 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
375 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
376 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f,
377 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
378 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
379 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
380 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
381 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
382 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
383 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
384 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -