From 730db924c92de6db6c3115325984f740ef300dd4 Mon Sep 17 00:00:00 2001 From: Dean Camera Date: Tue, 15 Jan 2013 19:34:35 +0000 Subject: [PATCH] Fixed bug in the TWI peripheral driver for the AVR8 devices causing incorrect failure codes to be returned in some cases (thanks to Peter K). --- LUFA/DoxygenPages/ChangeLog.txt | 1 + LUFA/Drivers/Peripheral/AVR8/TWI_AVR8.c | 6 ++++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/LUFA/DoxygenPages/ChangeLog.txt b/LUFA/DoxygenPages/ChangeLog.txt index b46efd09c7..e06e235e11 100644 --- a/LUFA/DoxygenPages/ChangeLog.txt +++ b/LUFA/DoxygenPages/ChangeLog.txt @@ -40,6 +40,7 @@ * - Fixed hardware race condition that could cause failed device enumerations for AVR8 and UC3 architectures (thanks to Mike Beyhs) * - Fixed incorrect Minimus board LED definitions (thanks to Joonas Lahtinen) * - Fixed incorrect ordering of the linker options in the build system causing link failures in some cases + * - Fixed bug in the TWI peripheral driver for the AVR8 devices causing incorrect failure codes to be returned in some cases (thanks to ) * - Library Applications: * - Fixed broken RESET_TOGGLES_LIBUSB_COMPAT compile time option in the AVRISP-MKII project * - Fixed incompatibility in the CDC class bootloader on some systems (thanks to Sylvain Munaut) diff --git a/LUFA/Drivers/Peripheral/AVR8/TWI_AVR8.c b/LUFA/Drivers/Peripheral/AVR8/TWI_AVR8.c index 9cfad9af4b..e7629d5b7b 100644 --- a/LUFA/Drivers/Peripheral/AVR8/TWI_AVR8.c +++ b/LUFA/Drivers/Peripheral/AVR8/TWI_AVR8.c @@ -45,7 +45,7 @@ uint8_t TWI_StartTransmission(const uint8_t SlaveAddress, TWCR = ((1 << TWINT) | (1 << TWSTA) | (1 << TWEN)); TimeoutRemaining = (TimeoutMS * 100); - while (TimeoutRemaining-- && !(BusCaptured)) + while (TimeoutRemaining && !(BusCaptured)) { if (TWCR & (1 << TWINT)) { @@ -65,6 +65,7 @@ uint8_t TWI_StartTransmission(const uint8_t SlaveAddress, } _delay_us(10); + TimeoutRemaining--; } if (!(TimeoutRemaining)) @@ -77,12 +78,13 @@ uint8_t TWI_StartTransmission(const uint8_t SlaveAddress, TWCR = ((1 << TWINT) | (1 << TWEN)); TimeoutRemaining = (TimeoutMS * 100); - while (TimeoutRemaining--) + while (TimeoutRemaining) { if (TWCR & (1 << TWINT)) break; _delay_us(10); + TimeoutRemaining--; } if (!(TimeoutRemaining))