一、AT24Cxx系列芯片简介
EEPROM是指带电可擦可编程只读存储器,一种掉电后数据不丢失的存储芯片。
AT24Cxx系列芯片是EEPROM芯片的一种,它是基于IIC总线的存储器件,遵循二线制协议,由于其具有接口方便,体积小,数据掉电不丢失等特点,在仪器仪表及工业自动化控制中得到大量的应用。
AT24Cxx系列芯片 在电路中的主要作用就是在 掉电的情况下保存数据。
1. 存储结构
2. 引脚
AT24C02,AT24C32,AT24C64,AT24C128,AT24C256
这五种型号的芯片,引脚图都如下所示:
引脚说明如下:
AT24C04,AT24C08,AT24C16
这三种型号的芯片,引脚图都如下所示:
AT24C512
引脚图都如下所示:
A0和A1是硬件地址,NC空脚可接地,总线上同时级联4个AT24C512器件。
3. 原理图
4. 从控设备地址
从控设备地址前4位,所有型号都是一样的。
随后3位是A2,A1和A0为硬件地址位,与硬件输入引脚一致;P2,P1和P0为数据地址高位。
最后1位是读/写选择位,1为读操作,0为写操作。
二、IIC总线的数据传输
IIC总线上的每一个设备都可以作为主设备或者从设备。
每一个设备都有对应一个唯一的设备地址,设备地址就是通过A2,A1和A0物理接地和拉高决定,主从设备之间就通过设备地址来确定与哪个器件进行通信。
这次以STM32F103开发板为主控,以AT24Cxx为从控。
1. IIC总线数据传输协议
主控设备在传输有效数据之前要先指定从控设备地址,然后确定数据传输方向 (0表示主控向从控写数据,1表示主控向从控读数据),然后传输数据。
2. IIC总线主控写数据
IIC总线主控写数据时序图
主要流程:
主控发送起始条件
主控发送从控设备地址
主控发送写操作
主控等待从控应答:应答失败,主控发送停止条件;
应答成功进行下一步
从控应答后,主控发送要写入的数据
主控等待从控应答:应答失败,主控发送停止条件;
应答成功,进行下一步
主控数据发送未完:重复5和6步骤;
主控数据发送完毕:主控发送停止条件
3. IIC总线主控读数据
IIC总线主控读数据时序图
主要流程:
主控发送起始条件
主控发送从控设备地址
主控发送*读操作**
主控等待从控应答:应答失败,主控发送停止条件;
应答成功进行下一步
从控应答后,主控读取从控发送的数据
主控发送应答:应答失败,主控发送停止条件;
应答成功,重复5和6步骤
三、普通I/O口模拟IIC总线读写AT24C256
1. 原理图
2. IIC总线底层驱动程序
文章链接:STM32F103标准库开发—IIC主控实验—普通I/O口模拟—基本原理和底层驱动程序
3. 普通I/O口模拟IIC总线读取AT24C256数据
具体流程如下:
写入数据地址----此地址为读取数据的起始地址
读取数据----可以读取多字节数据
具体程序如下:
- /**
- *@功能:读取指定字节数据
- *@参数1:ReadAddr---读取数据的起始地址
- *@参数2:*Rdata ---读取到的数据缓存起始地址
- *@参数3: Num ---读取数据的个数
- **/
- void AT24C256_ReadData(u16 ReadAddr, u8* Rdata, u16 Num)
- {
- IIC_Start(); //发送起始条件
- IIC_Send_Byte(0XA0); //发送写命令
- IIC_Wait_Ack(); //等待应答
- IIC_Send_Byte(ReadAddr>>8); //发送高地址
- IIC_Wait_Ack(); //等待应答
- IIC_Send_Byte(ReadAddr%256); //发送低地址
- IIC_Wait_Ack(); //等待应答
- IIC_Start(); //发送起始条件
- IIC_Send_Byte(0XA1); //发送读命令
- IIC_Wait_Ack(); //等待应答
- for(int i=0;i<Num;i++) //读取数据
- {
- if(i==Num-1) {Rdata<i>=IIC_Read_Byte(0);}//读取最后一个数据后,发送非应答命令
- else {Rdata<i>=IIC_Read_Byte(1);}//读取其他数据后,发送应答命令
- }
- IIC_Stop(); //发送停止条件
- }</i></i>
复制代码
4. 普通I/O口模拟IIC总线写入AT24C256数据
具体流程如下:
写入数据地址----此地址为读取数据的起始地址
写入数据----可以写入多字节数据
AT24Cxx系列EEPROM,页与页之间写数据需要延时10ms。
AT24C256 每页可以写64个字节数据。
页写程序如下:
- /**
- *@功能:在一页中写多个数据
- *@参数1:WriteAddr---写入数据的起始地址
- *@参数2:*Wdata ---写入数据缓存的起始地址
- *@参数3: Num ---写入数据的个数
- **/
- void AT24C256_PageWriteData(u16 WriteAddr,u8* Wdata,u16 Num)
- {
- IIC_Start();
- IIC_Send_Byte(0XA0); //发送写命令
- IIC_Wait_Ack();
- IIC_Send_Byte(WriteAddr>>8);//发送高地址
- IIC_Wait_Ack();
- IIC_Send_Byte(WriteAddr%256); //发送低地址
- IIC_Wait_Ack();
- for(int i=0;i<Num;i++)
- {
- IIC_Send_Byte(Wdata); //发送字节
- IIC_Wait_Ack();
- }
- IIC_Stop(); //产生一个停止条件
- delay_ms(10); //每写一页都需要延时10ms后再写入下一页
- }
复制代码
AT24C256 写入多个数据
具体程序如下:
- void AT24C256_WriteData(u16 WriteAddr,u8* Wdata,u16 Num)
- {
- u16 Addr_mod=WriteAddr%64; //起始地址在本页的位置
- u16 Num1=64-Addr_mod; //起始地址那一页数据个数
- u16 PageNum = WriteAddr/64+1; //起始地址在第几页
- if(Addr_mod+Num<=64)
- {
- AT24C256_PageWriteData(WriteAddr,Wdata,Num);
- }
- else
- {
- AT24C256_PageWriteData(WriteAddr,Wdata,Num1);//写入起始地址的那一页数据
- for(int i=0;i<((Num+Addr_mod)/64);i++)
- {
- if((Num-(i*64+Num1))>64) //判断这页是不是最后一页
- {
- AT24C256_PageWriteData((PageNum+i)*64,&Wdata[i*64+Num1],64);//中间整页写入
- }
- else
- {
- AT24C256_PageWriteData((PageNum+i)*64,&Wdata[i*64+Num1],Num-(i*64+Num1));//最后一页写入
- }
- }
- }
- }
复制代码
————————————————
版权声明:根号五
|