我讀了相當長的一段詳細的教程和有關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)用於讀取。
這裏是輸出
在上升沿我看到1 0 0 0 0 1 1 0 1
最後一個裝置NACK。
我的想法是:
- 傳感器是死
- 性不好,傳感器不能拉下SDA線
- 頻率爲125kHz的處是否正常?
PS: SCL探頭有問題,使信號質量更好,從你在這裏看到的
問候,
您試圖與之交談的設備的數據表應顯示完整的交易波形圖,以便清楚說明。我會說這是前者。 – unwind
我看過的所有I2C外設都是你的例子,有寫操作和寫操作,如果你讀5個字節,你讀地址0x21到0x25。 – JMA
@JMA更新後的第一篇文章 – Luigi