TMS320F28379D: TMS320F28379D CPU2 FLASH操作故障

Part Number: TMS320F28379D

 F28379D 双核,自定义 Bootloader ,在CCS内仿真时正常工作,使用FREE RUN模式测试通过.

CPU2 烧录在脱离 CCS 仿真(Flash 直接引导)时失败,CPU1正常。

在执行擦除时,

g_nModbusRegister[0x78] = HWREG(FLASHPUMPSEMAPHORE_BASE); 返回值为0x0001 ;

g_nModbusRegister[0x75] = (uint16_t)(oFlashStatus & 0xFFFF); 返回值为0x0810 ;

g_nModbusRegister[0x76] = (uint16_t)((oFlashStatus & 0xFFFF0000) >> 16);返回值为0x0000 ;

g_nModbusRegister[0x74] 返回值为0x0000 ;

g_nModbusRegister[0x77] 返回值为0x0000 ;

CCS仿真引导和    Device_bootCPU2(C1C2_BROM_BOOTMODE_BOOT_FROM_FLASH);引导可能在什么方面的差别会导致这个问题

static bool BL_Flash_EraseRange(uint32_t startAddr, uint32_t endAddr)
{
    uint16_t i;
    uint32_t sectorStart, sectorEnd;
    uint32_t eraseResult = 0;
    Fapi_StatusType oReturnCheck;
    Fapi_FlashStatusType oFlashStatus;
    Fapi_FlashStatusWordType oFlashStatusWord;
    const FlashSectorInfo_t *pSectorInfo;

    EALLOW;

    g_nModbusRegister[0x78] = HWREG(FLASHPUMPSEMAPHORE_BASE);

    oReturnCheck = Fapi_issueAsyncCommand(Fapi_ClearStatus);
    if (oReturnCheck != Fapi_Status_Success) eraseResult |= 1U;

    if (eraseResult != 0)
    {
        EDIS;
        return false;
    }

    while(Fapi_checkFsmForReady() != Fapi_Status_FsmReady) {}

    for (i = 0; i < g_u16SectorCount; i++)
    {
        pSectorInfo = &g_taSectorInfo[i];
        sectorStart = pSectorInfo->sectorAddr;
        sectorEnd  = sectorStart + 2 * pSectorInfo->sectorLen;

        if (sectorEnd <= startAddr || sectorStart >= endAddr) continue;

        oReturnCheck = Fapi_issueAsyncCommandWithAddress(Fapi_EraseSector,
                                                (uint32 *)pSectorInfo->sectorAddr);
        if (oReturnCheck != Fapi_Status_Success) eraseResult |= (1U << pSectorInfo->errBitIdx);
        g_nModbusRegister[0x74] = (uint16_t)(oReturnCheck & 0xFFFF);

        while (Fapi_checkFsmForReady() != Fapi_Status_FsmReady){}

        oFlashStatus = Fapi_getFsmStatus();
        g_nModbusRegister[0x75] = (uint16_t)(oFlashStatus & 0xFFFF);
        g_nModbusRegister[0x76] = (uint16_t)((oFlashStatus & 0xFFFF0000) >> 16);

        if (oFlashStatus != 0) eraseResult |= (1U << (pSectorInfo->errBitIdx));

        oReturnCheck = Fapi_doBlankCheck((uint32 *)pSectorInfo->sectorAddr,
                                         pSectorInfo->sectorLen,
                                         &oFlashStatusWord);
        if (oReturnCheck != Fapi_Status_Success) eraseResult |= (1U << (pSectorInfo->errBitIdx));
        g_nModbusRegister[0x77] = (uint16_t)(oReturnCheck & 0xFFFF);

        if (eraseResult != 0)
        {
            EDIS;
            return false;
        }
    }

    EDIS;
    return true;
}