Part Number: TMS570LC4357
Tool/software: Code Composer Studio
hello sir
I meet a strange problem, as following:
I erase a blank flash first, and write data into one sector of the flash successfully.
if I directly to erase the sector, it can success to erase it.
if I read data from the sector of the flash, then erase the sector, it failed to erase the sector. I didn't modiry any code about the flash handle.
about the flash handle code, please see the attachment.
/*
* flash_handle.c
*
* Created on: 2019��12��4��
* Author: Waite
*/
#include <stdio.h>
#include "flash_handle.h"
void OSTimeDly (uint32_t ticks);
/* The partition table of TMS570LC4357 */
struct Sector_List gSector_List[SECTOR_NUM] =
{
/* Bank ID Sector ID low Address Sector Size */
{Fapi_FlashBank0, 0, 0x00000000, 16 * 1024},
{Fapi_FlashBank0, 1, 0x00004000, 16 * 1024},
{Fapi_FlashBank0, 2, 0x00008000, 16 * 1024},
{Fapi_FlashBank0, 3, 0x0000C000, 16 * 1024},
{Fapi_FlashBank0, 4, 0x00010000, 16 * 1024},
{Fapi_FlashBank0, 5, 0x00014000, 16 * 1024},
{Fapi_FlashBank0, 6, 0x00018000, 32 * 1024},
{Fapi_FlashBank0, 7, 0x00020000, 128 * 1024},
{Fapi_FlashBank0, 8, 0x00040000, 128 * 1024},
{Fapi_FlashBank0, 9, 0x00060000, 128 * 1024},
{Fapi_FlashBank0, 10, 0x00080000, 256 * 1024},
{Fapi_FlashBank0, 11, 0x000C0000, 256 * 1024},
{Fapi_FlashBank0, 12, 0x00100000, 256 * 1024},
{Fapi_FlashBank0, 13, 0x00140000, 256 * 1024},
{Fapi_FlashBank0, 14, 0x00180000, 256 * 1024},
{Fapi_FlashBank0, 15, 0x001C0000, 256 * 1024},
{Fapi_FlashBank1, 0, 0x00200000, 128 * 1024},
{Fapi_FlashBank1, 1, 0x00220000, 128 * 1024},
{Fapi_FlashBank1, 2, 0x00240000, 128 * 1024},
{Fapi_FlashBank1, 3, 0x00260000, 128 * 1024},
{Fapi_FlashBank1, 4, 0x00280000, 128 * 1024},
{Fapi_FlashBank1, 5, 0x002A0000, 128 * 1024},
{Fapi_FlashBank1, 6, 0x002C0000, 128 * 1024},
{Fapi_FlashBank1, 7, 0x002E0000, 128 * 1024},
{Fapi_FlashBank1, 8, 0x00300000, 128 * 1024},
{Fapi_FlashBank1, 9, 0x00320000, 128 * 1024},
{Fapi_FlashBank1, 10, 0x00340000, 128 * 1024},
{Fapi_FlashBank1, 11, 0x00360000, 128 * 1024},
{Fapi_FlashBank1, 12, 0x00380000, 128 * 1024},
{Fapi_FlashBank1, 13, 0x003A0000, 128 * 1024},
{Fapi_FlashBank1, 14, 0x003C0000, 128 * 1024},
{Fapi_FlashBank1, 15, 0x003E0000, 128 * 1024},
{Fapi_FlashBank7, 0, 0xF0200000, 4 * 1024},
{Fapi_FlashBank7, 1, 0xF0201000, 4 * 1024},
{Fapi_FlashBank7, 2, 0xF0202000, 4 * 1024},
{Fapi_FlashBank7, 3, 0xF0203000, 4 * 1024},
{Fapi_FlashBank7, 4, 0xF0204000, 4 * 1024},
{Fapi_FlashBank7, 5, 0xF0205000, 4 * 1024},
{Fapi_FlashBank7, 6, 0xF0206000, 4 * 1024},
{Fapi_FlashBank7, 7, 0xF0207000, 4 * 1024},
{Fapi_FlashBank7, 8, 0xF0208000, 4 * 1024},
{Fapi_FlashBank7, 9, 0xF0209000, 4 * 1024},
{Fapi_FlashBank7, 10, 0xF020A000, 4 * 1024},
{Fapi_FlashBank7, 11, 0xF020B000, 4 * 1024},
{Fapi_FlashBank7, 12, 0xF020C000, 4 * 1024},
{Fapi_FlashBank7, 13, 0xF020D000, 4 * 1024},
{Fapi_FlashBank7, 14, 0xF020E000, 4 * 1024},
{Fapi_FlashBank7, 15, 0xF020F000, 4 * 1024},
{Fapi_FlashBank7, 16, 0xF0210000, 4 * 1024},
{Fapi_FlashBank7, 17, 0xF0211000, 4 * 1024},
{Fapi_FlashBank7, 18, 0xF0212000, 4 * 1024},
{Fapi_FlashBank7, 19, 0xF0213000, 4 * 1024},
{Fapi_FlashBank7, 20, 0xF0214000, 4 * 1024},
{Fapi_FlashBank7, 21, 0xF0215000, 4 * 1024},
{Fapi_FlashBank7, 22, 0xF0216000, 4 * 1024},
{Fapi_FlashBank7, 23, 0xF0217000, 4 * 1024},
{Fapi_FlashBank7, 24, 0xF0218000, 4 * 1024},
{Fapi_FlashBank7, 25, 0xF0219000, 4 * 1024},
{Fapi_FlashBank7, 26, 0xF021A000, 4 * 1024},
{Fapi_FlashBank7, 27, 0xF021B000, 4 * 1024},
{Fapi_FlashBank7, 28, 0xF021C000, 4 * 1024},
{Fapi_FlashBank7, 29, 0xF021D000, 4 * 1024},
{Fapi_FlashBank7, 30, 0xF021E000, 4 * 1024},
{Fapi_FlashBank7, 31, 0xF021F000, 4 * 1024},
};
void DelayMSt(void)
{
uint32_t count = 0;
for (count = 0; count < 10000; count++)
{}
}
uint32_t find_sector(Fapi_FlashBankType oNewFlashBank, uint32_t sector)
{
uint32_t i = 0;
for(i = 0; i<SECTOR_NUM; i++)
{
if( (gSector_List[i].banks_num == oNewFlashBank) && (gSector_List[i].sector_num == sector) )
{
return i;
}
}
return (uint32_t)-1;
}
uint32_t find_StartSectorNum(uint32_t flashSectorAddr)
{
uint32_t i = 0;
for(i = 0; i<SECTOR_NUM; i++)
{
if (flashSectorAddr >= gSector_List[i].low_addr && flashSectorAddr < gSector_List[i + 1].low_addr)
{
return i;
}
}
return (uint32_t)-1;
}
enum e_flash_status Flash_EraseSector(uint32_t num)
{
Fapi_StatusType oReturnCheck = Fapi_Status_Success;
oReturnCheck = Fapi_initializeFlashBanks(150); /* According to the Chip Manual*/
if((oReturnCheck == Fapi_Status_Success) && (FLASH_CONTROL_REGISTER->FmStat.FMSTAT_BITS.BUSY != Fapi_Status_FsmBusy))
{
oReturnCheck = Fapi_setActiveFlashBank(gSector_List[num].banks_num); /* Set Flash Bank Activate */
if( (gSector_List[num].banks_num == Fapi_FlashBank0) || (gSector_List[num].banks_num == Fapi_FlashBank1) )
{
/* Set the sectors available in the EEPROM store for erasure and programming */
oReturnCheck = Fapi_enableMainBankSectors( 1<<(gSector_List[num].sector_num) );
}
else if( gSector_List[num].banks_num == Fapi_FlashBank7 )
{
/* Set the sectors available in the EEPROM store for erasure and programming */
oReturnCheck = Fapi_enableEepromBankSectors(1<<(gSector_List[num].sector_num) ,0);
}
while(FLASH_CONTROL_REGISTER->FmStat.FMSTAT_BITS.BUSY == Fapi_Status_FsmBusy);
/* Issue command to flash state machine */
oReturnCheck = Fapi_issueAsyncCommandWithAddress(Fapi_EraseSector, (uint32_t*)(gSector_List[num].low_addr));
DelayMSt();
/* Place specific example code here */
DelayMSt();
/* Wait for FSM to finish */
while(FLASH_CONTROL_REGISTER->FmStat.FMSTAT_BITS.BUSY == Fapi_Status_FsmBusy);
/* Check the FSM Status to see if there were no errors */
if (FLASH_CONTROL_REGISTER->FmStat.u32Register != 0)
{
/* Put Error handling code here */
return flash_failure;
}
}
return flash_succeed;
}
enum e_flash_status Flash_EraseBanks(Fapi_FlashBankType oNewFlashBank)
{
int num = 0;
Fapi_StatusType oReturnCheck = Fapi_Status_Success;
Fapi_FlashStatusWordType poFlashStatus;
num = find_sector(oNewFlashBank, 0);
/* Initialize flash bank for API operations */
oReturnCheck = Fapi_initializeFlashBanks(150);
if ((oReturnCheck == Fapi_Status_Success) && (FLASH_CONTROL_REGISTER->FmStat.FMSTAT_BITS.BUSY != Fapi_Status_FsmBusy))
{
/* Set Flash Bank Activate */
oReturnCheck = Fapi_setActiveFlashBank(oNewFlashBank);
if ((oNewFlashBank == Fapi_FlashBank0) || (oNewFlashBank == Fapi_FlashBank1))
{
oReturnCheck = Fapi_enableMainBankSectors( 0xFFFF );
}
else if( oNewFlashBank == Fapi_FlashBank7 )
{
oReturnCheck = Fapi_enableEepromBankSectors(0xFFFFFFFF, 0xFFFFFFFF);
}
while(FLASH_CONTROL_REGISTER->FmStat.FMSTAT_BITS.BUSY == Fapi_Status_FsmBusy);
oReturnCheck = Fapi_issueAsyncCommandWithAddress(Fapi_EraseBank, (uint32_t*)(gSector_List[num].low_addr));
OSTimeDly(10);
oReturnCheck = Fapi_doBlankCheck((uint32_t*)(gSector_List[num].low_addr), 4096*9, &poFlashStatus);
OSTimeDly(10);
/* Place specific example code here */
/* Wait for FSM to finish */
while(FLASH_CONTROL_REGISTER->FmStat.FMSTAT_BITS.BUSY == Fapi_Status_FsmBusy);
/* Check the FSM Status to see if there were no errors */
if (FLASH_CONTROL_REGISTER->FmStat.u32Register != 0)
{
/* Put Error handling code here */
return flash_failure;
}
}
return flash_succeed;
}
enum e_flash_status Flash_WriteData(uint32_t num, uint32_t offset, uint8_t * buff, uint32_t len)
{
int write_count = 0;
Fapi_StatusType oReturnCheck = Fapi_Status_Success;
if( (offset+len) > gSector_List[num].size )
{
return flash_failure;
}
oReturnCheck = Fapi_initializeFlashBanks(150);
if((oReturnCheck == Fapi_Status_Success) && (FLASH_CONTROL_REGISTER->FmStat.FMSTAT_BITS.BUSY != Fapi_Status_FsmBusy))
{
oReturnCheck = Fapi_setActiveFlashBank(gSector_List[num].banks_num);
if( (gSector_List[num].banks_num == Fapi_FlashBank0) || (gSector_List[num].banks_num == Fapi_FlashBank1) )
{
oReturnCheck = Fapi_enableMainBankSectors( 0xFFFF );
}
else if( gSector_List[num].banks_num == Fapi_FlashBank7 )
{
oReturnCheck = Fapi_enableEepromBankSectors(0xFFFFFFFF, 0xFFFFFFFF);
}
while(FLASH_CONTROL_REGISTER->FmStat.FMSTAT_BITS.BUSY == Fapi_Status_FsmBusy);
while (len > 0)
{
if (len/8 > 0)
{
oReturnCheck = Fapi_issueProgrammingCommand((uint32_t*)(gSector_List[num].low_addr + offset + 8 * write_count), buff + 8 * write_count, 8, 0, 0, Fapi_AutoEccGeneration);
len = len - 8;
}
else
{
oReturnCheck = Fapi_issueProgrammingCommand((uint32_t*)(gSector_List[num].low_addr + offset + 8 * write_count), buff + 8 * write_count, len % 8, 0, 0, Fapi_AutoEccGeneration);
len = len - len % 8;
}
write_count = write_count + 1;
DelayMSt();
}
/* Place specific example code here */
/* Wait for FSM to finish */
while(FLASH_CONTROL_REGISTER->FmStat.FMSTAT_BITS.BUSY == Fapi_Status_FsmBusy);
/* Check the FSM Status to see if there were no errors */
if (FLASH_CONTROL_REGISTER->FmStat.u32Register != 0)
{
/* Put Error handling code here */
return flash_failure;
}
}
return flash_succeed;
}
int Flash_Erase(uint32_t flashAddr, uint32_t eraseSize)
{
uint32_t sector_pos = 0;
uint32_t sector_diff = 0;
uint8_t finish_flag = 1;
uint32_t tempAddr;
enum e_flash_status ret_status;
tempAddr = flashAddr;
sector_pos = find_StartSectorNum(tempAddr);
while (finish_flag)
{
sector_diff = gSector_List[sector_pos].size + (uint32_t)gSector_List[sector_pos].low_addr - (uint32_t)tempAddr;
if (eraseSize <= sector_diff)
{
ret_status = Flash_EraseSector(sector_pos);
if (ret_status == flash_failure)
{
return -1;
}
finish_flag = 0;
}
else
{
ret_status = Flash_EraseSector(sector_pos);
eraseSize = eraseSize - sector_diff;
tempAddr = tempAddr + sector_diff;
sector_pos = find_StartSectorNum(tempAddr);
if (ret_status == flash_failure)
{
return -1;
}
}
}
return 0;
}
int Flash_Read(uint8_t * dataBuffer, uint32_t flashAddr, uint32_t length)
{
uint32_t sector_pos = 0;
uint32_t sector_diff = 0;
uint8_t finish_flag = 1;
uint32_t tempAddr;
tempAddr = flashAddr;
sector_pos = find_StartSectorNum(tempAddr);
Fapi_initializeAPI((Fapi_FmcRegistersType *)F021_CPU0_REGISTER_ADDRESS, 150);
Fapi_flushPipeline();
while (finish_flag)
{
sector_diff = gSector_List[sector_pos].size + (uint32_t)gSector_List[sector_pos].low_addr - (uint32_t)tempAddr;
if (length <= sector_diff)
{
// memcpy(dataBuffer, (uint8_t *)flashAddr, length);
Fapi_doMarginReadByByte(
(uint8_t *)flashAddr,
dataBuffer,
length,
Fapi_RM0);
finish_flag = 0;
}
else
{
// memcpy(dataBuffer, (uint8_t *)flashAddr, sector_diff);
Fapi_doMarginReadByByte(
(uint8_t *)flashAddr,
dataBuffer,
length,
Fapi_RM0);
length = length - sector_diff;
tempAddr = tempAddr + sector_diff;
sector_pos = find_StartSectorNum(tempAddr);
}
}
return 0;
}
int Flash_Write(uint8_t * dataBuffer, uint32_t flashAddr, uint32_t length)
{
uint32_t sector_pos = 0;
uint32_t sector_diff = 0;
uint8_t finish_flag = 1;
uint32_t tempAddr;
uint32_t sector_offset;
tempAddr = flashAddr;
sector_pos = find_StartSectorNum(tempAddr);
while (finish_flag)
{
sector_offset = tempAddr - gSector_List[sector_pos].low_addr;
sector_diff = gSector_List[sector_pos].size + (uint32_t)gSector_List[sector_pos].low_addr - (uint32_t)tempAddr;
if (length <= sector_diff)
{
Flash_WriteData(sector_pos, sector_offset, dataBuffer, length);
finish_flag = 0;
}
else
{
Flash_WriteData(sector_pos, sector_offset, dataBuffer, sector_diff);
length = length - sector_diff;
tempAddr = tempAddr + sector_diff;
dataBuffer = dataBuffer + sector_diff;
sector_pos = find_StartSectorNum(tempAddr);
}
}
return 0;
}