More SDP code improvements - responses to ServiceSearchAttribute service discovery...
[pub/USBasp.git] / LUFA / Drivers / Peripheral / TWI.c
index 6028bba..bd6e853 100644 (file)
@@ -1,54 +1,73 @@
-/*\r
-     Copyright (C) Dean Camera, 2010.\r
-              \r
-  dean [at] fourwalledcubicle [dot] com\r
-      www.fourwalledcubicle.com\r
-*/\r
-\r
-#include "TWI.h"\r
-\r
-bool TWI_StartTransmission(uint8_t SlaveAddress)\r
-{\r
-       for (;;)\r
-       {\r
-               uint8_t IterationsRemaining = 50;\r
-               bool    BusCaptured = false;\r
-\r
-               while (IterationsRemaining-- && !BusCaptured)\r
-               {\r
-                       TWCR = ((1 << TWINT) | (1 << TWSTA) | (1 << TWEN));     \r
-                       while (!(TWCR & (1 << TWINT)));\r
-                               \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
-                                       continue;\r
-                               default:\r
-                                       return false;\r
-                       }\r
-               }\r
-               \r
-               if (!(BusCaptured))\r
-                 return false;\r
-                 \r
-               TWDR = SlaveAddress;\r
-               TWCR = ((1 << TWINT) | (1 << TWEN));\r
-               while (!(TWCR & (1 << TWINT)));\r
-               \r
-               GPIOR0 = (TWSR & TW_STATUS_MASK);\r
-\r
-               switch (TWSR & TW_STATUS_MASK)\r
-               {\r
-                       case TW_MT_SLA_ACK:\r
-                       case TW_MR_SLA_ACK:\r
-                               return true;\r
-                       default:\r
-                               TWI_StopTransmission();\r
-                               break;\r
-               }                 \r
-       }\r
-}\r
+/*
+     Copyright (C) Dean Camera, 2010.
+              
+  dean [at] fourwalledcubicle [dot] com
+      www.fourwalledcubicle.com
+*/
+
+#include "TWI.h"
+
+bool TWI_StartTransmission(uint8_t SlaveAddress, uint8_t TimeoutMS)
+{
+       for (;;)
+       {
+               bool     BusCaptured = false;
+               uint16_t TimeoutRemaining;
+
+               TWCR = ((1 << TWINT) | (1 << TWSTA) | (1 << TWEN));     
+
+               TimeoutRemaining = (TimeoutMS * 100);
+               while (TimeoutRemaining-- && !(BusCaptured))
+               {
+                       if (TWCR & (1 << TWINT))
+                       {
+                               switch (TWSR & TW_STATUS_MASK)
+                               {
+                                       case TW_START:
+                                       case TW_REP_START:
+                                               BusCaptured = true;
+                                               break;
+                                       case TW_MT_ARB_LOST:
+                                               TWCR = ((1 << TWINT) | (1 << TWSTA) | (1 << TWEN));     
+                                               continue;
+                                       default:
+                                               TWCR = (1 << TWEN);
+                                               return false;
+                               }
+                       }
+                       
+                       _delay_us(10);
+               }
+               
+               if (!(BusCaptured))
+               {
+                       TWCR = (1 << TWEN);
+                       return false;
+               }
+               
+               TWDR = SlaveAddress;
+               TWCR = ((1 << TWINT) | (1 << TWEN));
+               
+               TimeoutRemaining = (TimeoutMS * 100);
+               while (TimeoutRemaining--)
+               {
+                       if (TWCR & (1 << TWINT))
+                         break;
+                         
+                       _delay_us(10);
+               }
+               
+               if (!(TimeoutRemaining))
+                 return false;
+
+               switch (TWSR & TW_STATUS_MASK)
+               {
+                       case TW_MT_SLA_ACK:
+                       case TW_MR_SLA_ACK:
+                               return true;
+                       default:
+                               TWCR = ((1 << TWINT) | (1 << TWSTO) | (1 << TWEN));
+                               return false;
+               }
+       }
+}