I2C协议详解

    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公司开发的一种简单的双向的二线同步总线。

    多用于芯片和芯片间的通信;

    主要特点:

  1. 简单,就2根线,SDA和SCL;

  2. 双向,可读可写,简单可用;

  3. 可多器件,不同器件通过地址识别,待会讲协议时再说;

  4. 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 Uart @调试命令的实现

下一篇:《STM32 使用IO口模拟I2C时序》---还没写呀

回目录:《目录

猜你喜欢

转载自blog.csdn.net/ForeverIT/article/details/83344170