Tool/software:
Hello,
Im trying to flash the microcontroler via SPI, (from a conected external memory).
Using the application notes provided:
SPI Bootloader for Hercules TMS570LS31X MCU (ti.com)
I have moodified this function to flash from the data reead in the external memories and not as packets recived via SPI,
however im having a issue with the function Fapi_BlockProgram.
Im getting
CortexR4: Trouble Reading Memory Block at 0x800243c on Page 0 of Length 0x3c
CortexR4: Trouble Reading Memory Block at 0x8002464 on Page 0 of Length 0x24
CortexR4: Can't Single Step Target Program: (Error -1066 @ 0x8002468) Unable to set/clear requested breakpoint. Verify that the breakpoint address is in valid memory. (Emulation package 9.4.0.00129)
CortexR4: Can't Run Target CPU: (Error -1066 @ 0x8002468) Unable to set/clear requested breakpoint. Verify that the breakpoint address is in valid memory. (Emulation package 9.4.0.00129)
/* bl_spi.c */
#define PAGE_LENGTH 16
void readExtMem(uint8_t FRAM, uint32_t packetNr, uint32_t dataDir, uint8_t *returnDir);
uint16_t rExtMem(uint32_t address, uint8_t cs, bool delay);
void cast8to32(uint8_t *dataIn, uint32_t *dataOut){
uint8_t littleEndian = 0;
if (littleEndian){
*dataOut = ((uint32_t)dataIn[3] << 24) |
((uint32_t)dataIn[2] << 16) |
((uint32_t)dataIn[1] << 8) |
((uint32_t)dataIn[0]);
} else {
*dataOut = ((uint32_t)dataIn[0] << 24) |
((uint32_t)dataIn[1] << 16) |
((uint32_t)dataIn[2] << 8) |
((uint32_t)dataIn[3]);
}
}
void UpdaterSPI_V2(spiBASE_t *node) {
uint32_t dataDir = APP_BANK_B;
uint32_t NrPages = 12;
uint8_t dataInMem_8[PAGE_LENGTH*8];
uint32_t dataInMem_32[PAGE_LENGTH*8/4];
uint8_t i;
uint32_t oReturnCheck;
uint32_t FLASH_FIRST_SECTOR_SIZE;
uint8_t ucBank, ulSize;
uint32_t updateStatusBank;
sciSend(scilinREG, 21, "\n\rProgram Flash begin");
ulSize = PAGE_LENGTH*8/4;
updateStatusBank = 0;
ucBank = 0;
g_ulTransferAddress = APP_START_ADDRESS;
g_ulTransferSize = ulSize*NrPages;
FLASH_FIRST_SECTOR_SIZE = BLInternalFlashFirstSectorSizeGet();
if(g_ulTransferSize > FLASH_FIRST_SECTOR_SIZE){
sciSend(scilinREG, 22, "\n\rProgram Flash failed");
sciSend(scilinREG, 16, "\n\r\tFile to large");
return;
}
while(1) {
sciSend(scilinREG, 20, "\n\r\n\rTransferSize: 0x");
sciDisplayData(scilinREG, (uint8 *) &g_ulTransferSize, 4);
uExtMem(FRAM1);
readExtMem(FRAM1, PAGE_LENGTH, dataDir, dataInMem_8);
sExtMem(FRAM1);
for(i = 0; i < PAGE_LENGTH*8/4; i++){
cast8to32(dataInMem_8+(i*4), dataInMem_32+i);
}
sciSend(scilinREG, 26, "\n\rEnter Fapi Block Program");
oReturnCheck = Fapi_BlockProgram( ucBank, g_ulTransferAddress, (uint32_t) &(dataInMem_32), ulSize);
sciSend(scilinREG, 25, "\n\rExit Fapi Block Program");
if (oReturnCheck) { /*Error*/
sciSend(scilinREG, 22, "\n\rProgram Flash failed");
break;
}
dataDir += ulSize*4;
g_ulTransferAddress += ulSize;
g_ulTransferSize -= ulSize;
if (g_ulTransferSize == 0) {
if (oReturnCheck == 0) {
oReturnCheck = Fapi_UpdateStatusProgram( updateStatusBank, g_ulUpdateStatusAddr, (uint32_t)&g_pulUpdateSuccess[0], g_ulUpdateBufferSize);
sciSend(scilinREG, 36, "\n\rApplication was loaded successful!");
break;
}
}
}
if (oReturnCheck == 0) {
sciSend(scilinREG, 17, "\n\r\n\rReseting...\n\r");
systemREG1->SYSECR = (0x10) << 14;
// The microcontroller should have reset,
// so this should never be reached.
while(1){}
}
}
/* bl_flash.c */
uint32_t Fapi_BlockProgram( uint32_t Bank, uint32_t Flash_Address, uint32_t Data_Address, uint32_t SizeInBytes)
{
register uint32_t src = Data_Address;
register uint32_t dst = Flash_Address;
uint32_t bytes;
if (SizeInBytes < 16)
bytes = SizeInBytes;
else
bytes = 16;
if ((Fapi_initializeFlashBanks((uint32_t)SYS_CLK_FREQ)) == Fapi_Status_Success){
(void)Fapi_setActiveFlashBank((Fapi_FlashBankType)Bank);
(void)Fapi_enableMainBankSectors(0xFFFF); /* used for API 2.01*/
}else {
return (1);
}
//Here the program gets stucked
while( FAPI_CHECK_FSM_READY_BUSY != Fapi_Status_FsmReady );
while( FAPI_GET_FSM_STATUS != Fapi_Status_Success );
while( SizeInBytes > 0)
{
Fapi_issueProgrammingCommand((uint32_t *)dst,
(uint8_t *)src,
(uint32_t) bytes,
0,
0,
Fapi_AutoEccGeneration);
while( FAPI_CHECK_FSM_READY_BUSY == Fapi_Status_FsmBusy );
// while(FAPI_GET_FSM_STATUS != Fapi_Status_Success);
src += bytes;
dst += bytes;
SizeInBytes -= bytes;
if ( SizeInBytes < 16){
bytes = SizeInBytes;
}
}
return (0);
}