Slightly speed up software USART in the AVRISP project - faster parity computation, ensure received data is byte aligned when receive is complete by throwing away the start bit during reception.

pull/1469/head
Dean Camera 15 years ago
parent 108a22a66a
commit f0b4d79629

@ -70,8 +70,10 @@ ISR(TIMER1_COMPA_vect, ISR_BLOCK)
if ((SoftUSART_BitCount == BITS_IN_FRAME) && (BITBANG_PDIDATA_PIN & BITBANG_PDIDATA_MASK)) if ((SoftUSART_BitCount == BITS_IN_FRAME) && (BITBANG_PDIDATA_PIN & BITBANG_PDIDATA_MASK))
return; return;
/* Shift in the bit one less than the frame size in position, so that the start bit will eventually
* be discarded leaving the data to be byte-aligned for quick access */
if (BITBANG_PDIDATA_PIN & BITBANG_PDIDATA_MASK) if (BITBANG_PDIDATA_PIN & BITBANG_PDIDATA_MASK)
SoftUSART_Data |= (1 << BITS_IN_FRAME); SoftUSART_Data |= (1 << (BITS_IN_FRAME - 1));
SoftUSART_Data >>= 1; SoftUSART_Data >>= 1;
SoftUSART_BitCount--; SoftUSART_BitCount--;
@ -82,6 +84,7 @@ ISR(TIMER1_COMPA_vect, ISR_BLOCK)
if (!IsSending) if (!IsSending)
return; return;
/* Set the data line to the next bit value */
if (SoftUSART_Data & 0x01) if (SoftUSART_Data & 0x01)
BITBANG_PDIDATA_PORT |= BITBANG_PDIDATA_MASK; BITBANG_PDIDATA_PORT |= BITBANG_PDIDATA_MASK;
else else
@ -196,17 +199,20 @@ void PDITarget_SendByte(uint8_t Byte)
bool EvenParityBit = false; bool EvenParityBit = false;
uint8_t ParityData = Byte; uint8_t ParityData = Byte;
/* Compute Even parity bit */ /* Compute Even parity - while a bit is still set, chop off lowest bit and toggle parity bit */
for (uint8_t i = 0; i < 8; i++) while (ParityData)
{ {
EvenParityBit ^= ParityData & 0x01; EvenParityBit ^= true;
ParityData >>= 1; 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));
while (SoftUSART_BitCount); while (SoftUSART_BitCount);
/* Data shifted out LSB first, START DATA PARITY STOP STOP */ /* Data shifted out LSB first, START DATA PARITY STOP STOP */
SoftUSART_Data = ((uint16_t)EvenParityBit << 9) | ((uint16_t)Byte << 1) | (1 << 10) | (1 << 11); SoftUSART_Data = NewUSARTData;
SoftUSART_BitCount = BITS_IN_FRAME; SoftUSART_BitCount = BITS_IN_FRAME;
#endif #endif
} }
@ -253,7 +259,7 @@ uint8_t PDITarget_ReceiveByte(void)
while (SoftUSART_BitCount); while (SoftUSART_BitCount);
/* Throw away the start, parity and stop bits to leave only the data */ /* Throw away the start, parity and stop bits to leave only the data */
return (uint8_t)(SoftUSART_Data >> 1); return (uint8_t)SoftUSART_Data;
#endif #endif
} }

@ -54,7 +54,17 @@
/* Defines: */ /* Defines: */
#if ((BOARD == BOARD_XPLAIN) || (BOARD == BOARD_XPLAIN_REV1)) #if ((BOARD == BOARD_XPLAIN) || (BOARD == BOARD_XPLAIN_REV1))
#define PDI_VIA_HARDWARE_USART // #define PDI_VIA_HARDWARE_USART
#define BITBANG_PDIDATA_PORT PORTD
#define BITBANG_PDIDATA_DDR DDRD
#define BITBANG_PDIDATA_PIN PIND
#define BITBANG_PDIDATA_MASK (1 << 3)
#define BITBANG_PDICLOCK_PORT PORTD
#define BITBANG_PDICLOCK_DDR DDRD
#define BITBANG_PDICLOCK_PIN PIND
#define BITBANG_PDICLOCK_MASK (1 << 5)
#else #else
#define BITBANG_PDIDATA_PORT PORTB #define BITBANG_PDIDATA_PORT PORTB
#define BITBANG_PDIDATA_DDR DDRB #define BITBANG_PDIDATA_DDR DDRB

@ -66,7 +66,7 @@ MCU = at90usb1287
# Target board (see library "Board Types" documentation, USER or blank for projects not requiring # Target board (see library "Board Types" documentation, USER or blank for projects not requiring
# LUFA board drivers). If USER is selected, put custom board drivers in a directory called # LUFA board drivers). If USER is selected, put custom board drivers in a directory called
# "Board" inside the application directory. # "Board" inside the application directory.
BOARD = USBKEY BOARD = XPLAIN
# Processor frequency. # Processor frequency.

Loading…
Cancel
Save