OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4088|回复: 3

I2C读24C04的时间和估算的差异太大,到底是什么原因?

[复制链接]

21

主题

151

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
423
金钱
423
注册时间
2017-4-1
在线时间
73 小时
发表于 2020-12-23 15:36:17 | 显示全部楼层 |阅读模式
5金钱
本帖最后由 bucker 于 2020-12-23 15:43 编辑

用F4开发板做了CubeMX环境下的用I2C接口读取24C04的试验,I2C总线使用100kHz的时钟,试验前先启动定时器TIM5,然后用HAL_I2C_Mem_Read()函数一次读取4个字节数据,再关闭定时器TIM5,测得读取24C04共耗时330uS。TIM5的内部时钟为168MHz,预分频系数为167,这样,当TIM5停止时的计数值就是耗时数,单位为uS。

无标题.jpg


按照24C04的读取时序,进行一次随机多字节读取需要经历2次开始信号,两次器件地址字节,一次寄存器地址字节,然后是读取的数据字节,其中还包含应答位。如果将应答位算在字节中,那么每传输一字节需要9个时钟周期,这意味着所需的时钟周期大致应该是2(2次启动信号)+9*3(两次器件地址+一次寄存器地址)+9*4(传输4个字节数据)=65(时钟周期)。以100kHz时钟计算,65个时钟周期应该是650uS,这就与实测的TIM5的值差距太大。


最佳答案

查看完整内容[请看2#楼]

原因找到了,主要还是想当然的认为定时器的时钟频率就是系统频率。实际上定时器最高时钟频率是84MHz,而我以前使用F1或F401都是用系统频率没错,但没注意F407的差异,误以为定时器的时钟频率为168MHz了。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

21

主题

151

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
423
金钱
423
注册时间
2017-4-1
在线时间
73 小时
 楼主| 发表于 2020-12-23 15:36:18 | 显示全部楼层
原因找到了,主要还是想当然的认为定时器的时钟频率就是系统频率。实际上定时器最高时钟频率是84MHz,而我以前使用F1或F401都是用系统频率没错,但没注意F407的差异,误以为定时器的时钟频率为168MHz了。
回复

使用道具 举报

22

主题

2251

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4471
金钱
4471
注册时间
2013-4-22
在线时间
335 小时
发表于 2020-12-23 20:46:06 | 显示全部楼层
貌似不能这么测试,得用CYCCNT精准测量。建议看下ucos-III代码关于时间戳的计算。定时器的误差很大的。
回复

使用道具 举报

21

主题

151

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
423
金钱
423
注册时间
2017-4-1
在线时间
73 小时
 楼主| 发表于 2020-12-27 10:05:35 | 显示全部楼层
三叶草 发表于 2020-12-23 20:46
貌似不能这么测试,得用CYCCNT精准测量。建议看下ucos-III代码关于时间戳的计算。定时器的误差很大的。

也就是进行粗略估算就可以满足要求了。
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-3-1 06:31

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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