良许Linux教程网 干货合集 STM32F0单片机快速入门九 用 I2C HAL 库读写24C02

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

1.24C02介绍

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

a. 写入Flash数据之前需要进行擦除操作,并且擦除操作是以扇区为单位进行的。

b. 与EEPROM相比,Flash的读写次数有限,次数较少。

c. 容易误操作,可能会擦除Flash内部的代码。

d. 对中断的响应时间会产生影响。

24C02具有256字节的存储容量,通常来说已经足够使用了。它的地址可以通过引脚配置,这样在同一条I2C总线上可以连接多个24C02。示例如下:

image-20231016214644514
image-20231016214644514

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

image-20231016214649898
image-20231016214649898

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 地址改为跟我们硬件一致:

image-20231016214655639
image-20231016214655639

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

image-20231016214659063
image-20231016214659063

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

image-20231016214702350
image-20231016214702350

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 // 超时设置

);

image-20231016214707906
image-20231016214707906

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

image-20231016214711458
image-20231016214711458

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

image-20231016214714314
image-20231016214714314

读出数据的波形:

image-20231016214717382
image-20231016214717382

注意:

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

以上就是良许教程网为各位朋友分享的Linu系统相关内容。想要了解更多Linux相关知识记得关注公众号“良许Linux”,或扫描下方二维码进行关注,更多干货等着你 !

137e00002230ad9f26e78-265x300
本文由 良许Linux教程网 发布,可自由转载、引用,但需署名作者且注明文章出处。如转载至微信公众号,请在文末添加作者公众号二维码。
良许

作者: 良许

良许,世界500强企业Linux开发工程师,公众号【良许Linux】的作者,全网拥有超30W粉丝。个人标签:创业者,CSDN学院讲师,副业达人,流量玩家,摄影爱好者。
上一篇
下一篇

发表评论

1条评论

联系我们

联系我们

公众号:良许Linux

在线咨询: QQ交谈

邮箱: yychuyu@163.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部