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

简介: 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         // 超时设置
);

ee1df7cb7b4460def2bc34df87df4476.png

在此我们写入数据用的 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 manualUM1785 Description of STM32F0 HAL and low-layer drivers24C02 DatasheetSTM32F030 Datasheet

STM32F030 Reference Manual

相关文章
|
3月前
stm32f407探索者开发板(十七)——串口寄存器库函数配置方法
stm32f407探索者开发板(十七)——串口寄存器库函数配置方法
419 0
|
4月前
使用STM32F103标准库实现定时器控制LED点亮和关闭
通过这篇博客,我们学习了如何使用STM32F103标准库,通过定时器来控制LED的点亮和关闭。我们配置了定时器中断,并在中断处理函数中实现了LED状态的切换。这是一个基础且实用的例子,适合初学者了解STM32定时器和中断的使用。 希望这篇博客对你有所帮助。如果有任何问题或建议,欢迎在评论区留言。
244 2
|
4月前
|
IDE 开发工具
使用STM32F103标准库实现自定义键盘
通过本文,我们学习了如何使用STM32F103标准库实现一个简单的自定义键盘。我们首先初始化了GPIO引脚,然后实现了一个扫描函数来检测按键状态。这个项目不仅能够帮助我们理解STM32的GPIO配置和按键扫描原理,还可以作为进一步学习中断处理和低功耗设计的基础。希望本文对你有所帮助,祝你在嵌入式开发的道路上不断进步!
431 4
|
4月前
|
传感器
【经典案例】STM32F407使用HAL库配置I2C详解
STM32F407是一个强大的微控制器,广泛应用于嵌入式系统中。在许多应用中,我们需要使用I2C总线来与传感器、EEPROM、显示屏等外设进行通信。本文将详细介绍如何使用STM32 HAL库来配置和使用I2C接口。
418 2
|
4月前
|
存储 数据采集 数据安全/隐私保护
使用STM32F103读取TF卡并模拟U盘:使用标准库实现
通过以上步骤,你可以实现用STM32F103将TF卡内容变成U盘进行读取。这种功能在数据采集、便携式存储设备等应用中非常有用。如果你有更多的需求,可以进一步扩展此项目,例如添加文件管理功能、加密存储等。希望这篇博客能帮到你,如果有任何问题,欢迎在评论区留言讨论!
147 1
|
4月前
|
开发者
【经典案例】使用HAL库配置STM32F407的SPI外设
在嵌入式系统开发中,STM32F407是一款广泛应用的微控制器,而SPI(Serial Peripheral Interface)是一种常用的通信接口。本文将详细介绍如何使用STM32的硬件抽象层(HAL)库配置STM32F407的SPI外设,并提供完整的代码示例。
306 1
|
3月前
|
传感器 编解码 API
【STM32开发入门】温湿度监测系统实战:SPI LCD显示、HAL库应用、GPIO配置、UART中断接收、ADC采集与串口通信全解析
SPI(Serial Peripheral Interface)是一种同步串行通信接口,常用于微控制器与外围设备间的数据传输。SPI LCD是指使用SPI接口与微控制器通信的液晶显示屏。这类LCD通常具有较少的引脚(通常4个:MISO、MOSI、SCK和SS),因此在引脚资源有限的系统中非常有用。通过SPI协议,微控制器可以向LCD发送命令和数据,控制显示内容和模式。
104 0
|
5月前
|
编译器 C语言 开发者
单片机原理与应用:探索微型计算机世界
单片机原理与应用:探索微型计算机世界
46 1
|
5月前
|
数据采集 数据处理 C语言
单片机:探索其原理、应用与编程实践
单片机:探索其原理、应用与编程实践
67 1
|
5月前
|
物联网
STC51单片机-实验开发装置仿真-物联网应用系统设计
STC51单片机-实验开发装置仿真-物联网应用系统设计
113 0