More speed and quality improvements to the software USART in the AVRISP project.
This commit is contained in:
		
							parent
							
								
									f0b4d79629
								
							
						
					
					
						commit
						021b1b567e
					
				
					 5 changed files with 25 additions and 38 deletions
				
			
		| 
						 | 
					@ -48,23 +48,7 @@ void NVMTarget_SendNVMRegAddress(uint8_t Register)
 | 
				
			||||||
	uint32_t Address = XPROG_Param_NVMBase | Register;
 | 
						uint32_t Address = XPROG_Param_NVMBase | Register;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Send the calculated 32-bit address to the target, LSB first */
 | 
						/* Send the calculated 32-bit address to the target, LSB first */
 | 
				
			||||||
	PDITarget_SendByte(Address &  0xFF);
 | 
						NVMTarget_SendAddress(Address);
 | 
				
			||||||
	PDITarget_SendByte(Address >> 8);
 | 
					 | 
				
			||||||
	PDITarget_SendByte(Address >> 16);
 | 
					 | 
				
			||||||
	PDITarget_SendByte(Address >> 24);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/** Sends the given 32-bit absolute address to the target.
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 *  \param[in] AbsoluteAddress  Absolute address to send to the target
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
void NVMTarget_SendAddress(uint32_t AbsoluteAddress)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	/* Send the given 32-bit address to the target, LSB first */
 | 
					 | 
				
			||||||
	PDITarget_SendByte(AbsoluteAddress &  0xFF);
 | 
					 | 
				
			||||||
	PDITarget_SendByte(AbsoluteAddress >> 8);
 | 
					 | 
				
			||||||
	PDITarget_SendByte(AbsoluteAddress >> 16);
 | 
					 | 
				
			||||||
	PDITarget_SendByte(AbsoluteAddress >> 24);
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/** Waits while the target's NVM controller is busy performing an operation, exiting if the
 | 
					/** Waits while the target's NVM controller is busy performing an operation, exiting if the
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -105,6 +105,20 @@
 | 
				
			||||||
		#define NVM_CMD_ERASEWRITEEEPROMPAGE   0x35
 | 
							#define NVM_CMD_ERASEWRITEEEPROMPAGE   0x35
 | 
				
			||||||
		#define NVM_CMD_READEEPROM             0x06
 | 
							#define NVM_CMD_READEEPROM             0x06
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Inline Functions: */
 | 
				
			||||||
 | 
							/** Sends the given 32-bit absolute address to the target.
 | 
				
			||||||
 | 
							 *
 | 
				
			||||||
 | 
							 *  \param[in] AbsoluteAddress  Absolute address to send to the target
 | 
				
			||||||
 | 
							 */
 | 
				
			||||||
 | 
							static inline void NVMTarget_SendAddress(uint32_t AbsoluteAddress)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								/* Send the given 32-bit address to the target, LSB first */
 | 
				
			||||||
 | 
								PDITarget_SendByte(AbsoluteAddress &  0xFF);
 | 
				
			||||||
 | 
								PDITarget_SendByte(AbsoluteAddress >> 8);
 | 
				
			||||||
 | 
								PDITarget_SendByte(AbsoluteAddress >> 16);
 | 
				
			||||||
 | 
								PDITarget_SendByte(AbsoluteAddress >> 24);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Function Prototypes: */
 | 
						/* Function Prototypes: */
 | 
				
			||||||
		void NVMTarget_SendNVMRegAddress(uint8_t Register);
 | 
							void NVMTarget_SendNVMRegAddress(uint8_t Register);
 | 
				
			||||||
		void NVMTarget_SendAddress(uint32_t AbsoluteAddress);
 | 
							void NVMTarget_SendAddress(uint32_t AbsoluteAddress);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -196,19 +196,18 @@ void PDITarget_SendByte(uint8_t Byte)
 | 
				
			||||||
		IsSending = true;
 | 
							IsSending = true;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	bool    EvenParityBit = false;
 | 
						/* Calculate the new USART frame data here while while we wait for a previous byte (if any) to finish sending */
 | 
				
			||||||
	uint8_t ParityData    = Byte;
 | 
						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 */
 | 
						/* Compute Even parity - while a bit is still set, chop off lowest bit and toggle parity bit */
 | 
				
			||||||
 | 
						uint8_t ParityData    = Byte;
 | 
				
			||||||
	while (ParityData)
 | 
						while (ParityData)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		EvenParityBit ^= true;
 | 
							NewUSARTData ^= (1 << 9);
 | 
				
			||||||
		ParityData    &= (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 */
 | 
						/* Wait until transmitter is idle before writing new data */
 | 
				
			||||||
	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 */
 | 
				
			||||||
| 
						 | 
					@ -258,7 +257,7 @@ uint8_t PDITarget_ReceiveByte(void)
 | 
				
			||||||
	SoftUSART_BitCount = BITS_IN_FRAME;
 | 
						SoftUSART_BitCount = BITS_IN_FRAME;
 | 
				
			||||||
	while (SoftUSART_BitCount);
 | 
						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;
 | 
						return (uint8_t)SoftUSART_Data;
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -280,7 +279,7 @@ void PDITarget_SendBreak(void)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Need to do nothing for a full frame to send a BREAK */
 | 
						/* 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 */
 | 
							/* Wait for a full cycle of the clock */
 | 
				
			||||||
		while (PIND & (1 << 5));
 | 
							while (PIND & (1 << 5));
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -54,17 +54,7 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* 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 = XPLAIN
 | 
					BOARD = USBKEY
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Processor frequency.
 | 
					# Processor frequency.
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue