X-Git-Url: http://git.linex4red.de/pub/USBasp.git/blobdiff_plain/1d433d4506113c95285f633e3553ff62d4cfd05d..db73b11244c2c5dc444f3c459d6823be8d1fe655:/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.c?ds=sidebyside diff --git a/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.c b/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.c index 7cf62ffee..065cd0965 100644 --- a/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.c +++ b/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.c @@ -140,7 +140,7 @@ void XPROGTarget_SendByte(const uint8_t Byte) UDR1 = Byte; } -/** Receives a byte via the software USART, blocking until data is received. +/** Receives a byte via the hardware USART, blocking until data is received or timeout expired. * * \return Received byte from the USART */ @@ -151,7 +151,7 @@ uint8_t XPROGTarget_ReceiveByte(void) XPROGTarget_SetRxMode(); /* Wait until a byte has been received before reading */ - while (!(UCSR1A & (1 << RXC1)) && TimeoutTicksRemaining); + while (!(UCSR1A & (1 << RXC1)) && !(TimeoutExpired)); return UDR1; } @@ -174,9 +174,14 @@ void XPROGTarget_SendIdle(void) static void XPROGTarget_SetTxMode(void) { - /* Wait for a full cycle of the clock */ - while (PIND & (1 << 5)); - while (!(PIND & (1 << 5))); + /* Need to do nothing for a full frame to send a BREAK - only one cycle should be needed, however + * there are reports that sometimes the interface will get stuck in some environments. */ + for (uint8_t i = 0; i < BITS_IN_USART_FRAME; i++) + { + /* Wait for a full cycle of the clock */ + while (PIND & (1 << 5)); + while (!(PIND & (1 << 5))); + } PORTD |= (1 << 3); DDRD |= (1 << 3);