I2C协议---由发钱想到的...
月圆之夜,紫禁之巅,一剑西来,天外飞仙...
屋顶有人,两个人,一个是黑衣人,另一个也是黑衣人,一胖一瘦。
胖的叫“钱哆哆”,外号“马斯特(Master)”,笔名“主设备”,人称“钱老板”,没有人知道他具体有多少钱,只知道很多很多...
瘦的叫“项药前”,外号"斯莱姆(Slave)",笔名“子设备”,其他,不详。
斯莱姆(Slave)一言不发,只是哀怨地看着马斯特……
马斯特(Master)道:“我要发钱!”。
此时,鼓声响起,马斯特(Master):(咚)“发1亿”,(咚)“发1亿”,(咚)“发1亿”……(咚)“发1亿”,8次鼓声,喊了8次,马斯特(Master)不再说话,静静地看着斯莱姆(Slave)。
咚,当第9次鼓声响起时,斯莱姆(Slave):”收到!“
马斯特(Master)继续:(咚)“发1亿”,(咚)“发1亿”,(咚)“发1亿”……(咚)“发1亿”,又喊了8次
(咚)斯莱姆(Slave):”收到!“
…… …… …… ……
不知过了反复多少轮,马斯特(Master)不再发钱了:”发完了!“
于是,鼎鼎大名的 I2C 协议,便诞生了!
以上纯属一本正经地瞎说,现在开始谈正事儿!
I2C (Inter-Intergrated Circuit),Philips公司开发的一种简单的双向的二线同步总线。
多用于芯片和芯片间的通信;
主要特点:
简单,就2根线,SDA和SCL;
双向,可读可写,简单可用;
可多器件,不同器件通过地址识别,待会讲协议时再说;
5.6.7.8....略,请自行搜索;
就拿个EEPROM为例,来讲解下I2C的协议吧。
EEPROM长这样子的,这里四种样子,有脚长的,脚短的,胖的,瘦的,不用担心,它们只不过封装不同,不影响软件操作;反正不管你长什么样子,我都喜欢!
共有8个脚:
A2A1A0:地址线,就是特点3里面多器件操作中识别的关键;
GND:接地;Vcc:电源;
WP:写保护,拉低才能写进去,拉高就写不进去了;
SDA,SCL:控制线,SDA是数据线,产生数据,SCL是时钟线,产生时钟;
硬件原理图是这样子的,仅供参考:(对了,记得加上拉电阻,当然,这是硬件工程师的事儿。)
如图所示,SCL,SDA连接到MCU的GPIO引脚上,MCU作为主设备,控制AT24C32,AT24C32作为从设备;
SCL完全由主设备(MCU)产生;
协议:
I2C协议以
1.“Start”:开始,表示“嘿,我要向你发钱了”。。。
2. “Transmite”: “Start”之后,开始传输数据(发钱),每传输8-bit数据(比如发8亿元),在第9个时钟,从设备会产生一个ACK(Acknowledge),表明设备接收成功(对方要表示一下,我收到钱了),接下才能继续传输数据(发钱),直到传输数据结束(不发了);
3.“Stop”:结束,发完钱之后,跟对方喊下"我没钱发了,不发了";
是不是很简单呀?下面我就用一个图,来表示一下,怎么发钱:
上面一根线是SCL,下面一根线是SDA,SCL完全由主设备(MCU)产生;
Start: SCL为高电平,SDA从高电平跳变至低电平,表示开始发送数据(钱);
Transmit: Start之后,就可以发送数据了,数据在SCL高电平有效,发送8-Bit数据(1BYTE)后,
在第9个SCL,次设备将SDA拉低,主设备检测SDA为低电平,表示收到数据;
此后,继续发送NNNNNN个字节;待所有数据发送完成后;
Stop: SCL为高电平,SDA从低电平跳变至高电平,表示发送数据结束;
整个过程可以理解成:
1.老板:“我要开始你发钱了”;
2.老板开始转帐,一个SCL转一次,转 8-Bit 的钱后,你:“我收到钱了”,老板听到你喊话后,继续转帐...NNNN次;
3.老板:“发好了,没钱了”;
至此,整个过程结束;
好了,再看一下上面的故事:
斯莱姆(Slave)一言不发,只是哀怨地看着马斯特……(从设备不会主动向主设备发起信号,老板要主动向员工发钱啊。。。)
马斯特(Master)道:“我要发钱!”(这个是Start,记得,SCL为高电平,SDA从高电平跳变至低电平)
喊完话后,马斯特(Master)不管斯莱姆(Slave):“发1亿”,“发1亿”,“发1亿”……“发1亿”,一共喊了8次,马斯特(Master)不再说话,静静地看着斯莱姆(Slave)。(发送8个Bit后,主设备等待从设备ACK)
斯莱姆(Slave):”收到!“(从设备ACK)
马斯特(Master)继续:“发1亿”,“发1亿”,“发1亿”……“发1亿”,又喊了8次(下一轮发送数据)
斯莱姆(Slave):”收到!“(下一轮ACK)
…… …… ……(可以一直发送数据)
不知过了多久,马斯特(Master)终于支撑不住了:”发完了!“(发送完成,Stop)
这个鼓谁在敲?记得,马斯特(Master),SCL由主设备产生;
好了,协议篇,就基本上是这样了,没什么好讲的了。
下一篇,我们来个知行合一,以AT24C02为例,结合AT24C02 DataSheet上的时序图,做一个用IO口高低电平来模拟I2C协议,通过这个模拟的协议,来读写AT24C02的例子吧!
后续,我们所有的例子,都在《STM32 Uart @调试命令的实现》这个项目上添加,可以调试,也可以打印,比较方便。
上一篇:《STM32 精准延时》
下一篇:《STM32 使用IO口模拟I2C时序》
回目录:《目录》