forked from mfulz_github/qmk_firmware
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.
This commit is contained in:
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))
|
||||
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)
|
||||
SoftUSART_Data |= (1 << BITS_IN_FRAME);
|
||||
SoftUSART_Data |= (1 << (BITS_IN_FRAME - 1));
|
||||
|
||||
SoftUSART_Data >>= 1;
|
||||
SoftUSART_BitCount--;
|
||||
|
@ -82,6 +84,7 @@ ISR(TIMER1_COMPA_vect, ISR_BLOCK)
|
|||
if (!IsSending)
|
||||
return;
|
||||
|
||||
/* Set the data line to the next bit value */
|
||||
if (SoftUSART_Data & 0x01)
|
||||
BITBANG_PDIDATA_PORT |= BITBANG_PDIDATA_MASK;
|
||||
else
|
||||
|
@ -196,17 +199,20 @@ void PDITarget_SendByte(uint8_t Byte)
|
|||
bool EvenParityBit = false;
|
||||
uint8_t ParityData = Byte;
|
||||
|
||||
/* Compute Even parity bit */
|
||||
for (uint8_t i = 0; i < 8; i++)
|
||||
/* Compute Even parity - while a bit is still set, chop off lowest bit and toggle parity bit */
|
||||
while (ParityData)
|
||||
{
|
||||
EvenParityBit ^= ParityData & 0x01;
|
||||
ParityData >>= 1;
|
||||
EvenParityBit ^= true;
|
||||
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);
|
||||
|
||||
/* 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;
|
||||
#endif
|
||||
}
|
||||
|
@ -253,7 +259,7 @@ uint8_t PDITarget_ReceiveByte(void)
|
|||
while (SoftUSART_BitCount);
|
||||
|
||||
/* 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
|
||||
}
|
||||
|
||||
|
|
|
@ -54,7 +54,17 @@
|
|||
|
||||
/* Defines: */
|
||||
#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
|
||||
#define BITBANG_PDIDATA_PORT PORTB
|
||||
#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
|
||||
# LUFA board drivers). If USER is selected, put custom board drivers in a directory called
|
||||
# "Board" inside the application directory.
|
||||
BOARD = USBKEY
|
||||
BOARD = XPLAIN
|
||||
|
||||
|
||||
# Processor frequency.
|
||||
|
|
Loading…
Reference in New Issue