Added a timeout value to the TWI_StartTransmission() function, within which the addre...
[pub/lufa.git] / LUFA / Drivers / Peripheral / TWI.c
index 6028bba..eb513c4 100644 (file)
@@ -7,39 +7,58 @@
 \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
@@ -49,6 +68,6 @@ bool TWI_StartTransmission(uint8_t SlaveAddress)
                        default:\r
                                TWI_StopTransmission();\r
                                break;\r
-               }                 \r
+               }\r
        }\r
 }\r