一:24C02芯片介绍:
24C02是一款2048位串行可擦除可编程只读存储器(EEPROM),组织为256个8位字。该设备采用先进的CMOS工艺制造,适用于低功耗和低电压应用。提供多种封装选项,包括8引脚DIP、8引脚SOP、8引脚MSOP、8引脚TSSOP、8引脚DFN和5引脚SOT-23/TSOT-23。标准2线双向串行接口用于所有读写功能。
二:24Cxx芯片特点:
宽范围的工作电压1.8V~5.5V低电压技术
-1mA典型工作电流
-1uA典型待机电流
存储器组织结构
24C02,256 X8(2K bits)
-24C04,512 X8(4K bits)
-24C08,1024X8(8K bits)
-24C16,2048 x8(16K bits)
-24C32,4096 X8(32K bits)
-24C64.8192X8(64K bits)2线串行接口,完全兼容12C总线12C时钟频率为1MHz(5V),400 kHz(1.8V,2.5V,2.7V)
施密特触发输入噪声抑制
硬件数据写保护
内部写周期(最大5 ms)
可按字节写
页写:8字节页(24C02),16字节页(24C04/08/16),32字节页(24C32164)
可按字节,随机和序列读
自动递增地址
ESD保护大于2.5kV
T24C02A
高可靠性
擦写寿命:100万次
-数据保持时间:100年
8-pin DIP和8-pin SOP封装
无铅工艺,符合RoHS标准
三:24Cxx的存储结构
可见 24C02 每一页最大支持64个字节长度,所以当我们存入数据时候需要注意不要超过每页的最大字节,防止自动存入到下一页。
四:24C02的时序图:
4.1 24CXX支持I2C总线传输协议。12C是一种双向、两线串行通讯接口,分别是串行数据线SDA和串行时钟线SCL。两根线都必须通过一个上拉电阻接到电源。典型的总线配置如图下所示:
总线上发送数据的器件被称作发送器,接收数据的器件被称作接收器。控制信息交换的器件被称作主器件,受主器件控制的器件则被称作从器件。主器件产生串行时钟SCL,控制总线的访问状态、产生START和STOP条件。24CXX在12C总线中作为从器件工作。只有当总线处于空闲状态时才可以启动数据传输。每次数据传输均开始于START条件,结束于STOP条件,二者之间的数据字节数是没有限制的,由总线上的主器件决定。信息以字节(8位)为单位传输,第9位时由接收器产生应答。
4.2
起始和停止条件数据和时钟线都为高则称总线处在空闲状态。当SCL为高电平时SDA的下降沿(高到低叫做起始条件(START,简写为S),SDA的上升沿(低到高)则叫做停止条件(STOP,简写为P)。参见下所示:
4.3 24C02 配置地址如下所示:
I2C 总线允许连接多个从机设备。通过给不同的 24C02 芯片设置不同的 A2/A1/A0 组合,你可以在同一条 I2C 总线上挂载最多 8 个 24C02(或其它 24Cxx 系列)器件,而不会发生地址冲突。
五:代码编写过程如下:
5.1 芯片的原理图:
可见,该芯片直接连接到硬件的IIC接口,我们直接使用硬件的IIC来操作该款芯片
5.2 STM32 cube MX软件配置如下所示:
5.3 代码如下所示:
写入eeprom操作代码:
/*******************************************************************************
* Function Name : void WriteBufferTo24C02(int addr,uint8_t *pdata,char length)
* Description :
* Input :
* Output : None
* Return : None
*******************************************************************************/
void WriteBufferTo24C02(int addr,uint8_t *pdata,char length)
{
HAL_I2C_Mem_Write(&hi2c1, ADDR_WR_AT24CXX, addr, I2C_MEMADD_SIZE_16BIT, pdata, length, 1000);
}
读取eeprom操作代码:
/*******************************************************************************
* Function Name : void ReadBufferTo24C02(int addr,uint8_t *pdata,char length)
* Description :
* Input :
* Output : None
* Return : None
*******************************************************************************/
void ReadBufferTo24C02(int addr,uint8_t *pdata,char length)
{
HAL_I2C_Mem_Read(&hi2c1, ADDR_RD_AT24CXX, addr, I2C_MEMADD_SIZE_16BIT, pdata, length, 1000);
}
测试代码如下所示:
WriteBuffer24C02[0]= 0xFA ;
WriteBuffer24C02[1]= 0xFB ;
WriteBuffer24C02[2]= 0xFC ;
WriteBuffer24C02[3]= 0x05 ;
WriteBuffer24C02[4]= 0xC0 ;
WriteBuffer24C02[5]= 0x01 ;
WriteBuffer24C02[6]= 0x02 ;
WriteBufferTo24C02(0,&WriteBuffer24C02[0],7);
HAL_Delay(20);
ReadBufferTo24C02(0,&ReadBuffer24C02[0],7) ;
HAL_UART_Transmit(&huart1, &ReadBuffer24C02[0], 7, 100);
实物验证图如下所示:
后记:
1:可以将需要存储的数据,通过memcpy函数,赋值给存储的buffer。
2:每次存入和读取的需要增加一定延时时间,不太明白为什么要加延时,实测不加延时的话,数据读取的都是错误。
(稍后拿逻辑分析仪测试一下。)
3:最重要的一点,存入和读取的buffer,要进行取值操作,否则导致数据异常。
4:为了方便管理数据,尽量每页存储的数据不超过64个字节。
全部评论