|
25 | 25 | #include <avr/io.h>
|
26 | 26 | #include <avr/interrupt.h>
|
27 | 27 | #include <compat/twi.h>
|
28 |
| -#include "Arduino.h" // for digitalWrite |
| 28 | +#include "Arduino.h" // for digitalWrite and millis |
29 | 29 |
|
30 | 30 | #ifndef cbi
|
31 | 31 | #define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
|
@@ -155,7 +155,14 @@ uint8_t twi_readFrom(uint8_t address, uint8_t* data, uint8_t length, uint8_t sen
|
155 | 155 | }
|
156 | 156 |
|
157 | 157 | // wait until twi is ready, become master receiver
|
| 158 | + uint32_t startMillis = millis(); |
158 | 159 | while(TWI_READY != twi_state){
|
| 160 | + if((twi_timeout_ms > 0) && (millis() - startMillis > twi_timeout_ms)) { |
| 161 | + //timeout |
| 162 | + twi_init(); |
| 163 | + |
| 164 | + return 0; |
| 165 | + } |
159 | 166 | continue;
|
160 | 167 | }
|
161 | 168 | twi_state = TWI_MRX;
|
@@ -194,7 +201,14 @@ uint8_t twi_readFrom(uint8_t address, uint8_t* data, uint8_t length, uint8_t sen
|
194 | 201 | TWCR = _BV(TWEN) | _BV(TWIE) | _BV(TWEA) | _BV(TWINT) | _BV(TWSTA);
|
195 | 202 |
|
196 | 203 | // wait for read operation to complete
|
| 204 | + startMillis = millis(); |
197 | 205 | while(TWI_MRX == twi_state){
|
| 206 | + if((twi_timeout_ms > 0) && (millis() - startMillis > twi_timeout_ms)) { |
| 207 | + //timeout |
| 208 | + twi_init(); |
| 209 | + |
| 210 | + return 0; |
| 211 | + } |
198 | 212 | continue;
|
199 | 213 | }
|
200 | 214 |
|
@@ -234,7 +248,14 @@ uint8_t twi_writeTo(uint8_t address, uint8_t* data, uint8_t length, uint8_t wait
|
234 | 248 | }
|
235 | 249 |
|
236 | 250 | // wait until twi is ready, become master transmitter
|
| 251 | + uint32_t startMillis = millis(); |
237 | 252 | while(TWI_READY != twi_state){
|
| 253 | + if((twi_timeout_ms > 0) && (millis() - startMillis > twi_timeout_ms)) { |
| 254 | + //timeout |
| 255 | + twi_init(); |
| 256 | + |
| 257 | + return 4; |
| 258 | + } |
238 | 259 | continue;
|
239 | 260 | }
|
240 | 261 | twi_state = TWI_MTX;
|
@@ -276,7 +297,14 @@ uint8_t twi_writeTo(uint8_t address, uint8_t* data, uint8_t length, uint8_t wait
|
276 | 297 | TWCR = _BV(TWINT) | _BV(TWEA) | _BV(TWEN) | _BV(TWIE) | _BV(TWSTA); // enable INTs
|
277 | 298 |
|
278 | 299 | // wait for write operation to complete
|
| 300 | + startMillis = millis(); |
279 | 301 | while(wait && (TWI_MTX == twi_state)){
|
| 302 | + if((twi_timeout_ms > 0) && (millis() - startMillis > twi_timeout_ms)) { |
| 303 | + //timeout |
| 304 | + twi_init(); |
| 305 | + |
| 306 | + return 4; |
| 307 | + } |
280 | 308 | continue;
|
281 | 309 | }
|
282 | 310 |
|
|
0 commit comments