mirror of
https://github.com/qmk/qmk_firmware.git
synced 2025-07-16 21:01:31 +00:00
Make AVRISP-MKII clone project's software PDI/TPI mode more robust by keeping track of timeouts while waiting for a Tx/Rx to finish.
This commit is contained in:
parent
3c7ff36cfd
commit
85aaaf84ce
@ -156,8 +156,7 @@ void XPROGTarget_EnableTargetPDI(void)
|
|||||||
PORTD |= (1 << 3);
|
PORTD |= (1 << 3);
|
||||||
_delay_us(1);
|
_delay_us(1);
|
||||||
|
|
||||||
/* Set up the synchronous USART for XMEGA communications -
|
/* Set up the synchronous USART for XMEGA communications - 8 data bits, even parity, 2 stop bits */
|
||||||
8 data bits, even parity, 2 stop bits */
|
|
||||||
UBRR1 = (F_CPU / XPROG_HARDWARE_SPEED);
|
UBRR1 = (F_CPU / XPROG_HARDWARE_SPEED);
|
||||||
UCSR1B = (1 << TXEN1);
|
UCSR1B = (1 << TXEN1);
|
||||||
UCSR1C = (1 << UMSEL10) | (1 << UPM11) | (1 << USBS1) | (1 << UCSZ11) | (1 << UCSZ10) | (1 << UCPOL1);
|
UCSR1C = (1 << UMSEL10) | (1 << UPM11) | (1 << USBS1) | (1 << UCSZ11) | (1 << UCSZ10) | (1 << UCPOL1);
|
||||||
@ -172,7 +171,6 @@ void XPROGTarget_EnableTargetPDI(void)
|
|||||||
|
|
||||||
/* Fire timer compare channel A ISR to manage the software USART */
|
/* Fire timer compare channel A ISR to manage the software USART */
|
||||||
OCR1A = BITS_BETWEEN_USART_CLOCKS;
|
OCR1A = BITS_BETWEEN_USART_CLOCKS;
|
||||||
OCR1B = BITS_BETWEEN_USART_CLOCKS;
|
|
||||||
TCCR1B = (1 << WGM12) | (1 << CS10);
|
TCCR1B = (1 << WGM12) | (1 << CS10);
|
||||||
TIMSK1 = (1 << OCIE1A);
|
TIMSK1 = (1 << OCIE1A);
|
||||||
#endif
|
#endif
|
||||||
@ -197,8 +195,7 @@ void XPROGTarget_EnableTargetTPI(void)
|
|||||||
DDRD |= (1 << 5) | (1 << 3);
|
DDRD |= (1 << 5) | (1 << 3);
|
||||||
DDRD &= ~(1 << 2);
|
DDRD &= ~(1 << 2);
|
||||||
|
|
||||||
/* Set up the synchronous USART for TINY communications -
|
/* Set up the synchronous USART for TINY communications - 8 data bits, even parity, 2 stop bits */
|
||||||
8 data bits, even parity, 2 stop bits */
|
|
||||||
UBRR1 = (F_CPU / XPROG_HARDWARE_SPEED);
|
UBRR1 = (F_CPU / XPROG_HARDWARE_SPEED);
|
||||||
UCSR1B = (1 << TXEN1);
|
UCSR1B = (1 << TXEN1);
|
||||||
UCSR1C = (1 << UMSEL10) | (1 << UPM11) | (1 << USBS1) | (1 << UCSZ11) | (1 << UCSZ10) | (1 << UCPOL1);
|
UCSR1C = (1 << UMSEL10) | (1 << UPM11) | (1 << USBS1) | (1 << UCSZ11) | (1 << UCSZ10) | (1 << UCPOL1);
|
||||||
@ -402,7 +399,14 @@ static void XPROGTarget_SetTxMode(void)
|
|||||||
|
|
||||||
IsSending = true;
|
IsSending = true;
|
||||||
#else
|
#else
|
||||||
while (SoftUSART_BitCount);
|
while (SoftUSART_BitCount && TimeoutMSRemaining)
|
||||||
|
{
|
||||||
|
if (TIFR0 & (1 << OCF0A))
|
||||||
|
{
|
||||||
|
TIFR0 |= (1 << OCF0A);
|
||||||
|
TimeoutMSRemaining--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Wait for a full cycle of the clock */
|
/* Wait for a full cycle of the clock */
|
||||||
SoftUSART_Data = 0x0001;
|
SoftUSART_Data = 0x0001;
|
||||||
@ -436,7 +440,14 @@ static void XPROGTarget_SetRxMode(void)
|
|||||||
DDRD &= ~(1 << 3);
|
DDRD &= ~(1 << 3);
|
||||||
PORTD &= ~(1 << 3);
|
PORTD &= ~(1 << 3);
|
||||||
#else
|
#else
|
||||||
while (SoftUSART_BitCount);
|
while (SoftUSART_BitCount && TimeoutMSRemaining)
|
||||||
|
{
|
||||||
|
if (TIFR0 & (1 << OCF0A))
|
||||||
|
{
|
||||||
|
TIFR0 |= (1 << OCF0A);
|
||||||
|
TimeoutMSRemaining--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (XPROG_SelectedProtocol == XPRG_PROTOCOL_PDI)
|
if (XPROG_SelectedProtocol == XPRG_PROTOCOL_PDI)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user