通过I2C从I/O扩展器的输出寄存器读取字节

Reading byte from Output Register of I/O Expander via I2C

本文关键字:输出 寄存器 读取 字节 扩展器 I2C 通过      更新时间:2024-09-27

下面的Arduino代码片段显示了一个函数,该函数应通过I2C返回从I/O扩展器TCA9535的输出寄存器读取的字节。我在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;
}

以下是我正在使用的TCA9535I/O扩展器的数据表链接:https://www.ti.com/lit/ds/symlink/tca9535.pdf

首先,来自Wire.endTransmission()参考页。

此函数结束由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();
}
}