目前在执行Fapi_BlockProgram( 0, addr, (uint32_t)data, 4); 语句卡住,测试地址为0x000FFC00。
发现是卡在while( FAPI_GET_FSM_STATUS!= Fapi_Status_Success );但是之前我们在TMS570LS1224开发板上测试是OK的,用同样的程序在TMS570LS0914上测试就会卡死,不知道这两者的芯片有什么区别?
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
目前在执行Fapi_BlockProgram( 0, addr, (uint32_t)data, 4); 语句卡住,测试地址为0x000FFC00。
发现是卡在while( FAPI_GET_FSM_STATUS!= Fapi_Status_Success );但是之前我们在TMS570LS1224开发板上测试是OK的,用同样的程序在TMS570LS0914上测试就会卡死,不知道这两者的芯片有什么区别?
并且我仿真发现while(FAPI_GET_FSM_STATUS != Fapi_Status_Success);这个寄存器一直返回0x810,目前所使用的的代码原型如下:
uint32_t Fapi_BlockErase( uint32_t Bank, uint32_t Flash_Start_Address, uint32_t Size_In_Bytes)
{
uint32_t status;
uint32_t Freq_In_MHz;
uint8_t i, j, bk, ucStartBank, ucStartSector, ucEndBank;
uint32_t *eraseStartAddr0;
uint32_t *eraseStartAddr;
int remaining;
uint32_t Flash_End_Address;
ucStartBank = 0, i=0, ucStartSector = 0;
ucEndBank = 0;
eraseStartAddr0 = (uint32_t *)Flash_Start_Address;
eraseStartAddr = (uint32_t *)Flash_Start_Address;
Flash_End_Address = Flash_Start_Address + Size_In_Bytes;
Freq_In_MHz = SYS_CLK_FREQ;
for (i = 0; i < NUMBEROFSECTORS-1; i++){
if (Flash_Start_Address == (uint32_t)(flash_sector[i].start))
{
ucStartBank = flash_sector[i].bankNumber;
ucStartSector = flash_sector[i].sectorNumber;
eraseStartAddr0 = flash_sector[i].start;
eraseStartAddr = flash_sector[i].start;
break;
}
}
for (i = ucStartSector; i < NUMBEROFSECTORS-1; i++){
if (Flash_End_Address <= ((uint32_t)(flash_sector[i].start) + flash_sector[i].length))
{
ucEndBank = flash_sector[i].bankNumber;
break;
}
}
//F021_CPU0_REGISTER_ADDRESS is defined as 0xfff87000 in FMC.h
//Fapi_initializeAPI((Fapi_FmcRegistersType *)F021_CPU0_REGISTER_ADDRESS, Freq_In_MHz); /*used for API Rev1.5*/
Fapi_initializeFlashBanks(Freq_In_MHz); /* used for API Rev2.01 */
for (bk = ucStartBank; bk < ucEndBank+1; bk++){
Fapi_setActiveFlashBank((Fapi_FlashBankType)bk);
if (bk == 0){
j = ucStartSector;//0
remaining = Size_In_Bytes;//4
}else{
j = 0;
}
Fapi_enableMainBankSectors(0xFFFF); /* used for API 2.01*/
while( FAPI_CHECK_FSM_READY_BUSY == Fapi_Status_FsmBusy );
do{
Fapi_issueAsyncCommandWithAddress(Fapi_EraseSector, eraseStartAddr);
//Fapi_issueAsyncCommandWithAddress(Fapi_ProgramData, eraseStartAddr);
while( FAPI_CHECK_FSM_READY_BUSY == Fapi_Status_FsmBusy );
while(FAPI_GET_FSM_STATUS != Fapi_Status_Success);
// while(FAPI_GET_FSM_STATUS != Fapi_Status_Success){status = FAPI_GET_FSM_STATUS;}
remaining -= flash_sector[j++].length;
eraseStartAddr = flash_sector[j].start;
}while((remaining > 0) && ( j < flash_bank[bk].numOfSectors));
}
status = Flash_Erase_Check((uint32_t)eraseStartAddr0, Size_In_Bytes);
return (status);
}
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(0xFFFF); /* 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
UART_putString(UART, "\r Programmed the flash: ");
UART_send32BitData(UART, Size_In_Bytes);
UART_putString(UART, " Bytes. \r ");
#endif
status = Flash_Program_Check(Flash_Start_Address, Data_Start_Address, Size_In_Bytes);
return (status);
}