@ -49,31 +49,31 @@ volatile uint16_t SoftUSART_Data;
# define SoftUSART_BitCount GPIOR2
# define SoftUSART_BitCount GPIOR2
/** ISR to manage the T PI software USART when bit-banged T PI USART mode is selected. */
/** ISR to manage the PD I software USART when bit-banged PD I USART mode is selected. */
ISR ( TIMER1_C APT _vect, ISR_BLOCK )
ISR ( TIMER1_C OMP A_vect, ISR_BLOCK )
{
{
/* Toggle CLOCK pin in a single cycle (see AVR datasheet) */
/* Toggle CLOCK pin in a single cycle (see AVR datasheet) */
BITBANG_ T PICLOCK_PIN | = BITBANG_ T PICLOCK_MASK;
BITBANG_ PD ICLOCK_PIN | = BITBANG_ PD ICLOCK_MASK;
/* If not sending or receiving, just exit */
/* If not sending or receiving, just exit */
if ( ! ( SoftUSART_BitCount ) )
if ( ! ( SoftUSART_BitCount ) )
return ;
return ;
/* Check to see if we are at a rising or falling edge of the clock */
/* Check to see if we are at a rising or falling edge of the clock */
if ( BITBANG_ T PICLOCK_PORT & BITBANG_ T PICLOCK_MASK)
if ( BITBANG_ PD ICLOCK_PORT & BITBANG_ PD ICLOCK_MASK)
{
{
/* If at rising clock edge and we are in send mode, abort */
/* If at rising clock edge and we are in send mode, abort */
if ( IsSending )
if ( IsSending )
return ;
return ;
/* Wait for the start bit when receiving */
/* Wait for the start bit when receiving */
if ( ( SoftUSART_BitCount = = BITS_IN_USART_FRAME ) & & ( BITBANG_ T PIDATA_PIN & BITBANG_ T PIDATA_MASK) )
if ( ( SoftUSART_BitCount = = BITS_IN_USART_FRAME ) & & ( BITBANG_ PD IDATA_PIN & BITBANG_ PD IDATA_MASK) )
return ;
return ;
/* Shift in the bit one less than the frame size in position, so that the start bit will eventually
/* 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 */
* be discarded leaving the data to be byte - aligned for quick access */
if ( BITBANG_ T PIDATA_PIN & BITBANG_ T PIDATA_MASK)
if ( BITBANG_ PD IDATA_PIN & BITBANG_ PD IDATA_MASK)
SoftUSART_Data | = ( 1 < < ( BITS_IN_USART_FRAME - 1 ) ) ;
( ( uint8_t * ) & SoftUSART_Data ) [ 1 ] | = ( 1 < < ( BITS_IN_USART_FRAME - 9 ) ) ;
SoftUSART_Data > > = 1 ;
SoftUSART_Data > > = 1 ;
SoftUSART_BitCount - - ;
SoftUSART_BitCount - - ;
@ -85,41 +85,41 @@ ISR(TIMER1_CAPT_vect, ISR_BLOCK)
return ;
return ;
/* Set the data line to the next bit value */
/* Set the data line to the next bit value */
if ( SoftUSART_Data & 0x01 )
if ( ( ( uint8_t * ) & SoftUSART_Data ) [ 0 ] & 0x01 )
BITBANG_ T PIDATA_PORT | = BITBANG_ T PIDATA_MASK;
BITBANG_ PD IDATA_PORT | = BITBANG_ PD IDATA_MASK;
else
else
BITBANG_ T PIDATA_PORT & = ~ BITBANG_ T PIDATA_MASK;
BITBANG_ PD IDATA_PORT & = ~ BITBANG_ PD IDATA_MASK;
SoftUSART_Data > > = 1 ;
SoftUSART_Data > > = 1 ;
SoftUSART_BitCount - - ;
SoftUSART_BitCount - - ;
}
}
}
}
/** ISR to manage the PD I software USART when bit-banged PD I USART mode is selected. */
/** ISR to manage the T PI software USART when bit-banged T PI USART mode is selected. */
ISR ( TIMER1_COMP A _vect, ISR_BLOCK )
ISR ( TIMER1_COMP B _vect, ISR_BLOCK )
{
{
/* Toggle CLOCK pin in a single cycle (see AVR datasheet) */
/* Toggle CLOCK pin in a single cycle (see AVR datasheet) */
BITBANG_ PD ICLOCK_PIN | = BITBANG_ PD ICLOCK_MASK;
BITBANG_ T PICLOCK_PIN | = BITBANG_ T PICLOCK_MASK;
/* If not sending or receiving, just exit */
/* If not sending or receiving, just exit */
if ( ! ( SoftUSART_BitCount ) )
if ( ! ( SoftUSART_BitCount ) )
return ;
return ;
/* Check to see if we are at a rising or falling edge of the clock */
/* Check to see if we are at a rising or falling edge of the clock */
if ( BITBANG_ PD ICLOCK_PORT & BITBANG_ PD ICLOCK_MASK)
if ( BITBANG_ T PICLOCK_PORT & BITBANG_ T PICLOCK_MASK)
{
{
/* If at rising clock edge and we are in send mode, abort */
/* If at rising clock edge and we are in send mode, abort */
if ( IsSending )
if ( IsSending )
return ;
return ;
/* Wait for the start bit when receiving */
/* Wait for the start bit when receiving */
if ( ( SoftUSART_BitCount = = BITS_IN_USART_FRAME ) & & ( BITBANG_ PD IDATA_PIN & BITBANG_ PD IDATA_MASK) )
if ( ( SoftUSART_BitCount = = BITS_IN_USART_FRAME ) & & ( BITBANG_ T PIDATA_PIN & BITBANG_ T PIDATA_MASK) )
return ;
return ;
/* Shift in the bit one less than the frame size in position, so that the start bit will eventually
/* 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 */
* be discarded leaving the data to be byte - aligned for quick access */
if ( BITBANG_ PD IDATA_PIN & BITBANG_ PD IDATA_MASK)
if ( BITBANG_ T PIDATA_PIN & BITBANG_ T PIDATA_MASK)
SoftUSART_Data | = ( 1 < < ( BITS_IN_USART_FRAME - 1 ) ) ;
( ( uint8_t * ) & SoftUSART_Data ) [ 1 ] | = ( 1 < < ( BITS_IN_USART_FRAME - 9 ) ) ;
SoftUSART_Data > > = 1 ;
SoftUSART_Data > > = 1 ;
SoftUSART_BitCount - - ;
SoftUSART_BitCount - - ;
@ -131,10 +131,10 @@ ISR(TIMER1_COMPA_vect, ISR_BLOCK)
return ;
return ;
/* Set the data line to the next bit value */
/* Set the data line to the next bit value */
if ( SoftUSART_Data & 0x01 )
if ( ( ( uint8_t * ) & SoftUSART_Data ) [ 0 ] & 0x01 )
BITBANG_ PD IDATA_PORT | = BITBANG_ PD IDATA_MASK;
BITBANG_ T PIDATA_PORT | = BITBANG_ T PIDATA_MASK;
else
else
BITBANG_ PD IDATA_PORT & = ~ BITBANG_ PD IDATA_MASK;
BITBANG_ T PIDATA_PORT & = ~ BITBANG_ T PIDATA_MASK;
SoftUSART_Data > > = 1 ;
SoftUSART_Data > > = 1 ;
SoftUSART_BitCount - - ;
SoftUSART_BitCount - - ;
@ -142,41 +142,42 @@ ISR(TIMER1_COMPA_vect, ISR_BLOCK)
}
}
# endif
# endif
/** Enables the target's T PI interface, holding the target in reset until T PI mode is exited. */
/** Enables the target's PD I interface, holding the target in reset until PD I mode is exited. */
void XPROGTarget_EnableTarget T PI( void )
void XPROGTarget_EnableTarget PD I( void )
{
{
/* Set /RESET line low for at least 90ns to enable TPI functionality */
RESET_LINE_DDR | = RESET_LINE_MASK ;
RESET_LINE_PORT & = ~ RESET_LINE_MASK ;
asm volatile ( " NOP " : : ) ;
asm volatile ( " NOP " : : ) ;
# if defined(XPROG_VIA_HARDWARE_USART)
# if defined(XPROG_VIA_HARDWARE_USART)
/* Set Tx and XCK as outputs, Rx as input */
/* Set Tx and XCK as outputs, Rx as input */
DDRD | = ( 1 < < 5 ) | ( 1 < < 3 ) ;
DDRD | = ( 1 < < 5 ) | ( 1 < < 3 ) ;
DDRD & = ~ ( 1 < < 2 ) ;
DDRD & = ~ ( 1 < < 2 ) ;
/* Set DATA line high for at least 90ns to disable /RESET functionality */
PORTD | = ( 1 < < 3 ) ;
asm volatile ( " NOP " : : ) ;
asm volatile ( " NOP " : : ) ;
/* Set up the synchronous USART for XMEGA communications -
/* Set up the synchronous USART for XMEGA communications -
8 data bits , even parity , 2 stop bits */
8 data bits , even parity , 2 stop bits */
UBRR1 = ( F_CPU / 1000000UL ) ;
UBRR1 = ( F_CPU / 1000000UL ) ;
UCSR1B = ( 1 < < TXEN1 ) ;
UCSR1B = ( 1 < < TXEN1 ) ;
UCSR1C = ( 1 < < UMSEL10 ) | ( 1 < < UPM11 ) | ( 1 < < USBS1 ) | ( 1 < < UCSZ11 ) | ( 1 < < UCSZ10 ) | ( 1 < < UCPOL1 ) ;
UCSR1C = ( 1 < < UMSEL10 ) | ( 1 < < UPM11 ) | ( 1 < < USBS1 ) | ( 1 < < UCSZ11 ) | ( 1 < < UCSZ10 ) | ( 1 < < UCPOL1 ) ;
/* Send two BREAKs of 12 bits each to enable T PI interface (need at least 16 idle bits) */
/* Send two BREAKs of 12 bits each to enable PD I interface (need at least 16 idle bits) */
XPROGTarget_SendBreak ( ) ;
XPROGTarget_SendBreak ( ) ;
XPROGTarget_SendBreak ( ) ;
XPROGTarget_SendBreak ( ) ;
# else
# else
/* Set DATA and CLOCK lines to outputs */
/* Set DATA and CLOCK lines to outputs */
BITBANG_ T PIDATA_DDR | = BITBANG_ T PIDATA_MASK;
BITBANG_ PD IDATA_DDR | = BITBANG_ PD IDATA_MASK;
BITBANG_ T PICLOCK_DDR | = BITBANG_ T PICLOCK_MASK;
BITBANG_ PD ICLOCK_DDR | = BITBANG_ PD ICLOCK_MASK;
/* Set DATA line high for idle state */
/* Set DATA line high for at least 90ns to disable /RESET functionality */
BITBANG_TPIDATA_PORT | = BITBANG_TPIDATA_MASK ;
BITBANG_PDIDATA_PORT | = BITBANG_PDIDATA_MASK ;
asm volatile ( " NOP " : : ) ;
asm volatile ( " NOP " : : ) ;
/* Fire timer capture ISR every 100 cycles to manage the software USART */
/* Fire timer c ompare channel A ISR every 9 0 cycles to manage the software USART */
OCR1A = 10 0;
OCR1A = 9 0;
TCCR1B = ( 1 < < WGM1 3) | ( 1 < < WGM1 2) | ( 1 < < CS10 ) ;
TCCR1B = ( 1 < < WGM1 2) | ( 1 < < CS10 ) ;
TIMSK1 = ( 1 < < ICIE1 ) ;
TIMSK1 = ( 1 < < OCIE1A ) ;
/* Send two BREAKs of 12 bits each to enable TPI interface (need at least 16 idle bits) */
/* Send two BREAKs of 12 bits each to enable TPI interface (need at least 16 idle bits) */
XPROGTarget_SendBreak ( ) ;
XPROGTarget_SendBreak ( ) ;
@ -184,42 +185,41 @@ void XPROGTarget_EnableTargetTPI(void)
# endif
# endif
}
}
/** Enables the target's PD I interface, holding the target in reset until PD I mode is exited. */
/** Enables the target's T PI interface, holding the target in reset until T PI mode is exited. */
void XPROGTarget_EnableTarget PD I( void )
void XPROGTarget_EnableTarget T PI( void )
{
{
/* Set /RESET line low for at least 90ns to enable TPI functionality */
RESET_LINE_DDR | = RESET_LINE_MASK ;
RESET_LINE_PORT & = ~ RESET_LINE_MASK ;
asm volatile ( " NOP " : : ) ;
asm volatile ( " NOP " : : ) ;
# if defined(XPROG_VIA_HARDWARE_USART)
# if defined(XPROG_VIA_HARDWARE_USART)
/* Set Tx and XCK as outputs, Rx as input */
/* Set Tx and XCK as outputs, Rx as input */
DDRD | = ( 1 < < 5 ) | ( 1 < < 3 ) ;
DDRD | = ( 1 < < 5 ) | ( 1 < < 3 ) ;
DDRD & = ~ ( 1 < < 2 ) ;
DDRD & = ~ ( 1 < < 2 ) ;
/* Set DATA line high for at least 90ns to disable /RESET functionality */
PORTD | = ( 1 < < 3 ) ;
asm volatile ( " NOP " : : ) ;
asm volatile ( " NOP " : : ) ;
/* Set up the synchronous USART for XMEGA communications -
/* Set up the synchronous USART for XMEGA communications -
8 data bits , even parity , 2 stop bits */
8 data bits , even parity , 2 stop bits */
UBRR1 = ( F_CPU / 1000000UL ) ;
UBRR1 = ( F_CPU / 1000000UL ) ;
UCSR1B = ( 1 < < TXEN1 ) ;
UCSR1B = ( 1 < < TXEN1 ) ;
UCSR1C = ( 1 < < UMSEL10 ) | ( 1 < < UPM11 ) | ( 1 < < USBS1 ) | ( 1 < < UCSZ11 ) | ( 1 < < UCSZ10 ) | ( 1 < < UCPOL1 ) ;
UCSR1C = ( 1 < < UMSEL10 ) | ( 1 < < UPM11 ) | ( 1 < < USBS1 ) | ( 1 < < UCSZ11 ) | ( 1 < < UCSZ10 ) | ( 1 < < UCPOL1 ) ;
/* Send two BREAKs of 12 bits each to enable PD I interface (need at least 16 idle bits) */
/* Send two BREAKs of 12 bits each to enable T PI interface (need at least 16 idle bits) */
XPROGTarget_SendBreak ( ) ;
XPROGTarget_SendBreak ( ) ;
XPROGTarget_SendBreak ( ) ;
XPROGTarget_SendBreak ( ) ;
# else
# else
/* Set DATA and CLOCK lines to outputs */
/* Set DATA and CLOCK lines to outputs */
BITBANG_ PD IDATA_DDR | = BITBANG_ PD IDATA_MASK;
BITBANG_ T PIDATA_DDR | = BITBANG_ T PIDATA_MASK;
BITBANG_ PD ICLOCK_DDR | = BITBANG_ PD ICLOCK_MASK;
BITBANG_ T PICLOCK_DDR | = BITBANG_ T PICLOCK_MASK;
/* Set DATA line high for at least 90ns to disable /RESET functionality */
/* Set DATA line high for idle state */
BITBANG_PDIDATA_PORT | = BITBANG_PDIDATA_MASK ;
BITBANG_TPIDATA_PORT | = BITBANG_TPIDATA_MASK ;
asm volatile ( " NOP " : : ) ;
asm volatile ( " NOP " : : ) ;
/* Fire timer c ompare ISR every 10 0 cycles to manage the software USART */
/* Fire timer capture channel B ISR every 90 cycles to manage the software USART */
OCR1 A = 100 ;
OCR1 B = 9 ;
TCCR1B = ( 1 < < WGM12 ) | ( 1 < < CS10 ) ;
TCCR1B = ( 1 < < WGM12 ) | ( 1 < < CS10 ) ;
TIMSK1 = ( 1 < < OCIE1 A ) ;
TIMSK1 = ( 1 < < OCIE1 B ) ;
/* Send two BREAKs of 12 bits each to enable TPI interface (need at least 16 idle bits) */
/* Send two BREAKs of 12 bits each to enable TPI interface (need at least 16 idle bits) */
XPROGTarget_SendBreak ( ) ;
XPROGTarget_SendBreak ( ) ;
@ -227,8 +227,8 @@ void XPROGTarget_EnableTargetPDI(void)
# endif
# endif
}
}
/** Disables the target's T PI interface, exits programming mode and starts the target's application. */
/** Disables the target's PD I interface, exits programming mode and starts the target's application. */
void XPROGTarget_DisableTarget T PI( void )
void XPROGTarget_DisableTarget PD I( void )
{
{
# if defined(XPROG_VIA_HARDWARE_USART)
# if defined(XPROG_VIA_HARDWARE_USART)
/* Turn off receiver and transmitter of the USART, clear settings */
/* Turn off receiver and transmitter of the USART, clear settings */
@ -241,21 +241,17 @@ void XPROGTarget_DisableTargetTPI(void)
PORTD & = ~ ( ( 1 < < 5 ) | ( 1 < < 3 ) | ( 1 < < 2 ) ) ;
PORTD & = ~ ( ( 1 < < 5 ) | ( 1 < < 3 ) | ( 1 < < 2 ) ) ;
# else
# else
/* Set DATA and CLOCK lines to inputs */
/* Set DATA and CLOCK lines to inputs */
BITBANG_ T PIDATA_DDR & = ~ BITBANG_ T PIDATA_MASK;
BITBANG_ PD IDATA_DDR & = ~ BITBANG_ PD IDATA_MASK;
BITBANG_ T PICLOCK_DDR & = ~ BITBANG_ T PICLOCK_MASK;
BITBANG_ PD ICLOCK_DDR & = ~ BITBANG_ PD ICLOCK_MASK;
/* Tristate DATA and CLOCK lines */
/* Tristate DATA and CLOCK lines */
BITBANG_ T PIDATA_PORT & = ~ BITBANG_ T PIDATA_MASK;
BITBANG_ PD IDATA_PORT & = ~ BITBANG_ PD IDATA_MASK;
BITBANG_ T PICLOCK_PORT & = ~ BITBANG_ T PICLOCK_MASK;
BITBANG_ PD ICLOCK_PORT & = ~ BITBANG_ PD ICLOCK_MASK;
# endif
# endif
/* Tristate target /RESET line */
RESET_LINE_DDR & = ~ RESET_LINE_MASK ;
RESET_LINE_PORT & = ~ RESET_LINE_MASK ;
}
}
/** Disables the target's PD I interface, exits programming mode and starts the target's application. */
/** Disables the target's TPI interface, exits programming mode and starts the target's application. */
void XPROGTarget_DisableTarget PD I( void )
void XPROGTarget_DisableTargetTPI ( void )
{
{
# if defined(XPROG_VIA_HARDWARE_USART)
# if defined(XPROG_VIA_HARDWARE_USART)
/* Turn off receiver and transmitter of the USART, clear settings */
/* Turn off receiver and transmitter of the USART, clear settings */
@ -268,13 +264,17 @@ void XPROGTarget_DisableTargetPDI(void)
PORTD & = ~ ( ( 1 < < 5 ) | ( 1 < < 3 ) | ( 1 < < 2 ) ) ;
PORTD & = ~ ( ( 1 < < 5 ) | ( 1 < < 3 ) | ( 1 < < 2 ) ) ;
# else
# else
/* Set DATA and CLOCK lines to inputs */
/* Set DATA and CLOCK lines to inputs */
BITBANG_ PD IDATA_DDR & = ~ BITBANG_ PD IDATA_MASK;
BITBANG_ T PIDATA_DDR & = ~ BITBANG_ T PIDATA_MASK;
BITBANG_ PD ICLOCK_DDR & = ~ BITBANG_ PD ICLOCK_MASK;
BITBANG_ T PICLOCK_DDR & = ~ BITBANG_ T PICLOCK_MASK;
/* Tristate DATA and CLOCK lines */
/* Tristate DATA and CLOCK lines */
BITBANG_ PD IDATA_PORT & = ~ BITBANG_ PD IDATA_MASK;
BITBANG_ T PIDATA_PORT & = ~ BITBANG_ T PIDATA_MASK;
BITBANG_ PD ICLOCK_PORT & = ~ BITBANG_ PD ICLOCK_MASK;
BITBANG_ T PICLOCK_PORT & = ~ BITBANG_ T PICLOCK_MASK;
# endif
# endif
/* Tristate target /RESET line */
RESET_LINE_DDR & = ~ RESET_LINE_MASK ;
RESET_LINE_PORT & = ~ RESET_LINE_MASK ;
}
}
/** Sends a byte via the USART.
/** Sends a byte via the USART.