#include "board.h" #include "eeprom.h" #include #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; }