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); }