24CXX.c 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. #include "delay.h"
  2. #include "24CXX.h"
  3. //////////////////////////////////////////////////////////////////////////////////
  4. // 2203/4/X GHz_ljw 合并版
  5. //////////////////////////////////////////////////////////////////////////////
  6. //在AT24CXX指定地址读出一个数据
  7. //ReadAddr:开始读数的地址
  8. //返回值 :读到的数据
  9. //ljw 23.6.30 Tested
  10. u8 AT24CXX_ReadOneByte(u16 ReadAddr)
  11. {
  12. u8 ack=0;
  13. u8 data=0;
  14. IIC_Start();
  15. if(EE_TYPE>AT24C16)
  16. {
  17. IIC_Send_Byte(0XA0); //发送写命令
  18. ack = IIC_Wait_Ack();
  19. if(ack!=0)
  20. {
  21. goto fail;
  22. }
  23. IIC_Send_Byte(ReadAddr>>8);//发送高地址
  24. } else IIC_Send_Byte(0XA0+((ReadAddr/256)<<1)); //发送器件固定地址0XA0,写数据
  25. ack = IIC_Wait_Ack();
  26. if(ack!=0)
  27. {
  28. goto fail;
  29. }
  30. IIC_Send_Byte(ReadAddr%256); //发送低地址
  31. ack = IIC_Wait_Ack();
  32. if(ack!=0)
  33. {
  34. goto fail;
  35. }
  36. IIC_Start();
  37. IIC_Send_Byte(0XA1); //进入接收模式
  38. ack = IIC_Wait_Ack();
  39. if(ack!=0)
  40. {
  41. goto fail;
  42. }
  43. data=IIC_Read_Byte(0);
  44. IIC_Stop();//产生一个停止条件
  45. return data;
  46. fail:
  47. IIC_Stop();//产生一个停止条件
  48. return 0;
  49. }
  50. /*
  51. u8 AT24CXX_WriteOneByte(u16 WriteAddr,u8 DataToWrite)
  52. {
  53. //u8 test = 0;
  54. IIC_Start();
  55. if(EE_TYPE>AT24C16)
  56. {
  57. IIC_Send_Byte(0XA0); //发送写命令
  58. IIC_Wait_Ack();
  59. IIC_Send_Byte(WriteAddr>>8);//发送高地址
  60. }
  61. else IIC_Send_Byte(0XA0+((WriteAddr/256)<<1)); //发送器件地址0XA0,写数据
  62. IIC_Wait_Ack();
  63. IIC_Send_Byte(WriteAddr%256); //发送低地址
  64. IIC_Wait_Ack();
  65. IIC_Send_Byte(DataToWrite); //发送字节
  66. IIC_Wait_Ack();
  67. //test = test; // 测试用,消除waring
  68. IIC_Stop();//产生一个停止条件
  69. delay_ms(10);
  70. return 1;
  71. }*/
  72. //在AT24CXX指定地址写入一个数据
  73. //WriteAddr :写入数据的目的地址
  74. //DataToWrite:要写入的数据
  75. //ljw 23.6.30 Tested
  76. u8 AT24CXX_WriteOneByte(u16 WriteAddr,u8 DataToWrite)
  77. {
  78. u8 ack = 0;
  79. IIC_Start();
  80. if(EE_TYPE>AT24C16)
  81. //if(0)
  82. {
  83. IIC_Send_Byte(0XA0); //发送写命令
  84. ack = IIC_Wait_Ack();
  85. if(ack!=0)
  86. {
  87. //goto fail;
  88. }
  89. IIC_Send_Byte(WriteAddr>>8);//发送高地址
  90. }
  91. else IIC_Send_Byte(0XA0+((WriteAddr/256)<<1)); //发送器件地址0XA0,写数据
  92. ack = IIC_Wait_Ack();
  93. if(ack!=0)
  94. {
  95. //goto fail;
  96. }
  97. IIC_Send_Byte(WriteAddr%256); //发送低地址
  98. ack = IIC_Wait_Ack();
  99. if(ack!=0)
  100. {
  101. //goto fail;
  102. }
  103. IIC_Send_Byte(DataToWrite); //发送字节
  104. ack = IIC_Wait_Ack();
  105. if(ack!=0)
  106. {
  107. //goto fail;
  108. }
  109. IIC_Stop();//产生一个停止条件
  110. delay_ms(15);
  111. return 1;
  112. /*fail:
  113. IIC_Stop();//产生一个停止条件
  114. return 0;*/
  115. }
  116. //在AT24CXX里面的指定地址开始写入长度为Len的数据
  117. //该函数用于写入16bit或者32bit的数据.
  118. //WriteAddr :开始写入的地址
  119. //DataToWrite:数据数组首地址
  120. //Len :要写入数据的长度2,4
  121. void AT24CXX_WriteLenByte(u16 WriteAddr,u32 DataToWrite,u8 Len)
  122. {
  123. u8 t;
  124. for(t=0; t<Len; t++)
  125. {
  126. AT24CXX_WriteOneByte(WriteAddr+t,(DataToWrite>>(8*t))&0xff);
  127. }
  128. }
  129. //在AT24CXX里面的指定地址开始读出长度为Len的数据
  130. //该函数用于读出16bit或者32bit的数据.
  131. //ReadAddr :开始读出的地址
  132. //返回值 :数据
  133. //Len :要读出数据的长度2,4
  134. u32 AT24CXX_ReadLenByte(u16 ReadAddr,u8 Len)
  135. {
  136. u8 t;
  137. u32 temp=0;
  138. for(t=0; t<Len; t++)
  139. {
  140. temp<<=8;
  141. temp+=AT24CXX_ReadOneByte(ReadAddr+Len-t-1);
  142. }
  143. return temp;
  144. }
  145. //检查AT24CXX是否正常
  146. //这里用了24XX的最后一个地址(255)来存储标志字.
  147. //23.3.x ,AT24C32 => 0x0FFF, GHz ljw
  148. //如果用其他24C系列,这个地址要修改
  149. //返回1:检测失败
  150. //返回0:检测成功
  151. u8 AT24CXX_Check(void)
  152. {
  153. u8 temp;
  154. temp=AT24CXX_ReadOneByte(0xFF);//避免每次开机都写AT24CXX
  155. if(temp==0X28)
  156. {
  157. return 0;
  158. }
  159. else//排除第一次初始化的情况
  160. {
  161. AT24CXX_WriteOneByte(0xFF,0X28);
  162. temp=AT24CXX_ReadOneByte(0xFF);
  163. if(temp==0X28)
  164. {
  165. return 0;
  166. }
  167. }
  168. return 1;
  169. }
  170. //在AT24CXX里面的指定地址开始读出指定个数的数据
  171. //ReadAddr :开始读出的地址 对24c02为0~255
  172. //pBuffer :数据数组首地址
  173. //NumToRead:要读出数据的个数
  174. void AT24CXX_Read(u16 ReadAddr,u8 *pBuffer,u16 NumToRead)
  175. {
  176. while(NumToRead)
  177. {
  178. *pBuffer++=AT24CXX_ReadOneByte(ReadAddr++);
  179. NumToRead--;
  180. }
  181. }
  182. //在AT24CXX里面的指定地址开始写入指定个数的数据
  183. //WriteAddr :开始写入的地址 对24c02为0~255
  184. //pBuffer :数据数组首地址
  185. //NumToWrite:要写入数据的个数
  186. u8 AT24CXX_Write(u16 WriteAddr,u8 *pBuffer,u16 NumToWrite)
  187. {
  188. u8 result =0;
  189. while(NumToWrite--)
  190. {
  191. result = AT24CXX_WriteOneByte(WriteAddr,*pBuffer);
  192. if(result!=1)
  193. {
  194. return 0;
  195. }
  196. WriteAddr++;
  197. pBuffer++;
  198. }
  199. return 1;
  200. }