目录
前言
I2C 流程
Trasmint only mode(I2C_CON[1:0]=2’b00)
Mix mode (I2C_CON[1:0]=2’b01 or I2C_CON[1:0]=2’b11)
Receive only mode (I2C_CON[1:0]=2’b10)
I2C 驱动参数配置
I2C 使用
1 Kernel space
2User space
GPIO 模拟 I2C
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。
I2C 流程
I2C 的流程在两个驱动上大致是一样,写是单纯的 TX 模式 (I2C_CON[1:0]=2’b00),而读一般使用 TRX 模式(I2C_CON[1:0]=2’b01)。下面的 I2C 控制器操作流程图是描述软件如何通过这个 I2C 控制器寄存器 来配置和执行 I2C 任务。描述分为 3 部分,传输模式,混合模式和接收模式。
Trasmint only mode(I2C_CON[1:0]=2’b00)
Mix mode (I2C_CON[1:0]=2’b01 or I2C_CON[1:0]=2’b11)
Receive only mode (I2C_CON[1:0]=2’b10)
I2C 驱动参数配置
I2C 的参数配置最主要就是 I2C 频率的配置,可配 I2C frequency 除了与芯片有关外,主要是由 I2C SCL rise time 决定的,因为 I2C 协议标准里面对上升沿和下降沿时间有规定要求特别是上升沿时间,如果超 过了协议规定的最大值,则 I2C 通讯可能失败,下面是协议里面规定的最大最小值范围,下图表示了二 者之间的关系
上升沿 Tr 和下降沿 Tf,需要用示波器测量,参考下面示图
I2C 使用
1 Kernel space
Rockchip I2C 的读写通信都是使用的是 linux 的标准接口
2User space
通常, I2C 设备由内核驱动程序控制。但也可以从用户态访问总线上的所有设备,
GPIO 模拟 I2C
下面是使用的例子,dts 下配置 I2C 节点
i2c@4 {
compatible = "i2c-gpio";
gpios = <&gpio5 9 GPIO_ACTIVE_HIGH>, /* sda */
<&gpio5 8 GPIO_ACTIVE_HIGH>; /* scl */
i2c-gpio,delay-us = <2>; /* ~100 kHz */
#address-cells = <1>;
#size-cells = <0>;
pinctrl-names = "default";
pinctrl-0 = <&i2c4_gpio>;
status = "okay";
gt9xx: gt9xx@14 {
compatible = "goodix,gt9xx";
reg = <0x14>;
touch-gpio = <&gpio5 11 IRQ_TYPE_LEVEL_LOW>;
reset-gpio = <&gpio5 10 GPIO_ACTIVE_HIGH>;
max-x = <1200>;
max-y = <1900>;
tp-size = <911>;
tp-supply = <&vcc_tp>;
status = "okay";
};
};
I2C 常见问题
如果调用 I2C 传输接口返回值为 -6(-ENXIO)时候,表示为 NACK 错误,即对方设备无应答响应,这种情 况一般为外设的问题,常见的有以下几种情况:
I2C 地址错误; I2C slave 设备处于不正常工作状态,比如没有上电,错误的上电时序以及设备异常等;
I2C 时序不符合 slave 设备所要求也会产生 NACK 信号,比如 slave 设备需要的是 stop 信号,而不是 repeat start 信号的时候;
I2C 总线受外部干扰导致的,用示波器测量可以看到是一个 ACK 波形。
当出现 I2C 的 log:"timeout, ipd: 0x00, state: 1"时,此时 I2C 控制器工作异常,无法产生中断状态,start 时序无法发出,有以下几种可能:
I2C SCL 或者 SDA Pin 脚 iomux 错误;
I2C 的上拉电压不对,如电压不够或者上拉电源没有等;
I2C Pin 脚被外设拉住,电压不对;
I2C 时钟未开,或者时钟源太小;
I2C 同时配置了 CON_START 和 CON_STOP 位。