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

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

器件型号:TMS570LS3137

工具与软件:

您好!

Im 尝试通过 SPI 刷写微控制器(从连接的外部存储器)。

使用提供的应用手册:

适用于 Hercules TMS570LS31X MCU 的 SPI 引导加载程序(TI.com) 


我演示了此函数、通过外部存储器中的数据存储器进行刷写、而不是通过 SPI 接收的数据包。
但是我有一个问题的功能 Fapi_Block。  

该程序在这条线被卡住了  
"while (FAPI_GET_FSM_STATUS!= Fapi_Status_Success);"

如果您愿意、我可以提供所有代码。

bl_spi.c

//*****************************************************************************
//
// bl_spi.c - Functions used to transfer data via the SPI port.
// Author         : QJ Wang. qjwang@ti.com
// Date           : 9-19-2012
//
// Copyright (c) 2006-2011 Texas Instruments Incorporated.  All rights reserved.
// Software License Agreement
// 
// Texas Instruments (TI) is supplying this software for use solely and
// exclusively on TI's microcontroller products. The software is owned by
// TI and/or its suppliers, and is protected under applicable copyright
// laws. You may not combine this software with "viral" open-source
// software in order to form a larger program.
// 
// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT
// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY
// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
// DAMAGES, FOR ANY REASON WHATSOEVER.
//
//*****************************************************************************

#include "bl_config.h"

#include "bl_commands.h"
#include "bl_spi_packet.h"
#include "bl_spi.h"
#include "Registers_FMC_LE.h"
#include "system.h"
#include "bl_flash.h"
#include "hw_spi.h"
#include "sci_common.h"
#include "bl_led_demo.h"

uint8_t g_ucStatus;

extern uint32_t transferAddress;
extern uint32_t transferSize;
extern uint32_t g_ulUpdateStatusAddr;
extern uint32_t g_ulUpdateBufferSize;  //32 bytes or 8 32-bit words

extern uint32_t g_pulUpdateSuccess[8];

#include "fram.h"
#include "general_def.h"

#define PAGE_LENGTH           16

void readPageFromExtMem(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]);
}

#define UPD_STATUS_BANK    0
#define UPD_BANK           1

enum STATUS {
    Success = 1,
    Fail    = 0
};

void UpdaterSPI(spiBASE_t *node) {
    uint32_t dataDir = APP_BANK_B;
    uint32_t dataInMem_32[PAGE_LENGTH*2];
    uint8_t  dataInMem_8[PAGE_LENGTH*8];
    uint16_t NrPages, statusOk;
    uint32_t FLASH_FIRST_SECTOR_SIZE;
    uint8_t  i;
    uint8_t  ulSize = PAGE_LENGTH*2;
    transferAddress = APP_START_ADDRESS;

    uExtMem(FRAM1);
    NrPages = rExtMem(APP_BANK_B_LEN, FRAM1, true);
    sExtMem(FRAM1);

    transferSize    = ulSize*NrPages;

    FLASH_FIRST_SECTOR_SIZE = BLInternalFlashFirstSectorSizeGet();

    if(transferSize > FLASH_FIRST_SECTOR_SIZE) {
        sciSend(scilinREG, 22, "\n\rProgram Flash failed");
        sciSend(scilinREG, 18, "\n\r\tFile to large\n\r");
        return;
    }

    sciSend(scilinREG, 17, "\n\rNr of pages: 0x");
    sciDisplayData(scilinREG, (uint8 *) &NrPages, 2);
    sciSend(scilinREG,  2, "\n\r");

    while(transferSize) {
        sciSend(scilinREG, 18, "\n\rPackets left: 0x");
        sciDisplayData(scilinREG, (uint8 *) &transferSize, 4);

        readPageFromExtMem(FRAM1, PAGE_LENGTH, dataDir, dataInMem_8);

        for(i = 0; i < PAGE_LENGTH*2; i++){
            cast8to32(dataInMem_8+(i*4), dataInMem_32+i);
        }

        statusOk = !Fapi_BlockProgram(UPD_BANK, transferAddress, (uint32_t)dataInMem_32, ulSize);
        //the program does not move beyond this point

        if (!statusOk) {
            sciSend(scilinREG, 22, "\n\rProgram Flash failed");
            return;
        }

        dataDir         += ulSize*4;
        transferAddress += ulSize;
        transferSize    -= ulSize;
    }

    sciSend(scilinREG, 36, "\n\r\n\rApplication load was successful!");

    statusOk = !Fapi_UpdateStatusProgram(UPD_STATUS_BANK, g_ulUpdateStatusAddr, (uint32_t)&g_pulUpdateSuccess[0], g_ulUpdateBufferSize);

    if (statusOk) {
        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){}
    }
}
...............
 

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

    尊敬的 Marco:

    您说您的代码卡住了在一行吗?

    我看不到你的代码中的任何问题,以使它卡在"appearc" Fapi_Block。

    只需确保您通过了  Fapi_Block 中的正确 SYS_CLK_FREQ。

    我使用你们的输入创建了一个示例项目、并且我能够成功地写入组1、而不会出现任何问题:

    大家可以看到、我可以直接进入闪存、而不会出现任何问题。

    下面附上我的项目供您参考:

    e2e.ti.com/.../FAPI_5F00_BANK1_5F00_TEST_5F00_LS3137.zip

    ——
    谢谢、此致、
    Jagadish。

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

    运行一个最小的示例、我有相同的问题、
    第一次跑步很顺利、但第二次比赛的成绩很糟糕。
    这是代码,我也已发送完整的文件给你在一个 privete 消息。

    bl_main.c
    
    
    #include "hal_stdtypes.h"
    #include "bl_config.h"
    #include "bl_spi.h"
    #include "hw_spi.h"
    #include "system.h"
    #include "sci_common.h"
    #include "bl_led_demo.h"
    
    uint32_t transferAddress; /*  Address that is being written to. */
    
    void main(void){
        uint32_t flashRequired = 1;
    
    	sciInit();
    	sciSend(scilinREG, 24, "OBC BootLoader program\n\r");
    
        if(flashRequired){
            sciSend(scilinREG, 23, "\n\rProgram Flash begin\n\r");
            spiInit();
            UpdaterSPI(SPI_PORT);
        }
    
        sciSend(scilinREG, 24, "\n\rJump to application...");
    
        transferAddress = (uint32_t)APP_START_ADDRESS;
        ((void (*)(void))transferAddress)();
    }
    bl_spi.c
    
    
    extern uint32_t transferAddress;
    
    #include "fram.h"
    #include "general_def.h"
    
    #define PAGE_LENGTH           16
    #define UPD_STATUS_BANK    0
    #define UPD_BANK           1
    
    void readPageFromExtMem(uint8_t FRAM, uint32_t dataDir, uint32_t *returnDir);
    uint16_t rExtMem(uint32_t address, uint8_t cs, bool delay);
    void cast8to32(uint8_t *dataIn, uint32_t *dataOut);
    
    uint8_t dataInMem_32[16*2] = {0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xA, 0xB, 0xC, 0xD, 0xE, 0xF, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F};
    uint16_t nrPages = 5;
    uint16_t statusOk;
    
    void UpdaterSPI(spiBASE_t *node) {
        uint32_t dataDir = APP_BANK_B;
        uint32_t FLASH_FIRST_SECTOR_SIZE;
        uint8_t  ulSize = PAGE_LENGTH*2;
    
        FLASH_FIRST_SECTOR_SIZE = BLInternalFlashFirstSectorSizeGet();
        transferAddress = APP_START_ADDRESS;
    
        if((ulSize*nrPages) > FLASH_FIRST_SECTOR_SIZE) {
            sciSend(scilinREG, 22, "\n\rProgram Flash failed");
            sciSend(scilinREG, 18, "\n\r\tFile to large\n\r");
            return;
        }
    
        sciSend(scilinREG, 23, "\n\rTotal nr of pages: 0x");
        sciDisplayData(scilinREG, (uint8 *) &nrPages, 2);
        sciSend(scilinREG,  2, "\n\r");
    
        while(nrPages--) {
    
            statusOk = !Fapi_BlockProgram(UPD_BANK, transferAddress, (uint32_t)dataInMem_32, ulSize);
            //the program does not move beyond this point
    
            if (!statusOk) {
                sciSend(scilinREG, 22, "\n\rProgram Flash failed");
                return;
            }
    
            sciSend(scilinREG, 16, "\n\rPages left: 0x");
            sciDisplayData(scilinREG, (uint8 *) &nrPages, 2);
    
            dataDir         += ulSize*4;
            transferAddress += ulSize;
        }
    
        sciSend(scilinREG, 36, "\n\r\n\rApplication load was successful!");
    
        sciSend(scilinREG, 17, "\n\r\n\rReseting...\n\r");
        systemREG1->SYSECR = (0x10) << 14;
        while(1){
            // The microcontroller should have reset, so this should never be reached.
        }
    }
    ...........


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

    尊敬的 Marco:

    您是否直接测试了我的代码、执行是否成功?

    您的起始地址是什么、它是0x00180000吗?

    您还可以共享链接器 cmd 文件吗? 如果可能、共享完整的项目? 如果需要、您也可以通过私人聊天发送邮件。

    此致、

    Jagadish。

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

    我已经 通过私聊向您提供了完整的代码。

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

    尊敬的 Macro Mecha:

    我不知道根本原因是什么、我在应用手册中使用了 SPI 引导加载程序代码、并直接修改了 UpdateSPI、以直接写入组1上的闪存。

    我仍然看不到任何书面问题。

    我随附代码以供参考、只需尝试替换我与您的文件共享的 bl_spi.c 文件、看看您是否能够写入闪存。

    e2e.ti.com/.../5732.SafetyMCU_5F00_Bootloader.zip

    ——
    谢谢、此致、
    Jagadish。

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

    我还更改了 SPI 的一些配置、为了根据需要使用它、它可以正常工作、但现在经过一些更改后无法正常工作。  Im、看看我是否可以将其改回问题所在的测试。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Im 看看我是否可以将它改回问题所在的测试。  [报价]

    请先在终端处进行尝试、如果您找不到问题的根本原因、我们将根据观察结果设置实时调试会话。