CCS:5.4
F021 Flash API: 2.01.01
I am testing writing internal flash of TMS570ls3137 with FAPI.
I am using functions in bl_flash.c for erasing and writing to the flash.
I got this file from : https://e2e[dot] ti [dot] com/support/microcontrollers/hercules/f/312/t/286222
When I try to write on address 0x00180000 of bank1 everything works ok but if i repeat same process for address 0X000C0000, nothing happens
I read all 0xFFFF (blank) in memory (sometimes BAD0BAD0) and API goes in infinite loop on line
while(FAPI_GET_FSM_STATUS!= Fapi_Status_Success)
. As per customer requirement I need to write in bank0 using FAPI.
I have modified the cmd file to accommodate the FAPI section and using _copyAPI2RAM function for running API on RAM.
While debugging I observe that FAPI is correctly copied to RAM & PC register has address of RAM during FAPI function calls.
What did I miss? Please Help, I am stuck here.
/////////////////////////////////bl_link.cmd///////////////////////////////////////////
--retain="*(.intvecs)"
MEMORY
{
VECTORS (X) : origin=0x00000000 length=0x00000200
BOOT_LOAD (RX) : origin=0x00000200 length=0x00001000
FLASH_API (RX) : origin=0x00001200 length=0x00001000
FLASH0 (RX) : origin=0x00002200 length=0x00018000
SRAM (RW) : origin=0x08002000 length=0x00004000
STACK (RW) : origin=0x08000000 length=0x00002000
}
SECTIONS
{
.intvecs : {} > VECTORS
boot_code : {src\sys_core.obj (.text)} > BOOT_LOAD
eabi_start : {src\sys_startup.obj (.text)} > BOOT_LOAD
flashAPI :
{
//..\Debug\src\Fapi_UserDefinedFunctions.obj (.text)
..\Debug\src\bl_flash.obj (.text)
//..\Debug\src\ccrs\peripherals\McuFlash08.obj (.text)
//..\Debug\src\main.obj (.text)
--library=F021_API_CortexR4_BE.lib < FlashStateMachine.IssueFsmCommand.obj
FlashStateMachine.SetActiveBank.obj
FlashStateMachine.InitializeFlashBanks.obj
FlashStateMachine.EnableMainSectors.obj
FlashStateMachine.IssueFsmCommand.obj
FlashStateMachine.ScaleFclk.obj
Init.obj
Utilities.CalculateEcc.obj
Utilities.WaitDelay.obj
Utilities.CalculateFletcher.obj
Read.MarginByByte.obj
Read.Common.obj
Read.FlushPipeline.obj
Read.WdService.obj
Async.WithAddress.obj
Program.obj > (.text)
} load = FLASH_API, run = SRAM, LOAD_START(api_load), RUN_START(api_run), SIZE(api_size)
.text > FLASH0
.const > FLASH0
.cinit > FLASH0
.pinit > FLASH0
.data > SRAM
.bss > SRAM
.sysmem > SRAM
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////Writing function(called from main)/////////////////////
uint32_t Fapi_BlockProgram( uint32_t Bank, uint32_t Flash_Start_Address, uint32_t Data_Start_Address, uint32_t Size_In_Bytes)
{
register uint32_t src = Data_Start_Address;
register uint32_t dst = Flash_Start_Address;
register uint32_t bytes_remain = Size_In_Bytes;
uint8_t i, ucBank;
uint32_t status;
uint32_t bytes;
uint32_t Freq_In_MHz;
Freq_In_MHz = SYS_CLK_FREQ;
if (Size_In_Bytes < 16)
bytes = Size_In_Bytes;
else
bytes = 16;
for (i = 0; i < NUMBEROFSECTORS-1; i++){
if (Flash_Start_Address < (uint32_t)(flash_sector[i+1].start))
{
ucBank = flash_sector[i].bankNumber;
break;
}
}
if(( Flash_Start_Address == APP_START_ADDRESS ) || ( ucBank == 1 )){
Fapi_initializeFlashBanks(Freq_In_MHz); /* used for API Rev2.01 */
Fapi_setActiveFlashBank((Fapi_FlashBankType)ucBank);
Fapi_enableMainBankSectors(0xFF); /* used for API 2.01*/
while( FAPI_CHECK_FSM_READY_BUSY == Fapi_Status_FsmBusy );
while( FAPI_GET_FSM_STATUS!= Fapi_Status_Success );
}
while( bytes_remain > 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; //Size_In_Bytes;
dst += bytes; //Size_In_Bytes;
bytes_remain -= bytes; //Size_In_Bytes;
if ( bytes_remain < 16){
bytes = bytes_remain;
}
}
#ifdef DEBUG_MSG_L3
myprintf("\r Programmed the flash:%d Bytes",Size_In_Bytes);
#endif
status = Flash_Program_Check(Flash_Start_Address, Data_Start_Address, Size_In_Bytes);
return (status);
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////Function Call in main/////////////////////////////////////
#define WR_ADDR 0x000C0000
#define BANK Fapi_FlashBank0
unsigned char pucProgTest[0x100];
for(i=0 ; i<0x100; i++)
pucProgTest[i] = i;
Fapi_BlockProgram(BANK, (uint32_t) WR_ADDR, pucProgTest, 0x10);
//////////////////////////////////////////////////////////////////////////////////////////////////////////