通过I2C从I/O扩展器的输出寄存器读取字节
Reading byte from Output Register of I/O Expander via I2C
下面的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();
}
}
相关文章:
- 本质:使用__128寄存器
- 将寄存器设计成可由C和C++访问的外设的最佳实践
- 在模拟器中使用并集来模拟CPU寄存器有多合适
- 使用英特尔 PIN 修改寄存器
- AVX 指令中寄存器和指针之间的客观差异
- 什么是现实中的"endl"(或任何输出操纵器)?它是如何实现的,它如何与操作员<<一起工
- 如何确定我的处理器有多少个 AVX 寄存器?
- 除非使用某些寄存器,否则函数挂钩会崩溃
- 寄存器上的管道计算
- 其中关于内存和寄存器的左值和右值
- 有没有办法强制C++编译器将变量存储在寄存器中?
- "变量":函数中函数作用域不允许初始化的自动或寄存器变量'naked'
- Atmel Studio:返回一个包含数组的寄存器
- 使用 googletest 测试嵌入式C++代码时处理外设寄存器的重复符号
- 移位寄存器74HC595输出电流
- 超过255的Modbus寄存器无法访问SimpleModbus
- 如何在程序集函数中将元素数组作为参数传递时转发 ARM 寄存器的地址指针
- 为什么我的程序输出不断变化?EAX寄存器不断更改值
- 可以使用输入寄存器对输出 SIMD 寄存器进行寻址
- libOpenCL.so使用VFP寄存器参数,而输出不使用