学习记录:
近日学习了IIC集成电路总线,记录一下
学习清单:
- IIC的介绍
- IIC的起始信号、终止信号
- IIC的数据的发送
- IIC的应答信号
- 主机发送数据流程、主机接收数据流程
学习内容:
1.IIC的介绍
IIC的全称是Inter-Integrated Circuit,其实是IICBus的简称,所以中文应该叫集成电路总线,它是一种串行通信总线,使用多主从架构,由飞利浦公司在1980年代为了让主板、嵌入式系统或手机用以连接低速周边设备而发展。I²C的正确读法位“I平方C”(I-squared-C),而“I二C”(“I-two-C”)则是另一种错误但被广泛使用的读法。
2.IIC起始信号、终止信号
IIC是CPU与芯片之间进行通信使用最多的协议,除去电源之外,需要使用的两根线是:SCLK或者SCL(时钟线)和SDA(数据线)。
- 数据线用来传输数据
- 时钟信号线用于产生时钟频率,控制时序,实现协议过程
由于它有一根时钟线,所以IIC是同步通信,由于它只有一根数据线,且IIC的主从结构中,主设备和从设备都是会发送信息给对方的,所以IIC协议是半双工的(半双工:只有一根数据线,主设备和从设备分时使用这根数据线进行信息传送)。
在开始通信之前和结束通信我们都需要一个标志信号来标识,以便让计算机知道什么时候是在传输数据。IIC总线规定当SCLK时钟信号一直处于高电平状态时,SDA线由高电平跳转到低电平这个动作,表示起始信号。此时就算SDA数据线的电平跳变完,SCLK依然是高电平。当连接在IIC总线上的外设模块检测到这个信号时,就知道数据要开始传输了,对于结束信号同理;规定,当SCLK时钟信号一直处于高电平状态时,SDA线由低电平跳转到高电平这个动作,表示结束信号。
如图中框起来的部分,分别就是起始信号和结束信号,一般简称为S和P。IIC在空闲的时候,SDA、SDLK都处于高电平状态(由上拉电阻拉起高电平),我们也可以看见在起始信号之前和结束信号之后都是高电平,即都是空闲状态。
3.IIC数据的传送
规定,在数据的传输过程中,SCLK为高电平时,外设模块开始采集SDA数据线上的数据,此时要求SDA 数据线上的电平线上的电平状态必须稳定(这样才能区分高低电平传输的数据),并且只有SCLK为低电平的时候才允许SDA数据线进行高低电平的跳转(这是因为如果SCLK为高电平,然后SDA进行高低电位的跳转会与起始信号和结束信号发生冲突)。
现在比如要传送一个位的数据,上文有提到,在发送完起始信号之后,SCLK时钟信号仍然是高电平,SDA保持低电平,这时还没有开始读取数据,从发了起始信号到真正数据传输之间,会有一段缓冲时间,这段时间是用来准备数据的,先是将SCLK时钟信号拉低一段时间,在这期间将SDA数据线拉高一段时间(即传输了数据1),然后再将SCLK信号拉高,此时这个时钟信号的高电平被外设检测到的话,外设就知道要读取数据了。可结合上图进行理解。
允许数据进行跳转的部分,如下图的中间部分,即SCLK时钟线是低电平的时候。
4.IIC应答信号
主设备往IIC总线上传输器件地址,所有从机接收到之后与自己的地址相比较,若相同,则阿初一个应答ACK(Acknowledge)信号,主设备收到这个信号表示通信连接成功,包括在连接成功之后,数据接收方(主设备或从设备)收到传输的一字节数据后,需要给出响应,即在第九个时钟的时候,发送端释放SDA线控制权,将SDA电平拉高,由接收方控制。
收到的信息分:
- ACK(Acknowledge):若希望继续,则给出“应答信号”,即SDA为低电平
- NACK(Not Acknowledge):若不希望继续,则给出“非应答信号”,即SDA为高电平
比如现在是主机向从机发送信息,在主机传输完一个字节之后,应该要释放总线(协议规定,当SDA和CSLK同时为高时,表示空闲状态),因为这里要让出总线,使从机能发送一个应答信号,此时SDA数据线连接的IO口从输出模式转换成输入模式,这样才能拿到SDA数据线上的应答信号,这样一个字节的数据就从主机到外设传输完毕了。
5.IIC双向通信
主设备通过地址来确定与哪个器件进行通信,IIC总线上每个从设备都有唯一的一个7bit地址物理识别(因为另外还有一位是读写位),这个地址固化在芯片内部,可以在芯片的datasheet上找到。由于IIC地址全零为广播地址,所以IIC总线理论上最多能有2^7-1 = 127个从设备,一般不会带这么多从设备,负载会太大。
6.主机发送数据流程、主机接收数据流程
主机发送数据流程
- 主机在检测到总线为空闲时,发送一个启动信号“S”,开始一次通信
- 主机接着发送一个从设备的地址,它由7bit物理地址和1bit读写控制位R/W组成(R/W此时为0)0表示写
- 相对应的从机收到命令字节后向主机反馈应答信号ACK
- 主机收到从机的应答信号之后,开始发送第一个字节的数据
- 从机收到该字节的数据之后就反馈一个应答信号
- 主机收到应答信号之后再发送下一个字节的数据
- 主机发完最后一个字节并收到ACK后,向从机发送一个停止信号P结束本次通信并释放总线
- 从机收到P(结束信号)信号之后也退出与主机之间的通信
主机接收数据的流程
- 主机发送启动信号后,接着发送地址字节(其中 R/W=1)1表示读
- 对应的从机接收到地址字节后,返回一个应答信号并向主机发送数据
- 主机收到数据后向从机反馈一个应答信号ACK
- 从机收到应答信号之后,再向主机发送下一个数据
- 当主机完成数据接收之后,向从机发送一个NAK,从机收到非应答信号之后便停止发送
- 主机发送非应答消息之后,再发送一个停止信号,释放总线结束通信
资料:
参考文章:参考的好文章1