X-Git-Url: http://git.linex4red.de/pub/USBasp.git/blobdiff_plain/f0b4d796297cd4be311b8596c8308bad218adabd..24f730fce3f2022762011d795c3feada5ef874b3:/Projects/AVRISP/Lib/PDITarget.c diff --git a/Projects/AVRISP/Lib/PDITarget.c b/Projects/AVRISP/Lib/PDITarget.c index e21942a1f..29bb33985 100644 --- a/Projects/AVRISP/Lib/PDITarget.c +++ b/Projects/AVRISP/Lib/PDITarget.c @@ -167,7 +167,7 @@ void PDITarget_DisableTargetPDI(void) * * \param[in] Byte Byte to send through the USART */ -void PDITarget_SendByte(uint8_t Byte) +void PDITarget_SendByte(const uint8_t Byte) { #if defined(PDI_VIA_HARDWARE_USART) /* Switch to Tx mode if currently in Rx mode */ @@ -196,19 +196,18 @@ void PDITarget_SendByte(uint8_t Byte) IsSending = true; } - bool EvenParityBit = false; - uint8_t ParityData = Byte; + /* Calculate the new USART frame data here while while we wait for a previous byte (if any) to finish sending */ + uint16_t NewUSARTData = ((1 << 11) | (1 << 10) | (0 << 9) | ((uint16_t)Byte << 1) | (0 << 0)); /* Compute Even parity - while a bit is still set, chop off lowest bit and toggle parity bit */ + uint8_t ParityData = Byte; while (ParityData) { - EvenParityBit ^= true; - ParityData &= (ParityData - 1); + NewUSARTData ^= (1 << 9); + ParityData &= (ParityData - 1); } - /* Calculate the new USART frame data here while while we wait for a previous byte (if any) to finish sending */ - uint16_t NewUSARTData = ((1 << 11) | (1 << 10) | ((uint16_t)EvenParityBit << 9) | ((uint16_t)Byte << 1) | (0 << 0)); - + /* Wait until transmitter is idle before writing new data */ while (SoftUSART_BitCount); /* Data shifted out LSB first, START DATA PARITY STOP STOP */ @@ -258,7 +257,7 @@ uint8_t PDITarget_ReceiveByte(void) SoftUSART_BitCount = BITS_IN_FRAME; while (SoftUSART_BitCount); - /* Throw away the start, parity and stop bits to leave only the data */ + /* Throw away the parity and stop bits to leave only the data (start bit is already discarded) */ return (uint8_t)SoftUSART_Data; #endif } @@ -280,7 +279,7 @@ void PDITarget_SendBreak(void) } /* Need to do nothing for a full frame to send a BREAK */ - for (uint8_t i = 0; i <= BITS_IN_FRAME; i++) + for (uint8_t i = 0; i < BITS_IN_FRAME; i++) { /* Wait for a full cycle of the clock */ while (PIND & (1 << 5)); @@ -312,14 +311,23 @@ void PDITarget_SendBreak(void) bool PDITarget_WaitWhileNVMBusBusy(void) { TCNT0 = 0; - + TIFR0 = (1 << OCF1A); + + uint8_t TimeoutMS = PDI_NVM_TIMEOUT_MS; + /* Poll the STATUS register to check to see if NVM access has been enabled */ - while (TCNT0 < PDI_NVM_TIMEOUT_MS) + while (TimeoutMS) { /* Send the LDCS command to read the PDI STATUS register to see the NVM bus is active */ PDITarget_SendByte(PDI_CMD_LDCS | PDI_STATUS_REG); if (PDITarget_ReceiveByte() & PDI_STATUS_NVM) return true; + + if (TIFR0 & (1 << OCF1A)) + { + TIFR0 = (1 << OCF1A); + TimeoutMS--; + } } return false;