阿哲
发表于: 2016-9-30 14:49:34 | 显示全部楼层

LPC11E68内部包含一个4KB的片上EEPROM,该存储可以单字节进行擦除和写入。对于需要存储少量数据的应用,可以不必外加存储器,从而减少设计的难度。


原理:

EEPROM可以通过片上的引导程序使用IAP的方式进行读写。


实现

1. 首先定义IAP指令的入口地址。IAP指令位于0x1FFF 1FF0地址。

  1. #define IAP_LOCATION 0x1FFF1FF1
复制代码

然后定义IAP指令的数据结构。IAP指令

  1. unsigned int command_param[5];
  2. unsigned int status_result[5];
复制代码

定义一个函数指针

  1. typedef void (*IAP_ENTRY_T)(unsigned int [],unsigned int[]);
  2. IAP_ENTRY_T iap_entry;
  3. ap_entry =( IAP_ENTRY_T)IAP_ENTRY_LOCATION</p>
复制代码

在调用该IAP时就可以使用下面的方式:

  1. iap_entry (cmd_param, status_result);
复制代码

2.  IAP中共有两个与EEPROM相关的命令,分别是EEPROM Write和EEPROM Read。

2.1 EEPROM Write命令

该命令主要是将数据从RAM地址复制到EEPROM中。共有五个输入参数,分别是:

参数0:命令代码61;

参数1:EEPROM地址

参数2:RAM地址

参数3:要写入的字节数

参数4:系统内核主频(KHz)

实现代码如下:


  1. /* Write data to EEPROM */
  2. uint8_t Chip_EEPROM_Write(uint32_t dstAdd, uint8_t *ptr, uint32_t byteswrt)
  3. {
  4.     uint32_t command[5], result[4];

  5.     command[0] = IAP_EEPROM_WRITE;
  6.     command[1] = dstAdd;
  7.     command[2] = (uint32_t) ptr;
  8.     command[3] = byteswrt;
  9.     command[4] = SystemCoreClock / 1000;
  10.     iap_entry(command, result);

  11.     return result[0];
  12. }
复制代码

2.2 EEPROM Read命令

该命令主要是将数据从EEPROM地址复制到RAM中。共有五个输入参数,分别是:

参数0:命令代码62;

参数1:EEPROM地址

参数2:RAM地址

参数3:要写入的字节数

参数4:系统内核主频(KHz)

实现代码如下:


  1. /* Read data from EEPROM */
  2. uint8_t Chip_EEPROM_Read(uint32_t srcAdd, uint8_t *ptr, uint32_t bytesrd)
  3. {
  4.     uint32_t command[5], result[4];

  5.     command[0] = IAP_EEPROM_READ;
  6.     command[1] = srcAdd;
  7.     command[2] = (uint32_t) ptr;
  8.     command[3] = bytesrd;
  9.     command[4] = SystemCoreClock / 1000;
  10.     iap_entry(command, result);

  11.     return result[0];
  12. }
复制代码

测试

下面的测试程序主要实现的是将固定数据写入到EEPROM的0x00地址,然后再进行读取,查看是否与写入的数据是否一致。

  1. int main()
  2. {
  3.     uint8_t Data[16];
  4.     uint8_t result;
  5.     uint32_t i;
  6.    
  7.     SystemCoreClockUpdate();
  8.    
  9.     result = Chip_EEPROM_Read(0x00, Data, sizeof(Data));
  10.    
  11.     for(i=0;i<5000;i++) ;
  12.    
  13.     Data[0] = 0x01;
  14.     Data[1] = 0x02;
  15.     Data[2] = 0x03;
  16.     Data[3] = 0x04;
  17.     Data[4] = 0x06;
  18.     result = Chip_EEPROM_Write(0x00, Data, sizeof(Data));
  19.    
  20.     for(i=0;i<5000;i++) ;
  21.    
  22.     result = Chip_EEPROM_Read(0x00, Data, sizeof(Data));
  23.    
  24.     result = result;

  25.     while(1) ;
  26.    
  27. }
复制代码

测试结果如下:

test.jpg



跳转到指定楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 53 | 回复: 76



手机版|

GMT+8, 2024-12-4 01:21 , Processed in 0.071874 second(s), 6 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表