TMS320F28377D: F28377D移植官方flashapi,在线仿真测试正常,拔掉仿真器重新上电,程序执行到Fapi_issueProgrammingCommand就会跑飞,并且只能单独使用擦除函数,使用写入函数程序会跑飞,请问是什么问题

Part Number: TMS320F28377D

我在使用F28377D对flash进行写数据,在线仿真测试结果正常,能确保关于flash操作函数都已经搬到ram运行。

一、仿真操作

1:仿真操作前的情况:

image.png

2.仿真后的情况:

image.png

可以看到数据正常。

二、离线仿真情况

通过串口打印得出程序在执行 Fapi_issueProgrammingCommand后就跑飞了

image.png

定位代码如下:

image.png

附加我的flash代码

----------------------------------------------flash.c--------------------------------------------------

#include "F28x_Project.h"
#include <string.h>
#include "flash_programming_dcsm_c28.h"
#include "F021_F2837xD_C28x.h"
#include "bsp_flash.h"
#include "bsp_sci.h"
static void Scia_PrintHex32(uint32 val)
{

    const char hex[] = "0123456789ABCDEF";
    int i;
    Scia_Xmit('0'); Scia_Xmit('x');
    for (i = 28; i >= 0; i -= 4) {
        Scia_Xmit(hex[(val >> i) & 0xF]);
    }
    Scia_Msg("\r\n");
}

static void Scia_PrintHex16(uint16 val)
{
    const char hex[] = "0123456789ABCDEF";
    int i;
    Scia_Xmit('0'); Scia_Xmit('x');
    for (i = 12; i >= 0; i -= 4) {
        Scia_Xmit(hex[(val >> i) & 0xF]);
    }
    Scia_Msg("\r\n");
}

////////////////////////////////////////////配置flash///////////////////////////////////////////

 #pragma CODE_SECTION(McuFlash_Init, ".TI.ramfunc");
void McuFlash_Init(void)
{
    EALLOW;

 //   FlashRegs.FRDWAIT.bit.RWAIT = 5; // 对应 200 MHz EDIS;
    SeizeFlashPump();
//    DELAY_US(100);
    Flash0EccRegs.ECC_ENABLE.bit.ENABLE = 0;
//   DELAY_US(1000);

    Fapi_initializeAPI(F021_CPU0_BASE_ADDRESS, 200);
//    Fapi_writeEwaitValue(0x717);//时钟等待周期?
//    Fapi_flushPipeline();//刷新   测试失败
    Flash0CtrlRegs.FRD_INTF_CTRL.bit.PREFETCH_EN = 0;
    Fapi_setActiveFlashBank(Fapi_FlashBank0);
    Flash0CtrlRegs.FRD_INTF_CTRL.bit.PREFETCH_EN = 1;
    EDIS;
    ReleaseFlashPump();

}

uint8 McuFlash_Read(uint32 Addr, void *Data, uint32 Size)
{
    uint32 i;
    uint16 *Read = (uint16 *)Data;
    if (Addr < MCU_FLASH_SADD || Addr + Size >= MCU_FLASH_SADD + MCU_FLASH_SIZE)
        return 1;

    Scia_Msg("Reading from address: ");
    Scia_PrintHex32(Addr);
    Scia_Msg("Size: ");
    Scia_PrintHex32(Size);
    Scia_Msg("Data read:\r\n");
    for (i = 0; i < Size; i++) {
        *Read = *(uint16 *)Addr;

        // 打印读取的值
               Scia_Msg("  [");
               if(i < 10) {
                   Scia_Xmit('0' + i);
               } else {
                   Scia_Xmit('A' + (i - 10));
               }
               Scia_Msg("]: ");
               Scia_PrintHex16(*Read);
        Read++;
        Addr++;
    }

 


    return 0;
}

 #pragma CODE_SECTION(McuFlash_Write, ".TI.ramfunc");
uint8 McuFlash_Write(uint32 Addr, const void *Data, uint32 Size)
{
    uint8 i;
    uint8 Res;
    Fapi_StatusType oReturnCheck;
    uint16 *Write = (uint16 *)Data;
    uint16 WriteBuf[MCU_FLASH_PB_SIZE];

    if (0 == Size || NULL == Data)
        return 1;
    if (Addr < MCU_FLASH_SADD || Addr + Size >= MCU_FLASH_SADD + MCU_FLASH_SIZE)
        return 1;
    if (Addr & (MCU_FLASH_PB_SIZE - 1))
        return 1;
    SeizeFlashPump();

    EALLOW;
    while (Size > 0) {
        if (Size >= MCU_FLASH_PB_SIZE) {
            for (i = 0; i < MCU_FLASH_PB_SIZE; i++)
                WriteBuf[i] = Write[i];
            Size -= MCU_FLASH_PB_SIZE;
        } else {
            for (i = 0; i < Size; i++)
                WriteBuf[i] = Write[i];
            for (; i < MCU_FLASH_PB_SIZE; i++)
                WriteBuf[i] = 0xFFFF;
            Size -= Size;
        }
        Scia_Msg("===write: in Fapi_issueProgrammingCommand!===\r\n");

        oReturnCheck = Fapi_issueProgrammingCommand((uint32 *)Addr, WriteBuf, MCU_FLASH_PB_SIZE, NULL , 0, Fapi_AutoEccGeneration);
        Scia_Msg("===write: out Fapi_issueProgrammingCommand!===\r\n");
        while (Fapi_checkFsmForReady() != Fapi_Status_FsmReady) {
        }
        if (oReturnCheck != Fapi_Status_Success) {
            Res = 1;
//            goto FLS_SET_EXT;
        }
        Addr += MCU_FLASH_PB_SIZE;
        Write += MCU_FLASH_PB_SIZE;
    }
    Res = 0;
//    FLS_SET_EXT:
    EDIS;

    ReleaseFlashPump();
/*
    Flash_claimPumpSemaphore(FLASHPUMPSEMAPHORE_BASE, (Flash_PumpOwnership)0);
*/
    return Res;
}


#pragma CODE_SECTION(McuFlash_Erase, ".TI.ramfunc");
 uint8 McuFlash_Erase(uint32 Addr)
{
    uint8 Res;
    Fapi_StatusType oReturnCheck;

    if (Addr < MCU_FLASH_SADD || Addr >= MCU_FLASH_SADD + MCU_FLASH_SIZE)
        return 1;
    if (Addr & (MCU_FLASH_PP_SIZE - 1))
       return 1;

    SeizeFlashPump();
/*
#ifdef CPU1
    Flash_claimPumpSemaphore(FLASHPUMPSEMAPHORE_BASE, FLASH_CPU1_WRAPPER); //??
#else
    Flash_claimPumpSemaphore(FLASHPUMPSEMAPHORE_BASE, FLASH_CPU2_WRAPPER);//??
#endif
*/
    EALLOW;
    oReturnCheck = Fapi_issueAsyncCommandWithAddress(Fapi_EraseSector, (uint32 *)Addr);
    while (Fapi_checkFsmForReady() != Fapi_Status_FsmReady) {
    }
    if (oReturnCheck != Fapi_Status_Success) {
        Res = 1;
//        goto FLS_ERASE_EXT;
    }
    Res = 0;
//FLS_ERASE_EXT:
    EDIS;
    ReleaseFlashPump();
/*
    Flash_claimPumpSemaphore(FLASHPUMPSEMAPHORE_BASE, (Flash_PumpOwnership)0);
*/
    return Res;
}

----------------------------------------------main.c--------------------------------------------------

#include "F28x_Project.h"     // Device Headerfile and Examples Include File
#include "F2837xD_Ipc_drivers.h"
#include "stdio.h"
#include "user_app.h"

 

#pragma CODE_SECTION(Flash_QuickTest, ".TI.ramfunc");
void Flash_QuickTest(void)
{
    EALLOW;
    uint16_t quickTestData[4] = {0xAAAA, 0x1111, 0x2222, 0x90EF};
    uint16_t quickReadData[4];
    uint16_t result;
    int i;
    uint16_t verifyFailed = 0;
    Scia_Msg("=== Quick Flash Test ===\r\n");

    // 2. 擦除

    result = McuFlash_Erase(TEST_FLASH_ADDR);
    if(result != 0) {
        Scia_Msg("Erase FAILED!\r\n");
        return;
    }

/*    result = McuFlash_Read(TEST_FLASH_ADDR, quickReadData, sizeof(quickReadData));
    if(result != 0) {
        Scia_Msg("Read FAILED!\r\n");
        return;
    }
*/

    // 3. 写入
    result = McuFlash_Write(TEST_FLASH_ADDR, quickTestData, sizeof(quickTestData));
    if(result != 0) {
        Scia_Msg("Write FAILED!\r\n");
        return;
    }

    // 4. 读取
    result = McuFlash_Read(TEST_FLASH_ADDR, quickReadData, sizeof(quickReadData));
    if(result != 0) {
        Scia_Msg("Read FAILED!\r\n");
        return;
    }

    // 5. 验证

    for( i = 0; i < 4; i++) {
        if(quickTestData[i] != quickReadData[i]) {
            Scia_Msg("Verify FAILED at pos \r\n");
            Scia_Xmit('0' + i);
            Scia_Msg("\r\n");
            verifyFailed = 1;
        }
    }

    if(!verifyFailed) {
        Scia_Msg("PASS - Quick Test OK!\r\n");
    }
    EDIS;
}

 

void main(void)
{

    DINT;

    EALLOW;
    DevCfgRegs.CPUSEL5.bit.SCI_A = 0;
    EDIS;

   InitSysCtrl();
/*
#ifdef _STANDALONE
#ifdef _FLASH
IPCBootCPU2(C1C2_BROM_BOOTMODE_BOOT_FROM_FLASH);
#else
IPCBootCPU2(C1C2_BROM_BOOTMODE_BOOT_FROM_RAM);
#endif
#endif
*/
//初始化之间检查外设时钟是否开启
    InitGpio();
//    DINT;
    InitPieCtrl();
    IER = 0x0000;
    IFR = 0x0000;
    InitPieVectTable();
    DELAY_US(5000);
    User_App_Init();
    EINT;
    ERTM;

    for(;;)
    {

    }
}