- IIC配置中的Clock No Stretch Mode
Clock Stretch Mode时钟延长模式:
时钟延长是一个术语,某些从设备可以把时钟线拉低,主设备发现自己释放时钟线之后时钟线还没有变成高电平,就会停止发送数据,然后等待从设备释放时钟线。通过这种方式从设备可以告诉主设备你慢点发,我这边还得准备准备(比如从机有个其他中断要处理),这在从机速率比主机低的时候会有用,stm32会默认开启时钟延长模式[Clock No Stretch Mode=disbale](这里的disable和No双重否定等于肯定),不过大多数IIC设备没有时钟延长的设定.
会导致什么问题呢?就是以STM32 MCU作为从设备时,从设备会出现ACK延时的情况,原因就是从机会主动拉低SCL不释放,一直到从机处理完它的工作再释放,主机才能发送第9各时钟,从机才真正发出ACK, 波形上就是ACK信号延迟。如下图:
2024-05-23 11:43:01 INFO 3,4382,2591582111,-;sunxi_i2c_drv_core_process()1014 - [i2c6] Timeout when sending 9th SCL clk
2024-05-23 11:43:01 INFO 3,4383,2591582128,-;i2c_sunxi_drv_complete()1188 - [i2c6] incomplete xfer(status: 0x1, dev addr: 0x77)
所以需要修改linux主机端I2C驱动,将等待ACK的时间把握好