Add start of a SDP service table, which will be linked to the Bluetooth SDP code.
[pub/USBasp.git] / LUFA / Drivers / Peripheral / TWI.c
index 6028bba..9e0c20d 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
@@ -47,8 +66,8 @@ bool TWI_StartTransmission(uint8_t SlaveAddress)
                        case TW_MR_SLA_ACK:\r
                                return true;\r
                        default:\r
-                               TWI_StopTransmission();\r
-                               break;\r
-               }                 \r
+                               TWCR = ((1 << TWINT) | (1 << TWSTO) | (1 << TWEN));\r
+                               return false;\r
+               }\r
        }\r
 }\r