簡體   English   中英

通過 I2C 從 I/O 擴展器的 Output 寄存器讀取字節

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM