Write_Memory_Params.PollValue2;
uint8_t* NextWriteByte = Write_Memory_Params.ProgData;
- /* Check to see if the host has issued a SET ADDRESS command and we haven't sent a
- * LOAD EXTENDED ADDRESS command (if needed, used when operating beyond the 128KB
- * FLASH barrier) */
- if (MustSetAddress)
- {
- if (CurrentAddress & (1UL << 31))
- ISPTarget_LoadExtendedAddress();
-
- MustSetAddress = false;
- }
-
/* Check the programming mode desired by the host, either Paged or Word memory writes */
if (Write_Memory_Params.ProgrammingMode & PROG_MODE_PAGED_WRITES_MASK)
{
uint16_t StartAddress = (CurrentAddress & 0xFFFF);
+ /* Check to see if we need to send a LOAD EXTENDED ADDRESS command to the target */
+ if (MustLoadExtendedAddress)
+ {
+ ISPTarget_LoadExtendedAddress();
+ MustLoadExtendedAddress = false;
+ }
+
/* Paged mode memory programming */
for (uint16_t CurrentByte = 0; CurrentByte < Write_Memory_Params.BytesToWrite; CurrentByte++)
{
PollAddress = (CurrentAddress & 0xFFFF);
}
- /* EEPROM just increments the address each byte, flash needs to increment on each word and
- * also check to ensure that a LOAD EXTENDED ADDRESS command is issued each time the extended
- * address boundary has been crossed */
- if (V2Command == CMD_PROGRAM_EEPROM_ISP)
- {
- CurrentAddress++;
- }
- else if (IsOddByte)
- {
- if (!(++CurrentAddress & 0xFFFF))
- ISPTarget_LoadExtendedAddress();
- }
+ /* EEPROM increments the address on each byte, flash needs to increment on each word */
+ if (IsOddByte || (V2Command == CMD_PROGRAM_EEPROM_ISP))
+ CurrentAddress++;
}
/* If the current page must be committed, send the PROGRAM PAGE command to the target */
ProgrammingStatus = ISPTarget_WaitForProgComplete(Write_Memory_Params.ProgrammingMode, PollAddress, PollValue,
Write_Memory_Params.DelayMS, Write_Memory_Params.ProgrammingCommands[2]);
+
+ /* Check to see if the FLASH address has crossed the extended address boundary */
+ if ((V2Command == CMD_PROGRAM_FLASH_ISP) && !(CurrentAddress & 0xFFFF))
+ MustLoadExtendedAddress = true;
}
}
else
bool IsOddByte = (CurrentByte & 0x01);
uint8_t ByteToWrite = *(NextWriteByte++);
+ /* Check to see if we need to send a LOAD EXTENDED ADDRESS command to the target */
+ if (MustLoadExtendedAddress)
+ {
+ ISPTarget_LoadExtendedAddress();
+ MustLoadExtendedAddress = false;
+ }
+
SPI_SendByte(Write_Memory_Params.ProgrammingCommands[0]);
SPI_SendByte(CurrentAddress >> 8);
SPI_SendByte(CurrentAddress & 0xFF);
PollAddress = (CurrentAddress & 0xFFFF);
}
+
+ ProgrammingStatus = ISPTarget_WaitForProgComplete(Write_Memory_Params.ProgrammingMode, PollAddress, PollValue,
+ Write_Memory_Params.DelayMS, Write_Memory_Params.ProgrammingCommands[2]);
+
+ /* Abort the programming loop early if the byte/word programming failed */
+ if (ProgrammingStatus != STATUS_CMD_OK)
+ break;
/* EEPROM just increments the address each byte, flash needs to increment on each word and
* also check to ensure that a LOAD EXTENDED ADDRESS command is issued each time the extended
* address boundary has been crossed */
- if (V2Command == CMD_PROGRAM_EEPROM_ISP)
+ if ((CurrentByte & 0x01) || (V2Command == CMD_PROGRAM_EEPROM_ISP))
{
CurrentAddress++;
- }
- else if (IsOddByte)
- {
- if (!(++CurrentAddress & 0xFFFF))
- ISPTarget_LoadExtendedAddress();
- }
- ProgrammingStatus = ISPTarget_WaitForProgComplete(Write_Memory_Params.ProgrammingMode, PollAddress, PollValue,
- Write_Memory_Params.DelayMS, Write_Memory_Params.ProgrammingCommands[2]);
-
- if (ProgrammingStatus != STATUS_CMD_OK)
- break;
+ if ((V2Command != CMD_PROGRAM_EEPROM_ISP) && !(CurrentAddress & 0xFFFF))
+ MustLoadExtendedAddress = true;
+ }
}
}
Endpoint_Write_Byte(V2Command);
Endpoint_Write_Byte(STATUS_CMD_OK);
-
- /* Check to see if the host has issued a SET ADDRESS command and we haven't sent a
- * LOAD EXTENDED ADDRESS command (if needed, used when operating beyond the 128KB
- * FLASH barrier) */
- if (MustSetAddress)
- {
- if (CurrentAddress & (1UL << 31))
- ISPTarget_LoadExtendedAddress();
-
- MustSetAddress = false;
- }
/* Read each byte from the device and write them to the packet for the host */
for (uint16_t CurrentByte = 0; CurrentByte < Read_Memory_Params.BytesToRead; CurrentByte++)
{
+ /* Check to see if we need to send a LOAD EXTENDED ADDRESS command to the target */
+ if (MustLoadExtendedAddress)
+ {
+ ISPTarget_LoadExtendedAddress();
+ MustLoadExtendedAddress = false;
+ }
+
/* Read the next byte from the desired memory space in the device */
SPI_SendByte(Read_Memory_Params.ReadMemoryCommand);
SPI_SendByte(CurrentAddress >> 8);
/* EEPROM just increments the address each byte, flash needs to increment on each word and
* also check to ensure that a LOAD EXTENDED ADDRESS command is issued each time the extended
* address boundary has been crossed */
- if (V2Command == CMD_READ_EEPROM_ISP)
+ if ((CurrentByte & 0x01) || (V2Command == CMD_READ_EEPROM_ISP))
{
CurrentAddress++;
- }
- else if (CurrentByte & 0x01)
- {
- if (!(++CurrentAddress & 0xFFFF))
- ISPTarget_LoadExtendedAddress();
+
+ if ((V2Command != CMD_READ_EEPROM_ISP) && !(CurrentAddress & 0xFFFF))
+ MustLoadExtendedAddress = true;
}
}