总线一:IIC

一、I2C集成电路总线, 多用于主控制器和从器件间的主从通信 。
二、适用场景:在小数据量场合使用 , 传输距离短 。
三、IIC是半双工 。IIC的物理层:两条总线线路 , 一条是串行数据线SDA , 一条是串行时钟线SCL , 当总线空闲时 , 两条线都是高电平 。
四、传输速率在标准模式下可以达到100kb/s,快速模式下可以达到400kb/s , 支持7位地址模式 。
五、IIC的协议层:
①数据的有效性:在时钟的高电平期间SDA线上的数据必须保持稳定 , 只有在时钟信号SCL变低的时候SDA的电平状态才能跳变 。
②所有的数据传输起始于一个START(S)结束于一个STOP(P),如下图所示 。起始条件:当SCL为高电平的时候 , SDA线上由高到低的跳变定义为起始条件;结束条件:当SCL为高电平的时候 , SDA线上由低到高的跳变被定义为停止条件 。
③:每当主机向从机发送完一个字节的数据 , 主机总是需要等待从机给出一个应答信号 , 以确认从机是否成功接收到了数据 , 从机应答主机所需要的时钟仍是主机提供的 。
④数据帧格式I2C总线上传送的数据信号是广义的 , 既包括地址信号 , 又包括真正的数据信号 。
I2C通讯流程
每个I2C设备(不管是微控制器 ,  LCD驱动 , 存储器或者键盘接口)都通过唯一的地址进行识别 , 根据设备功能 , 他们既可以是发送器也可作为接收器 。
I2C从机检测到I2C总线上的START起始位之后 , 就开始从总线上接收地址 , 之后会把从总线接收到的地址和自身的地址(通过软件编程)进行比较 , 一旦两个地址相同 ,  I2C从机将发送一个确认应答(ACK) , 并响应总线的后续命令:发送或接受所要求的数据 。此外 , 如果软件开启
了广播呼叫 , 则I2C从机始终对一个广播地址 (0x00)发送确认应答 。I2C模块始终支持7位和10位的地址 。I2C主机负责产生START起始位和STOP结束位来开始和结束一次传输 , 并且负责产生SCL时钟 。
1、7位地址的I2C通讯流程
2、10位地址的I2C通讯流程(主机发送)
3、10位地址的I2C通讯流程(主机接收)
一个I2C设备例如LCD驱动器可能只是作为一个接收器 , 但是一个存储器既可以接收数据 , 也
能发送数据 。除了按照发送/接收方来区分 ,  I2C设备也分为数据传输的主机和从机 。主机是指
负责初始化总线上数据的传输并产生时钟信号的设备 , 此时任何被寻址的设备都是从机 。
不管I2C设备是主机还是从机 , 都可以发送或接收数据 , 因此 ,  I2C设备有以下4种运行模式:
? 主机发送方;
? 主机接收方;
? 从机发送方;
? 从机接收方 。
I2C模块支持以上四种模式 。系统复位以后 , I2C默认工作在丛机模式下 。通过软件配置使I2C总线上发送STOP结束位后 , I2C又变回丛机模式 。
七、从机发送模式下的软件流程
在从机模式下要发送数据到I2C总线 , 软件应该按照下面的步骤来运行操作:
1. 首先 , 软件应该使能I2C外设时钟 , 以及配置中时钟相关寄存器来确保正确的I2C时序 。使能和配置以后 ,  I2C运行在默认的从机模式状态 , 等待START起始位和地址 。
2. 接收一个START起始位及随后的地址 。
3. 现在I2C进入数据发送状态 , 由于移位寄存器和数据寄存器都是空的 , 硬件将TBE位置1 。软件此时可以写入第一个字节数据到寄存器 , 但是TBE位并没有被清0 , 因为写入寄存器的字节被立即移入内部移位寄存器 。当移位寄存器非空的时候 ,  I2C开始发送数据到I2C总线 。