你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32实例-I2C-EEPROM 实验⑦-AT24CXX 数据读写函数

[复制链接]
STMCU小助手 发布时间:2022-6-28 10:00
    编写好 I2C 数据读写函数, 下面就可以编写 AT24CXX 的读写函数, 代码如下:
  1. /****************************************************************
  2. * 函 数 名 : AT24CXX_ReadOneByte
  3. * 函数功能 : 在AT24CXX 指定地址读出一个数据
  4. * 输 入 : ReadAddr:开始读数的地址
  5. * 输 出 : 读到的数据
  6. *****************************************************************/
  7. u8 AT24CXX_ReadOneByte(u16 ReadAddr)
  8. {
  9. u8 temp=0;
  10. IIC_Start();
  11. if(EE_TYPE>AT24C16)
  12. {
  13. IIC_Send_Byte(0XA0); //发送写命令
  14. IIC_Wait_Ack();
  15. IIC_Send_Byte(ReadAddr>>8);//发送高地址
  16. }
  17. else
  18. {
  19. IIC_Send_Byte(0XA0+((ReadAddr/256)<<1)); //发送器件地址0XA0,写数据
  20. }
  21. IIC_Wait_Ack();
  22. IIC_Send_Byte(ReadAddr%256); //发送低地址
  23. IIC_Wait_Ack();
  24. IIC_Start();
  25. IIC_Send_Byte(0XA1); //进入接收模式
  26. IIC_Wait_Ack();
  27. temp=IIC_Read_Byte(0);
  28. IIC_Stop();//产生一个停止条件
  29. return temp;
  30. }
复制代码
  1. /****************************************************************
  2. * 函 数 名 : AT24CXX_WriteOneByte
  3. * 函数功能 : 在AT24CXX 指定地址写入一个数据
  4. * 输 入 : WriteAddr :写入数据的目的地址DataToWrite:要写入的数据
  5. * 输 出 : 无
  6. *****************************************************************/
  7. void AT24CXX_WriteOneByte(u16 WriteAddr,u8 DataToWrite)
  8. {
  9. IIC_Start();
  10. if(EE_TYPE>AT24C16)
  11. {
  12. IIC_Send_Byte(0XA0); //发送写命令
  13. IIC_Wait_Ack();
  14. IIC_Send_Byte(WriteAddr>>8);//发送高地址
  15. }
  16. else
  17. {
  18. IIC_Send_Byte(0XA0+((WriteAddr/256)<<1)); //发送器件地址0XA0,写数据
  19. }
  20. IIC_Wait_Ack();
  21. IIC_Send_Byte(WriteAddr%256); //发送低地址
  22. IIC_Wait_Ack();
  23. IIC_Send_Byte(DataToWrite); //发送字节
  24. IIC_Wait_Ack();
  25. IIC_Stop();//产生一个停止条件
  26. delay_ms(10);
  27. }
复制代码
  1. /****************************************************************
  2. * 函 数 名 : AT24CXX_WriteLenByte
  3. * 函数功能 : 在 AT24CXX 里面的指定地址开始写入长度为 Len的数据用于写入 16bit 或者 32bit 的数据
  4. * 输 入 : WriteAddr :写入数据的目的地址
  5. DataToWrite:要写入的数据
  6. Len :要写入数据的长度 2,4
  7. * 输 出 : 无
  8. *****************************************************************/
  9. void AT24CXX_WriteLenByte(u16 WriteAddr,u32 DataToWrite,u8 Len)
  10. {
  11. u8 t;
  12. for(t=0;t<Len;t++)
  13. {
  14. AT24CXX_WriteOneByte(WriteAddr+t,(DataToWrite>>(8*t))&0xff);
  15. }
  16. }
复制代码
  1. /****************************************************************
  2. * 函 数 名 : AT24CXX_ReadLenByte
  3. * 函数功能 : 在 AT24CXX 里面的指定地址开始读出长度为 Len的数据用于读出 16bit 或者 32bit 的数据
  4. * 输 入 : ReadAddr :开始读出的地址
  5. Len :要读出数据的长度 2,4
  6. * 输 出 : 读取的数据
  7. *****************************************************************/
  8. u32 AT24CXX_ReadLenByte(u16 ReadAddr,u8 Len)
  9. {
  10. u8 t;
  11. u32 temp=0;
  12. for(t=0;t<Len;t++)
  13. {
  14. temp<<=8;
  15. temp+=AT24CXX_ReadOneByte(ReadAddr+Len-t-1);
  16. }
  17. return temp;
  18. }
复制代码
  1. /****************************************************************
  2. * 函 数 名 : AT24CXX_Check
  3. * 函数功能 : 检查 AT24CXX 是否正常
  4. * 输 入 : 无
  5. * 输 出 : 1:检测失败,0:检测成功
  6. *****************************************************************/
  7. u8 AT24CXX_Check(void)
  8. {
  9. u8 temp;
  10. temp=AT24CXX_ReadOneByte(255);//避免每次开机都写 AT24CXX
  11. if(temp==0x36)return 0;
  12. else//排除第一次初始化的情况
  13. {
  14. AT24CXX_WriteOneByte(255,0X36);
  15. temp=AT24CXX_ReadOneByte(255);
  16. if(temp==0X36)return 0;
  17. }
  18. return 1;
  19. }
复制代码
  1. /****************************************************************
  2. * 函 数 名 : AT24CXX_Read
  3. * 函数功能 : 在 AT24CXX 里面的指定地址开始读出指定个数的数据
  4. * 输 入 : ReadAddr :开始读出的地址 对 24c02为0~255
  5. pBuffer :数据数组首地址
  6. NumToRead:要读出数据的个数
  7. * 输 出 : 无
  8. *****************************************************************/
  9. void AT24CXX_Read(u16 ReadAddr,u8 *pBuffer,u16 NumToRead)
  10. {
  11. while(NumToRead)
  12. {
  13. *pBuffer++=AT24CXX_ReadOneByte(ReadAddr++);
  14. NumToRead--;
  15. }
  16. }
复制代码
  1. /****************************************************************
  2. * 函 数 名 : AT24CXX_Write
  3. * 函数功能 : 在 AT24CXX 里面的指定地址开始写入指定个数的数据
  4. * 输 入 : WriteAddr :开始写入的地址 对 24c02为0~255
  5. pBuffer :数据数组首地址
  6. NumToRead:要读出数据的个数
  7. * 输 出 : 无
  8. *****************************************************************/
  9. void AT24CXX_Write(u16 WriteAddr,u8 *pBuffer,u16 NumToWrite)
  10. {
  11. while(NumToWrite--)
  12. {
  13. AT24CXX_WriteOneByte(WriteAddr,*pBuffer);
  14. WriteAddr++;
  15. pBuffer++;
  16. }
  17. }
复制代码
这部分函数在 24cxx.c文件内,这个文件支持 AT24CXX 系列的很多芯片,可通过 24cxx.h 文件内的 EE_TYPE宏来修改,可修改的宏定义如下:
  1. #define AT24C01 127
  2. #define AT24C02 255
  3. #define AT24C04 511
  4. #define AT24C08 1023
  5. #define AT24C16 2047
  6. #define AT24C32 4095
  7. #define AT24C64 8191
  8. #define AT24C128 16383
  9. #define AT24C256 32767
复制代码

    由于我们开发板上使用的是 AT24C02,所以宏定义默认是:
  1. #define EE_TYPE AT24C02
复制代码

    如果你自己设计的电路板上使用的是其他的 AT24CXX 芯片, 那么可以修改这个宏,实现不同芯片数据的读取和写入操作。

收藏 评论0 发布时间:2022-6-28 10:00

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版