| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231 |
- #include "board.h"
- #include "eeprom.h"
- #include <rtthread.h>
- #include "wdg_drv.h"
- static rt_mutex_t eeprom_mutex = RT_NULL;//静态互斥信号量
- static uint32_t EepromRwErrCnt = 0;//eeprom读写失败计数
- ////////创建静态互斥信号量eeprom_mutx////////////////
- //输入参数:无
- //返回参数char :0:成功 -1:失败
- //////////////////////////////////////////////
- uint8_t init_eeprom_mutx_flag=0;//初始化过程中,不能使用互斥量
- uint8_t muxflag=0;
- void eeprom_take_mutex(void){
- rt_thread_mdelay(EEPROM_DELAY_TICK);
- if(init_eeprom_mutx_flag==1){
- rt_mutex_take(eeprom_mutex, RT_WAITING_FOREVER);//获取互斥量
- muxflag=1;
- }
- feed_dog();
- }
- void eeprom_release_mutex(void){
- if(init_eeprom_mutx_flag==1){
- rt_mutex_release(eeprom_mutex);//释放互斥量
- muxflag=0;
- }
- }
- int8_t eeprom_mutx_init(void)
- {
- eeprom_mutex = rt_mutex_create("eeprom_mutx", RT_IPC_FLAG_FIFO);
- // if (result != RT_EOK)
- // {
- // printf("Failed to initialize mutex\n");
- // return -1;
- // }
- return 0;
- }
- //////////////////////写eeprom////////////////////////////////////
- //输入参数:addr 写入地址
- //输入参数: data 写入数据指针
- //输入参数:size:写入数据的大小
- //无返回
- //:注最大写入长度125byte并进行校验(最后一个字节是单字节累加和校验值)
- //////////////////////////////////////////////////////////
- //size > 125, must increase buf space
- void write_eeprom(uint32_t addr, uint8_t *data, uint16_t size) {
- eeprom_take_mutex();
- uint8_t buf[128];
- uint8_t flag=0;
- uint8_t ret=0;
- uint16_t size1;
- uint8_t check;
- check=check_sum(data,size-1);
- data[size-1]=check;//鏈€鍚庝竴浣嶆槸鏍¢獙
- buf[0] = (addr > 0x0000ffff) ? 0x01 : 0x00;
- buf[1] = (uint8_t)(addr >> 8);
- buf[2] = (uint8_t)addr;
- if(addr/EEPROM_PAGE_SIZE != (addr+size-1)/EEPROM_PAGE_SIZE){//鐡掑懎鍤�稉鈧�い浣冨瘱閸?
- flag=1;
- size1=EEPROM_PAGE_SIZE-(addr%EEPROM_PAGE_SIZE);
- }
- else size1=size;
- memcpy(&buf[3], data, size1);
- ret|=EEPROM_WrPacket(buf, size1);
- if(flag==1){
- addr += size1;
- buf[0] = (addr > 0x0000ffff) ? 0x01 : 0x00;
- buf[1] = (uint8_t)(addr >> 8);
- buf[2] = (uint8_t)addr;
- memcpy(&buf[3], data+size1, size-size1);
- ret|=EEPROM_WrPacket(buf, size-size1);
- }
- if(ret) {
- EepromRwErrCnt > 100? EepromRwErrCnt=100 : EepromRwErrCnt++;
- } else {
- //if (EepromRwErrCnt > 0) {
- // EepromRwErrCnt--;
- EepromRwErrCnt=0;
- // }
- }
- eeprom_release_mutex();
- }
- //////////////////////读eeprom////////////////////////////////////
- //输入参数:addr:要读取的地址
- //输入参数: data 读出数据存储缓冲区
- //输入参数:size:读取数据的大小
- //无返回
- //:注最大读取长度125byte,并进行校验(最后一个字节是单字节累加和校验值)
- //////////////////////////////////////////////////////////
- //size > 125, must increase buf space
- uint8_t read_eeprom(uint32_t addr, uint8_t *data, uint16_t size) {
- eeprom_take_mutex();
- uint8_t buf[128];
- uint8_t check;
- uint8_t ret;
- buf[0] = (addr > 0x0000ffff) ? 0x01 : 0x00;
- buf[1] = (uint8_t)(addr >> 8);
- buf[2] = (uint8_t)addr;
- ret = EEPROM_RdPacket(buf, size);
- if (ret) {
- memset(data, 0, size);
- EepromRwErrCnt > 100? EepromRwErrCnt=100:EepromRwErrCnt++;
- eeprom_release_mutex();//释放互斥量
- return 1;
- } else {
- //if (EepromRwErrCnt > 0) {
- // EepromRwErrCnt--;
- //}
- EepromRwErrCnt=0;
- }
- check = check_sum(&buf[3], size - 1);
- if (check != buf[3 + size - 1]) {
- memset(data, 0, size);
- eeprom_release_mutex();//释放互斥量
- return 2;
- }
- memcpy(data, &buf[3], size);
- eeprom_release_mutex();//释放互斥量
- return 0;
- }
- //////////////////////////////////////////////////////
- //写入eeprom数据,长度不超过128字节
- //参数 addr:写入的地址
- //参数 data 要写入的数据
- //参数size 写入的字节数 <128
- //返回: 1:失败 0:成功
- //////////////////////////////////////////////////////////////////
- uint8_t write_eeprom_para(uint32_t addr, uint8_t *data, uint16_t size) {
- eeprom_take_mutex();//获取互斥量
- uint8_t buf[131];
- uint8_t ret;
- uint8_t flag=0;
- uint16_t size1;
- buf[0] = (addr > 0x0000ffff) ? 0x01 : 0x00;
- buf[1] = (uint8_t)(addr >> 8);
- buf[2] = (uint8_t)addr;
- ret=0;
- if(addr/EEPROM_PAGE_SIZE != (addr+size-1)/EEPROM_PAGE_SIZE){//瓒呭嚭涓€椤佃寖鍥?
- flag=1;
- size1=EEPROM_PAGE_SIZE-(addr%EEPROM_PAGE_SIZE);
- }
- else size1=size;
- memcpy(&buf[3], data, size1);
- if (EEPROM_WrPacket(buf, size1)) {//检查写入是否成功,失败返回1
- EepromRwErrCnt > 100? EepromRwErrCnt=100:EepromRwErrCnt++;//失败次数记录,超过限定次数则报故障
- ret =1;
- } else {
- // if (EepromRwErrCnt > 0) {
- // EepromRwErrCnt--;
- // }
- EepromRwErrCnt=0;
- }
- if(flag==1){//瓒呭嚭涓€椤佃寖鍥寸殑鍐呭�
- addr+=size1;
- buf[0] = (addr > 0x0000ffff) ? 0x01 : 0x00;
- buf[1] = (uint8_t)(addr >> 8);
- buf[2] = (uint8_t)addr;
- memcpy(&buf[3], data+size1, size-size1);
- if (EEPROM_WrPacket(buf, size-size1)) {//检查写入是否成功,失败返回1
- EepromRwErrCnt > 100? EepromRwErrCnt=100:EepromRwErrCnt++;//失败次数记录,超过限定次数则报故障
- ret =1;
- } else {
- //if (EepromRwErrCnt > 0) {
- // EepromRwErrCnt--;
- //}
- EepromRwErrCnt=0;
- }
- }
- eeprom_release_mutex();//释放互斥量
- return ret;
- }
- ////////////////////读取数据///////////////////////////////////////////
- //读取eeprom数据,长度不超过128字节
- //参数 addr:读取的地址
- //参数 data 要读出的数据缓冲区
- //参数size 读取字节数 <128
- //返回: 无返回值
- //////////////////////////////////////////////////////////////
- uint8_t read_eeprom_para(uint32_t addr, uint8_t *data, uint16_t size) {
- eeprom_take_mutex();//获取互斥量
- uint8_t buf[131];
- uint8_t check;
- uint8_t ret;
- buf[0] = (addr > 0x0000ffff) ? 0x01 : 0x00;
- buf[1] = (uint8_t)(addr >> 8);
- buf[2] = (uint8_t)addr;
- ret = EEPROM_RdPacket(buf, size);
- if (ret) {
- memset(data, 0, size);
- //EepromRwErrCnt++;
- EepromRwErrCnt > 100? EepromRwErrCnt=100:EepromRwErrCnt++;
- eeprom_release_mutex();//释放互斥量
- return 1;
- } else {
- // if (EepromRwErrCnt > 0) {
- // EepromRwErrCnt--;
- //}
- EepromRwErrCnt=0;
- }
- memcpy(data, &buf[3], size);
- eeprom_release_mutex();//释放互斥量
- return 0;
- }
- uint32_t get_eeprom_rw_err_cnt(void) {
- return EepromRwErrCnt;
- }
- void set_eeprom_rw_err_cnt(uint32_t err_cnt) {
- EepromRwErrCnt = err_cnt;
- }
|