--- /dev/null
+/*\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