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.

[参考译文] TMS570LS3137:SPI 引导加载程序

Guru**** 2538950 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1378749/tms570ls3137-spi-bootloader

器件型号:TMS570LS3137

工具与软件:

您好!

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

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Marco:

    我验证了上述共享代码、但我看不到任何问题。

    我需要您的完整项目、是否可以共享?  如果需要、您也可以通过私人消息发送。

    另外、我想知道您的外部存储器在这里是什么?

    您如何将数据传输到 FRAM1阵列? 您是仅通过 SPI 协议读取还是使用 EMIF?

    ——
    谢谢、此致、
    Jagadish。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Marco:

    感谢您分享代码、我将对它们进行查看并很快更新我的输入内容。

    ——
    谢谢、此致、
    Jagadish。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Marco:

    我验证了您的代码、可能是以下问题:

    您的应用起始地址是0x180000、它只不过是闪存存储体1。

    但是、当你调用 Fapi_Block、c 函数时、你正在用 bank-0调用。

    如果我们这么做、闪存存储体0将被激活进行写入、但我们实际上是在尝试写入存储体1。 因此、请将 Bank-1 (1)值传递给  Fapi_Block API、以写入地址 0x180000。

    ——
    谢谢、此致、
    Jagadish。