工具与软件:
您好!
Im 尝试通过 SPI 刷写微控制器(从连接的外部存储器)。
使用提供的应用手册:
适用于 Hercules TMS570LS31X MCU 的 SPI 引导加载程序(TI.com)
我演示了此函数、通过外部存储器中的数据存储器进行刷写、而不是通过 SPI 接收的数据包。
但是我有一个问题的功能 Fapi_Block。
Im 正在获取
CortexR4:在读取长度为0x3c 的第0页上0x800243c 时遇到问题
CortexR4:在读取长度为0x24的第0页上的0x8002464时遇到问题
CortexR4:不能单步执行目标程序:(错误-1066 @ 0x8002468)无法设置/清除请求的断点。 验证断点地址是否在有效存储器中。 (仿真包9.4.0.00129)
CortexR4:无法运行目标 CPU:(错误-1066 @ 0x8002468)无法设置/清除请求的断点。 验证断点地址是否在有效存储器中。 (仿真包9.4.0.00129)
/* bl_spi.c */
#define PAGE_LENGTH 16
void readExtMem(uint8_t FRAM, uint32_t packetNr, uint32_t dataDir, uint8_t *returnDir);
uint16_t rExtMem(uint32_t address, uint8_t cs, bool delay);
void cast8to32(uint8_t *dataIn, uint32_t *dataOut){
uint8_t littleEndian = 0;
if (littleEndian){
*dataOut = ((uint32_t)dataIn[3] << 24) |
((uint32_t)dataIn[2] << 16) |
((uint32_t)dataIn[1] << 8) |
((uint32_t)dataIn[0]);
} else {
*dataOut = ((uint32_t)dataIn[0] << 24) |
((uint32_t)dataIn[1] << 16) |
((uint32_t)dataIn[2] << 8) |
((uint32_t)dataIn[3]);
}
}
void UpdaterSPI_V2(spiBASE_t *node) {
uint32_t dataDir = APP_BANK_B;
uint32_t NrPages = 12;
uint8_t dataInMem_8[PAGE_LENGTH*8];
uint32_t dataInMem_32[PAGE_LENGTH*8/4];
uint8_t i;
uint32_t oReturnCheck;
uint32_t FLASH_FIRST_SECTOR_SIZE;
uint8_t ucBank, ulSize;
uint32_t updateStatusBank;
sciSend(scilinREG, 21, "\n\rProgram Flash begin");
ulSize = PAGE_LENGTH*8/4;
updateStatusBank = 0;
ucBank = 0;
g_ulTransferAddress = APP_START_ADDRESS;
g_ulTransferSize = ulSize*NrPages;
FLASH_FIRST_SECTOR_SIZE = BLInternalFlashFirstSectorSizeGet();
if(g_ulTransferSize > FLASH_FIRST_SECTOR_SIZE){
sciSend(scilinREG, 22, "\n\rProgram Flash failed");
sciSend(scilinREG, 16, "\n\r\tFile to large");
return;
}
while(1) {
sciSend(scilinREG, 20, "\n\r\n\rTransferSize: 0x");
sciDisplayData(scilinREG, (uint8 *) &g_ulTransferSize, 4);
uExtMem(FRAM1);
readExtMem(FRAM1, PAGE_LENGTH, dataDir, dataInMem_8);
sExtMem(FRAM1);
for(i = 0; i < PAGE_LENGTH*8/4; i++){
cast8to32(dataInMem_8+(i*4), dataInMem_32+i);
}
sciSend(scilinREG, 26, "\n\rEnter Fapi Block Program");
oReturnCheck = Fapi_BlockProgram( ucBank, g_ulTransferAddress, (uint32_t) &(dataInMem_32), ulSize);
sciSend(scilinREG, 25, "\n\rExit Fapi Block Program");
if (oReturnCheck) { /*Error*/
sciSend(scilinREG, 22, "\n\rProgram Flash failed");
break;
}
dataDir += ulSize*4;
g_ulTransferAddress += ulSize;
g_ulTransferSize -= ulSize;
if (g_ulTransferSize == 0) {
if (oReturnCheck == 0) {
oReturnCheck = Fapi_UpdateStatusProgram( updateStatusBank, g_ulUpdateStatusAddr, (uint32_t)&g_pulUpdateSuccess[0], g_ulUpdateBufferSize);
sciSend(scilinREG, 36, "\n\rApplication was loaded successful!");
break;
}
}
}
if (oReturnCheck == 0) {
sciSend(scilinREG, 17, "\n\r\n\rReseting...\n\r");
systemREG1->SYSECR = (0x10) << 14;
// The microcontroller should have reset,
// so this should never be reached.
while(1){}
}
}
/* bl_flash.c */
uint32_t Fapi_BlockProgram( uint32_t Bank, 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 < 16)
bytes = SizeInBytes;
else
bytes = 16;
if ((Fapi_initializeFlashBanks((uint32_t)SYS_CLK_FREQ)) == Fapi_Status_Success){
(void)Fapi_setActiveFlashBank((Fapi_FlashBankType)Bank);
(void)Fapi_enableMainBankSectors(0xFFFF); /* used for API 2.01*/
}else {
return (1);
}
//Here the program gets stucked
while( FAPI_CHECK_FSM_READY_BUSY != Fapi_Status_FsmReady );
while( FAPI_GET_FSM_STATUS != Fapi_Status_Success );
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);
src += bytes;
dst += bytes;
SizeInBytes -= bytes;
if ( SizeInBytes < 16){
bytes = SizeInBytes;
}
}
return (0);
}


