Fixed bug in the TWI peripheral driver for the AVR8 devices causing incorrect failure...
authorDean Camera <dean@fourwalledcubicle.com>
Tue, 15 Jan 2013 19:34:35 +0000 (19:34 +0000)
committerDean Camera <dean@fourwalledcubicle.com>
Tue, 15 Jan 2013 19:34:35 +0000 (19:34 +0000)
LUFA/DoxygenPages/ChangeLog.txt
LUFA/Drivers/Peripheral/AVR8/TWI_AVR8.c

index b46efd0..e06e235 100644 (file)
@@ -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)
index 9cfad9a..e7629d5 100644 (file)
@@ -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))