找回密码
 立即注册
查看: 26|回复: 5

26-I2C接口通过DMA读写AT24C02数据保存不成功问题

[复制链接]
  • 打卡等级:偶尔看看I
  • 打卡总天数:14
  • 最近打卡:2025-08-22 09:29:09

10

主题

23

回帖

412

积分

中级会员

积分
412
发表于 昨天 09:29 | 显示全部楼层 |阅读模式

使用例程
image.png
的AT24C02读写程序。实际调试过程中遇到了这样一个问题,如下程序所示,我先后保存两个数据,不延时的话,第2个数据保存不成功。延时100ms后才行的。
image.png

不知道是程序问题还是AT24C02的读写不能太快问题,请教一下各位大神,谢谢啦!

一下是IIC和DMA的配置程序。

1.png

2.png

回复

使用道具 举报 送花

3

主题

2031

回帖

910

积分

等待验证会员

积分
910
发表于 昨天 09:33 | 显示全部楼层
针对您在使用I2C接口通过DMA读写AT24C02时遇到的“保存第二个数据不成功”问题,以下是专业分析与建议:

一、问题现象描述  
您在使用I2C接口配合DMA进行AT24C02读写操作时,发现未添加延时的情况下,第二个数据无法成功保存;而加入100ms延时后,问题得以解决。这表明可能存在以下两种情况之一:

1. I2C通信速率过快导致AT24C02未能及时响应;
2. DMA配置或I2C协议未正确处理应答信号(ACK/NACK)。

二、可能原因分析  

1. AT24C02的写入时序限制  
   AT24C02是I2C总线设备,其写入操作需要满足一定的时序要求。根据AT24C02的数据手册,其内部写入操作需一定时间完成(通常为5ms以内)。如果在前一次写入尚未完成时再次发起写入请求,可能导致第二次写入失败。因此,若程序中未等待前次写入完成,就立即发起下一次写入,将导致数据无法保存。

2. I2C通信未正确处理应答信号  
   在I2C通信过程中,主设备在发送地址和数据后,必须检查从设备是否返回ACK(应答)信号。若未正确处理ACK/NACK,可能导致通信中断或数据丢失。特别是在DMA传输模式下,若未设置适当的中断或查询机制,可能会忽略该信号,造成数据未被正确写入。

3. DMA传输未完成即发起下一次操作  
   在DMA模式下,若未确保前一次DMA传输完成,就直接发起下一次传输,可能导致数据覆盖或未正确写入。因此,建议在每次DMA传输完成后,通过状态寄存器或中断确认传输是否完成,再进行下一步操作。

三、解决方案建议  

1. 增加写入完成检测机制  
   在每次向AT24C02写入数据后,应等待其内部写入完成。可以通过以下方式实现:
使用I2C轮询方式,在发送写入命令后,持续检查AT24C02是否返回ACK;
或者在发送写入命令后,等待至少5ms(根据AT24C02数据手册),以确保写入操作完成。

2. 确保DMA传输完成后再执行下一次操作  
   在DMA传输过程中,应通过DMA状态寄存器或中断标志位确认传输是否完成。例如,在STM32中可通过DMAGetFlagStatus()函数检查DMA传输是否完成,确保前一次传输结束后再发起下一次传输。

3. 优化I2C通信逻辑  
   确保I2C通信流程符合标准协议,包括:
正确发送起始条件(START);
发送设备地址及读/写位;
发送寄存器地址;
发送数据;
接收应答信号(ACK/NACK);
发送停止条件(STOP)。

4. 检查I2C时钟频率设置  
   I2C总线的时钟频率应控制在AT24C02支持的范围内(一般为400kHz或1MHz)。若时钟频率过高,可能导致AT24C02无法及时响应。可尝试降低I2C时钟频率,观察是否能解决问题。

四、参考代码示例(基于STM32 HAL库)  

```c
// 写入AT24C02函数
void AT24C02Write(uint8t devaddr, uint16t regaddr, uint8t data) {
    uint8t txdata[2];
    txdata[0] = (regaddr >> 8) & 0xFF;
    txdata[1] = regaddr & 0xFF;
    txdata[2] = data;

    // 发送起始条件
    HALI2CMasterTransmit(&hi2c1, devaddr > 8) & 0xFF;
    txdata[1] = regaddr & 0xFF;

    // 发送起始条件并发送寄存器地址
    HALI2CMasterTransmit(&hi2c1, devaddr

[本文内容由国芯人工智能辅助生成,仅供参考]
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:536
  • 最近打卡:2025-08-23 05:54:51
已绑定手机

86

主题

5977

回帖

1万

积分

超级版主

积分
10824
发表于 昨天 09:45 | 显示全部楼层
检查主时钟频率是否和例程一致,不同厂商的24C02也有可能不同,具体查看数据手册
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:276
  • 最近打卡:2025-08-23 14:05:57
已绑定手机

80

主题

2979

回帖

6355

积分

荣誉版主

无情的代码机器

积分
6355
发表于 昨天 10:21 | 显示全部楼层

用Ai8051U实验箱测试2ms间隔也能连续写入。

建议间隔5ms以上,具体看各家手册。
截图202508221019223461.jpg
三天不学习,赶不上刘少奇~
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:14
  • 最近打卡:2025-08-22 09:29:09

10

主题

23

回帖

412

积分

中级会员

积分
412
发表于 昨天 14:46 | 显示全部楼层
Debu*** 发表于 2025-8-22 09:45
检查主时钟频率是否和例程一致,不同厂商的24C02也有可能不同,具体查看数据手册 ...

例程是22MHZ,我的是33MHZ。但这与主时钟有什么关系呢?
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:14
  • 最近打卡:2025-08-22 09:29:09

10

主题

23

回帖

412

积分

中级会员

积分
412
发表于 昨天 14:48 | 显示全部楼层
erci*** 发表于 2025-8-22 10:21
用Ai8051U实验箱测试2ms间隔也能连续写入。

建议间隔5ms以上,具体看各家手册。

噢,那应该就是这个原因了。多谢多谢
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-8-23 16:44 , Processed in 0.110763 second(s), 77 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表