关闭 I2C 时钟延展功能的使用介绍

1.问题发生的背景

某客户使用 STM32L452(作为 I2C 设备)开发光模块产品,在测试时发现,同一设备(硬件及软件均未变动),当插入交换机时,可正常通信,但是当插入 FPGA 测试机后,I2C 通信不正常。通过出现问题时的 I2C 波形的对比,客户初步认为是第 9 个时钟脉宽相对其他时钟过窄导致的(如下图)。询问我们有没有办法配置这个宽度 ?
在这里插入图片描述

2.问题的分析

首先,关于第 9 个时钟脉宽过窄的情况,建议客户测量下其宽度,结合 I2C 规范,发现该窄脉宽仍然在 I2C 规定的范围之内。另外,对照 L452 的参考手册 I2C timming 章节的内容,也建议客户尝试通过修改 Data setup time 和 Data hold time,客户表示可以使得每个脉宽整体变长,但是对于通信的结果没有明显改善。
再次回过头来测试分析,I2C 的 SCL 是由 I2C 主机发出的,如果主机不接 I2C 设备,其第 9 个时钟 SCL 没有看到变窄的情况,那就是说明,I2C 从机使能了时钟延展功能将 SCL拉低了。换句话了, FPGA 作为 I2C 主机时,未支持时钟延展功能(从上图中其实也可以分析,SCL 脉宽高电平变窄了,但是其 SCL 低电平也变长了,也就是 SCL 的周期是没有变化的。那么,如果 FPGA 主机是以固定的采样频率去判断 SDA 数据,当 SCL 被拉低时,主机也没有判断回读该 SCL 的实际电平,未对该情况进行处理,仍然以固定频率采样,导致出错)。由于主机端不能做任何修改,剩下的方法只能令 I2C 设备关闭时钟延展功能,保证通信正常。

2.1.关闭时钟延展功能

在 I2C 初始化的函数中,将 No Stretch Mode = Enable 即可,也就是关闭了时钟延展功能。

2.2.时钟延展功能关闭下的通信【NOSTRETCH = 1】

客户反馈,NOSTRETCH = 1 关闭时钟延展的情况下,会发生多发送一个 0xFF 的现象,结合参考手册的说明,和查看相关寄存器,得知客户遇到了 OVR 的情况;
在这里插入图片描述
怎样去解决这个 OVR 的问题呢?
在这里插入图片描述
也就是说 I2C 设备发送阶段的第一个 SCL 脉冲之前,必须写入其要发送的数据。
在这里插入图片描述
I2C 设备如何能够在发送之前知道自己每次要发送什么正确的数据呢?这就用到了 Combined 模式。
在这里插入图片描述
在 Repeat start 之前(也就是发送数据阶段之前),是 I2C 主机的写操作,在该阶段 I2C 设备即可以根据实际接收到的数据命令,填充合适的将要应答的第一个数据即可。就不会遇到 OVR 的情况了。

3.小结

I2C 的时钟延展功能是可选功能,主机可以不支持该功能,但从机需要相应的适配。未来 ST公司的 STM32 Cube 库后续有计划增加对时钟延展功能的支持。


本文档参考ST官方的《【应用笔记】LAT1323+STM32L452+I2C关闭时钟延展功能的使用》文档。
参考下载地址:https://download.csdn.net/download/u014319604/89043935

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值