STM32F103标准库开发---IIC主控实验---普通I/O口模拟---读写AT24Cxx系列EEPROM实验
2022-09-20 来源:csdn
一、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 { if(i==Num-1) {Rdata[i]=IIC_Read_Byte(0);}//读取最后一个数据后,发送非应答命令 else {Rdata[i]=IIC_Read_Byte(1);}//读取其他数据后,发送应答命令 } IIC_Stop(); //发送停止条件 } 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 IIC_Send_Byte(Wdata[i]); //发送字节 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));//最后一页写入 } } } }
- 基于STM32F103的AS5600磁编码器角度数据采集
- 基于STM32F103单片机的示波器设计
- STM32F103C8T6开发板+GY521制作无刷四轴飞控详细图文教程
- 入门STM32F103-GPIO输入
- STM32F103C8T6制作舵机/电调测试仪详细图文教程 | 定时器触发ADC | DMA传输 | PWM输出
- STM32F103的硬件I2C调试记录
- 【讲义】STM32的IAP技术,基于CAN总线的STM32F103 BootLoader设计
- 【 STM 系列 】STM32F103 流水灯仿真
- 基于STM32F103C8T6和L298N电机驱动模块调速实验NO.1
- 使用Makefile在Windows环境下编译STM32F103C8T6标准库工程,脱离Keil的指南
- 六大全新产品系列推出,MCX A微控制器家族迎来创新
- 意法半导体全新STM32C5系列,重新定义入门级微控制器性能与价值,赋能万千智能设备
- 从控制到系统:TI利用边缘AI重塑嵌入式MCU的边界
- 模组复用与整机重测在SRRC、CCC、CTA/NAL认证中的实践操作指南
- 有源晶振与无源晶振的六大区别详解
- 英飞凌持续巩固全球微控制器市场领导地位
- 使用 Keil Studio for Visual Studio Code开发 STM32 设备
- 蓝牙信道探测技术原理与开发套件实践
- LoRa、LoRaWAN、NB-IoT与4G DTU技术对比及工业无线方案选型分析
- Microchip 推出生产就绪型全栈边缘 AI 解决方案,赋能MCU和MPU实现 智能实时决策




