RK 平臺 I2C debug
1、I2C 通信失敗,出現(xiàn) log: “timeout, ipd: 0x00, state: 1”
請檢查硬件上拉是否給電。
2、調(diào)用 i2c_transfer 返回值為 -6?
返回值為 -6 表示為 NACK 錯誤,即對方設(shè)備無應(yīng)答響應(yīng),這種情況一般為外設(shè)的問題,常見的有以下幾種情況:
- I2C 地址錯誤,解決方法是測量 I2C 波形,確認(rèn)是否 I2C 設(shè)備地址錯誤;
- I2C slave 設(shè)備不處于正常工作狀態(tài),比如未給電,錯誤的上電時序等;
- 時序不符合 I2C slave 設(shè)備所要求也會產(chǎn)生 Nack 信號。
3、當(dāng)外設(shè)對于讀時序要求中間是 stop 信號不是 repeat start 信號的時候,該如何處理?
這時需要調(diào)用兩次 i2c_transfer, I2C read 拆分成兩次,修改如下:
static int i2c_read_bytes(struct i2c_client *client, u8 cmd, u8 *data, u8 data_len) {struct i2c_msg msgs[2];
int ret;
u8 *buffer;
buffer = kzalloc(data_len, GFP_KERNEL);
if (!buffer)
return -ENOMEM;
msgs[0].addr = client- >addr;
msgs[0].flags = client- >flags;
msgs[0].len = 1;
msgs[0].buf = &cmd;
ret = i2c_transfer(client- >adapter, msgs, 1);
if (ret < 0) {
dev_err(&client- >adapter- >dev, "i2c read failedn");
kfree(buffer);
return ret;
}
msgs[1].addr = client- >addr;
msgs[1].flags = client- >flags | I2C_M_RD;
msgs[1].len = data_len;
msgs[1].buf = buffer;
ret = i2c_transfer(client- >adapter, &msgs[1], 1);
if (ret < 0)
dev_err(&client- >adapter- >dev, "i2c read failedn");
else
memcpy(data, buffer, data_len);
kfree(buffer);
return ret;
}
-
通信
+關(guān)注
關(guān)注
18文章
6036瀏覽量
136088 -
I2C
+關(guān)注
關(guān)注
28文章
1489瀏覽量
123907 -
DEBUG
+關(guān)注
關(guān)注
3文章
94瀏覽量
19934
發(fā)布評論請先 登錄
相關(guān)推薦
評論