最近发现嵌入式的面试经常会被问到I2C协议,所以今天好好的学习总结下。目前I2C几乎所有芯片都留有I2C接口,也那怪这么多面试会被问到。下面我们下来了解一波I2C的硬件结构,如下图所示:
I2C的硬件结构包含两根线一根是数据线(SDA)和一根时钟线(SCL)外部上拉,采取一主多从的模式:一台主机与多个从设备相连,那么怎么将数据发送/接收到指定的主机/从机的呢?我们再来看两张图:
start | 从机地址/方向 | 回应 | 数据1 | 回应 | 数据2 | 回应 | ………. | P停止位 |
上图黑色为主机发送,红色为从机发送
首先需要主机发送开始信号(START)I2C规定只有在时钟线为低电平期间允许数据线变化,如果在时钟线为高电平期间数据线产生下降沿信号即为通讯开始标志。接下来主机会发送七位从机地址和一位的读写信号,若对应的从机地址存在,时钟线的控制权交给从机,从机确认可以接收后会发送第九位的ASK回应信号表示目标地址可以接收,接下来主机会一直发送八位数据然后等待从机回应去人接受,当主机觉得发送内容已完成会主动在时钟线为高电平期间产生一个上升沿信号给数据线表示通讯结束。以上为主机发送从机接收,接下来我们来看看从机发送主机接受的模式。
start | 从机地址/方向 | 回应 | 数据1 | 回应 | 数据2 | 回应 | ………. | P停止位 |
与上面相似也是现有主机发出开始信号,然后发送从机地址和一位读信号,从机回应一位确认信号后,不同的地方开始了,接下来是从机控制时钟线向主机发送数据,然后主机接收到会有一位的回应信号,接下来就这样一直循环读取,直到主机觉得数据接收完成以后发送停止信号停止接收。
IIC的采样方式
IIC采用的是双边采样(为了检测START和STOP信号),当两个相邻的上升沿和下降沿采样数据发生变化,说明在SCL的高电平期间发生数据位变动,若是从1到0即表示START,从0到1即为STOP信号,其他的数据位在相邻的两个上升沿和下降沿相同表示在SCL高电平期间数据未发生变化,该数据即实际要传递的数据。