From 5f363996e3b6fc66017ff02eb2de6f477e0f328e Mon Sep 17 00:00:00 2001 From: Dean Camera Date: Mon, 1 Feb 2010 03:42:10 +0000 Subject: [PATCH] Fixed issues with EEPROM and FLASH ISP programming in the AVRISP project. --- LUFA/ManPages/ChangeLog.txt | 1 + Projects/AVRISP-MKII/Lib/ISP/ISPProtocol.c | 15 ++++++++------- Projects/AVRISP-MKII/Lib/ISP/ISPTarget.c | 2 +- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/LUFA/ManPages/ChangeLog.txt b/LUFA/ManPages/ChangeLog.txt index b9436d6feb..8215bbe8ed 100644 --- a/LUFA/ManPages/ChangeLog.txt +++ b/LUFA/ManPages/ChangeLog.txt @@ -49,6 +49,7 @@ * ranges are specified (thanks to Thomas Bleeker) * - Fixed CDC and RNDIS host demos and class drivers - bidirectional endpoints should use two seperate pipes, not one half-duplex pipe * - Fixed Pipe_IsEndpointBound() not taking the endpoint's direction into account + * - Fixed EEPROM and FLASH ISP programming in the AVRISP project * * \section Sec_ChangeLog091223 Version 091223 * diff --git a/Projects/AVRISP-MKII/Lib/ISP/ISPProtocol.c b/Projects/AVRISP-MKII/Lib/ISP/ISPProtocol.c index 59a77e5758..33ccbf91e4 100644 --- a/Projects/AVRISP-MKII/Lib/ISP/ISPProtocol.c +++ b/Projects/AVRISP-MKII/Lib/ISP/ISPProtocol.c @@ -198,14 +198,15 @@ void ISPProtocol_ProgramMemory(uint8_t V2Command) /* AVR FLASH addressing requires us to modify the write command based on if we are writing a high * or low byte at the current word address */ - Write_Memory_Params.ProgrammingCommands[0] ^= READ_WRITE_HIGH_BYTE_MASK; + if (V2Command == CMD_PROGRAM_FLASH_ISP) + Write_Memory_Params.ProgrammingCommands[0] ^= READ_WRITE_HIGH_BYTE_MASK; /* Check to see the write completion method, to see if we have a valid polling address */ if (!(PollAddress) && (ByteToWrite != PollValue)) { if (IsOddByte && (V2Command == CMD_PROGRAM_FLASH_ISP)) Write_Memory_Params.ProgrammingCommands[2] |= READ_WRITE_HIGH_BYTE_MASK; - + PollAddress = (CurrentAddress & 0xFFFF); } @@ -239,17 +240,17 @@ void ISPProtocol_ProgramMemory(uint8_t V2Command) { bool IsOddByte = (CurrentByte & 0x01); uint8_t ByteToWrite = *(NextWriteByte++); - - if (IsOddByte && (V2Command == CMD_READ_FLASH_ISP)) - Write_Memory_Params.ProgrammingCommands[0] |= READ_WRITE_HIGH_BYTE_MASK; - else - Write_Memory_Params.ProgrammingCommands[0] &= ~READ_WRITE_HIGH_BYTE_MASK; SPI_SendByte(Write_Memory_Params.ProgrammingCommands[0]); SPI_SendByte(CurrentAddress >> 8); SPI_SendByte(CurrentAddress & 0xFF); SPI_SendByte(ByteToWrite); + /* AVR FLASH addressing requires us to modify the write command based on if we are writing a high + * or low byte at the current word address */ + if (V2Command == CMD_PROGRAM_FLASH_ISP) + Write_Memory_Params.ProgrammingCommands[0] ^= READ_WRITE_HIGH_BYTE_MASK; + if (ByteToWrite != PollValue) { if (IsOddByte && (V2Command == CMD_PROGRAM_FLASH_ISP)) diff --git a/Projects/AVRISP-MKII/Lib/ISP/ISPTarget.c b/Projects/AVRISP-MKII/Lib/ISP/ISPTarget.c index 19b0aa07b1..c9822d0a6c 100644 --- a/Projects/AVRISP-MKII/Lib/ISP/ISPTarget.c +++ b/Projects/AVRISP-MKII/Lib/ISP/ISPTarget.c @@ -128,7 +128,7 @@ uint8_t ISPTarget_WaitForProgComplete(const uint8_t ProgrammingMode, const uint1 SPI_SendByte(PollAddress >> 8); SPI_SendByte(PollAddress & 0xFF); } - while ((SPI_TransferByte(0x00) != PollValue) && TimeoutMSRemaining); + while ((SPI_TransferByte(0x00) == PollValue) && TimeoutMSRemaining); if (!(TimeoutMSRemaining)) ProgrammingStatus = STATUS_CMD_TOUT;