这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » STM32 » 【STM32F103ZET6】01:使用硬件IIC读取24C02芯片数据

共1条 1/1 1 跳转至

【STM32F103ZET6】01:使用硬件IIC读取24C02芯片数据

高工
2025-09-01 19:36:27     打赏

一: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典型待机电流

存储器组织结构

24C024,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的存储结构

07-1.png

可见 24C02 每一页最大支持64个字节长度,所以当我们存入数据时候需要注意不要超过每页的最大字节,防止自动存入到下一页。

四:24C02的时序图:4.1 24CXX支持I2C总线传输协议。12C是一种双向、两线串行通讯接口,分别是串行数据线SDA和串行时钟线SCL。

两根线都必须通过一个上拉电阻接到电源。典型的总线配置如图下所示:

01-1.png

总线上发送数据的器件被称作发送器,接收数据的器件被称作接收器。控制信息交换的器件被称作主器件,受主器件控制的器件则被称作从器件。主器件产生串行时钟SCL,控制总线的访问状态、产生START和STOP条件。24CXX在12C总线中作为从器件工作。只有当总线处于空闲状态时才可以启动数据传输。每次数据传输均开始于START条件,结束于STOP条件,二者之间的数据字节数是没有限制的,由总线上的主器件决定。信息以字节(8位)为单位传输,第9位时由接收器产生应答。

4.2

起始和停止条件数据和时钟线都为高则称总线处在空闲状态。当SCL为高电平时SDA的下降沿(高到低叫做起始条件(START,简写为S),SDA的上升沿(低到高)则叫做停止条件(STOP,简写为P)。参见下所示:

07-3.png

4.3 24C02配置地址如下所示:

07-4.png

I2C 总线允许连接多个从机设备。通过给不同的 24C02 芯片设置不同的 A2/A1/A0 组合,你可以在同一条 I2C 总线上挂载最多 8 个 24C02(或其它 24Cxx 系列)器件,而不会发生地址冲突。

五:软件代码编写:

5.1 这里我是用STM32 cube MX软件对底层驱动函数进行配置如下所示:

01-2.png

5.2 硬件IIC 写入数据操作:

/*******************************************************************************
* 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);
}

5.3 硬件IIC 读取数据操作:

/*******************************************************************************
* 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);
}

5.4 测试代码如下所示:

/*******************************************************************************
* Function Name  : void Test_24C02_EEprom(void)
* Description    : 
* Input          : 
* Output         : None
* Return         : None
*******************************************************************************/
void Test_24C02_EEprom(void)
{
    WriteBuffer24C02[0]= 0x01 ;
    WriteBuffer24C02[1]= 0x02 ;
    WriteBuffer24C02[2]= 0x03 ;
    WriteBuffer24C02[3]= 0x04 ;
    WriteBuffer24C02[4]= 0x05 ;
    WriteBuffer24C02[5]= 0x06 ;
    WriteBuffer24C02[6]= 0x07 ;

    WriteBufferTo24C02(0,&WriteBuffer24C02[0],7);
    HAL_Delay(20);
    ReadBufferTo24C02(0,&ReadBuffer24C02[0],7) ;
    HAL_UART_Transmit(&huart1, &ReadBuffer24C02[0], 7, 100); 
}

六:测试图片如下所示:

01-3.png

01-4.png

调试感想:

1:可以将需要存储的数据,通过memcpy函数,赋值给存储的buffer。

2:每次存入和读取的需要增加一定延时时间,不太明白为什么要加延时,实测不加延时的话,数据读取的都是错误。

3:最重要的一点,存入和读取的buffer,要进行取值操作,否则导致数据异常。

4:为了方便管理数据,尽量每页存储的数据不超过64个字节。

测试代码如下所示:

01_IIC_24C02.zip




关键词: STM32F103ZET6     硬件     24C02    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]