X-Git-Url: http://git.linex4red.de/pub/USBasp.git/blobdiff_plain/72527867f6bd2d800bd0a71a90fe7079fbe1ab47..a5e79333e5769f92558bf20458c165e2582a0cb6:/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 bfc2e824d..6adb24f16 100644 --- a/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.c +++ b/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.c @@ -156,8 +156,7 @@ void XPROGTarget_EnableTargetPDI(void) PORTD |= (1 << 3); _delay_us(1); - /* Set up the synchronous USART for XMEGA communications - - 8 data bits, even parity, 2 stop bits */ + /* Set up the synchronous USART for XMEGA communications - 8 data bits, even parity, 2 stop bits */ UBRR1 = (F_CPU / XPROG_HARDWARE_SPEED); UCSR1B = (1 << TXEN1); UCSR1C = (1 << UMSEL10) | (1 << UPM11) | (1 << USBS1) | (1 << UCSZ11) | (1 << UCSZ10) | (1 << UCPOL1); @@ -166,15 +165,18 @@ void XPROGTarget_EnableTargetPDI(void) BITBANG_PDIDATA_DDR |= BITBANG_PDIDATA_MASK; BITBANG_PDICLOCK_DDR |= BITBANG_PDICLOCK_MASK; + /* Set DATA line low for at least 90ns to ensure that the device is ready for PDI mode to be entered */ + BITBANG_PDIDATA_PORT &= ~BITBANG_PDIDATA_MASK; + _delay_us(1); + /* Set DATA line high for at least 90ns to disable /RESET functionality */ BITBANG_PDIDATA_PORT |= BITBANG_PDIDATA_MASK; _delay_us(1); /* Fire timer compare channel A ISR to manage the software USART */ - OCR1A = BITS_BETWEEN_USART_CLOCKS; - OCR1B = BITS_BETWEEN_USART_CLOCKS; - TCCR1B = (1 << WGM12) | (1 << CS10); - TIMSK1 = (1 << OCIE1A); + OCR1A = BITS_BETWEEN_USART_CLOCKS; + TCCR1B = (1 << WGM12) | (1 << CS10); + TIMSK1 = (1 << OCIE1A); #endif /* Send two BREAKs of 12 bits each to enable PDI interface (need at least 16 idle bits) */ @@ -197,8 +199,7 @@ void XPROGTarget_EnableTargetTPI(void) DDRD |= (1 << 5) | (1 << 3); DDRD &= ~(1 << 2); - /* Set up the synchronous USART for TINY communications - - 8 data bits, even parity, 2 stop bits */ + /* Set up the synchronous USART for TINY communications - 8 data bits, even parity, 2 stop bits */ UBRR1 = (F_CPU / XPROG_HARDWARE_SPEED); UCSR1B = (1 << TXEN1); UCSR1C = (1 << UMSEL10) | (1 << UPM11) | (1 << USBS1) | (1 << UCSZ11) | (1 << UCSZ10) | (1 << UCPOL1); @@ -211,9 +212,9 @@ void XPROGTarget_EnableTargetTPI(void) BITBANG_TPIDATA_PORT |= BITBANG_TPIDATA_MASK; /* Fire timer capture channel ISR to manage the software USART */ - ICR1 = BITS_BETWEEN_USART_CLOCKS; - TCCR1B = (1 << WGM13) | (1 << WGM12) | (1 << CS10); - TIMSK1 = (1 << ICIE1); + ICR1 = BITS_BETWEEN_USART_CLOCKS; + TCCR1B = (1 << WGM13) | (1 << WGM12) | (1 << CS10); + TIMSK1 = (1 << ICIE1); #endif /* Send two BREAKs of 12 bits each to enable TPI interface (need at least 16 idle bits) */ @@ -317,6 +318,9 @@ void XPROGTarget_SendByte(const uint8_t Byte) SoftUSART_Data = NewUSARTData; SoftUSART_BitCount = BITS_IN_USART_FRAME; #endif + + if (TimeoutMSRemaining) + TimeoutMSRemaining = COMMAND_TIMEOUT_MS; } /** Receives a byte via the software USART, blocking until data is received. @@ -331,29 +335,16 @@ uint8_t XPROGTarget_ReceiveByte(void) #if defined(XPROG_VIA_HARDWARE_USART) /* Wait until a byte has been received before reading */ - while (!(UCSR1A & (1 << RXC1)) && TimeoutMSRemaining) - { - /* Manage software timeout */ - if (TIFR0 & (1 << OCF0A)) - { - TIFR0 |= (1 << OCF0A); - TimeoutMSRemaining--; - } - } + while (!(UCSR1A & (1 << RXC1)) && TimeoutMSRemaining); + if (TimeoutMSRemaining) + TimeoutMSRemaining = COMMAND_TIMEOUT_MS; + return UDR1; #else /* Wait until a byte has been received before reading */ SoftUSART_BitCount = BITS_IN_USART_FRAME; - while (SoftUSART_BitCount && TimeoutMSRemaining) - { - /* Manage software timeout */ - if (TIFR0 & (1 << OCF0A)) - { - TIFR0 |= (1 << OCF0A); - TimeoutMSRemaining--; - } - } + while (SoftUSART_BitCount && TimeoutMSRemaining); if (TimeoutMSRemaining) TimeoutMSRemaining = COMMAND_TIMEOUT_MS; @@ -385,6 +376,9 @@ void XPROGTarget_SendBreak(void) SoftUSART_Data = 0x0FFF; SoftUSART_BitCount = BITS_IN_USART_FRAME; #endif + + if (TimeoutMSRemaining) + TimeoutMSRemaining = COMMAND_TIMEOUT_MS; } static void XPROGTarget_SetTxMode(void) @@ -402,8 +396,8 @@ static void XPROGTarget_SetTxMode(void) IsSending = true; #else - while (SoftUSART_BitCount); - + while (SoftUSART_BitCount && TimeoutMSRemaining); + /* Wait for a full cycle of the clock */ SoftUSART_Data = 0x0001; SoftUSART_BitCount = 1; @@ -421,6 +415,9 @@ static void XPROGTarget_SetTxMode(void) } #endif + if (TimeoutMSRemaining) + TimeoutMSRemaining = COMMAND_TIMEOUT_MS; + IsSending = true; } @@ -436,28 +433,23 @@ static void XPROGTarget_SetRxMode(void) DDRD &= ~(1 << 3); PORTD &= ~(1 << 3); #else - while (SoftUSART_BitCount); + while (SoftUSART_BitCount && TimeoutMSRemaining); if (XPROG_SelectedProtocol == XPRG_PROTOCOL_PDI) { BITBANG_PDIDATA_DDR &= ~BITBANG_PDIDATA_MASK; BITBANG_PDIDATA_PORT &= ~BITBANG_PDIDATA_MASK; + + /* Wait until DATA line has been pulled up to idle by the target */ + while (!(BITBANG_PDIDATA_PIN & BITBANG_PDIDATA_MASK) && TimeoutMSRemaining); } else { BITBANG_TPIDATA_DDR &= ~BITBANG_TPIDATA_MASK; - BITBANG_TPIDATA_PORT &= ~BITBANG_TPIDATA_MASK; - } - - /* Wait until DATA line has been pulled up to idle by the target */ - while (!(BITBANG_PDIDATA_PIN & BITBANG_PDIDATA_MASK) && TimeoutMSRemaining) - { - /* Manage software timeout */ - if (TIFR0 & (1 << OCF0A)) - { - TIFR0 |= (1 << OCF0A); - TimeoutMSRemaining--; - } + BITBANG_TPIDATA_PORT &= ~BITBANG_TPIDATA_MASK; + + /* Wait until DATA line has been pulled up to idle by the target */ + while (!(BITBANG_TPIDATA_PIN & BITBANG_TPIDATA_MASK) && TimeoutMSRemaining); } #endif