下面的Arduino代码片段显示了一个函数,它应该通过I2C返回从I/O Expander TCA9535的输出寄存器中读取的一个字节。我在TCA9535 Datasheet 图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
发布于 2022-08-13 13:30:58
首先,来自Wire.endTransmission() 参考页。
该函数结束对由beginTransmission()启动的外围设备的传输,将发送到write()排队的字节。
对于有线库,很多人认为Wire.write()会发送数据,实际上不是,它只将数据放在队列中。只有当您调用Wire.endTransmission()时,数据才会被发送。
因此,您需要在Wire.endTransmission()之后调用Wire.write(0x02)。
其次,要读取数据,需要调用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();
}
}https://stackoverflow.com/questions/73343887
复制相似问题