单片机
返回首页

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

2022-09-20 来源:csdn

一、AT24Cxx系列芯片简介

EEPROM是指带电可擦可编程只读存储器,一种掉电后数据不丢失的存储芯片。

AT24Cxx系列芯片是EEPROM芯片的一种,它是基于IIC总线的存储器件,遵循二线制协议,由于其具有接口方便,体积小,数据掉电不丢失等特点,在仪器仪表及工业自动化控制中得到大量的应用。


AT24Cxx系列芯片 在电路中的主要作用就是在 掉电的情况下保存数据。


1. 存储结构

image.png

2. 引脚

AT24C02,AT24C32,AT24C64,AT24C128,AT24C256

这五种型号的芯片,引脚图都如下所示:

在这里插入图片描述

引脚说明如下:

image.png

AT24C04,AT24C08,AT24C16

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

在这里插入图片描述

image.png

AT24C512

引脚图都如下所示:

在这里插入图片描述

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


3. 原理图

在这里插入图片描述

4. 从控设备地址

从控设备地址前4位,所有型号都是一样的。

随后3位是A2,A1和A0为硬件地址位,与硬件输入引脚一致;P2,P1和P0为数据地址高位。

最后1位是读/写选择位,1为读操作,0为写操作。

image.png

二、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

image.png

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));//最后一页写入

  }

}

  }

}

进入单片机查看更多内容>>
相关视频
  • 【TI MSPM0 应用实战】智能小车+工业角度编码器+血氧仪+烟雾探测器!硬核参考设计详解!

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

  • 直播回放: Microchip Timberwolf™ 音频处理器在线研讨会

  • 基于灵动MM32W0系列MCU的指夹血氧仪控制及OTA升级应用方案分享

精选电路图
  • 1瓦四级调频发射机

  • 500W MOS场效应管电源逆变器,12V转110V/220V

  • 12V 转 28V DC-DC 变换器(基于 LM2585)

  • 红外开关

  • 12V转110V/220V 500W逆变器

  • DS1669数字电位器

    相关电子头条文章