Added master mode hardware TWI driver.
[pub/lufa.git] / LUFA / Drivers / Peripheral / AVRU4U6U7 / TWI.c
diff --git a/LUFA/Drivers/Peripheral/AVRU4U6U7/TWI.c b/LUFA/Drivers/Peripheral/AVRU4U6U7/TWI.c
new file mode 100644 (file)
index 0000000..6028bba
--- /dev/null
@@ -0,0 +1,54 @@
+/*\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