你们知道如何为I2C slave启用时钟伸展吗?
在I2C的初始化中只放入这个函数I2C_StretchClockCmd(I2C2, ENABLE)就足够了吗?
时钟伸展究竟是如何工作的?
发布于 2014-07-22 19:34:38
对我来说,是的,这就足够了。以下是背景信息:
时钟生成
SCL时钟始终由I2C主机产生。该规范要求时钟信号的低相位和高相位的最小周期。因此,例如在由于高电容而具有大上升时间的I2C总线中,实际时钟速率可能低于标称时钟速率。
时钟扩展
I2C设备可以通过伸展SCL来减慢通信:在SCL低阶段,总线上的任何I2C设备都可以另外按住SCL,以防止它再次上升到高电平,从而使它们能够降低SCL时钟频率或停止I2C通信一段时间。这也称为时钟同步。
注意: I2C规范没有为时钟伸展指定任何超时条件,即任何设备都可以按下SCL,只要它愿意。
在I2C通信中,主设备确定时钟速度。与RS232不同,I2C总线提供显式时钟信号,使主机和从机不必完全同步到预定义的波特率。
但是,在某些情况下,I2C从机无法与主机提供的时钟速度配合工作,因此需要稍微放慢速度。这是通过一种称为时钟伸展的机制来完成的。
如果需要降低总线速度,则允许I2C从机保持时钟。另一方面,要求主设备在将时钟信号释放到高状态之后回读时钟信号,并等待直到线路实际变为高状态。
I2C时钟速度如何影响I2C从机引入的时钟展宽持续时间?
时钟拉伸是这样一种现象:在每次I2C数据传输的第9个时钟(确认阶段之前),I2C从机将SCL线拉低。当中央处理器正在处理I2C中断时,时钟被拉低,以评估地址或处理从主机接收的数据,或者在主机从从机读取数据时准备下一个数据。
时钟被拉低的时间取决于CPU处理中断所用的时间,因此取决于CPU速度而不是I2C时钟速度。
发布于 2016-01-22 15:12:59
为什么我们需要伸展时钟?在时钟的第9位上确认从机时,也可以实现相同的功能。
这些事情可以通过保持数据线直到从属内部进程结束来实现。
https://stackoverflow.com/questions/24862372
复制相似问题