硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1224|回复: 11
收起左侧

[其它] 向大伙请教个I2C的问题

[复制链接]

8

主题

134

回帖

168

积分

初级会员

积分
168
发表于 2022-12-3 21:11:02 | 显示全部楼层 |阅读模式
使用硬汉的软件模拟I2C驱动 AT24C64,不知为何只要一次性写入数量为500个就出现程序不正常。
1.png
2.png
回复

使用道具 举报

8

主题

134

回帖

168

积分

初级会员

积分
168
 楼主| 发表于 2022-12-3 21:55:21 | 显示全部楼层
刚在坛里看到了相关EEPROM的帖子,周一更新再试试。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106844
QQ
发表于 2022-12-4 12:13:51 | 显示全部楼层
此贴三楼分享。

注意AT24C01/02/04/08/16/128发送设备地址时,8位数据的不同含义
https://www.armbbs.cn/forum.php?mod=viewthread&tid=87557

之前LUA也写了一个。
H7-TOOL的I2C控制器驱动EEPROM操作说明,支持AT24C02/04/08/16/32/64/128,仅需读写两个函数,随意访问(2021-10-24)
https://www.armbbs.cn/forum.php?mod=viewthread&tid=109261


回复

使用道具 举报

8

主题

134

回帖

168

积分

初级会员

积分
168
 楼主| 发表于 2022-12-5 08:19:28 | 显示全部楼层
eric2013 发表于 2022-12-4 12:13
此贴三楼分享。

注意AT24C01/02/04/08/16/128发送设备地址时,8位数据的不同含义

好的,我 了解一下,谢谢!
回复

使用道具 举报

8

主题

134

回帖

168

积分

初级会员

积分
168
 楼主| 发表于 2022-12-5 11:06:43 | 显示全部楼层
找到原因了,EEPROM存储数量大后造成了任务堆栈溢出,因为我在操作EEPROM的函数里用了多次读出对比来保证数据完整性,从而定义的局部变量过大。加大任务堆栈解决。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106844
QQ
发表于 2022-12-6 10:15:13 | 显示全部楼层
litin326 发表于 2022-12-5 11:06
找到原因了,EEPROM存储数量大后造成了任务堆栈溢出,因为我在操作EEPROM的函数里用了多次读出对比来保证数 ...

好的,解决了就好。
回复

使用道具 举报

32

主题

103

回帖

199

积分

高级会员

积分
199
发表于 2022-12-19 13:25:33 | 显示全部楼层
litin326 发表于 2022-12-5 11:06
找到原因了,EEPROM存储数量大后造成了任务堆栈溢出,因为我在操作EEPROM的函数里用了多次读出对比来保证数 ...

是模拟iic吗?中间的延时,会不会被任务切换、中断打断
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106844
QQ
发表于 2022-12-19 15:06:52 | 显示全部楼层
伊森亨特 发表于 2022-12-19 13:25
是模拟iic吗?中间的延时,会不会被任务切换、中断打断

大部分情况下不会,这里有个关键的地方是I2C器件大部分都是边沿触发,所以高低电平期间被打断影响不大。
还要就是你的程序做好I2C的应答处理就行,可以有效排查错误通信。
回复

使用道具 举报

32

主题

103

回帖

199

积分

高级会员

积分
199
发表于 2022-12-20 08:47:37 | 显示全部楼层
eric2013 发表于 2022-12-19 15:06
大部分情况下不会,这里有个关键的地方是I2C器件大部分都是边沿触发,所以高低电平期间被打断影响不大。
...

直接用你的iic代码就行吧。我看例程里延时是用累加实现的,不同频率,比如72M,168M应该不一样吧
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106844
QQ
发表于 2022-12-20 10:28:17 | 显示全部楼层
伊森亨特 发表于 2022-12-20 08:47
直接用你的iic代码就行吧。我看例程里延时是用累加实现的,不同频率,比如72M,168M应该不一样吧

直接使用即可
回复

使用道具 举报

19

主题

371

回帖

428

积分

高级会员

积分
428
发表于 2022-12-20 21:07:40 | 显示全部楼层
伊森亨特 发表于 2022-12-20 08:47
直接用你的iic代码就行吧。我看例程里延时是用累加实现的,不同频率,比如72M,168M应该不一样吧

用模拟方式:
1. 一般带clk线的(比如spi,i2c等,是按照clk采样的)通讯,被其他中断打断也不怕
2. 异步uart(是按时钟频率的绝对值采样,要求很严格)就不行
回复

使用道具 举报

32

主题

103

回帖

199

积分

高级会员

积分
199
发表于 2022-12-29 13:22:57 | 显示全部楼层
h_007 发表于 2022-12-20 21:07
用模拟方式:
1. 一般带clk线的(比如spi,i2c等,是按照clk采样的)通讯,被其他中断打断也不怕
2. 异 ...

i2c时序里有延时,如果被打断,相当于延时时间加长了,会通信失败吧。
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-7 09:55 , Processed in 0.279487 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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