STM32F4 读写 AT24C512问题

移植正点原子对IC2,驱动程序读数据正确(使用写好的AT24C512测试,说明器件地址没有问题),但无法写入数据,驱动函数中,数据写入的用到的函数,数据读取都用的到,示波器检查IO配置正确(不正确的话,数据读取也不会出错),延时时间正确(排除时钟配置问题);

问题陆陆续续扣了两天才找到原因,

iic时序问题,iic停止函数中停止建立时间太短,官方数据手册最小时间为0.25us,原子哥的程序停止信号需要改善,增加延时就ok.

### STM32F4AT24C16 EEPROM的兼容性 STM32F4系列微控制器支持多种通信协议,其中包括I²C总线规范rev03,该规范具备从机模式和主机模式、多主机功能以及不同传输速率的支持——标准模式(高达100kHz)、快速模式(高达400kHz),甚至超快速模式(高达1MHz)。这些特性使得STM32F4能够很好地适配基于I²C接口的各种外围器件,包括但不限于EEPROM芯片如AT24C16[^3]。 对于AT24C16而言,这是一款采用I²C串行接口的低功耗CMOS电可擦除存储器(EEPROM),其容量为16Kbits,即2KB字节空间。它通常用于保存少量但重要的数据或参数设定值,在断电情况下仍能保持所存信息不变。由于遵循通用的I²C协议标准,因此可以方便地连接到任何具有相应硬件资源并实现相同协议栈处理逻辑的MCU上工作,比如这里提到的STM32F4平台[^2]。 ### 应用实例:通过STM32F4读写AT24C16中的数据 为了展示如何利用STM32F4来操作AT24C16,下面给出一段简单的代码片段作为参考: #### 初始化部分 ```c // 假设已经在CubeMX中完成了必要的配置,并生成了初始化代码 void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_I2C1_Init(void); int main(void){ HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_I2C1_Init(); // 对应于上述描述中的I2C初始化过程 while (1){ // 主循环体... } } ``` #### 数据读取/写入函数定义 ```c #include "stm32f4xx_hal.h" #define AT24C16_ADDRESS 0xA0 << 1 // 设备地址左移一位得到实际使用的7-bit I2C地址加上R/W位 uint8_t ReadByteFromAT24C16(uint16_t memAddress){ uint8_t data; HAL_I2C_Mem_Read(&hi2c1, AT24C16_ADDRESS, memAddress, I2C_MEMADD_SIZE_8BIT, &data, 1, HAL_MAX_DELAY); return data; } void WriteByteToAT24C16(uint16_t memAddress, uint8_t byteData){ HAL_I2C_Mem_Write(&hi2c1, AT24C16_ADDRESS, memAddress, I2C_MEMADD_SIZE_8BIT, &byteData, 1, HAL_MAX_DELAY); } ``` 以上代码展示了基本的操作流程,其中`ReadByteFromAT24C16()` 和 `WriteByteToAT24C16()` 函数分别实现了单个字节级别的读取和写入动作。需要注意的是,具体的应用场景可能还需要考虑更多的细节问题,例如错误检测机制的设计等[^4]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值