AT24CXX_ATY.c 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. /**
  2. * @file AT24CXX_ATY.c
  3. *
  4. * @param Project DEVICE_GENERAL_ATY_LIB
  5. *
  6. * @author ATY
  7. *
  8. * @copyright
  9. * - Copyright 2017 - 2026 MZ-ATY
  10. * - This code follows:
  11. * - MZ-ATY Various Contents Joint Statement -
  12. * <a href="https://mengze.top/MZ-ATY_VCJS">
  13. * https://mengze.top/MZ-ATY_VCJS</a>
  14. * - CC 4.0 BY-NC-SA -
  15. * <a href="https://creativecommons.org/licenses/by-nc-sa/4.0/">
  16. * https://creativecommons.org/licenses/by-nc-sa/4.0/</a>
  17. * - Your use will be deemed to have accepted the terms of this statement.
  18. *
  19. * @brief functions of AT24CXX for C platform
  20. *
  21. * @version
  22. * - 1_01_220602 > ATY
  23. * -# Preliminary version, first Release
  24. * - 1_01_221212 > ATY
  25. * -# Change to general I2C function
  26. * -# Change and remove several functions
  27. * - 1_02_231229 > ATY
  28. * -# add multy addr and channel
  29. ********************************************************************************
  30. */
  31. #ifndef __AT24CXX_ATY_C
  32. #define __AT24CXX_ATY_C
  33. #include "AT24CXX_ATY.h"
  34. /******************************* For user *************************************/
  35. /******************************************************************************/
  36. /**
  37. * @brief Read one byte from assign address
  38. * @param regAddr address to read data
  39. * @param addr chip address
  40. * @param channel chip channel
  41. * @return uint8 data at regAddr
  42. */
  43. uint8_t AT24CXX_ReadByte(uint16_t regAddr, uint8_t addr, uint8_t channel)
  44. {
  45. uint8_t temp_uint8 = 0, addrG[2] = {regAddr >> 8, regAddr % 256};
  46. if(AT24CXX_TYPE > AT24C16)
  47. I2C_Write_NoStop(addr, addrG, 2, channel);
  48. else // 04/08/16
  49. I2C_Write_NoStop(addr + ((regAddr / 256) << 1), addrG + 1, 1, channel);
  50. I2C_Read(addr, &temp_uint8, 1, channel);
  51. return temp_uint8;
  52. }
  53. /**
  54. * @brief Write one byte to assign address
  55. * @param regAddr address to write data
  56. * @param data_t data to write
  57. * @param addr chip address
  58. * @param channel chip channel
  59. */
  60. void AT24CXX_WriteByte(uint16_t regAddr, uint8_t data_t, uint8_t addr, uint8_t channel)
  61. {
  62. uint8_t addrG[3] = {regAddr >> 8, regAddr % 256, data_t};
  63. if(AT24CXX_TYPE > AT24C16)
  64. I2C_Write(addr, addrG, 3, channel);
  65. else // 04/08/16
  66. I2C_Write(addr + ((regAddr / 256) << 1), addrG + 1, 2, channel);
  67. DelayMs(AT24CXX_WRITE_DELAY);
  68. }
  69. /**
  70. * @brief Read series data from assign address
  71. * @param regAddr address to start read data
  72. * @param pbuf data group to save read data
  73. * @param len data length to read
  74. * @param addr chip address
  75. * @param channel chip channel
  76. */
  77. void AT24CXX_Read(uint16_t regAddr, uint8_t* pbuf, uint16_t len, uint8_t addr, uint8_t channel)
  78. {
  79. uint8_t addrG[2] = {regAddr >> 8, regAddr % 256};
  80. if(AT24CXX_TYPE > AT24C16)
  81. I2C_Write_NoStop(addr, addrG, 2, channel);
  82. else // 04/08/16
  83. I2C_Write_NoStop(addr + ((regAddr / 256) << 1), addrG + 1, 1, channel);
  84. I2C_Read(addr, pbuf, len, channel);
  85. }
  86. /**
  87. * @brief Write series data to assign address
  88. * @param regAddr address to start read data
  89. * @param pbuf data group to write
  90. * @param len data length to write
  91. * @param addr chip address
  92. * @param channel chip channel
  93. */
  94. void AT24CXX_Write(uint16_t regAddr, uint8_t* pbuf, uint16_t len, uint8_t addr, uint8_t channel)
  95. {
  96. uint8_t* addrG = (uint8_t*)malloc(sizeof(uint8_t) * (len + 2));
  97. addrG[0] = regAddr >> 8;
  98. addrG[1] = regAddr % 256;
  99. for(uint16_t i = 0; i < len; i++)
  100. addrG[2 + i] = pbuf[i];
  101. if(AT24CXX_TYPE > AT24C16)
  102. I2C_Write(addr, addrG, len + 2, channel);
  103. else // 04/08/16
  104. I2C_Write(addr + ((regAddr / 256) << 1), addrG + 1, len + 1, channel);
  105. free(addrG);
  106. DelayMs(AT24CXX_WRITE_DELAY);
  107. }
  108. /**
  109. * @brief Write random data to assign address
  110. * @param regAddr address to start read data
  111. * @param pbuf data group to save read data
  112. * @param len data length to write
  113. * @param addr chip address
  114. * @param channel chip channel
  115. */
  116. void AT24CXX_WriteRandom(uint16_t regAddr, uint8_t* pbuf, uint16_t len, uint8_t addr, uint8_t channel)
  117. {
  118. uint16_t fullPageCount = 0; // whole page count
  119. uint16_t lastPageSize = 0;
  120. uint16_t firstPageSize = 0;
  121. if(regAddr + len > AT24CXX_TYPE)
  122. len = AT24CXX_TYPE - regAddr;
  123. if(regAddr % AT24CXX_PAGE_SIZE == 0) // regAddr is the page start
  124. firstPageSize = 0;
  125. else
  126. {
  127. firstPageSize = AT24CXX_PAGE_SIZE - (regAddr % AT24CXX_PAGE_SIZE);
  128. AT24CXX_Write(regAddr, pbuf, firstPageSize, addr, channel);
  129. }
  130. if((regAddr + len) % AT24CXX_PAGE_SIZE == 0) // location regAddr will be wrote too
  131. lastPageSize = 0;
  132. else
  133. {
  134. lastPageSize = (regAddr + len) % AT24CXX_PAGE_SIZE;
  135. AT24CXX_Write(regAddr + len - lastPageSize, pbuf + len - lastPageSize, lastPageSize, addr, channel);
  136. }
  137. fullPageCount = (len - firstPageSize - lastPageSize) / AT24CXX_PAGE_SIZE;
  138. for(uint8_t i = 0; i < fullPageCount; i++)
  139. AT24CXX_Write(regAddr + firstPageSize + i * AT24CXX_PAGE_SIZE,
  140. pbuf + firstPageSize + i * AT24CXX_PAGE_SIZE, AT24CXX_PAGE_SIZE, addr, channel);
  141. DelayMs(AT24CXX_WRITE_DELAY);
  142. }
  143. /**
  144. * @brief Check device state
  145. * @param addr chip address
  146. * @param channel chip channel
  147. * @return errCode, 0: device good, !0: device has problem
  148. */
  149. uint8_t AT24CXX_Check(uint8_t addr, uint8_t channel)
  150. {
  151. uint8_t temp_uint8;
  152. // avoid writing every boot up
  153. temp_uint8 = AT24CXX_ReadByte(0xFF, addr, channel);
  154. if(temp_uint8 == 0X68)
  155. return 0;
  156. else
  157. {
  158. // may be the first init
  159. AT24CXX_WriteByte(0xFF, 0x68, addr, channel);
  160. temp_uint8 = AT24CXX_ReadByte(0xFF, addr, channel);
  161. if(temp_uint8 == 0x68)
  162. return 0;
  163. }
  164. return 1;
  165. }
  166. /**
  167. * @brief Init device
  168. * @param addr chip address
  169. * @param channel chip channel
  170. * @note not useful if i2c functions good
  171. */
  172. void AT24CXX_Init(uint8_t addr, uint8_t channel)
  173. {
  174. }
  175. #ifdef __DEBUG_AT24CXX_ATY
  176. /**
  177. * @brief Test funtion(can be instead by Check function)
  178. * @param addr chip address
  179. * @param channel chip channel
  180. * @return errCode, 0: success, !0: err
  181. */
  182. uint8_t AT24CXX_Test(uint8_t addr, uint8_t channel)
  183. {
  184. // AT24CXX_Init(addr, channel);
  185. // W/R one byte
  186. uint8_t startupCounte = 0;
  187. startupCounte = AT24CXX_ReadByte(0xFF, addr, channel);
  188. AT24CXX_WriteByte(0xFF, startupCounte + 1, addr, channel);
  189. AT24CXX_ReadByte(0xFF, addr, channel);
  190. // W/R bytes
  191. uint8_t tempTestR_uint8[6] = {0, 0, 0, 0, 0, 0};
  192. uint8_t tempTestW_uint8[5] = {1, 2, 3, 4, 5};
  193. AT24CXX_Write(0xFA, tempTestR_uint8, 0xFF - 0xFA, addr, channel);
  194. AT24CXX_Read(0xFA, tempTestR_uint8, 0x100 - 0xFA, addr, channel);
  195. AT24CXX_Write(0xFA, tempTestW_uint8, 0xFF - 0xFA, addr, channel);
  196. AT24CXX_Read(0xFA, tempTestR_uint8, 0x100 - 0xFA, addr, channel);
  197. // W/R random
  198. uint8_t tempBuf[50];
  199. const char* str = "abcdefghijklmnopqrstuvwxyz0123456789";
  200. AT24CXX_WriteRandom(100, (uint8_t*)str, strlen(str), addr, channel);
  201. AT24CXX_Read(100, tempBuf, strlen(str), addr, channel);
  202. printf("\r\nAT24CXX read data from regAddr %d at num %d: %s\r\n",
  203. 100, startupCounte, (char*)tempBuf);
  204. if(memcmp(str, tempBuf, strlen(str)) == 0)
  205. return 0;
  206. return 1;
  207. }
  208. // AT24CXX_Test(AT24CXX_ADDRESS, AT4CXX_I2C);
  209. #endif /* __DEBUG_AT24CXX_ATY */
  210. #endif /* __AT24CXX_ATY_C */
  211. /******************************** End Of File *********************************/