From 39d56aeffecdd50d1e413c8da6edbe8485d5ac29 Mon Sep 17 00:00:00 2001 From: Dean Camera Date: Tue, 16 Mar 2010 11:47:11 +0000 Subject: Fixed PDI programming mode in the AVRISP programmer project not exiting programming mode correctly (clear target Reset key twice, set /RESET pin to pullup). Add newlines to the MIDI event printf() statements in the MIDI host demos. --- Projects/AVRISP-MKII/Lib/XPROG/XPROGProtocol.c | 10 +++++++++- Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.c | 21 ++++++--------------- 2 files changed, 15 insertions(+), 16 deletions(-) (limited to 'Projects/AVRISP-MKII/Lib/XPROG') diff --git a/Projects/AVRISP-MKII/Lib/XPROG/XPROGProtocol.c b/Projects/AVRISP-MKII/Lib/XPROG/XPROGProtocol.c index 805eaa31f..08936a202 100644 --- a/Projects/AVRISP-MKII/Lib/XPROG/XPROGProtocol.c +++ b/Projects/AVRISP-MKII/Lib/XPROG/XPROGProtocol.c @@ -119,7 +119,7 @@ static void XPROGProtocol_EnterXPROGMode(void) { /* Enable PDI programming mode with the attached target */ XPROGTarget_EnableTargetPDI(); - + /* Store the RESET key into the RESET PDI register to keep the XMEGA in reset */ XPROGTarget_SendByte(PDI_CMD_STCS | PDI_RESET_REG); XPROGTarget_SendByte(PDI_RESET_KEY); @@ -170,14 +170,22 @@ static void XPROGProtocol_LeaveXPROGMode(void) if (XPROG_SelectedProtocol == XPRG_PROTOCOL_PDI) { + 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); + + /* Clear /RESET key twice (for some reason this needs to be done twice to take effect) */ + XPROGTarget_SendByte(PDI_CMD_STCS | PDI_RESET_REG); + XPROGTarget_SendByte(0x00); XPROGTarget_DisableTargetPDI(); } else { + TINYNVM_WaitWhileNVMBusBusy(); + /* Clear the NVMEN bit in the TPI CONTROL register to disable TPI mode */ XPROGTarget_SendByte(TPI_CMD_SSTCS | TPI_CTRL_REG); XPROGTarget_SendByte(0x00); diff --git a/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.c b/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.c index 957084c0b..4ecf03335 100644 --- a/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.c +++ b/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.c @@ -232,33 +232,24 @@ void XPROGTarget_DisableTargetPDI(void) XPROGTarget_SetRxMode(); #if defined(XPROG_VIA_HARDWARE_USART) - /* Set /RESET high for a one millisecond to ensure target device is restarted */ - PORTD |= (1 << 5); - _delay_ms(1); - /* Turn off receiver and transmitter of the USART, clear settings */ - UCSR1A |= (1 << TXC1) | (1 << RXC1); + UCSR1A = ((1 << TXC1) | (1 << RXC1)); UCSR1B = 0; UCSR1C = 0; - /* Set all USART lines as input, tristate */ + /* Make Reset input with pullup to take target out of /RESET, tristate all other pins */ DDRD &= ~((1 << 5) | (1 << 3)); - PORTD &= ~((1 << 5) | (1 << 3) | (1 << 2)); + PORTD &= ~((1 << 3) | (1 << 2)); + PORTD |= (1 << 5); #else /* Turn off software USART management timer */ TCCR1B = 0; - /* Set /RESET high for a one millisecond to ensure target device is restarted */ - BITBANG_PDICLOCK_PORT |= BITBANG_PDICLOCK_MASK; - _delay_ms(1); - - /* Set DATA and CLOCK lines to inputs */ + /* Make Reset input with pullup to take target out of /RESET, tristate all other pins */ BITBANG_PDIDATA_DDR &= ~BITBANG_PDIDATA_MASK; BITBANG_PDICLOCK_DDR &= ~BITBANG_PDICLOCK_MASK; - - /* Tristate DATA and CLOCK lines */ - BITBANG_PDIDATA_PORT &= ~BITBANG_PDIDATA_MASK; BITBANG_PDICLOCK_PORT &= ~BITBANG_PDICLOCK_MASK; + BITBANG_PDIDATA_PORT |= BITBANG_PDIDATA_MASK; #endif } -- cgit v1.2.3