At24xx.c 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250
  1. /*********************************************************************************************************
  2. * Module : At24xx.c
  3. * Abstract :
  4. * Version : 1.0.0
  5. * Author : Leopul(COPYRIGHT 2025 - 2027 Leopul. All rights reserved.)
  6. * Complete : 2025-02-28
  7. * Content : None
  8. * Note : None
  9. *********************************************************************************************************/
  10. #include "At24xx.h"
  11. #include "SysTick.h"
  12. #include "I2c.h"
  13. #include "gd32f30x_libopt.h"
  14. #include "stdint.h"
  15. #include "main.h"
  16. #define CHECK_ADDR 8000
  17. #define AT24C01 127
  18. #define AT24C02 255
  19. #define AT24C04 511
  20. #define AT24C08 1023
  21. #define AT24C16 2047
  22. #define AT24C32 4095
  23. #define AT24C64 8191
  24. #define AT24C128 16383
  25. #define AT24C256 32767
  26. #define USER_DEFINE_EEPROM_TYPE AT24C64
  27. static void read_iic_data(void);
  28. void at24xx_init(void)
  29. {
  30. InitI2C();
  31. sts_data_t *data = get_sts();
  32. data->read_eeprom = read_iic_data;
  33. data->write_at24 = at24xx_write;
  34. data->read_at24 = at24xx_read;
  35. }
  36. uint8_t at24xx_check(void)
  37. {
  38. uint8_t temp = 0;
  39. temp = at24xx_read_one_byte(CHECK_ADDR);
  40. if(temp == 0x55)
  41. {
  42. return 0;
  43. }else
  44. {
  45. at24xx_write_one_byte(CHECK_ADDR,0x55);
  46. temp = at24xx_read_one_byte(CHECK_ADDR);
  47. if(temp == 0x55)
  48. {
  49. return 0;
  50. }
  51. }
  52. return 1;
  53. }
  54. void at24xx_read(unsigned short read_addr, unsigned char *buff,unsigned short read_num)
  55. {
  56. while(read_num)
  57. {
  58. *buff = at24xx_read_one_byte(read_addr);
  59. read_addr++;
  60. buff++;
  61. read_num --;
  62. }
  63. }
  64. void at24xx_write(unsigned short write_addr, unsigned char *buff,unsigned short write_num)
  65. {
  66. while(write_num)
  67. {
  68. at24xx_write_one_byte(write_addr,*buff);
  69. write_addr++;
  70. buff++;
  71. write_num --;
  72. }
  73. }
  74. unsigned char at24xx_read_one_byte(unsigned short read_addr)
  75. {
  76. uint8_t temp = 0;
  77. GenI2CStartSig();
  78. if(USER_DEFINE_EEPROM_TYPE > AT24C16)
  79. {
  80. I2CSendByte(0XA0);
  81. I2CWaitAck();
  82. I2CSendByte(read_addr >> 8);
  83. }else
  84. {
  85. I2CSendByte(0XA0 + ((read_addr / 256) << 1));
  86. }
  87. I2CWaitAck();
  88. I2CSendByte(read_addr % 256);
  89. I2CWaitAck();
  90. GenI2CStartSig();
  91. I2CSendByte(0XA1);
  92. I2CWaitAck();
  93. temp = I2CReadByte(0);
  94. GenI2CStopSig();
  95. return temp;
  96. }
  97. void at24xx_write_one_byte(unsigned short write_addr,unsigned char data)
  98. {
  99. GenI2CStartSig();
  100. if(USER_DEFINE_EEPROM_TYPE > AT24C16)
  101. {
  102. I2CSendByte(0XA0);
  103. I2CWaitAck();
  104. I2CSendByte(write_addr >> 8);
  105. }
  106. else
  107. {
  108. I2CSendByte(0XA0 + ((write_addr / 256) << 1));
  109. }
  110. I2CWaitAck();
  111. I2CSendByte(write_addr % 256);
  112. I2CWaitAck();
  113. I2CSendByte(data);
  114. I2CWaitAck();
  115. GenI2CStopSig();
  116. DelayNms(10);
  117. }
  118. static void read_iic_data(void)
  119. {
  120. sts_data_t *sts_d = get_sts();
  121. if(sts_d)
  122. {
  123. uint8_t * r_addr =&sts_d->m_data.input_th;
  124. at24xx_read(IIC_INPUT_THRESHOLD_START,r_addr,sizeof(iic_in_threshold_t) * 2);
  125. for(uint8_t i = 0 ;i < 2 ;i ++)
  126. {
  127. if(sts_d->m_data.input_th[i].voltage_max > INVALID_VALUE) sts_d->m_data.input_th[i].voltage_max = 0;
  128. if(sts_d->m_data.input_th[i].voltage_min > INVALID_VALUE) sts_d->m_data.input_th[i].voltage_min = 0;
  129. if(sts_d->m_data.input_th[i].freq_max > INVALID_VALUE) sts_d->m_data.input_th[i].freq_max = 0;
  130. if(sts_d->m_data.input_th[i].freq_min > INVALID_VALUE) sts_d->m_data.input_th[i].freq_min = 0;
  131. sts_d->input_wanning_en[i] = 0;
  132. if(sts_d->m_data.input_th[i].voltage_max <= SMALL_VALUE)
  133. UNSET_VOLTAGE_MAX_EN(sts_d->input_wanning_en[i]);
  134. else
  135. SET_VOLTAGE_MAX_EN(sts_d->input_wanning_en[i]);
  136. if(sts_d->m_data.input_th[i].voltage_min <= SMALL_VALUE)
  137. UNSET_VOLTAGE_MIN_EN(sts_d->input_wanning_en[i]);
  138. else
  139. SET_VOLTAGE_MIN_EN(sts_d->input_wanning_en[i]);
  140. if(sts_d->m_data.input_th[i].freq_max <= SMALL_VALUE)
  141. UNSET_FREQ_MAX_EN(sts_d->input_wanning_en[i]);
  142. else
  143. SET_FREQ_MAX_EN(sts_d->input_wanning_en[i]);
  144. if(sts_d->m_data.input_th[i].freq_min <= SMALL_VALUE)
  145. UNSET_FREQ_MIN_EN(sts_d->input_wanning_en[i]);
  146. else
  147. SET_FREQ_MIN_EN(sts_d->input_wanning_en[i]);
  148. }
  149. r_addr=&sts_d->m_data.output_th;
  150. at24xx_read(IIC_OUTPUT_THRESHOLD_START,r_addr,sizeof(iic_out_threshold_t));
  151. {
  152. if(sts_d->m_data.output_th.voltage_max > INVALID_VALUE) sts_d->m_data.output_th.voltage_max = 0;
  153. if(sts_d->m_data.output_th.voltage_min > INVALID_VALUE) sts_d->m_data.output_th.voltage_min = 0;
  154. if(sts_d->m_data.output_th.current_max > INVALID_VALUE) sts_d->m_data.output_th.current_max = 0;
  155. if(sts_d->m_data.output_th.power_max > INVALID_VALUE) sts_d->m_data.output_th.power_max = 0;
  156. if(sts_d->m_data.output_th.consumer_max > INVALID_VALUE) sts_d->m_data.output_th.consumer_max = 0;
  157. sts_d ->output_wanning_en = 0;
  158. if(sts_d->m_data.output_th.voltage_max <= SMALL_VALUE)
  159. UNSET_VOLTAGE_MAX_EN(sts_d ->output_wanning_en);
  160. else
  161. SET_VOLTAGE_MAX_EN(sts_d ->output_wanning_en);
  162. if(sts_d->m_data.output_th.voltage_min <= SMALL_VALUE)
  163. UNSET_VOLTAGE_MIN_EN(sts_d ->output_wanning_en);
  164. else
  165. SET_VOLTAGE_MIN_EN(sts_d ->output_wanning_en);
  166. if(sts_d->m_data.output_th.current_max <= SMALL_VALUE)
  167. UNSET_CURRENT_MAX_EN(sts_d ->output_wanning_en);
  168. else
  169. SET_CURRENT_MAX_EN(sts_d ->output_wanning_en);
  170. if(sts_d->m_data.output_th.power_max <= SMALL_VALUE)
  171. UNSET_POWER_MAX_EN(sts_d ->output_wanning_en);
  172. else
  173. SET_POWER_MAX_EN(sts_d ->output_wanning_en);
  174. if(sts_d->m_data.output_th.consumer_max <= SMALL_VALUE)
  175. UNSET_CONSUMER_MAX_EN(sts_d ->output_wanning_en);
  176. else
  177. SET_CONSUMER_MAX_EN(sts_d ->output_wanning_en);
  178. }
  179. r_addr = &sts_d->m_data.temprature_th;
  180. at24xx_read(IIC_TEMPRATURE_THRESHOLD_START,r_addr,sizeof(iic_temp_threshold_t));
  181. {
  182. if(sts_d->m_data.temprature_th.fans_max_temp > 0x7fff) sts_d->m_data.temprature_th.fans_max_temp = 0;
  183. if(sts_d->m_data.temprature_th.fans_min_temp > 0x7fff) sts_d->m_data.temprature_th.fans_min_temp = 0;
  184. }
  185. r_addr = &sts_d->m_data.over_func;
  186. at24xx_read(IIC_OVER_FUNC_START,r_addr,sizeof(iic_over_func));
  187. if(sts_d->m_data.over_func > 0x003F)
  188. {
  189. sts_d->m_data.over_func = 0;
  190. }
  191. r_addr = &sts_d->iic_consumer;
  192. uint32_t buff = 0;
  193. at24xx_read(IIC_CONSUMER_START,&buff,4);
  194. if((uint32_t)buff == 0)
  195. {
  196. sts_d->iic_consumer = 0;
  197. }else
  198. {
  199. at24xx_read(IIC_CONSUMER_START,r_addr,sizeof(float));
  200. }
  201. r_addr = &sts_d->m_data.out_status;
  202. at24xx_read(IIC_OUT_CHANNEL,r_addr,sizeof(uint16_t));
  203. if(sts_d->m_data.out_status > 1)
  204. {
  205. sts_d->m_data.out_status = 0;
  206. }
  207. }
  208. }