Arduino Wire.requestFrom 函数读取没有反应
前言
在读取DA217 传感器 ID 的时候,发现把需要读取的寄存器地址写过去之后,再用 Wire.requestFrom 去读取就没有反应了(程序不会继续运行,会卡死到此处)。
过程
- 参看 DA217 手册,看 I2C 通讯部分里面有一张通讯示例图。
- 其中 Table 13 是读取示意图,在里面可以看到把寄存器地址写过去之后,直接就发送下一个开始位,而不是发送 P(停止位)。所以写代码的时候需要注意这一点,在把寄存器地址写完之后,不能发送停止位。对应到代码里面就是 Wire.endTransmission(0); //这里的参数0,表示不发送停止位。
- 所以最终的读取代码是
uint8_t DA217::da217_read_reg(uint8_t reg)
{
uint8_t data = 0;
Wire.beginTransmission(_address); // start transmission to device
Wire.write(reg); // sends register address to read from
Wire.endTransmission(0); // end transmission
Wire.requestFrom((uint8_t)_address, (size_t)1,true);// send data n-bytes read
Wire.available();
data = Wire.read(); // receive DATA
return data;
}
参考文章
这篇文章对 Arduino 的I2C函数有很详细的介绍。