From 27461546523862a3a76ee41f615f7ec2eed2195f Mon Sep 17 00:00:00 2001 From: Dean Camera Date: Tue, 19 Jan 2010 00:25:26 +0000 Subject: Added master mode hardware TWI driver. Fixed a bug in the incomplete Webserver project, where the packet data was not being written to and read from the correct buffer address. --- LUFA/Drivers/Peripheral/AVRU4U6U7/TWI.c | 54 +++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 LUFA/Drivers/Peripheral/AVRU4U6U7/TWI.c (limited to '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 index 000000000..6028bbae9 --- /dev/null +++ b/LUFA/Drivers/Peripheral/AVRU4U6U7/TWI.c @@ -0,0 +1,54 @@ +/* + Copyright (C) Dean Camera, 2010. + + dean [at] fourwalledcubicle [dot] com + www.fourwalledcubicle.com +*/ + +#include "TWI.h" + +bool TWI_StartTransmission(uint8_t SlaveAddress) +{ + for (;;) + { + uint8_t IterationsRemaining = 50; + bool BusCaptured = false; + + while (IterationsRemaining-- && !BusCaptured) + { + TWCR = ((1 << TWINT) | (1 << TWSTA) | (1 << TWEN)); + while (!(TWCR & (1 << TWINT))); + + switch (TWSR & TW_STATUS_MASK) + { + case TW_START: + case TW_REP_START: + BusCaptured = true; + break; + case TW_MT_ARB_LOST: + continue; + default: + return false; + } + } + + if (!(BusCaptured)) + return false; + + TWDR = SlaveAddress; + TWCR = ((1 << TWINT) | (1 << TWEN)); + while (!(TWCR & (1 << TWINT))); + + GPIOR0 = (TWSR & TW_STATUS_MASK); + + switch (TWSR & TW_STATUS_MASK) + { + case TW_MT_SLA_ACK: + case TW_MR_SLA_ACK: + return true; + default: + TWI_StopTransmission(); + break; + } + } +} -- cgit v1.2.3