偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

通信協(xié)議 I2C 子系統(tǒng)之 Debug

網(wǎng)絡(luò) 通信技術(shù)
在應(yīng)該收到 ACK 信號(hào)的時(shí)候沒(méi)有收到 ACK 信號(hào),i2c controller 就會(huì)產(chǎn)生一個(gè) ACK error 的中斷,告訴 i2c driver 發(fā)生了 ACK error。通常情況是 slave 本身的問(wèn)題。

I2C 常見(jiàn)有兩種錯(cuò)誤:I2C ACK error、I2C timeout

一、I2C ACK error

在應(yīng)該收到 ACK 信號(hào)的時(shí)候沒(méi)有收到 ACK 信號(hào),i2c controller 就會(huì)產(chǎn)生一個(gè) ACK error 的中斷,告訴 i2c driver 發(fā)生了 ACK error。通常情況是 slave 本身的問(wèn)題。

圖片

1、檢查 device 是否存在,i2c bus number 和 device address 是否正確。示例如下:i2c number 為 6,addr 為 0x28:

[31.092951][xxx]i2c i2c-6:addr:0x28,ACK error

2、檢查 device 是否已經(jīng)上電使能,以及正確的 init。

3、檢查 i2c speed 是否適配,speed 大于 device 支持的 max speed 也會(huì)造成 ACK Error。降低速度,如果仍然可以工作的話就說(shuō)明是 clk 相關(guān)問(wèn)題。

4、檢查 i2c device 信號(hào)電平是否與 AP 匹配。

5、GPIO check 以下幾個(gè)部分:

  1. GPIO 電流驅(qū)動(dòng)能力。
  2. GPIO 工作模式是否是 I2C 模式。
  3. GPIO 是否有內(nèi)部上拉電阻。
  4. GPIO 默認(rèn)電平狀態(tài)。

從 i2c spec 看,如下情況 NACK 是正常的。

I2C 寫

圖片

主機(jī)向從機(jī)發(fā)送數(shù)據(jù)時(shí),最后一個(gè) Byte 數(shù)據(jù)時(shí),從機(jī)可能應(yīng)答也可能非應(yīng)答,但不怎樣主機(jī)都可以產(chǎn)生停止條件,如果主機(jī)在向從機(jī)發(fā)送數(shù)據(jù)(甚至包括從機(jī)地址在內(nèi))時(shí)檢測(cè)到從機(jī)非應(yīng)答,則會(huì)及時(shí)停止傳輸。

I2C 讀

圖片

主機(jī)從從機(jī)接收數(shù)據(jù)時(shí),最后一個(gè) Byte 數(shù)據(jù)時(shí),主機(jī)不回應(yīng)該從機(jī),即 NACK。

二、I2C timeout

當(dāng) I2C 傳輸發(fā)生 timeout 時(shí),一般 kernel log 會(huì)有類似如下打印:

[48.197718][xxx]i2c i2c-1: addr:0xa,transfer timeout

圖片

1、GPIO check 以下幾個(gè)部分。

  1. GPIO 電流驅(qū)動(dòng)能力。
  2. GPIO 工作模式是否是 I2C 模式。
  3. GPIO 是否有內(nèi)部上拉電阻。
  4. GPIO 默認(rèn)電平狀態(tài)。

2、排查 slave 順序。

  1. log 中第一個(gè)發(fā)生 timeout 的 slave。
  2. 有 power 控制和 reset 控制的 slave。
  3. other slave。

復(fù)現(xiàn)問(wèn)題后,可以手動(dòng)將相應(yīng)外設(shè)去掉,確認(rèn)是哪個(gè)外設(shè)將 i2c bus 拉住,再與供應(yīng)商溝通,debug 一下該 IC 狀態(tài),理清拉住 i2c bus 原因。

三、i2c-tools

i2c-tools 也很好用,這個(gè)工具工具博主上次寫過(guò),參考以下文章:

??手把手教你使用 i2c-tools。??

四、常見(jiàn)問(wèn)題

1、同一條 i2c bus 上所有的外設(shè)的 i2c addr 要不同

(1)相同 address 注冊(cè)時(shí)沖突.

[2.059184][xxx]i2c i2c-1:Failed to register i2c client 24c02 at 0x51(-16) 
[2.059189][xxx]i2c i2c-1:Can't create device at 0x51

對(duì)應(yīng)的錯(cuò)誤碼是 -16。

/kernel-5.10/include/uapi/asm-generic/errno-base.h
#define EPERM 1 /* Operation not permitted */
#define ENOENT 2 /* No such file or directory */
#define ESRCH 3 /* No such process */
#define EINTR 4 /* Interrupted system call */
#define EIO 5 /* I/O error */
#define ENXIO 6 /* No such device or address */
#define E2BIG 7 /* Argument list too long */
#define ENOEXEC 8 /* Exec format error */
#define EBADF 9 /* Bad file number */
#define ECHILD 10 /* No child processes */
#define EAGAIN 11 /* Try again */
#define ENOMEM 12 /* Out of memory */
#define EACCES 13 /* Permission denied */
#define EFAULT 14 /* Bad address */
#define ENOTBLK 15 /* Block device required */
#define EBUSY 16 /* Device or resource busy */
......

可以執(zhí)行 ls /sys/bus/i2c/devices 查看對(duì)應(yīng)的 i2c-1 下是否已經(jīng)有注冊(cè)相同的 address 的外設(shè)。

若返回 -11,-EAGAIN。代表總線正忙,或無(wú)法申請(qǐng)到總線鎖。如果總線正忙,請(qǐng) retry 等待,或查看是哪個(gè) device 一直在發(fā)送。如果無(wú)法申請(qǐng)到總線鎖,請(qǐng)查看是否在中斷函數(shù)或原子上下文調(diào)用了 i2c_transfer。

(2)隱藏的 i2c address,即外設(shè)存在多個(gè) i2c addr 或外設(shè) HW bug,導(dǎo)致 i2c 通訊異常。

示例:eeprom 在 i2c-1 上注冊(cè)了 0x50 地址,而 type c 雖然注冊(cè)到 0x60 地址,但對(duì) 0x50 也能產(chǎn)生響應(yīng),type c 拉低了 SDA ,從而 timeout 。

debug 方法:

  1. 軟件上確認(rèn)數(shù)據(jù)及對(duì)應(yīng)的 driver 是否正確。
  2. 硬件上逐一去掉外設(shè),確認(rèn)是哪個(gè)外設(shè)導(dǎo)致。

2、示波器 ACK 的地方有毛刺

slave 在第 9 個(gè) clk 產(chǎn)生 ACK 應(yīng)答后,換成 mater 端來(lái)控制時(shí)產(chǎn)生的毛刺。此毛刺不會(huì)影響 I2C 總線讀寫時(shí)序,無(wú)需處理。

即 slave 和 master 控制總線切換間隔,沒(méi)有人控制總線,帶來(lái)的毛刺。

3、半高電平

在外接上拉電阻的情況下,有 enable 內(nèi)部下拉電阻,導(dǎo)致總線上有半高電平。

4、總線上電平拉不到地

  1. master 端發(fā)送數(shù)據(jù)時(shí)電平拉不到地,可以增大驅(qū)動(dòng)電流或者上拉電阻。
  2. slave 端拉不到地,可以咨詢供應(yīng)商看是否能增大 slave 端驅(qū)動(dòng)電流或者上拉電阻。

5、RK 平臺(tái) I2C debug

來(lái)源于 firefly。

https://wiki.t-firefly.com/zh_CN/Firefly-RK3399/driver_i2c.html

I2C 通信失敗,出現(xiàn) log: “timeout, ipd: 0x00, state: 1”

請(qǐng)檢查硬件上拉是否給電。

調(diào)用 i2c_transfer 返回值為 -6?

返回值為 -6 表示為 NACK 錯(cuò)誤,即對(duì)方設(shè)備無(wú)應(yīng)答響應(yīng),這種情況一般為外設(shè)的問(wèn)題,常見(jiàn)的有以下幾種情況:

  1. I2C 地址錯(cuò)誤,解決方法是測(cè)量 I2C 波形,確認(rèn)是否 I2C 設(shè)備地址錯(cuò)誤;
  2. I2C slave 設(shè)備不處于正常工作狀態(tài),比如未給電,錯(cuò)誤的上電時(shí)序等;
  3. 時(shí)序不符合 I2C slave 設(shè)備所要求也會(huì)產(chǎn)生 Nack 信號(hào)。

當(dāng)外設(shè)對(duì)于讀時(shí)序要求中間是 stop 信號(hào)不是 repeat start 信號(hào)的時(shí)候,該如何處理?

這時(shí)需要調(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 failed\n");
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 failed\n");
else
memcpy(data, buffer, data_len);
kfree(buffer);
return ret;
}

相信以上的 I2C debug 方法已經(jīng)能為大家解決大部分問(wèn)題,如果還是沒(méi)解決,一般是芯片問(wèn)題或者原廠底層 code bug,可以找芯片原廠支持。

責(zé)任編輯:姜華 來(lái)源: 嵌入式Linux系統(tǒng)開(kāi)發(fā)
相關(guān)推薦

2022-06-13 09:21:45

I2C DriverI2C 子系統(tǒng)

2022-05-27 09:00:09

I2C子系統(tǒng)協(xié)議

2022-06-12 07:30:13

I3C通訊協(xié)議

2022-06-07 08:42:21

高速模式HS mode

2010-06-08 16:21:50

I2C總線協(xié)議

2010-06-08 16:25:35

I2C總線協(xié)議

2010-07-01 16:45:05

I2C總線協(xié)議

2023-04-07 09:14:31

硬件通信串口通信實(shí)驗(yàn)

2020-06-24 14:15:56

C語(yǔ)言物聯(lián)網(wǎng)通信

2019-04-29 10:26:49

TCP網(wǎng)絡(luò)協(xié)議網(wǎng)絡(luò)通信

2023-10-12 19:37:50

通信協(xié)議HTTP

2024-02-20 19:53:57

網(wǎng)絡(luò)通信協(xié)議

2010-06-11 14:31:08

通信協(xié)議

2022-12-02 14:42:37

2017-08-11 18:25:25

Linuxi2c

2017-03-16 08:30:19

Android ThAndroidI2C

2024-04-07 09:32:02

物聯(lián)網(wǎng)串口通信協(xié)議

2010-06-11 14:25:08

通信協(xié)議

2010-06-25 14:43:46

通信協(xié)議

2010-07-06 17:14:03

網(wǎng)關(guān)通信協(xié)議
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)