首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用I2C从I/O扩展器输出寄存器读取字节

用I2C从I/O扩展器输出寄存器读取字节
EN

Stack Overflow用户
提问于 2022-08-13 11:34:21
回答 1查看 91关注 0票数 0

下面的Arduino代码片段显示了一个函数,它应该通过I2C返回从I/O Expander TCA9535的输出寄存器中读取的一个字节。我在TCA9535 Datasheet 图7-8上对代码进行了定向,如下所示:https://i.stack.imgur.com/GgNAQ.png

但是,调用readOutputRegister()总是返回255

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-08-13 13:30:58

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

该函数结束对由beginTransmission()启动的外围设备的传输,发送到write()排队的字节。

对于有线库,很多人认为Wire.write()会发送数据,实际上不是,它只将数据放在队列中。只有当您调用Wire.endTransmission()时,数据才会被发送。

因此,您需要在Wire.endTransmission()之后调用Wire.write(0x02)

其次,要读取数据,需要调用Wire.requestFrom(),并在读取数据之前检查数据是否与Wire.available()一起接收。

代码语言:javascript
复制
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();
  }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73343887

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档