I2C
芯片名称与内核版本
芯片名称 | 内核版本 |
---|---|
所有芯片 | 所有版本 |
前言
ROCKCHIP 系列芯片为客户提供标准 I2C 总线,方便客户实现对不同外接设备的控制和访问。I2C 总线控制器通过串行数据(SDA)线和串行时钟(SCL)线在连接到总线的器件间传递信息。每个器件都有一个唯一地址识别(无论是微控制器——MCU、LCD 驱动器、存储器或键盘接口),并且都可以作为一个发送器或接收器(由器件的功能决定)。
Rockchip I2C 控制器支持以下功能:
- 兼容 I2C 与 SMBus 总线
- 仅支持主模式下的 I2C 总线
- 软件可编程时钟频率支持到 400kbps,部分芯片可高达 1000kbps
- 支持 7 位和 10 位寻址模式
- 一次中断或轮询至多 32 个字节的数据传输
下图为 I2C 总线的硬件连接方式,需要上拉电阻,改变上拉电阻大小可调节 I2C 总线的上拉强度。
ROCKCHIP I2C 在不同芯片,不同内核版本上的驱动不一样:i2c-rk3x.c
或者 i2c-rockchip.c
(i2c-rockchip.c
驱动为 3.10 内核版本上使用),I2C 可以运行的最高频率一般为 1000K。
读者对象
本文档主要适用于以下工程师:
- 技术支持工程师
- 软件开发工程师
1. I2C 流程
I2C 的流程在两个驱动上大致是一样的,写是单纯的 TX 模式 (I2C_CON[1:0]=2’b00),而读一般使用 TRX 模式 (I2C_CON[1:0]=2’b01)。下面的 I2C 控制器操作流程图是描述软件如何通过这个 I2C 控制器寄存器来配置和执行 I2C 任务。描述分为 3 部分:传输模式,混合模式和接收模式。
1.1 Trasmint only mode (I2C_CON[1:0]=2’b00)
1.2 Mix mode (I2C_CON[1:0]=2’b01 or I2C_CON[1:0]=2’b11)
1.3 Receive only mode (I2C_CON[1:0]=2’b10)
以上为 I2C 的主要流程,详细实现参考驱动代码。
2. I2C 驱动参数配置
I2C 的参数配置最主要就是 I2C 频率的配置,可配 I2C frequency 除了与芯片有关外,主要是由 I2C SCL rise time 决定的,因为 I2C 协议标准里面对上升沿和下降沿时间有规定要求特别是上升沿时间,如果超过了协议规定的最大值,则 I2C 通讯可能失败,下图表示了二者之间的关系:
上升沿 Tr 和下降沿 Tf,需要用示波器测量,参考下面示图:
I2C 的驱动 i2c-rk3x.c 与 i2c-rockchip.c 两个配置方式是不一样的,区别如下:
2.1 i2c-rk3x.c 配置
i2c-rk3x.c
驱动的配置都在 DTS,参考文件 Documentation/devicetree/bindings/i2c/i2c-rk3x.txt
。重点说明其中配置项,i2c-scl-rising-time-ns
,i2c-scl-falling-time-ns
:
clock-frequency
:默认 frequency 为 100k 可不配置,其它 I2C 频率需要配置,最大可配置频率由i2c-scl-rising-time-ns
决定;例如配置 400k,clock-frequency=<400000>
。i2c-scl-rising-time-ns
:SCL 上升沿时间由硬件决定,改变上拉电阻可调节该时间,需通过示波器量测,参考上图;例如测得 SCL 上升沿 365ns,i2c-scl-rising-time-ns=<365>
。(默认可以不配置,但必须保证当前的上升沿时间不能超过所配置频率下的 I2C 标准所定义的最大上升沿时间)i2c-scl-falling-time-ns
:SCL 下降沿时间,一般不变,等同于i2c-sda-falling-time-ns
。(默认也可以不配置)
示例:
&i2c1 {
status = "okay";
i2c-scl-rising-time-ns = <265>;
i2c-scl-falling-time-ns = <11>;
clock-frequency = <400000>;
es8316: es8316@10 {
#sound-dai-cells = <0>;
compatible = "everest,es8316";
reg = <0x10>;
clocks = <&cru SCLK_I2S_8CH_OUT>;
clock-names = "mclk";
spk-con-gpio = <&gpio0 11 GPIO_ACTIVE_HIGH>;
hp-det-gpio = <&gpio4 28 GPIO_ACTIVE_LOW>;
};
};
2.2 i2c-rockchip.c 配置
i2c-rockchip.c
驱动仍然遵循 I2C frequency 与 SCL 上升沿的约束关系,能否用更高的频率取决于 i2c-scl-rising-time-ns
;I2C 频率在代码上面配置,直接配置 i2c_msg
结构体上的 scl_rate
成员,默认 frequency 仍为 100k,例如下面的 200K 配置:
struct i2c_msg xfer_msg;
xfer_msg[0].addr = client->addr;
xfer_msg[0].len = num;
xfer_msg[0].flags = client->flags;
xfer_msg[0].buf = buf;
xfer_msg[0].scl_rate = 200 * 1000; /* 200K i2c clock frequency */
3. I2C 使用
对于 I2C 的使用说明在 Documentation/i2c/
有比较详细的,查阅,下面重点提下读写部分: