当前位置:   article > 正文

基于STM32的AT24C08数据读写

at24c08

有关AT24C02/04/08的区别:02有2k的空间,04有4k,08有8k,每2k作为一个page;

        器件地址的区别:

                                

 根据芯片手册:

                        

         可以看到:对于2k的器件,A2,A1,A0均作为地址位;对于4k的器件,A2和A1作为地址位,而A0位则作为寻页位,也就是A0为0时,选定第一页,A0为1时,选定第二页;而对于8k的器件,仅有A2位作为地址位,而A1和A0均作为寻页位,当A1A0为:00,01,10,11时,依次对应第1,2,3,4页。

而最低位为确定读还是写操作,为0时表示写操作,1表示读操作。

所以对于本次使用的AT24C08,进行写操作时,其器件地址可以为 0xA0 | XX(XX为00,01,10,11);进行读操作时,其器件地址可以为 0xA1 | XX(XX为00,01,10,11).

对应写操作的时序图

                

  1. /*
  2. *@breif 指定地址写入一个字节
  3. *@param 器件地址(写):0xA0|XX,XX可以为00,01,10,11,表示不同页(总共1024k)
  4. 数据所在地址:0x00~0xFF
  5. 要写入的一个字节:Data
  6. *@retval 无
  7. */
  8. void AT24C08_WriteByte(uint8_t DeviceAdd_W,uint8_t DataAdd,uint8_t Data)
  9. {
  10. IIC_Start();
  11. IIC_Send_Byte(DeviceAdd_W);
  12. IIC_Wait_Ack();
  13. IIC_Send_Byte(DataAdd);
  14. IIC_Wait_Ack();
  15. IIC_Send_Byte(Data);
  16. IIC_Wait_Ack();
  17. IIC_Stop();
  18. Delay_ms(2);
  19. }

 值得注意的是:进行EEPROM写操作是需要一定的写入时间,否则数据会产生混乱。

对应读操作的时序图:

                        

  1. /*
  2. *@breif 指定地址读取一个字节
  3. *@param 器件地址(写和读):0xA0|XX,XX可以为00,01,10,11,表示不同页(总共1024k)
  4. 数据所在地址:0x00~0xFF
  5. *@retval 读取到的数据:Data
  6. */
  7. uint8_t AT24C08_ReadByte(uint8_t DeviceAdd_W,uint8_t DeviceAdd_R,uint8_t DataAdd)
  8. {
  9. uint8_t Data;
  10. IIC_Start();
  11. IIC_Send_Byte(DeviceAdd_W);
  12. IIC_Wait_Ack();
  13. IIC_Send_Byte(DataAdd);
  14. IIC_Wait_Ack();
  15. IIC_Start();
  16. IIC_Send_Byte(DeviceAdd_R);
  17. IIC_Wait_Ack();
  18. Data = IIC_Read_Byte(0);//No Ack
  19. IIC_Stop();
  20. return Data;
  21. }

         而进行EEPROM读操作连续读是没有问题的。

主函数进行验证:

  1. #include "stm32f10x.h" // Device header
  2. #include "I2C.h"
  3. #include "AT24C08.h"
  4. #include "OLED.h"
  5. #include "Delay.h"
  6. int main(void)
  7. {
  8. uint8_t Num1 = 0,Num2 = 0,Num3 = 0,Num4 = 0;
  9. OLED_Init();
  10. IIC_Init();
  11. AT24C08_WriteByte(0xA0,0x00,11);//在第1页的0x0011
  12. AT24C08_WriteByte(0xA2,0x00,22);//在第2页的0x0022
  13. AT24C08_WriteByte(0xA4,0x00,33);//在第3页的0x0033
  14. AT24C08_WriteByte(0xA6,0x00,44);//在第4页的0x0044
  15. Num1 = AT24C08_ReadByte(0xA0,0xA1,0x00);
  16. Num2 = AT24C08_ReadByte(0xA2,0xA3,0x00);
  17. Num3 = AT24C08_ReadByte(0xA4,0xA5,0x00);
  18. Num4 = AT24C08_ReadByte(0xA6,0xA7,0x00);//逐个读取
  19. OLED_ShowString(2,1,"Read Num:");
  20. while(1)
  21. {
  22. OLED_ShowNum(2,10,Num1,3);
  23. Delay_s(1);
  24. OLED_ShowNum(2,10,Num2,3);
  25. Delay_s(1);
  26. OLED_ShowNum(2,10,Num3,3);
  27. Delay_s(1);
  28. OLED_ShowNum(2,10,Num4,3);
  29. Delay_s(1);
  30. }
  31. }

 最终结果:

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/438218
推荐阅读
相关标签
  

闽ICP备14008679号