Hi,
I am trying to write Flash in program. I am referring to CAN bootloader example. I can find the data is programmed into last sector of Bank 1. However, I found this sector can be only programmed once. I cannot program new into this sector. Here is my code for reference. Could someone please provide some guidance about this issue? Thanks.
/* Initialize the flash bank and activate the sectors */
uint32_t Fapi_Init(uint32_t ucStartBank, uint32_t ucEndBank)
{
uint32_t i;
/*SYS_CLK_FREQ is defined in bl_config.h */
if ((Fapi_initializeFlashBanks((uint32_t)SYS_CLK_FREQ)) == Fapi_Status_Success)
{
for (i = ucStartBank; i < ( ucEndBank + 1); i++)
{
(void)Fapi_setActiveFlashBank((Fapi_FlashBankType)i);
(void)Fapi_enableMainBankSectors(0xFFFF); /* used for API 2.01*/
while( FAPI_CHECK_FSM_READY_BUSY != Fapi_Status_FsmReady );
while( FAPI_GET_FSM_STATUS != Fapi_Status_Success ); /* don't have to include this one*/
}
g_ulBankInitialized = 1;
}
else
{
return (1);
}
return (0); //success
}
/* ulAddr must be starting address of one flash sector*/
uint32_t Fapi_BlockErase(uint32_t ulAddr, uint32_t Size)
{
uint8_t i=0, ucStartSector, ucEndSector;
uint32_t EndAddr, status;
EndAddr = ulAddr + Size;
for (i = 0; i < NUMBEROFSECTORS; i++)
{
if (ulAddr <= (uint32_t)(flash_sector[i].start))
{
g_ucStartBank = flash_sector[i].bankNumber;
ucStartSector = i;
break;
}
}
for (i = ucStartSector; i < NUMBEROFSECTORS; i++)
{
if (EndAddr <= (((uint32_t)flash_sector[i].start) + flash_sector[i].length))
{
g_ucEndBank = flash_sector[i].bankNumber;
ucEndSector = i;
break;
}
}
status = Fapi_Init(g_ucStartBank, g_ucEndBank);
if (status == 0) // initialization succeeds
{
for (i = ucStartSector; i < (ucEndSector + 1); i++){
Fapi_issueAsyncCommandWithAddress(Fapi_EraseSector, flash_sector[i].start);
while( FAPI_CHECK_FSM_READY_BUSY == Fapi_Status_FsmBusy );
while(FAPI_GET_FSM_STATUS != Fapi_Status_Success);
}
}
return (status);
}
//Bank here is not used. We calculate the bank in the function based on the Flash-Start-addr
uint32_t Fapi_BlockProgram(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 < 16u)
bytes = SizeInBytes;
else
bytes = 16;
/* The flash bank has been initialized in flash erase function */
if (g_ulBankInitialized |= 1 )
{
Fapi_Init(g_ucStartBank, g_ucEndBank);
}
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);
Fapi_flushPipeline();
src += bytes;
dst += bytes;
SizeInBytes -= bytes;
if ( SizeInBytes < 32){
bytes = SizeInBytes;
}
}
return (0);
}
void Flash_Write_Test(void)
{
static uint8 seqFlashWrite = 1;
uint32 dbIdx = 0;
uint32 dbCnt = FLASH_TEST_SECTOR_SIZE / FLASH_WRITE_BLOCK_SIZE;
uint32 retCode = Fapi_BlockErase(FLASH_TEST_SECTOR_BASE_ADDRESS, FLASH_TEST_SECTOR_SIZE);
uint8 checksum[CHECKSUM_REDUNDANT_SIZE] = {0};
uint8 u8PotStringBuf[128];
uint8 dataBlock[FLASH_WRITE_BLOCK_SIZE];
uint8 seed = (seqFlashWrite) % FLASH_WRITE_BLOCK_SIZE;
uint8 i = 0;
// Return an error if an access violation occurred.
if(retCode)
{
sprintf(u8PotStringBuf,"[Failed]-[Seq#%d]-Flash Write Test: 16KB Erase \r\n", seqFlashWrite);
sciDisplayText(UART_Msg, u8PotStringBuf);
#ifdef DEBUG_ON
sciDisplayText(UART_Debug, u8PotStringBuf);
#endif
seqFlashWrite++;
return;
}
else
{
sprintf(u8PotStringBuf,"[Passed]-[Seq#%d]-Flash Write Test: 16KB Erase \r\n", seqFlashWrite);
sciDisplayText(UART_Msg, u8PotStringBuf);
#ifdef DEBUG_ON
sciDisplayText(UART_Debug, u8PotStringBuf);
#endif
}
retCode = 0;
// generate data for Flash writing
for(i = 0; i < FLASH_WRITE_BLOCK_SIZE; i++)
dataBlock[i] = seed++;
for(i = 0; i < CHECKSUM_REDUNDANT_SIZE; i++)
checksum[i] = checksum8_2_compliment(dataBlock, FLASH_WRITE_BLOCK_SIZE);
for(dbIdx = 0; dbIdx < dbCnt; dbIdx++)
{
// set seed equals to data block index + execution sequence number
uint32 address = FLASH_TEST_SECTOR_BASE_ADDRESS + dbIdx * FLASH_WRITE_BLOCK_SIZE;
// program Flash with data block
retCode = Fapi_BlockProgram(address, (uint32_t)&dataBlock[0], FLASH_WRITE_BLOCK_SIZE);
if(retCode)
{
break;
}
}
if(retCode)
{
sprintf(u8PotStringBuf,"[Failed]-[Seq#%d]-Flash Write Test: 16KB Program \r\n", seqFlashWrite);
sciDisplayText(UART_Msg, u8PotStringBuf);
#ifdef DEBUG_ON
sciDisplayText(UART_Debug, u8PotStringBuf);
#endif
}
else
{
uint8 i = 0;
sprintf(u8PotStringBuf,"[Passed]-[Seq#%d]-Flash Write Test: 16KB Program. Checksum is:[ ", seqFlashWrite);
sciDisplayText(UART_Msg, u8PotStringBuf);
#ifdef DEBUG_ON
sciDisplayText(UART_Debug, u8PotStringBuf);
#endif
// store checksum into redundant data array
for(i=0; i<CHECKSUM_REDUNDANT_SIZE; i++)
{
Flash_Checksum[i] = checksum[i];
sprintf(u8PotStringBuf, "0x%0x ", checksum[i]);
sciDisplayText(UART_Msg, u8PotStringBuf);
#ifdef DEBUG_ON
sciDisplayText(UART_Debug, u8PotStringBuf);
#endif
}
sciDisplayText(UART_Msg, "]\r\n");
#ifdef DEBUG_ON
sciDisplayText(UART_Debug, "]\r\n");
#endif
}
seqFlashWrite++;
}
// main.c
// initialize Flash data for reading
Flash_Write_Test();
// initialize RAM data for reading
RAM_Write_Test();
Flash_Read_Test();
Flash_Write_Test();
Flash_Read_Test();
Flash_Write_Test();
Flash_Read_Test();
while(1)
{
}
