I2C控制器及其应用
I2C(Inter--Integrated Circuit))芯片与芯片之间的通讯,
集成电路总线,它由飞利浦(现为NXP)公司在20世纪80年代开发,是一种广泛用于嵌入式系统的
同步、串行、半双工通信协议,用于在同一块电路板上的集成电路之间进行通信。
I2C总线是一种物理通信架构,用于连接多个设备,实现设备之间的数据传输。
SCL(serial clock):时钟线,传输CLK信号,一般是I2C主设备向从设备提供时钟的通道。
SDA(serial data): 数据线,通信数据都通过SDA线传输
快速模式下,数据传输速率为400Kb/s。
高速模式下,数据传输速率为3.4Mb/s
I2C总线上可以挂载一个主设备和多个从设备,实现一对一(一个主设备 + 一个从设备)或者一对多(一个主设备 + 多个从设备)的通信;
主设备负责调度总线,决定某个时间和其中一个从设备通信。在同一时间,只有主设备和其中一个从设备通信,其余的从设备处于等待状态,等待主设备与其通信;
每个从设备在I2C总线上都有唯一的地址,主设备就是通过地址来区分不同的从设备,从而决定和哪一个从设备通信。
读模式
主设备发送开始信号;
主设备接着发送8bit数据,其中7bit是从设备的地址,1bit表示此次主设备是要读数据还是写数据;
从设备发送ACK响应信号;
从设备将数据每次发送8bit到SDA线上,主设备接收到发送ACK响应信号;
当主设备接收完数据后,发送一个停止信号;
写模式
主设备发送开始信号;
主设备接着发送8bit数据,其中7bit是从设备的地址,1bit表示此次主设备是要读数据还是写数据;
从设备发送ACK响应信号;
主设备将要写的数据每次发送8bit到SDA线上,从设备接收到发送ACK响应信号;
当主设备发送完数据后,发送一个停止信号;
I2C通信接收流程
通过操作I2CCON寄存器,将设备配置成主发送模式;
将从设备的地址写到I2CDS寄存器中;
往I2CSTAT寄存器写0xF0,让I2C控制器产生一个开始信号;
移位寄存器将I2CDS里的数据发送到SDA总线上;
在收到ACK信号后,中断被挂起,需要中断处理程序来处理;
中断处理程序判断是否是要结束本次通信;
如果不是结束本次通信,则将新的数据写到I2CDS寄存器中,然后清中断挂起标志,将数据发送到SDA总线上,等待ACK信号,进入下一次判断;
如果是要结束本次通信,则往I2CSTAT寄存器中写0xD0,产生一个停止信号,清中断挂起标志,等停止信号发送完毕则结束本次通信
I2C通信发送流程
通过操作I2CCON寄存器,将设备配置成从发送模式;
在SDA总线上检测到开始信号,I2CDS寄存器接收到数据;
将I2CDS寄存器中接收到的数据和I2CADD寄存器中保存的地址进行比较;
判断是否匹配;
如果不匹配,则表示主设备不是和自己通信,不用再进行下面的步骤;
2C地址匹配则中断产生,告诉设备主设备要和自己通信,并发送一个ACK信号;
写数据到I2CDS寄存器,然后清中断;
判断是否要停止本次通信,也就是有没有检测到主设备发送停止信号;
如果不停止通信,则将I2CDS寄存器中的数据发送到SDA总线上,然后产生中断,重复之前的步骤;
如果是停止本次通信,则不再做响应即可;
