STM32 I2C模块的的时钟延展功能

编程入门 行业动态 更新时间:2024-10-10 00:25:41

STM32 I2C模块的的<a href=https://www.elefans.com/category/jswz/34/1769919.html style=时钟延展功能"/>

STM32 I2C模块的的时钟延展功能

时钟延展是从的一项功能,该功能可以使得从设备具有拉低主时钟的能力,以应对从设备写数效率低时让主机等待而不是继续往发时钟,进而接收到错误的数据。

之所以出现从设备写数效率低,源自于从设备可能比较老旧,工作的主频低于或远低于主设备,此时只要有时钟延展功能,就不用害怕主从无法通讯。

举例子:

从设备采用STM32F407IGT6芯片的I2C模块,其I2C模块默认开启时钟延展功能,用该设备与另外一个相同的芯片通讯,但其速率比从设备快。

通讯采用主发从手,主设备将通过识别自身TXE进行发数,接收方只能通过识别BTF来接收数据,因为主设备的主频快,发送速度快,若接收方通过识别RXNE进行收数则将导致漏掉很多数,BTF在接收一个数没读时又收到一个数就会拖住时钟,从而让主设备停下来等等从设备。

若 从发主收,从的发送效率低,而主的时钟在收到数以后就会不停地出,但从设备只要数据寄存器一空,然后移位寄存器里没东西,那BTF立马就起了,起了就把主的时钟拖住了,这样主就不会接收到无效的数据,等从反应过来了把数放进数据寄存器了那就继续通信。

上面是数据通信时,但在建立通讯时主发送地址,若主向做发送,主如何确认自己可以发数据了,若主做接收,从什么时候发送?

那么就有需要一个能够在确认建立通信后能够拖住时钟的信号,那就是ADDR,该位在时钟延展开启的情况下只有清除了才能继续通信。

该流程确保了建立通讯,通讯过程的信息准确性,但对于通讯的结束还有一个问题,如果主只接收两个数,我在什么地方置位STOP,在ADDR置位后设置STOP,这就只能接收一个数了,若在BTF置位设置主STOP和主ACK就会多收取一个数(因为要想产生STOP只能等从回复NACK,夺回控制权后),这个时候就多了个控制位POS,他可以让ADDR处清除的ACK进而产生的NACK在第二个数,而不是第一个数,这个时候STOP就产生在第二个数,主的BTF也是在这里置位,等STOP产生后主再读取这两个数。

如果接收2N个数也类似于上述流程,如果接收奇数个那么就在BTF置位后清除主ACK以及产生STOP,那么自然就接收奇数个了。

更多推荐

STM32 I2C模块的的时钟延展功能

本文发布于:2024-03-12 19:34:34,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1732250.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:时钟   模块   功能   I2C

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!