物理接口:SCL+SDA
通信特征:串行、同步、非差分、低速率
突出特征:主设备+从设备(支持一对多,多个设备挂在一条总线上)
主要用途:Soc和周边外设之间的通信,可以很方便的添加各种外设。
I2C空闲:SCL和SDA同时处于“高电平”。
I2C起始:SCL维持高电平,SDA由“高电平跳变为低电平”,下降沿。
I2C终止:SCL维持高电平,SCA由“低电平跳变为高电平”,上升沿。
I2C传输:SCL高电平时,读取SDA电平。
ACK响应:发送方发送数据后,接收方需要回应一个ACK(只有一个bit位)
注:I2C每次传输的有效数据都是1个字节。然后I2C上传输一个ACK,继续下一次传输。
传输流程:
Start -》 I2C_Addr|R/W -》 I2C_Reg -》 I2C_Addr|R/W -》I2C_Data -》 Stop
对于驱动工程师而言,对于I2C总线的开发,其实就是对I2C控制器的配置。
通过驱动I2C控制器,产生I2C通信时序,实现I2C的通信。
如何改变I2C通信速率?
其实就是修改SCL频率,SCL时钟频率是有一个范围的,超出这个范围可能会造成不可预知的后果。常用的I2C频率:100K、400K、3.2M
设置方式,I2C控制器当中,通常有寄存器可以设置。例如系统传给I2C控制器一个PLL时钟频率,再通过I2C控制器中寄存器进行分频,最终得到I2C_SCL的频率。
I2C中断产生?
I2C数据TX中断,I2C传输1字节数据完成后,收到对端ACK,产生该中断。
I2C数据RX中断,I2C检测到匹配本设备I2C_Addr信息数据时,产生该中断。
I2C数据ERROR中断:总线仲裁错误,同时操作总线之类。
关键寄存器
I2C_CONF寄存器、I2C_STATUS寄存器、I2C_IRQ寄存器
配置流程:
配置相关寄存器初始化。
发送流程:配置I2C传输模式,配置访问I2C设备地址,配置Start,对端ACK,产生中断,继续发送/配置Stop。
接收流程:配置I2C传输模式,配置访问I2C设备地址|W,配置Start,对端ACK,产生中断。配置I2C传输模式,配置访问I2C设备地址|R,对端ACK,产生中断,接收对端数据,发送ACK,继续接收/配置Stop。
设备地址:可以硬件上设置,也可以软件上设置,7位地址。还有1位用作读写标志(R/W)
通信速率:需要主设备发送的时钟频率不能超过从设备的最大速率。
本文只是单纯的在分析I2C的作用功能、通信时序、配置等方面。
实际应用到驱动时,还会有很多方面的知识需要补充,例如Linux下的I2C驱动框架、注册之类。
SylixOS下将I2C分层:I2C总线层、I2C核心层、I2C设备层。参考:https://blog.csdn.net/Ivan804638781/article/details/54864289?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522158604302419724845022950%2522%252C%2522scm%2522%253A%252220140713.130056874..%2522%257D&request_id=158604302419724845022950&biz_id=0&utm_source=distribute.pc_search_result.none-task-blog-blog_SOOPENSEARCH-2
SylixOS下的I2C总线驱动详解。参考:
https://blog.csdn.net/Ivan804638781/article/details/61196715?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522158604302419724845022950%2522%252C%2522scm%2522%253A%252220140713.130056874..%2522%257D&request_id=158604302419724845022950&biz_id=0&utm_source=distribute.pc_search_result.none-task-blog-blog_SOOPENSEARCH-3
对于I2C设备驱动,主要熟悉I2C设备层的注册框架后,剩下的就是对应的设备芯片功能配置。