一、iic通信核心要点
在iic通信中,进行数据传输的时候,遵循在scl时钟线高的时候保持sda电平稳定,这个电平值就是要写入的值,然后,在scl时钟线拉低的时候去改变sda上的值,达到自己想要输出的值
所以说,一般scl高电平的时候,sda都是稳定的电平
但是,起始信号、结束信号、重开信号(SR)不同,他们可以也必须是在scl高电平的时候改变,以此来彰显不同
二、读写寄存器的时序
1、写寄存器
2、读寄存器
三、过程中各种信号解释
首先,不管是读还是写寄存器,开始都是需要走下面这一步流程,目的是为了确定从机地址,然后要操作从机哪个地址的寄存器
start信号,7位从机地址+写,(从机ACK),要操作的寄存器地址,(从机ACK)
(1) start信号:scl高电平的时候,SDA输出一个下降沿
(2) stop信号:scl高电平的时候,SDA输出一个上升沿
(3) restart信号:
restart信号被用于主机向从机读取的时候,因为这其中存在一次传输方向的变换,所以需要进行一次方向的变换。前面我也提到了,不管是想给从机写还是想从从机读取,最开始都是一个写入方向,写入从机地址,写入要通信的寄存器地址。因此,如果是要往从机写数据,那好,方向不变,已然是写这一个方向,就用不到restart信号,但如果需要读,那么方向就变了,从原来的写变成读,就需要用到restart信号。
start 和 restart 信号的区别:restart需要占据一个时序,也就是一个上升一个下降这样一个时序周期,而start不需要,它只要是scl时钟线是高电平就行
(4) ack和nack信号
ack也占一个时序,nack也占一个时序
ack和nack的区别:ack表示不再需要后续,nack表示已经结束,在连续读取寄存器的时候需要,另外,nack只有主机主动发送这一种情况,从机发送的都是ack
(5) 其他需要注意的点:
iic两条总线也就是数据线和时钟线,都是需要上拉的,就像下面这样
如果之前是低电平,直接配置成输出模式,因为有上拉电阻的存在,他就会直接输出1,但我们可能傻傻的认为,它还没输出1呢,用的时候要小心,另外,这种变化操作都在scl低电平的时候去做,切记,切记!