eeprom.c 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. #include "board.h"
  2. #include "eeprom.h"
  3. #include <rtthread.h>
  4. #include "wdg_drv.h"
  5. static rt_mutex_t eeprom_mutex = RT_NULL;//静态互斥信号量
  6. static uint32_t EepromRwErrCnt = 0;//eeprom读写失败计数
  7. ////////创建静态互斥信号量eeprom_mutx////////////////
  8. //输入参数:无
  9. //返回参数char :0:成功 -1:失败
  10. //////////////////////////////////////////////
  11. uint8_t init_eeprom_mutx_flag=0;//初始化过程中,不能使用互斥量
  12. uint8_t muxflag=0;
  13. void eeprom_take_mutex(void){
  14. rt_thread_mdelay(EEPROM_DELAY_TICK);
  15. if(init_eeprom_mutx_flag==1){
  16. rt_mutex_take(eeprom_mutex, RT_WAITING_FOREVER);//获取互斥量
  17. muxflag=1;
  18. }
  19. feed_dog();
  20. }
  21. void eeprom_release_mutex(void){
  22. if(init_eeprom_mutx_flag==1){
  23. rt_mutex_release(eeprom_mutex);//释放互斥量
  24. muxflag=0;
  25. }
  26. }
  27. int8_t eeprom_mutx_init(void)
  28. {
  29. eeprom_mutex = rt_mutex_create("eeprom_mutx", RT_IPC_FLAG_FIFO);
  30. // if (result != RT_EOK)
  31. // {
  32. // printf("Failed to initialize mutex\n");
  33. // return -1;
  34. // }
  35. return 0;
  36. }
  37. //////////////////////写eeprom////////////////////////////////////
  38. //输入参数:addr 写入地址
  39. //输入参数: data 写入数据指针
  40. //输入参数:size:写入数据的大小
  41. //无返回
  42. //:注最大写入长度125byte并进行校验(最后一个字节是单字节累加和校验值)
  43. //////////////////////////////////////////////////////////
  44. //size > 125, must increase buf space
  45. void write_eeprom(uint32_t addr, uint8_t *data, uint16_t size) {
  46. eeprom_take_mutex();
  47. uint8_t buf[128];
  48. uint8_t flag=0;
  49. uint8_t ret=0;
  50. uint16_t size1;
  51. uint8_t check;
  52. check=check_sum(data,size-1);
  53. data[size-1]=check;//鏈€鍚庝竴浣嶆槸鏍¢獙
  54. buf[0] = (addr > 0x0000ffff) ? 0x01 : 0x00;
  55. buf[1] = (uint8_t)(addr >> 8);
  56. buf[2] = (uint8_t)addr;
  57. if(addr/EEPROM_PAGE_SIZE != (addr+size-1)/EEPROM_PAGE_SIZE){//鐡掑懎鍤�稉鈧�い浣冨瘱閸?
  58. flag=1;
  59. size1=EEPROM_PAGE_SIZE-(addr%EEPROM_PAGE_SIZE);
  60. }
  61. else size1=size;
  62. memcpy(&buf[3], data, size1);
  63. ret|=EEPROM_WrPacket(buf, size1);
  64. if(flag==1){
  65. addr += size1;
  66. buf[0] = (addr > 0x0000ffff) ? 0x01 : 0x00;
  67. buf[1] = (uint8_t)(addr >> 8);
  68. buf[2] = (uint8_t)addr;
  69. memcpy(&buf[3], data+size1, size-size1);
  70. ret|=EEPROM_WrPacket(buf, size-size1);
  71. }
  72. if(ret) {
  73. EepromRwErrCnt > 100? EepromRwErrCnt=100 : EepromRwErrCnt++;
  74. } else {
  75. //if (EepromRwErrCnt > 0) {
  76. // EepromRwErrCnt--;
  77. EepromRwErrCnt=0;
  78. // }
  79. }
  80. eeprom_release_mutex();
  81. }
  82. //////////////////////读eeprom////////////////////////////////////
  83. //输入参数:addr:要读取的地址
  84. //输入参数: data 读出数据存储缓冲区
  85. //输入参数:size:读取数据的大小
  86. //无返回
  87. //:注最大读取长度125byte,并进行校验(最后一个字节是单字节累加和校验值)
  88. //////////////////////////////////////////////////////////
  89. //size > 125, must increase buf space
  90. uint8_t read_eeprom(uint32_t addr, uint8_t *data, uint16_t size) {
  91. eeprom_take_mutex();
  92. uint8_t buf[128];
  93. uint8_t check;
  94. uint8_t ret;
  95. buf[0] = (addr > 0x0000ffff) ? 0x01 : 0x00;
  96. buf[1] = (uint8_t)(addr >> 8);
  97. buf[2] = (uint8_t)addr;
  98. ret = EEPROM_RdPacket(buf, size);
  99. if (ret) {
  100. memset(data, 0, size);
  101. EepromRwErrCnt > 100? EepromRwErrCnt=100:EepromRwErrCnt++;
  102. eeprom_release_mutex();//释放互斥量
  103. return 1;
  104. } else {
  105. //if (EepromRwErrCnt > 0) {
  106. // EepromRwErrCnt--;
  107. //}
  108. EepromRwErrCnt=0;
  109. }
  110. check = check_sum(&buf[3], size - 1);
  111. if (check != buf[3 + size - 1]) {
  112. memset(data, 0, size);
  113. eeprom_release_mutex();//释放互斥量
  114. return 2;
  115. }
  116. memcpy(data, &buf[3], size);
  117. eeprom_release_mutex();//释放互斥量
  118. return 0;
  119. }
  120. //////////////////////////////////////////////////////
  121. //写入eeprom数据,长度不超过128字节
  122. //参数 addr:写入的地址
  123. //参数 data 要写入的数据
  124. //参数size 写入的字节数 <128
  125. //返回: 1:失败 0:成功
  126. //////////////////////////////////////////////////////////////////
  127. uint8_t write_eeprom_para(uint32_t addr, uint8_t *data, uint16_t size) {
  128. eeprom_take_mutex();//获取互斥量
  129. uint8_t buf[131];
  130. uint8_t ret;
  131. uint8_t flag=0;
  132. uint16_t size1;
  133. buf[0] = (addr > 0x0000ffff) ? 0x01 : 0x00;
  134. buf[1] = (uint8_t)(addr >> 8);
  135. buf[2] = (uint8_t)addr;
  136. ret=0;
  137. if(addr/EEPROM_PAGE_SIZE != (addr+size-1)/EEPROM_PAGE_SIZE){//瓒呭嚭涓€椤佃寖鍥?
  138. flag=1;
  139. size1=EEPROM_PAGE_SIZE-(addr%EEPROM_PAGE_SIZE);
  140. }
  141. else size1=size;
  142. memcpy(&buf[3], data, size1);
  143. if (EEPROM_WrPacket(buf, size1)) {//检查写入是否成功,失败返回1
  144. EepromRwErrCnt > 100? EepromRwErrCnt=100:EepromRwErrCnt++;//失败次数记录,超过限定次数则报故障
  145. ret =1;
  146. } else {
  147. // if (EepromRwErrCnt > 0) {
  148. // EepromRwErrCnt--;
  149. // }
  150. EepromRwErrCnt=0;
  151. }
  152. if(flag==1){//瓒呭嚭涓€椤佃寖鍥寸殑鍐呭�
  153. addr+=size1;
  154. buf[0] = (addr > 0x0000ffff) ? 0x01 : 0x00;
  155. buf[1] = (uint8_t)(addr >> 8);
  156. buf[2] = (uint8_t)addr;
  157. memcpy(&buf[3], data+size1, size-size1);
  158. if (EEPROM_WrPacket(buf, size-size1)) {//检查写入是否成功,失败返回1
  159. EepromRwErrCnt > 100? EepromRwErrCnt=100:EepromRwErrCnt++;//失败次数记录,超过限定次数则报故障
  160. ret =1;
  161. } else {
  162. //if (EepromRwErrCnt > 0) {
  163. // EepromRwErrCnt--;
  164. //}
  165. EepromRwErrCnt=0;
  166. }
  167. }
  168. eeprom_release_mutex();//释放互斥量
  169. return ret;
  170. }
  171. ////////////////////读取数据///////////////////////////////////////////
  172. //读取eeprom数据,长度不超过128字节
  173. //参数 addr:读取的地址
  174. //参数 data 要读出的数据缓冲区
  175. //参数size 读取字节数 <128
  176. //返回: 无返回值
  177. //////////////////////////////////////////////////////////////
  178. uint8_t read_eeprom_para(uint32_t addr, uint8_t *data, uint16_t size) {
  179. eeprom_take_mutex();//获取互斥量
  180. uint8_t buf[131];
  181. uint8_t check;
  182. uint8_t ret;
  183. buf[0] = (addr > 0x0000ffff) ? 0x01 : 0x00;
  184. buf[1] = (uint8_t)(addr >> 8);
  185. buf[2] = (uint8_t)addr;
  186. ret = EEPROM_RdPacket(buf, size);
  187. if (ret) {
  188. memset(data, 0, size);
  189. //EepromRwErrCnt++;
  190. EepromRwErrCnt > 100? EepromRwErrCnt=100:EepromRwErrCnt++;
  191. eeprom_release_mutex();//释放互斥量
  192. return 1;
  193. } else {
  194. // if (EepromRwErrCnt > 0) {
  195. // EepromRwErrCnt--;
  196. //}
  197. EepromRwErrCnt=0;
  198. }
  199. memcpy(data, &buf[3], size);
  200. eeprom_release_mutex();//释放互斥量
  201. return 0;
  202. }
  203. uint32_t get_eeprom_rw_err_cnt(void) {
  204. return EepromRwErrCnt;
  205. }
  206. void set_eeprom_rw_err_cnt(uint32_t err_cnt) {
  207. EepromRwErrCnt = err_cnt;
  208. }