Stm32 I2C从时钟扩展

Stm32 I2C从时钟扩展,stm32,i2c,Stm32,I2c,你们知道如何为I2C从机启用时钟伸缩功能吗 将此函数I2C\u StretchClockCmd(I2C2,ENABLE)放入I2C的初始化中就足够了吗 时钟拉伸到底是如何工作的?对我来说似乎是的,这就足够了。以下是一个背景: 时钟生成 SCL时钟始终由I2C主机生成。该规范要求时钟信号的低相位和高相位的最小周期。因此,实际时钟速率可能低于标称时钟速率,例如,在I2C总线中,由于高电容而具有大上升时间 时钟拉伸 I2C设备可以通过拉伸SCL来降低通信速度:在SCL低相位期间,总线上的任何I2C设备

你们知道如何为I2C从机启用时钟伸缩功能吗

将此函数
I2C\u StretchClockCmd(I2C2,ENABLE)
放入I2C的初始化中就足够了吗


时钟拉伸到底是如何工作的?

对我来说似乎是的,这就足够了。以下是一个背景:

时钟生成

SCL时钟始终由I2C主机生成。该规范要求时钟信号的低相位和高相位的最小周期。因此,实际时钟速率可能低于标称时钟速率,例如,在I2C总线中,由于高电容而具有大上升时间

时钟拉伸

I2C设备可以通过拉伸SCL来降低通信速度:在SCL低相位期间,总线上的任何I2C设备都可以另外按住SCL以防止其再次升高,从而使其能够降低SCL时钟频率或停止I2C通信一段时间。这也称为时钟同步

注:I2C规范没有为时钟拉伸指定任何超时条件,即任何设备都可以按住SCL,只要它愿意

在I2C通信中,主设备决定时钟速度。与RS232不同,I2C总线提供了一个明确的时钟信号,使主设备和从设备不必精确地同步到预定义的波特率

但是,在某些情况下,I2C从机无法与主机提供的时钟速度配合,需要稍微降低一点。这是通过一种称为时钟拉伸的机制实现的

如果需要降低总线速度,允许I2C从机按住时钟。另一方面,主机需要在将时钟信号释放到高电平状态后读回时钟信号,并等待线路实际变为高电平

I2C时钟速度如何影响I2C从机引入的时钟拉伸持续时间

时钟拉伸是指I2C从机在每次I2C数据传输的第9个时钟(ACK阶段之前)将SCL线拉低的现象。当CPU处理I2C中断以评估地址或处理从主机接收的数据,或在主机从从从机读取数据时准备下一个数据时,时钟被拉低


时钟被拉低的时间取决于CPU处理中断所用的时间,因此取决于CPU速度,而不是I2C时钟速度。

为什么我们需要时钟拉伸?在时钟的第9位确认从机时也可以实现同样的功能


通过将数据线保持到从机内部进程结束,可以实现这一点。

您好,谢谢您的回复。将delay()函数放在中断处理程序中,这是测试时钟拉伸函数的好方法吗?当从机从主机获得读取命令时,它将时钟线保持在低位。然后,CPU/MCU获取请求的数据,将其放入传输寄存器并释放时钟线,从而允许上拉电阻器最终将其拉高。从主机的角度来看,它将通过使SCL高来发出读取的第一个时钟脉冲,然后检查它是否真的变高。如果它仍然很低,那么是从机将其保持在较低的位置,主机应该等到它变高后再继续。幸运的是,大多数微处理器上的硬件I2C端口都能自动处理这个问题。请注意,从机可以延长任何周期,而不仅仅是第9个时钟。