Added reliability patches to the AVRISP-MKII Clone project's PDI/TPI protocols (thanks to Justin Mattair).
This commit is contained in:
		
							parent
							
								
									c15eaa5dae
								
							
						
					
					
						commit
						c6d6bdae0a
					
				
					 3 changed files with 22 additions and 18 deletions
				
			
		| 
						 | 
				
			
			@ -149,13 +149,18 @@ void XMEGANVM_DisablePDI(void)
 | 
			
		|||
{
 | 
			
		||||
	XMEGANVM_WaitWhileNVMBusBusy();
 | 
			
		||||
 | 
			
		||||
	/* Clear the RESET key in the RESET PDI register to allow the XMEGA to run */
 | 
			
		||||
	XPROGTarget_SendByte(PDI_CMD_STCS | PDI_RESET_REG);
 | 
			
		||||
	XPROGTarget_SendByte(0x00);
 | 
			
		||||
 | 
			
		||||
	/* Do it twice to make sure it takes effect (silicon bug?) */
 | 
			
		||||
	XPROGTarget_SendByte(PDI_CMD_STCS | PDI_RESET_REG);
 | 
			
		||||
	XPROGTarget_SendByte(0x00);
 | 
			
		||||
	/* Clear the RESET key in the RESET PDI register to allow the XMEGA to run - must perform this until the 
 | 
			
		||||
	 * change takes effect, as in some cases it takes multiple writes (silicon bug?).
 | 
			
		||||
	 */
 | 
			
		||||
	do
 | 
			
		||||
	{
 | 
			
		||||
		/* Clear reset register */
 | 
			
		||||
		XPROGTarget_SendByte(PDI_CMD_STCS | PDI_RESET_REG);
 | 
			
		||||
		XPROGTarget_SendByte(0x00);
 | 
			
		||||
	
 | 
			
		||||
		/* Read back the reset register, check to see if it took effect */
 | 
			
		||||
		XPROGTarget_SendByte(PDI_CMD_LDCS | PDI_RESET_REG);
 | 
			
		||||
	} while (XPROGTarget_ReceiveByte() != 0x00);
 | 
			
		||||
 | 
			
		||||
	XPROGTarget_DisableTargetPDI();
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -92,7 +92,8 @@ void XPROGTarget_EnableTargetTPI(void)
 | 
			
		|||
void XPROGTarget_DisableTargetPDI(void)
 | 
			
		||||
{
 | 
			
		||||
	/* Switch to Rx mode to ensure that all pending transmissions are complete */
 | 
			
		||||
	XPROGTarget_SetRxMode();
 | 
			
		||||
	if (IsSending)
 | 
			
		||||
	  XPROGTarget_SetRxMode();
 | 
			
		||||
 | 
			
		||||
	/* Turn off receiver and transmitter of the USART, clear settings */
 | 
			
		||||
	UCSR1A  = ((1 << TXC1) | (1 << RXC1));
 | 
			
		||||
| 
						 | 
				
			
			@ -108,7 +109,8 @@ void XPROGTarget_DisableTargetPDI(void)
 | 
			
		|||
void XPROGTarget_DisableTargetTPI(void)
 | 
			
		||||
{
 | 
			
		||||
	/* Switch to Rx mode to ensure that all pending transmissions are complete */
 | 
			
		||||
	XPROGTarget_SetRxMode();
 | 
			
		||||
	if (IsSending)
 | 
			
		||||
	  XPROGTarget_SetRxMode();
 | 
			
		||||
 | 
			
		||||
	/* Turn off receiver and transmitter of the USART, clear settings */
 | 
			
		||||
	UCSR1A |= (1 << TXC1) | (1 << RXC1);
 | 
			
		||||
| 
						 | 
				
			
			@ -169,19 +171,16 @@ void XPROGTarget_SendIdle(void)
 | 
			
		|||
		/* Wait for a full cycle of the clock */
 | 
			
		||||
		while (PIND & (1 << 5));
 | 
			
		||||
		while (!(PIND & (1 << 5)));
 | 
			
		||||
		while (PIND & (1 << 5));
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void XPROGTarget_SetTxMode(void)
 | 
			
		||||
{
 | 
			
		||||
    /* Need to do nothing for a full frame to send a BREAK - only one cycle should be needed, however
 | 
			
		||||
	 * there are reports that sometimes the interface will get stuck in some environments. */
 | 
			
		||||
    for (uint8_t i = 0; i < BITS_IN_USART_FRAME; i++)
 | 
			
		||||
    {
 | 
			
		||||
        /* Wait for a full cycle of the clock */
 | 
			
		||||
        while (PIND & (1 << 5));
 | 
			
		||||
        while (!(PIND & (1 << 5)));
 | 
			
		||||
    }
 | 
			
		||||
	/* Wait for a full cycle of the clock */
 | 
			
		||||
	while (PIND & (1 << 5));
 | 
			
		||||
	while (!(PIND & (1 << 5)));
 | 
			
		||||
	while (PIND & (1 << 5));
 | 
			
		||||
 | 
			
		||||
	PORTD  |=  (1 << 3);
 | 
			
		||||
	DDRD   |=  (1 << 3);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue