From c6d6bdae0a6fa5604174428787ff3c415ca73fad Mon Sep 17 00:00:00 2001 From: Dean Camera Date: Wed, 12 Oct 2011 05:31:35 +0000 Subject: Added reliability patches to the AVRISP-MKII Clone project's PDI/TPI protocols (thanks to Justin Mattair). --- Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.c | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) (limited to 'Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.c') diff --git a/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.c b/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.c index 065cd09658..58df785596 100644 --- a/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.c +++ b/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.c @@ -92,7 +92,8 @@ void XPROGTarget_EnableTargetTPI(void) void XPROGTarget_DisableTargetPDI(void) { /* Switch to Rx mode to ensure that all pending transmissions are complete */ - XPROGTarget_SetRxMode(); + if (IsSending) + XPROGTarget_SetRxMode(); /* Turn off receiver and transmitter of the USART, clear settings */ UCSR1A = ((1 << TXC1) | (1 << RXC1)); @@ -108,7 +109,8 @@ void XPROGTarget_DisableTargetPDI(void) void XPROGTarget_DisableTargetTPI(void) { /* Switch to Rx mode to ensure that all pending transmissions are complete */ - XPROGTarget_SetRxMode(); + if (IsSending) + XPROGTarget_SetRxMode(); /* Turn off receiver and transmitter of the USART, clear settings */ UCSR1A |= (1 << TXC1) | (1 << RXC1); @@ -169,19 +171,16 @@ void XPROGTarget_SendIdle(void) /* Wait for a full cycle of the clock */ while (PIND & (1 << 5)); while (!(PIND & (1 << 5))); + while (PIND & (1 << 5)); } } static void XPROGTarget_SetTxMode(void) { - /* 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))); - } + /* Wait for a full cycle of the clock */ + while (PIND & (1 << 5)); + while (!(PIND & (1 << 5))); + while (PIND & (1 << 5)); PORTD |= (1 << 3); DDRD |= (1 << 3); -- cgit v1.2.3