[英]Reading byte from Output Register of I/O Expander via I2C
下面的 Arduino 代碼片段顯示了一個 function,它應該通過I2C返回從 I/O 擴展器TCA9535的 Output 寄存器讀取的字節。 我在TCA9535數據表圖 7-8中定位了我的代碼,在這里可以看到: https://i.stack.imgur.com/GgNAQ.png 。
但是,調用readOutputRegister()
總是返回255
。
uint8_t readOutputRegister(){
Wire.beginTransmission(0x20); // Set Write mode (RW = 0)
Wire.write(0x02); // Read-write byte Output Port 0
// Repeated START
Wire.beginTransmission(0x21); // Set Read mode (RW = 1)
uint8_t res = Wire.read();
// Stop condition
Wire.endTransmission();
return res;
}
這是我正在使用的TCA9535 I/O 擴展器數據表的鏈接: https://www.ti.com/lit/ds/symlink/tca9535.pdf
首先,來自Wire.endTransmission()
參考頁。
此 function 結束由 beginTransmission() 開始的到外圍設備的傳輸,並傳輸由 write() 排隊的字節。
對於 Wire 庫,很多人認為Wire.write()
會發送數據,實際上並非如此,它只是將數據放入隊列中。 僅當您調用Wire.endTransmission()
時才會發送數據。
所以你需要在Wire.write(0x02)
之后調用Wire.endTransmission()
) 。
其次,要讀取數據,它需要調用Wire.requestFrom()
並且還需要在讀取數據之前使用Wire.available()
檢查數據是否已接收。
Wire.beginTransmission(0x20); // Set Write mode (RW = 0)
Wire.write(0x02); // Read-write byte Output Port 0
if (Wire.endTransmission() != 0) {
// error
}
else {
Wire.requestFrom(0x20, 1); // request 1 byte from the i2c address
if (Wire.available()) {
uint8_t c = Wire.read();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.