Fixed issues with EEPROM and FLASH ISP programming in the AVRISP project.

pull/1469/head
Dean Camera 15 years ago
parent b6a4584a19
commit 5f363996e3

@ -49,6 +49,7 @@
* ranges are specified (thanks to Thomas Bleeker) * 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 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 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 * \section Sec_ChangeLog091223 Version 091223
* *

@ -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 /* 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 */ * 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 */ /* Check to see the write completion method, to see if we have a valid polling address */
if (!(PollAddress) && (ByteToWrite != PollValue)) if (!(PollAddress) && (ByteToWrite != PollValue))
{ {
if (IsOddByte && (V2Command == CMD_PROGRAM_FLASH_ISP)) if (IsOddByte && (V2Command == CMD_PROGRAM_FLASH_ISP))
Write_Memory_Params.ProgrammingCommands[2] |= READ_WRITE_HIGH_BYTE_MASK; Write_Memory_Params.ProgrammingCommands[2] |= READ_WRITE_HIGH_BYTE_MASK;
PollAddress = (CurrentAddress & 0xFFFF); PollAddress = (CurrentAddress & 0xFFFF);
} }
@ -239,17 +240,17 @@ void ISPProtocol_ProgramMemory(uint8_t V2Command)
{ {
bool IsOddByte = (CurrentByte & 0x01); bool IsOddByte = (CurrentByte & 0x01);
uint8_t ByteToWrite = *(NextWriteByte++); 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(Write_Memory_Params.ProgrammingCommands[0]);
SPI_SendByte(CurrentAddress >> 8); SPI_SendByte(CurrentAddress >> 8);
SPI_SendByte(CurrentAddress & 0xFF); SPI_SendByte(CurrentAddress & 0xFF);
SPI_SendByte(ByteToWrite); 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 (ByteToWrite != PollValue)
{ {
if (IsOddByte && (V2Command == CMD_PROGRAM_FLASH_ISP)) if (IsOddByte && (V2Command == CMD_PROGRAM_FLASH_ISP))

@ -128,7 +128,7 @@ uint8_t ISPTarget_WaitForProgComplete(const uint8_t ProgrammingMode, const uint1
SPI_SendByte(PollAddress >> 8); SPI_SendByte(PollAddress >> 8);
SPI_SendByte(PollAddress & 0xFF); SPI_SendByte(PollAddress & 0xFF);
} }
while ((SPI_TransferByte(0x00) != PollValue) && TimeoutMSRemaining); while ((SPI_TransferByte(0x00) == PollValue) && TimeoutMSRemaining);
if (!(TimeoutMSRemaining)) if (!(TimeoutMSRemaining))
ProgrammingStatus = STATUS_CMD_TOUT; ProgrammingStatus = STATUS_CMD_TOUT;

Loading…
Cancel
Save