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

【经验分享】STM32G070用HAL库与AT24C08通讯

[复制链接]
STMCU小助手 发布时间:2021-11-14 23:04
一、AT24C08的通讯方式
AT24C08采用IIC通讯协议,本次例程是普通IO口模拟IIC端口

二、AT24C08的存储方式
AT24C08有8K位存储空间,可以存储8K/8=1K字节的空间,
1K存储空间,是由外部的A2决定如何分配的,例如你的A2引脚固定接地,那么这1K的存储空间
就分成了4块,每块都有256字节存储空间,每个字节是8位

器件写地址分别是0xA0,0xA2,0xA4,0xA6
器件读地址分别是0xA1,0xA3,0xA5,0xA7
  1. /*
  2. *描述:     在eeprom指定地址写入一个数据
  3. *参数:  WriteAddr  :写入数据的目的地址
  4. *                 DataToWrite:要写入的数据
  5. *返回值:读到的数据
  6. */
  7. void Eeprom_WriteOneByte(u16 WriteAddr,u8 DataToWrite)
  8. {                                                                                                  
  9.     IIC_Start();  

  10.     IIC_Send_Byte(0XA0+((WriteAddr/256)<<1));   //发送器件地址0XA0,写数据   
  11.     IIC_Wait_Ack();      
  12.     IIC_Send_Byte(WriteAddr%256);               //发送低地址
  13.     IIC_Wait_Ack();                                                           
  14.     IIC_Send_Byte(DataToWrite);                 //发送字节                              
  15.     IIC_Wait_Ack();                     
  16.     IIC_Stop();//产生一个停止条件
  17.     HAL_Delay(10);     
  18. }
  19. /*
  20. *描述:     在eeprom指定地址读出一个数据
  21. *参数:  ReadAddr:开始读数的地址
  22. *返回值:读到的数据
  23. */
  24. u8 Eeprom_ReadOneByte(u16 ReadAddr)
  25. {                  
  26.     u8 temp=0;                                                                                   
  27.   IIC_Start();  
  28.    
  29.     IIC_Send_Byte(0XA0+((ReadAddr/256)<<1));   //发送器件地址0XA0,写数据
  30.     IIC_Wait_Ack();
  31.   IIC_Send_Byte(ReadAddr%256);               //发送低地址
  32.     IIC_Wait_Ack();        
  33.     IIC_Start();   
  34.   IIC_Send_Byte(0XA1+((ReadAddr/256)<<1));   //进入接收模式   
  35.    
  36.     IIC_Wait_Ack();     
  37.     temp=IIC_Read_Byte(0);
  38.    
  39.     IIC_Stop();//产生一个停止条件     
  40.    
  41.     return temp;
  42. }

  43. /*
  44. *描述:     检查EEPROM是否正常
  45. *参数:  无
  46. *返回值:外接EEPROM是否存在  
  47. */
  48. u8 Eeprom_Check(void)
  49. {
  50.     u8 temp;
  51.     temp=Eeprom_ReadOneByte(1023);//避免每次开机都写EEPROM           
  52.     if(temp==0X55)return 0;           
  53.     else//排除第一次初始化的情况
  54.     {
  55.         Eeprom_WriteOneByte(1023,0X55);
  56.         temp=Eeprom_ReadOneByte(1023);      
  57.         if(temp==0X55)return 0;
  58.     }
  59.     return 1;                                             
  60. }


  61. /*
  62. *描述:     在EEPROM里面的指定地址开始读出指定个数的数据
  63. *参数:  ReadAddr:    开始读出的地址
  64. *                 pBuffer:    数据数组首地址
  65. *                 NumToRead:要读出数据的个数
  66. *返回值:读到的数据
  67. */
  68. void Eeprom_Read(u16 ReadAddr,u8 *pBuffer,u16 NumToRead)
  69. {
  70.     while(NumToRead)
  71.     {
  72.         CLRWDG();
  73.         *pBuffer++=Eeprom_ReadOneByte(ReadAddr++);   
  74.         NumToRead--;
  75.     }
  76. }  

  77. /*
  78. *描述:     在EEPROM里面的指定地址开始写入指定个数的数据
  79. *参数:  WriteAddr:        开始写入的地址
  80. *                 pBuffer:        数据数组首地址
  81. *                 NumToWrite:    要写入数据的个数
  82. *返回值:读到的数据
  83. */
  84. void Eeprom_Write(u16 WriteAddr,u8 *pBuffer,u16 NumToWrite)
  85. {
  86.     while(NumToWrite--)
  87.     {
  88.         CLRWDG();
  89.         Eeprom_WriteOneByte(WriteAddr,*pBuffer);
  90.         WriteAddr++;
  91.         pBuffer++;
  92.     }
  93. }

复制代码




收藏 评论0 发布时间:2021-11-14 23:04

举报

0个回答

所属标签

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