At24cxx.c 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. /*********************************************************************************************************
  2. * 模块名称: AT24Cxx.c
  3. * 摘 要: AT24Cxx模块
  4. * 当前版本: 1.0.0
  5. * 作 者:Leyutek(COPYRIGHT 2018 - 2021 Leyutek. All rights reserved.)
  6. * 完成日期:2021年07月01日
  7. * 内 容:
  8. * 注 意: none
  9. **********************************************************************************************************
  10. * 取代版本:
  11. * 作 者:
  12. * 完成日期:
  13. * 修改内容:
  14. * 修改文件:
  15. *********************************************************************************************************/
  16. /*********************************************************************************************************
  17. * 包含头文件
  18. *********************************************************************************************************/
  19. #include "At24cxx.h"
  20. #include "SysTick.h"
  21. #include "I2c.h"
  22. //#include "Uart1.h"
  23. #include <stdio.h>
  24. /*********************************************************************************************************
  25. * 宏定义
  26. *********************************************************************************************************/
  27. /*********************************************************************************************************
  28. * 内部变量
  29. *********************************************************************************************************/
  30. /*********************************************************************************************************
  31. * 内部函数声明
  32. *********************************************************************************************************/
  33. static unsigned char AT24CxxReadOneByte(unsigned short readAddr); //从指定地址读取一字节数据
  34. //static void AT24CxxWriteOneByte(unsigned short writeAddr, unsigned char dataToWrite); //从指定地址写入一字节数据
  35. /*********************************************************************************************************
  36. * 内部函数实现
  37. *********************************************************************************************************/
  38. /*********************************************************************************************************
  39. * 函数名称: AT24CxxReadOneByte
  40. * 函数功能: 通过一个地址,读取一字节数据
  41. * 输入参数: readAddr-开始读数的地址
  42. * 输出参数: void
  43. * 返 回 值: 读到的数据
  44. * 创建日期: 2021年07月01日
  45. * 注 意: 24WC01/02 1 0 1 0 A2 A1 A0 R/~W
  46. * 24WC04 1 0 1 0 A2 A1 a8 R/~W
  47. * 24WC08 1 0 1 0 A2 a9 a8 R/~W
  48. * 24WC16 1 0 1 0 a10 a11 a12 R/~W
  49. * A0/A1/A2对应器件的管脚1/2/3,最多可以级联的器件数
  50. * a8/a9/a10对应存储阵列字地址
  51. * 对应《AT24C01ASC/02SC/04SC/08SC/16SC数据手册》的Figure10. Random Read(Reference)
  52. *********************************************************************************************************/
  53. static unsigned char AT24CxxReadOneByte(unsigned short readAddr)
  54. {
  55. unsigned char temp = 0;
  56. GenI2CStartSig(); //发送起始信号
  57. if(USER_DEFINE_EEPROM_TYPE > AT24C16) //如果内存字节大于AT24C16(2047)
  58. {
  59. I2CSendByte(0XA0); //发送写命令
  60. I2CWaitAck(); //等待应答
  61. I2CSendByte(readAddr >> 8); //发送高地址
  62. }
  63. else //内存字节不大于2047
  64. {
  65. I2CSendByte(0XA0 + ((readAddr / 256) << 1));//发送器件地址0XA0,写数据
  66. }
  67. I2CWaitAck(); //等待应答
  68. I2CSendByte(readAddr % 256); //发送BYTE ADDRESS(字节的地址)
  69. I2CWaitAck(); //等待应答
  70. GenI2CStartSig(); //发送起始信号
  71. I2CSendByte(0XA1); //发送SLAVE ADDRESS,为了进入接收模式,1 0 1 0 x x x R/~W
  72. I2CWaitAck(); //等待应答
  73. temp = I2CReadByte(0); //传入参数0表示发送无应答
  74. GenI2CStopSig(); //发送停止信号
  75. return temp; //返回读取到的值
  76. }
  77. /*********************************************************************************************************
  78. * 函数名称: AT24CxxWriteOneByte
  79. * 函数功能: 在AT24Cxx指定地址写入一字节数据
  80. * 输入参数: writeAddr-写入数据的目的地址,dataToWrite-待写入的字节数据
  81. * 输出参数: void
  82. * 返 回 值: void
  83. * 创建日期: 2021年07月01日
  84. * 注 意: 对应《AT24C01ASC/02SC/04SC/08SC/16SC数据手册》的Figure7. Byte Write(Reference)
  85. *********************************************************************************************************/
  86. //static void AT24CxxWriteOneByte(unsigned short writeAddr, unsigned char dataToWrite)
  87. void AT24CxxWriteOneByte(unsigned short writeAddr, unsigned char dataToWrite)
  88. {
  89. GenI2CStartSig(); //发送起始信号
  90. if(USER_DEFINE_EEPROM_TYPE > AT24C16)
  91. {
  92. I2CSendByte(0XA0); //发送写命令
  93. I2CWaitAck();
  94. I2CSendByte(writeAddr >> 8); //发送高地址
  95. }
  96. else
  97. {
  98. //左移1位因为LSB是R/~W,发送SLAVE ADDRESS(字地址也包含其中)
  99. I2CSendByte(0XA0 + ((writeAddr / 256) << 1));
  100. }
  101. I2CWaitAck(); //等待应答
  102. I2CSendByte(writeAddr % 256); //发送BYTE ADDRESS(字节的地址)
  103. I2CWaitAck(); //等待应答
  104. I2CSendByte(dataToWrite); //发送待写入的字节
  105. I2CWaitAck(); //等待应答
  106. GenI2CStopSig(); //发送停止信号
  107. DelayNms(10); //在主器件产生停止信号后SLAVE开始内部数据的擦写,
  108. //在擦写过程中不在应答主器件的任何请求,数据手册上的tWR是5ms
  109. }
  110. /*********************************************************************************************************
  111. * API函数实现
  112. *********************************************************************************************************/
  113. /*********************************************************************************************************
  114. * 函数名称: InitAT24Cxx
  115. * 函数功能: 初始化I2C接口
  116. * 输入参数: void
  117. * 输出参数: void
  118. * 返 回 值: void
  119. * 创建日期: 2021年07月01日
  120. * 注 意:
  121. *********************************************************************************************************/
  122. void InitAT24Cxx(void)
  123. {
  124. InitI2C(); //初始化I2C模块
  125. }
  126. /*********************************************************************************************************
  127. * 函数名称: CheckAT24Cxx
  128. * 函数功能: 检查AT24Cxx是否正常,这里用了24XX的最后一个地址(255)来存储标志字,如用其他24C,这个地址要修改
  129. * 输入参数: void
  130. * 输出参数: void
  131. * 返 回 值: 1:检测失败,0:检测成功
  132. * 创建日期: 2021年07月01日
  133. * 注 意:
  134. *********************************************************************************************************/
  135. unsigned char CheckAT24Cxx(void)
  136. {
  137. unsigned char temp = 0;
  138. temp = AT24CxxReadOneByte(255); //避免每次开机都写AT24Cxx
  139. if(temp == 0X55) //检验是否AT24Cxx已写入
  140. {
  141. return 0; //检测成功
  142. }
  143. else //排除第一次初始化的情况
  144. {
  145. AT24CxxWriteOneByte(255, 0X55); //在地址255处写入字节0X55
  146. temp = AT24CxxReadOneByte(255); //读取地址255的字节赋值给temp
  147. if(temp == 0X55) //检测是否已经更改完成
  148. {
  149. return 0; //检测成功
  150. }
  151. }
  152. return 1; //以上条件不符合,检测失败
  153. }
  154. /*********************************************************************************************************
  155. * 函数名称: AT24CxxRead
  156. * 函数功能: 在AT24Cxx里面的指定地址开始读出指定个数的数据
  157. * 输入参数: readAddr-开始读出的地址,对24C02为0~255,pBuffer-数据数组首地址,numToRead-要读出的数据个数
  158. * 输出参数: void
  159. * 返 回 值: void
  160. * 创建日期: 2021年07月01日
  161. * 注 意:
  162. *********************************************************************************************************/
  163. void AT24CxxRead(unsigned short readAddr, unsigned char* pBuffer, unsigned short numToRead)
  164. {
  165. while(numToRead) //数据未读完
  166. {
  167. *pBuffer = AT24CxxReadOneByte(readAddr); //逐字节读出存放到数据数组
  168. readAddr++; //读取字节地址加1
  169. pBuffer++; //数据数组地址加1
  170. numToRead--; //要读出的数据个数减1
  171. }
  172. }
  173. /*********************************************************************************************************
  174. * 函数名称: AT24CxxWrite
  175. * 函数功能: 在AT24Cxx里面的指定地址开始写入指定个数的数据
  176. * 输入参数: writeAddr-开始写入的地址 对24C02为0~255,pBuffer-数据数组首地址,numToWrite-要写入的数据个数
  177. * 输出参数: void
  178. * 返 回 值: void
  179. * 创建日期: 2021年07月01日
  180. * 注 意:
  181. *********************************************************************************************************/
  182. void AT24CxxWrite(unsigned short writeAddr, unsigned char* pBuffer, unsigned short numToWrite)
  183. {
  184. while(numToWrite) //数据未写完
  185. {
  186. AT24CxxWriteOneByte(writeAddr, *pBuffer); //逐字节写入数据数组
  187. writeAddr++; //写入字节地址加1
  188. pBuffer++; //数据数组地址加1
  189. numToWrite--; //要写入的数据个数减1
  190. }
  191. //Start_Send_UartData("acvbn",5);
  192. }