2017-10-11 76 views
1

我讀了相當長的一段詳細的教程和有關I2C導遊,但它是我不明白的是以下幾點:I2C閱讀並寄存器I2C寫行爲,並沒有從設備應答

假設你要讀寄存器在i2c從設備上,

我需要在i2c上「寫入」前7位爲slave_address,1位爲R/W,然後是reg_address(作爲數據),然後發出「讀取」爲字節

h_i2c *i2c_dev = i2c_drv_open(I2C1_PORT, SLAVE_ADDRESS); 
write_data[0] = 0x21; 
write_len = i2c_drv_write(i2c_h, write_data, 1); 
if (write_len != 1) 
    printf("error write_len is %d", write_len); 

uint8_t read_data[5]; 
read_len = i2c_drv_read(i2c_h, read_data, 5); 
if (read_len != 5) 
    wmprintf("error read_len is %d", read_len); 

我是否需要發出只讀的地址,這是從機和我想讀取的寄存器的「組合」?

此外,「自動增量」屬性意味着只要我將SDA控制給從屬設備,他將繼續發送數據?

EDIT1:

引述PDF:

的ENS210是具有 ×43固定從地址的I²C從設備。這意味着開始條件後的第一個字節是 1000 011x,其中x表示數據方向,因此0x86(1000 0110)用於寫入,0x87(1000 0111)用於讀取。

這裏是輸出

https://imgur.com/a/8G8UR

在上升沿我看到1 0 0 0 0 1 1 0 1

最後一個裝置NACK。

我的想法是:

  1. 傳感器是死
  2. 性不好,傳感器不能拉下SDA線
  3. 頻率爲125kHz的處是否正常?

PS: SCL探頭有問題,使信號質量更好,從你在這裏看到的

問候,

+1

您試圖與之交談的設備的數據表應顯示完整的交易波形圖,以便清楚說明。我會說這是前者。 – unwind

+0

我看過的所有I2C外設都是你的例子,有寫操作和寫操作,如果你讀5個字節,你讀地址0x21到0x25。 – JMA

+0

@JMA更新後的第一篇文章 – Luigi

回答

0

這取決於I2C器件上。大部分我見過讓你先寫一個地址指針,然後執行一個讀操作:

[START] - > [ADDR(W)] - > [REG] - > [RESTART] - > [ADDR (R)] - > [DATABYTES] - > [STOP]

我見過的大多數設備都將從指定的寄存器開始讀取數據,並自動遞增主設備確認的每個數據字節的地址指針。每個數據字節讀取將在內存中連續。但情況並非總是如此。如果需要,許多設備實際上會讓您將寄存器自動遞增關閉。

我見過的一些設備與他們期待讀取寄存器命令進來的方式有些不同。有些設備不會讓您將寄存器設置爲全部讀取,您必須執行順序讀取才能獲得所需的數據。一個I2C器件應該有這樣的信息,說明數據手冊中的讀/寫命令如何完成波形圖。

+0

ENS210是我在看的i2c設備 – Luigi