\r
#include "TWI.h"\r
\r
-bool TWI_StartTransmission(uint8_t SlaveAddress)\r
+bool TWI_StartTransmission(uint8_t SlaveAddress, uint8_t TimeoutMS)\r
{\r
for (;;)\r
{\r
- uint8_t IterationsRemaining = 50;\r
- bool BusCaptured = false;\r
+ bool BusCaptured = false;\r
+ uint16_t TimeoutRemaining;\r
\r
- while (IterationsRemaining-- && !BusCaptured)\r
+ TWCR = ((1 << TWINT) | (1 << TWSTA) | (1 << TWEN)); \r
+\r
+ TimeoutRemaining = (TimeoutMS * 100);\r
+ while (TimeoutRemaining-- && !BusCaptured)\r
{\r
- TWCR = ((1 << TWINT) | (1 << TWSTA) | (1 << TWEN)); \r
- while (!(TWCR & (1 << TWINT)));\r
- \r
- switch (TWSR & TW_STATUS_MASK)\r
+ if (TWCR & (1 << TWINT))\r
{\r
- case TW_START:\r
- case TW_REP_START:\r
- BusCaptured = true;\r
- break;\r
- case TW_MT_ARB_LOST:\r
- continue;\r
- default:\r
- return false;\r
+ switch (TWSR & TW_STATUS_MASK)\r
+ {\r
+ case TW_START:\r
+ case TW_REP_START:\r
+ BusCaptured = true;\r
+ break;\r
+ case TW_MT_ARB_LOST:\r
+ TWCR = ((1 << TWINT) | (1 << TWSTA) | (1 << TWEN)); \r
+ continue;\r
+ default:\r
+ TWCR = (1 << TWEN);\r
+ return false;\r
+ }\r
}\r
+ \r
+ _delay_us(10);\r
}\r
\r
if (!(BusCaptured))\r
- return false;\r
- \r
+ {\r
+ TWCR = (1 << TWEN);\r
+ return false;\r
+ }\r
+ \r
TWDR = SlaveAddress;\r
TWCR = ((1 << TWINT) | (1 << TWEN));\r
- while (!(TWCR & (1 << TWINT)));\r
\r
- GPIOR0 = (TWSR & TW_STATUS_MASK);\r
+ TimeoutRemaining = (TimeoutMS * 100);\r
+ while (TimeoutRemaining--)\r
+ {\r
+ if (TWCR & (1 << TWINT))\r
+ break;\r
+ \r
+ _delay_us(10);\r
+ }\r
+ \r
+ if (!(TimeoutRemaining))\r
+ return false;\r
\r
switch (TWSR & TW_STATUS_MASK)\r
{\r
default:\r
TWI_StopTransmission();\r
break;\r
- } \r
+ }\r
}\r
}\r