设计与开发

单片机 24c02 51单片机用C51语言实现I2C24C02存储器用法和实例

小编 2025-08-13 设计与开发 23 0

51单片机用C51语言实现I2C24C02存储器用法和实例

一、I2C24C02存储器用法步骤:

1.把24C02的SCK/SDA引脚跟单片机的管脚连接。

2.调用Bus_Initialize()进行初始化。

3.根据实际情况,调用Write_Data()/Read_Data()

二、电路图

电路

三、简单存储实例代码截图

代码

四、at24c02.h头文件代码

#include<intrins.h>

#include<AT89X51.H>//#include<REG52.H>

#define uchar unsigned char

sbit SCL=P1^6;

sbit SDA=P1^7;

/*************************************

//延时5us

*************************************/

void Delay(void)

{

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

}

/*************************************

//总线初始化

*************************************/

void Bus_Initialize(void)

{

SDA=1;

Delay();

SCL=1;

Delay();

}

/*************************************

//---启动信号,开始数据传输

*************************************/

void Start_Signal(void)

{

SDA=1;

Delay();

SCL=1;

Delay();

SDA=0;

Delay();

}

void Response_Signal(void)

{

uchar i;

SCL=1;

Delay();

while((SDA==1)&&(i<250))

i++;

SCL=0;

Delay();

}

/*************************************

//---停止信号,停止数据传输

*************************************/

void Stop_Signal(void)

{

SDA=0;

Delay();

SCL=1;

Delay();

SDA=1;

Delay();

}

void Write_One_Byte(uchar m)

{

uchar temp,i;

temp=m;

for(i=0;i<8;i++)

{

temp=temp<<1;

SCL=0;

Delay();

SDA=CY;

Delay();

SCL=1;

Delay();

}

SCL=0;

Delay();

SDA=1;

Delay();

}

uchar Read_One_Byte()

{

uchar k,i;

SCL=0;

Delay();

SDA=1;

Delay();

for(i=0;i<8;i++)

{

SCL=1;

Delay();

k=(k<<1)|SDA;

SCL=0;

Delay();

}

return k;

}

/*************************************

//写一个字节数据函数,开始写数据到存储器

*************************************/

void Write_Data(uchar address,uchar Data)

{

Start_Signal();//启动总线

Write_One_Byte(0XA0);//发送从机写地址

Response_Signal();//等待从机应答

Write_One_Byte(address); //发送从机字地址

Response_Signal();//等待从机应答

Write_One_Byte(Data);//发送字节数据

Response_Signal();//等待从机应答

Stop_Signal();//结束总线

}

/*************************************

//读一个字节数据函数,从存储器读取数据

*************************************/

uchar Read_Data(uchar address)

{

uchar Data;

Start_Signal(); //启动总线

Write_One_Byte(0XA0);//发送从机写地址

Response_Signal(); //等待从机应答

Write_One_Byte(address);//发送从机读地址

Response_Signal();//等待从机应答

Start_Signal(); //启动总线

Write_One_Byte(0XA1);//发送从机读地址

Response_Signal();//等待从机应答

Data=Read_One_Byte();//存储到DATA

Stop_Signal();//结束总线

return Data;//返回存储的数据DATA

}

STM32F0单片机快速入门九:用 I2C HAL 库读写24C02

1. 24C02介绍

24C02 现在基本是开发板的标配,对于需要掉电存储的应用来说确是不二选择。现在单片机因为内部集成了Flash存储器,一般也都支持数据的掉电保存,但相对于 24C02 这种 EEPROM 来说,使用单片机内部的 Flash 有一些需要注意的问题:

a. Flash 写入数据之前需要先执行擦除操作,而且擦除以扇区为单位。

b. Flash读写次数比 EEPROM 少很多。

c. 容易误操作,把 Flash 内部的代码擦除掉。

d. 影响中断的响应时间。

24C02 有 256 字节的数据,一般说来也够用了。它的地址是可以通过引脚配置的,这样一条 I2C 总线上就可以挂多个 24C02。如下:

我们把 A2,A1,A0 都接地,这样地址为 A0。然后 SCL,SDA 脚接 MCU 的 PB8 和 PB9。需要注意 SCL,和 SDA 需要加上拉电阻。

2. 代码

下面我们在一个 I2C 例程上面修改代码来实现 24C02 的读写。大家可以看到使用库函数的好处,基本上不用看 STM32F030 的手册,很快就能实现我们想要实现的功能。

我们用 Keil 打开下面这个工程:

STM32Cube_FW_F0_V1.11.0\Projects\STM32F030R8-Nucleo\Examples\I2C\I2C_TwoBoards_ComPolling\MDK-ARM\Project.uvprojx

Step 1, 把 I2C 地址改为跟我们硬件一致:

Step 2, 根据实际使用的 I2C 模块和引脚进行配置:

Step 3, 把地址模式改为 7BIT:

Step 4, 操作EEPROM,我们不使用例子中的 HAL_I2C_Master_Transmit 和 HAL_I2C_Master_Receive,这两个函数适用于两个 I2C 器件之间进行数据传输。我们这里要用的是下面这两个函数:

HAL_I2C_Mem_Write (

I2C_HandleTypeDef *hi2c, // 使用的 I2C 模块的 Handle 的指针

uint16_t DevAddress, // I2C 器件的地址,这里是 24C02 的地址 0xA0

uint16_t MemAddress, // 存储器内部地址

uint16_t MemAddSize, // 存储器内部地址位数 8BIT or 16BIT ?

uint8_t *pData, // 发送数据缓冲区指针

uint16_t Size, // 数据长度

uint32_t Timeout // 超时设置

);

HAL_I2C_Mem_Read (

I2C_HandleTypeDef *hi2c, // 使用的 I2C 模块的 Handle 的指针

uint16_t DevAddress, // I2C 器件的地址,这里是 24C02 的地址 0xA0

uint16_t MemAddress, // 存储器内部地址

uint16_t MemAddSize, // 存储器内部地址位数 8BIT or 16BIT ?

uint8_t *pData, // 接收数据缓冲区指针

uint16_t Size, // 接收数据长度

uint32_t Timeout // 超时设置

);

在此我们写入数据用的 24C02 的 Page Write 命令,每次写入 8个字节的数据,然后存储器写入地址加 8。要注意每次执行完写入命令后,需要有一个延时,等待 EEPROM 内部处理完该指令后才能继续写入。这个延时要查手册,不同的厂家可能有不同的数值。读出时可以连续的读出数据,无需等待。

下面是写入数据的波形,0xA0 是器件地址,0x28 是 24C02 内部存储器地址,之后是 8个字节数据。

读出数据的波形:

注意:

在使用硬件 I2C 操作时,有时候会遇到死锁问题。在此情况下,可以把 SCL,SDA 引脚初始化为 GPIO,如此例中的 PB8, PB9 然后连续翻转 SCL 引脚送出 9 个时钟脉冲,既可以使 I2C 从死锁的状态复位。然后再重新初始化 I2C 模块,进入正常 I2C 操作。

参考资料:

PM0215 STM32F0xxx Cortex-M0 programming manual

UM1785 Description of STM32F0 HAL and low-layer drivers

24C02 Datasheet

STM32F030 Datasheet

STM32F030 Reference Manual

相关问答

AT 24C02 单片机 中是如何使用的,功能是什么呢?

I2C总线由单片机控制,挂在I2C总线上的设备可以很多个,每个有独立的地址,A0,A1,A2。。。但单片机发送地址后,该地址的设备就会被激活,向单片机反馈一个应答...

at 24c02 封装尺寸?

AT24C02是Ateml公司的2KB的电可擦除存储芯片,采用两线串行的总线和单片机通讯,电压最低可以到2.5V,额定电流为1mA,静态电流10uA(5.5V),芯片内的资料可以在断...

存储器 24C02 工作时,他的晶振是由ScL提供还是由其他振荡源提供?

24C02是比较常用的的E2ROM,可以方便的储存和读取数据。它不需要外部晶振,但需要外部提供时钟信号,就是你指的SCL。它的通讯是I2C通讯,下面我就详细以24c02/01为...

英语翻译1、系统的组成框图2、89 C51 的引脚图3、 单片机 最小系...

[最佳回答]1,systemcompositiondiagram2,the89C51pindiagram3andsingle-chipmicrocomputersmallestsystem...

24c 08怎么用?用 单片机 控制的?

AT24c08,属于非易失的存储器件,只占用单片机的两个引脚。它使用IIC总线,是一种特殊串行数据的规范,介绍起来比较麻烦,网上有很多资料可供查询。AT24c08,属于...

24C 04芯片在 单片机 实验板上干什么用?

24c04是采用铁电技术生产的EEPROM,掉电后数据不丢失。相比传统的EEPROM具有寿命长,读写速度快的优点,采用I2C总线与外界通讯,容量应该是512字节。主要用于存...

8位 单片机 如何实现AT 24C 04对32数据的储存?

一个字节一个字节的存入就可以了。4个字节一组,反正AT24C04也是用IO口模拟IIC来实现。一个字节一个字节的存入就可以了。4个字节一组,反正AT24C04也是用IO口...

求助,用 24C 04和LCD1602做的 单片机 密码锁设计的问题?

你意思是初始密码怎么写进去吗?会读写EEPROM就行,根本不需bin文件可以直接在程序里写,也可以先编写一个专门写24C04的程序你意思是初始密码怎么写进去吗?会...

用51 单片机 做一个模拟 I2c 的实验,E2PROM用的是at 24c5 12b,但是...

24C512的地址位是16位的,不能只传送八位地址位2条回答:延时函数有问题!

新手自学 单片机 ,用什么样的开发板比较好?

开发板是用来学习单片机最有用的工具,上面集成了常用的单片机外设电路,可以让初学者很方便的学习硬件电路的设计方法、控制方法和单片机寄存器、片上资源的编程...

猜你喜欢