[STM32F4] STM32F4 中断与 I2C 引脚复用问题

[复制链接]
94|18
yunfu1117 发表于 2026-6-18 09:49 | 显示全部楼层 |阅读模式
正在编写 TLV493D 磁编码器驱动。这款编码器有特殊机制,当有新数据可供读取时,它会主动拉低 I2C 总线的 SCL 时钟线;单片机检测到该电平后,需要发起一次 I2C 读取事务,读取数据并清除中断状态。
但是正常 I2C 通信产生的 SCL 时钟脉冲不能重复触发外部中断,所以我需要做特殊处理来适配该硬件逻辑。但我不清楚 STM32F4 该怎么配置、该做哪些操作。
目前我已经通过 CubeMX 完成 I2C1 初始化,上电复位后可以正常和 TLV493D 通信、配置寄存器。但我把 SCL 引脚重新配置为 GPIO 外部中断来接收编码器的中断信号时,I2C 总线直接失效。
我现在疑惑的方案是:来回切换引脚功能,在 I2C 复用功能和 GPIO 外部中断模式之间切换,不知道这种方式是否是标准、合理的实现思路。
单个引脚能否同时作为 I2C 的 SCL 时钟线,又能在线路被拉低时触发外部中断?还是说我来回切换引脚功能的思路才是正确方法?


评论

中断检测与去抖  发表于 2026-6-18 11:51
tpgf 发表于 2026-6-18 11:51 | 显示全部楼层
TLV493D 在有新数据(例如三轴数据就绪)时,会把 I2C 的 SCL 线主动拉低,作为“数据可读”的硬件中断信号
七毛钱 发表于 2026-6-18 15:19 | 显示全部楼层
单个引脚在STM32F4上不能同时作为复用功能SCL和GPIO外部中断输入,硬件复用逻辑是互斥的。
classroom 发表于 2026-6-18 15:49 | 显示全部楼层
来回切换引脚功能在理论上是可行的,但切换间隙会丢失总线时钟或中断边沿,实际稳定性很差。
cr315 发表于 2026-6-18 16:20 | 显示全部楼层
更好的做法是把编码器的中断输出引脚单独接到另一个GPIO,不和SCL共用物理引脚。
duo点 发表于 2026-6-18 16:50 | 显示全部楼层
TLV493D拉低SCL来通知数据就绪,这个信号本质是时钟延展,不是普通外部中断。
elephant00 发表于 2026-6-18 15:21 | 显示全部楼层
应该让I2C外设工作在从机模式,利用时钟延展机制配合DMA或中断来响应,而不是手动切换引脚。
flycamelaaa 发表于 2026-6-18 17:21 | 显示全部楼层
如果把SCL配置成外部中断,I2C控制器就无法正常产生或检测时钟信号,总线通信必然失败。
jcky001 发表于 2026-6-18 17:55 | 显示全部楼层
标准做法是使用I2C的接收中断或DMA传输完成中断来感知数据就绪,不需要SCL额外做GPIO检测。
powerantone 发表于 2026-6-18 18:25 | 显示全部楼层
可以尝试使用I2C的NACK或停止条件检测作为数据就绪的标志,避免动SCL引脚配置。
probedog 发表于 2026-6-18 18:56 | 显示全部楼层
来回切换引脚功能会导致I2C总线状态机混乱,因为切换时SCL电平可能处于不确定状态。
solty 发表于 2026-6-18 19:57 | 显示全部楼层
若坚持切换方式,每次切回I2C模式前必须软件复位I2C外设并重新初始化总线时序。
spicy 发表于 2026-6-18 20:28 | 显示全部楼层
这类传感器的中断通知引脚通常是独立开来的,建议检查硬件设计是否把INT脚误接到SCL上了。
stormwind123 发表于 2026-6-18 20:59 | 显示全部楼层
时钟延展本身是I2C协议允许的行为,主机应配置适当的超时和时钟同步参数来支持从机拉低SCL。
七毛钱 发表于 2026-6-18 21:31 | 显示全部楼层
不要试图用外部中断模拟SCL检测,这违背了I2C硬件设计的初衷,调试和维护成本极高。
今天会画卧蚕吗 发表于 2026-6-18 22:08 | 显示全部楼层
将SCL作为中断源还会干扰总线上的其他I2C设备,因为它们也会看到SCL被异常拉低。
内政奇才 发表于 2026-6-18 22:39 | 显示全部楼层
最稳健的方案是改用另一个空闲GPIO作为中断输入,SCL始终保持I2C复用功能,不做任何切换。
CarterERO 发表于 2026-6-18 19:01 | 显示全部楼层
用另一个GPIO接编码器中断,I2C用复用引脚,这样稳定可靠。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

205

主题

207

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部
0