前言:
相信各位在学习STM32时候的I2C通信肯定特别苦恼吧,这是什么通信时序,为什么起始终止发送SCL和SDA要那样,即使是深刻学习理解了一遍,时间长了之后也容易忘记,因为记的都是概念性的东西,枯燥无味的概念文字确实长时间后就容易忘记,那有没有什么方法可以让自己记牢一点呢?
有,在我重新回顾去看了一遍江科大的I2C后,不经意间我想起来之前看过的一部电影《饥饿站台》,我就想到了用一个故事来理解记住I2C的各个时序图。
感兴趣的话,不妨听听呗,说不定对你有收获。
故事背景:
先上I2C的各个时序图概念,稍稍回忆一下:(师出江科大)
这里硬件电路稍微讲一下,因为和我的故事背景有关系。
这里我们的I2C是一主多从模式,即一个主机,其他都是从机通信,所以我们这里的SCL就由主机来单独控制,假设我们去掉左图中的两个上拉电阻,来看看SCL和SDA。
SCL:因为是一主多从模式,所以主机SCL配置推挽输出输出高低电平,从机SCL配置浮空输入或者上拉输入都可以;
SDA:因为主机和从机都可以控制SDA线,假如当主机和从机同时输出时,主机输出高电平,从机输出低电平,这时候SDA就发生短路了,这是不能发生的。所以,I2C就规定所有的主机从机的SCL都配置成开漏输出模式,并且SCL和SDA外接一个上拉电阻,就像右图的硬件电路一样。
所以当SCL和SDA都空闲时,因为有一个弱上拉电阻拉着输出高电平,就好像SCL和SDA是一根杆子,弱上拉电阻是一根弹簧拉着SCL和SDA杆子,因为是主从机是开漏输出,输出高电平时引脚浮空,输出低电平时为强下拉,所以会把SCL和SDA杆子往下拉。
所以,联想一下饥饿站台的监狱模式,我们的故事背景就出来了,假设我们的主机是一个监狱长,监狱长在监狱最上层,从机是一个个犯人在监狱下面的每一层。
监狱长和犯人(也就是主机和从机)会通过可升降平台(SCL)和平台上的信息(SDA)互相交流。
I2C时序图故事讲解:
起始条件:
这里我们假设站台下面的那根绳子是起始和终止信号的(SDA)表示。
当平台(SCL)空闲时,平台因为弹簧(上拉电阻)的原因会升在高处,这时,如果有犯人(从机)要和主机通信,犯人就可以拉一下绳子(SDA),绳子由上往下拉,即SDA由高到低电平,这时候监狱长收到了犯人的信息,就知道要开始I2C通信了。
终止条件:
当互相收发完信息后,平台(SCL)会上升回去,如果不行通信了,犯人拉着SDA的绳子就放开,绳子由下往上收缩,即低电平到高电平,监狱长(主机)就知道犯人(从机)不想通信了,就终止I2C通信。
发送一个字节:
每次平台SCL将下来,即低电平,监狱长就会跟着平台下来,并且把平台上的东西(SDA数据)发给需要I2C通信的犯人,因为高层的会先到,所以是高位先发,在发送完之后,平台(SCL)上升,犯人开始接收自己发到的东西(SDA数据),发送一位是如此,发送一个字节即八次来回。
接收一个字节:
当有犯人(从机)要给监狱长(主机)发送信息时,平台(SCL)就会降下来(低电平),犯人(从机)把要给监狱长的信息放到SDA上,因为是高层先到,所以是高位先行,接着平台上升(高电平),监狱长(主机)读取SDA数据,因为SCL上升上去了,犯人无法放信息数据,所以SDA就不会有数据变化,接受一位如此,接收八位字节重复八次即可。
发送应答:
当监狱长在接收犯人的八次数据后,会在SCL平台上放上自己对SDA数据的反应,比如0就是批准(应答),1就是收到但是不批准(非应答),然后犯人判断监狱长的反应应答是怎么样的。
接收应答:
当监狱长(主机)在发送完八次数据(即一个字节)之后,需要判断犯人是否收到自己的信息,就会在下一个SCL上拿信息数据SDA,来判断是否有犯人收到自己的信息,0就是表示有犯人收到自己的数据了,1就是没有,因为需要接收犯人的信息,所以一开始就不能在SDA上放数据。
结语:
第一次编故事,编的不好,如有错误,请大家见谅!
标签:SCL,时序,讲故事,从机,犯人,监狱长,I2C,SDA From: https://blog.csdn.net/weixin_69902486/article/details/142940298