I2C -- I2C总线详解

什么是I2C通信?

物理接口:SCL+SDA

通信特征:串行、同步、非差分、低速率

突出特征:主设备+从设备(支持一对多,多个设备挂在一条总线上)

主要用途:Soc和周边外设之间的通信,可以很方便的添加各种外设。

 

I2C通信时序

I2C空闲:SCL和SDA同时处于“高电平”。

I2C起始:SCL维持高电平,SDA由“高电平跳变为低电平”,下降沿。

I2C终止:SCL维持高电平,SCA由“低电平跳变为高电平”,上升沿。

I2C传输:SCL高电平时,读取SDA电平。

ACK响应:发送方发送数据后,接收方需要回应一个ACK(只有一个bit位)

注:I2C每次传输的有效数据都是1个字节。然后I2C上传输一个ACK,继续下一次传输。

I2C -- I2C总线详解_第1张图片

传输流程:

Start -》 I2C_Addr|R/W -》 I2C_Reg -》 I2C_Addr|R/W -》I2C_Data -》 Stop

I2C -- I2C总线详解_第2张图片

 

I2C总线控制器

对于驱动工程师而言,对于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。

I2C -- I2C总线详解_第3张图片

I2C从设备

设备地址:可以硬件上设置,也可以软件上设置,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设备层的注册框架后,剩下的就是对应的设备芯片功能配置。

你可能感兴趣的:(SyloxOS)