TWIBus patch for proper use of Wire.requestFrom
This commit is contained in:
parent
8e9ac72191
commit
2b226bc5c2
|
@ -25,7 +25,6 @@
|
|||
#if ENABLED(EXPERIMENTAL_I2CBUS)
|
||||
|
||||
#include "twibus.h"
|
||||
|
||||
#include <Wire.h>
|
||||
|
||||
TWIBus::TWIBus() {
|
||||
|
@ -121,15 +120,9 @@ bool TWIBus::request(const uint8_t bytes) {
|
|||
#endif
|
||||
|
||||
// requestFrom() is a blocking function
|
||||
Wire.requestFrom(this->addr, bytes);
|
||||
|
||||
// Wait for all bytes to arrive
|
||||
millis_t t = millis() + this->timeout;
|
||||
while (Wire.available() < bytes)
|
||||
if (ELAPSED(millis(), t)) {
|
||||
if (Wire.requestFrom(this->addr, bytes) == 0) {
|
||||
#if ENABLED(DEBUG_TWIBUS)
|
||||
SERIAL_ECHO_START;
|
||||
SERIAL_ECHOLNPGM("i2c timeout");
|
||||
debug("request fail", this->addr);
|
||||
#endif
|
||||
return false;
|
||||
}
|
||||
|
@ -151,6 +144,11 @@ uint8_t TWIBus::capture(char *dst, const uint8_t bytes) {
|
|||
uint8_t count = 0;
|
||||
while (count < bytes && Wire.available())
|
||||
dst[count++] = Wire.read();
|
||||
|
||||
#if ENABLED(DEBUG_TWIBUS)
|
||||
debug(PSTR("capture"), count);
|
||||
#endif
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
|
|
|
@ -54,14 +54,6 @@ typedef void (*twiRequestFunc_t)();
|
|||
*/
|
||||
class TWIBus {
|
||||
private:
|
||||
/**
|
||||
* @brief Timeout value in milliseconds
|
||||
* @details Maximum amount of time (ms) to wait for a reply.
|
||||
* Useful if something goes wrong on the bus and the
|
||||
* SDA/SCL lines are held up by another device.
|
||||
*/
|
||||
const int timeout = 5;
|
||||
|
||||
/**
|
||||
* @brief Number of bytes on buffer
|
||||
* @description Number of bytes in the buffer waiting to be flushed to the bus
|
||||
|
@ -165,11 +157,11 @@ class TWIBus {
|
|||
/**
|
||||
* @brief Request data from the slave device and wait.
|
||||
* @details Request a number of bytes from a slave device.
|
||||
* Wait for the data to arrive until the timeout
|
||||
* interval expires. Return true on success.
|
||||
* Wait for the data to arrive, and return true
|
||||
* on success.
|
||||
*
|
||||
* @param bytes the number of bytes to request
|
||||
* @return status of the request: true=success, false=timeout
|
||||
* @return status of the request: true=success, false=fail
|
||||
*/
|
||||
bool request(const uint8_t bytes);
|
||||
|
||||
|
|
Loading…
Reference in a new issue