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

STM32F103标准库开发---IIC主控实验---普通I/O口模拟---读写AT24Cxx系列EEPROM实验

[复制链接]
STMCU小助手 发布时间:2022-9-7 14:59
一、AT24Cxx系列芯片简介
EEPROM是指带电可擦可编程只读存储器,一种掉电后数据不丢失的存储芯片。
AT24Cxx系列芯片是EEPROM芯片的一种,它是基于IIC总线的存储器件,遵循二线制协议,由于其具有接口方便,体积小,数据掉电不丢失等特点,在仪器仪表及工业自动化控制中得到大量的应用。
AT24Cxx系列芯片 在电路中的主要作用就是在 掉电的情况下保存数据。

1. 存储结构
1~UGCKZ~1@ASD55H_ZEY832.png

2. 引脚
AT24C02,AT24C32,AT24C64,AT24C128,AT24C256
这五种型号的芯片,引脚图都如下所示:

8f3c6592d4244dbcac0df106c52370dc.png

引脚说明如下:

NJF($WU3]VLD]UW]FQ8P$BT.png

AT24C04,AT24C08,AT24C16
这三种型号的芯片,引脚图都如下所示:

)QUM1[O{4D8{Y0U`[GDK3X8.png

AT24C512
引脚图都如下所示:



A0和A1是硬件地址,NC空脚可接地,总线上同时级联4个AT24C512器件。

3. 原理图

c47ba4c356cc4fbf91e16**460f510.png

4. 从控设备地址
从控设备地址前4位,所有型号都是一样的。
随后3位是A2,A1和A0为硬件地址位,与硬件输入引脚一致;P2,P1和P0为数据地址高位。
最后1位是读/写选择位,1为读操作,0为写操作。

1[[E($%K[7YDHJUPX0DL~PC.png

二、IIC总线的数据传输
IIC总线上的每一个设备都可以作为主设备或者从设备。
每一个设备都有对应一个唯一的设备地址,设备地址就是通过A2,A1和A0物理接地和拉高决定,主从设备之间就通过设备地址来确定与哪个器件进行通信。
这次以STM32F103开发板为主控,以AT24Cxx为从控。

1. IIC总线数据传输协议
主控设备在传输有效数据之前要先指定从控设备地址,然后确定数据传输方向 (0表示主控向从控写数据,1表示主控向从控读数据),然后传输数据。

8f1d2c0437894e1987e184a2902d3072.png

2. IIC总线主控写数据
IIC总线主控写数据时序图

cdadee2fec894cdcad0d728d5774d943.png

主要流程:

主控发送起始条件
主控发送从控设备地址
主控发送写操作
主控等待从控应答:应答失败,主控发送停止条件;
         应答成功进行下一步
从控应答后,主控发送要写入的数据
主控等待从控应答:应答失败,主控发送停止条件;
         应答成功,进行下一步
主控数据发送未完:重复5和6步骤;
主控数据发送完毕:主控发送停止条件

3. IIC总线主控读数据
IIC总线主控读数据时序图

1d4518e470d94e0e95c105a423c5472f.png

主要流程:
主控发送起始条件
主控发送从控设备地址
主控发送*读操作**
主控等待从控应答:应答失败,主控发送停止条件;
         应答成功进行下一步
从控应答后,主控读取从控发送的数据
主控发送应答:应答失败,主控发送停止条件;
       应答成功,重复5和6步骤

三、普通I/O口模拟IIC总线读写AT24C256

VU3Y{N289OTVFL%N10BT~4B.png

1. 原理图

bf021ee357254b82b7db8da798be8fae.png

2. IIC总线底层驱动程序
文章链接:STM32F103标准库开发—IIC主控实验—普通I/O口模拟—基本原理和底层驱动程序

3. 普通I/O口模拟IIC总线读取AT24C256数据
具体流程如下:
写入数据地址----此地址为读取数据的起始地址
读取数据----可以读取多字节数据

具体程序如下:

  1. /**
  2.   *@功能:读取指定字节数据
  3.   *@参数1:ReadAddr---读取数据的起始地址
  4.   *@参数2:*Rdata ---读取到的数据缓存起始地址
  5.   *@参数3:        Num   ---读取数据的个数
  6.   **/
  7. void AT24C256_ReadData(u16 ReadAddr, u8* Rdata, u16 Num)
  8. {                                                                                                                                                                    
  9.   IIC_Start();                                  //发送起始条件        
  10.   IIC_Send_Byte(0XA0);                           //发送写命令
  11.   IIC_Wait_Ack();                                //等待应答
  12.   IIC_Send_Byte(ReadAddr>>8);        //发送高地址         
  13.   IIC_Wait_Ack();                                 //等待应答
  14.   IIC_Send_Byte(ReadAddr%256);  //发送低地址
  15.   IIC_Wait_Ack();                            //等待应答
  16.   IIC_Start();                                         //发送起始条件                     
  17.   IIC_Send_Byte(0XA1);          //发送读命令                  
  18.   IIC_Wait_Ack();                                 //等待应答
  19.   for(int i=0;i<Num;i++)                //读取数据
  20.   {
  21.         if(i==Num-1)        {Rdata<i>=IIC_Read_Byte(0);}//读取最后一个数据后,发送非应答命令
  22.         else            {Rdata<i>=IIC_Read_Byte(1);}//读取其他数据后,发送应答命令  
  23.   }
  24.   IIC_Stop();                                        //发送停止条件            
  25. }</i></i>
复制代码

4. 普通I/O口模拟IIC总线写入AT24C256数据
具体流程如下:
写入数据地址----此地址为读取数据的起始地址
写入数据----可以写入多字节数据
AT24Cxx系列EEPROM,页与页之间写数据需要延时10ms。
AT24C256 每页可以写64个字节数据。
页写程序如下:

  1. /**
  2.   *@功能:在一页中写多个数据
  3.   *@参数1:WriteAddr---写入数据的起始地址
  4.   *@参数2:*Wdata ---写入数据缓存的起始地址
  5.   *@参数3:        Num   ---写入数据的个数
  6.   **/
  7. void AT24C256_PageWriteData(u16 WriteAddr,u8* Wdata,u16 Num)
  8. {
  9.         IIC_Start();  
  10.         IIC_Send_Byte(0XA0);            //发送写命令
  11.         IIC_Wait_Ack();
  12.         IIC_Send_Byte(WriteAddr>>8);//发送高地址
  13.         IIC_Wait_Ack();           
  14.           IIC_Send_Byte(WriteAddr%256); //发送低地址
  15.         IIC_Wait_Ack();
  16.         for(int i=0;i<Num;i++)
  17.         {                 
  18.                 IIC_Send_Byte(Wdata); //发送字节
  19.                 IIC_Wait_Ack();
  20.         }                                       
  21.           IIC_Stop();                                         //产生一个停止条件
  22.         delay_ms(10);                                  //每写一页都需要延时10ms后再写入下一页
  23. }
复制代码

AT24C256 写入多个数据
具体程序如下:

  1. void AT24C256_WriteData(u16 WriteAddr,u8* Wdata,u16 Num)
  2. {
  3.   u16 Addr_mod=WriteAddr%64;                //起始地址在本页的位置
  4.   u16 Num1=64-Addr_mod;                                        //起始地址那一页数据个数
  5.   u16 PageNum = WriteAddr/64+1;        //起始地址在第几页
  6.   if(Addr_mod+Num<=64)
  7.   {
  8.         AT24C256_PageWriteData(WriteAddr,Wdata,Num);
  9.   }
  10.   else
  11.   {
  12.         AT24C256_PageWriteData(WriteAddr,Wdata,Num1);//写入起始地址的那一页数据
  13.         for(int i=0;i<((Num+Addr_mod)/64);i++)
  14.         {
  15.           if((Num-(i*64+Num1))>64)                //判断这页是不是最后一页
  16.           {
  17.                 AT24C256_PageWriteData((PageNum+i)*64,&Wdata[i*64+Num1],64);//中间整页写入
  18.           }
  19.           else
  20.           {
  21.                 AT24C256_PageWriteData((PageNum+i)*64,&Wdata[i*64+Num1],Num-(i*64+Num1));//最后一页写入
  22.           }
  23.         }
  24.   }
  25. }
复制代码

————————————————
版权声明:根号五



a9f8f7fc2c3b41ac827145a034930fe3.png
143cb3c4011b4fa286127ef2030ee7cc.png
收藏 评论0 发布时间:2022-9-7 14:59

举报

0个回答

所属标签

相似分享

官网相关资源

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