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.

TMS320F28388D: 28388D 双核程序升级的思路

Part Number: TMS320F28388D
Other Parts Discussed in Thread: C2000WARE

你好,CPU1使用CANFD传输升级程序,对CPU1和CUP2都进行远程升级,请问有什么样思路可以实现?

  • 只有CPU1的一次boot支持can。CPU1和CPU2之间通过IPC传输数据。

    请看一下TRM的Chapter 5 ROM Code and Peripheral Booting

    https://www.ti.com.cn/cn/lit/ug/spruii0e/spruii0e.pdf

  • 另外请教一个问题,在cup1使用中FlashApi可以对flash进行擦写操作,但是cpu2使用该方式就没法擦写flash,同样的代码,内部函数中有关CPU1和CPU2选择的部分已经处理了,请问这CUP1和CPU2在擦写FLASH有什么不同吗?

    这是CPU1的代码,可以执行擦写操作

    SeizeFlashPump();
    EALLOW;
    oReturnCheck = Fapi_initializeAPI(F021_CPU0_BASE_ADDRESS, 200);
    
    if(oReturnCheck != Fapi_Status_Success)
    {
    //Example_Error(oReturnCheck);
    return false;
    }
    oReturnCheck = Fapi_setActiveFlashBank(Fapi_FlashBank0);
    if(oReturnCheck != Fapi_Status_Success)
    {
    return false;
    }
    oReturnCheck = Fapi_issueAsyncCommandWithAddress(Fapi_EraseSector,
    (uint32 *)Bzero_SectorD_start);
    
    while(Fapi_checkFsmForReady() != Fapi_Status_FsmReady){}
    
    
    oReturnCheck = Fapi_doBlankCheck((uint32 *)Bzero_SectorD_start,
    Bzero_16KSector_u32length,
    &oFlashStatusWord);
    
    if(oReturnCheck != Fapi_Status_Success)
    {
    
    // Example_Error(oReturnCheck);
    return false;
    }
    
    for(i=0;i<4;i++)
    {
    Buffer[i*2] = mflagWord;
    Buffer[i*2 + 1] = cpu_selected;
    }
    
    
    
    for(i=0, u32Index = Bzero_SectorD_start;
    (u32Index < (Bzero_SectorD_start + 8)) &&
    (oReturnCheck == Fapi_Status_Success); i+= 8, u32Index+= 8)
    {
    oReturnCheck = Fapi_issueProgrammingCommand((uint32 *)u32Index,Buffer,
    8,
    0,
    0,
    Fapi_AutoEccGeneration);
    
    while(Fapi_checkFsmForReady() == Fapi_Status_FsmBusy);
    
    if(oReturnCheck != Fapi_Status_Success)
    {
    // Example_Error(oReturnCheck);
    return false;
    }
    
    oFlashStatus = Fapi_getFsmStatus();
    // oReturnCheck = Fapi_doMarginRead((uint32 *)u32Index,debug32buf+(i/2),4, Fapi_NormalRead);
    
    if(oReturnCheck != Fapi_Status_Success)
    {
    // Example_Error(oReturnCheck);
    return false;
    }
    
    }
    EDIS;
    ReleaseFlashPump();
    return true;

    这是CPU2的代码 无法进行擦写FLASH

    CPU2SeizeFlashPump();
    EALLOW;
    oReturnCheck = Fapi_initializeAPI(F021_CPU0_BASE_ADDRESS, 200);
    
    if(oReturnCheck != Fapi_Status_Success)
    {
    //Example_Error(oReturnCheck);
    return false;
    }
    oReturnCheck = Fapi_setActiveFlashBank(Fapi_FlashBank0);
    if(oReturnCheck != Fapi_Status_Success)
    {
    return false;
    }
    oReturnCheck = Fapi_issueAsyncCommandWithAddress(Fapi_EraseSector,
    (uint32 *)Bzero_SectorD_start);
    
    while(Fapi_checkFsmForReady() != Fapi_Status_FsmReady){}
    
    
    oReturnCheck = Fapi_doBlankCheck((uint32 *)Bzero_SectorD_start,
    Bzero_16KSector_u32length,
    &oFlashStatusWord);
    
    if(oReturnCheck != Fapi_Status_Success)
    {
    
    // Example_Error(oReturnCheck);
    return false;
    }
    
    for(i=0;i<4;i++)
    {
    Buffer[i*2] = mflagWord;
    Buffer[i*2 + 1] = cpu_selected;
    }
    
    
    
    for(i=0, u32Index = Bzero_SectorD_start;
    (u32Index < (Bzero_SectorD_start + 8)) &&
    (oReturnCheck == Fapi_Status_Success); i+= 8, u32Index+= 8)
    {
    oReturnCheck = Fapi_issueProgrammingCommand((uint32 *)u32Index,Buffer,
    8,
    0,
    0,
    Fapi_AutoEccGeneration);
    
    while(Fapi_checkFsmForReady() == Fapi_Status_FsmBusy);
    
    if(oReturnCheck != Fapi_Status_Success)
    {
    // Example_Error(oReturnCheck);
    return false;
    }
    
    oFlashStatus = Fapi_getFsmStatus();
    // oReturnCheck = Fapi_doMarginRead((uint32 *)u32Index,debug32buf+(i/2),4, Fapi_NormalRead);
    
    if(oReturnCheck != Fapi_Status_Success)
    {
    // Example_Error(oReturnCheck);
    return false;
    }
    
    }
    EDIS;
    CPU2ReleaseFlashPump();
    return true;

  • 你好,还有个问题,28388D的FLASH_API只提供了Verify的函数,没有读取FLASH的函数,28377D的库函数有这个读取的功能,在388D读取FLASH需要什么样的操作呢?

    377D的库函数,这里面有Fapi_doMarginRead 这个读取FLASH的函数

    /* Read commands */
    extern Fapi_StatusType Fapi_doBlankCheck(
    uint32 *pu32StartAddress,
    uint32 u32Length,
    Fapi_FlashStatusWordType *poFlashStatusWord
    );

    extern Fapi_StatusType Fapi_doMarginRead(
    uint32 *pu32StartAddress,
    uint32 *pu32ReadBuffer,
    uint32 u32Length,
    Fapi_FlashReadMarginModeType oReadMode
    );

    extern Fapi_StatusType Fapi_doVerify(
    uint32 *pu32StartAddress,
    uint32 u32Length,
    uint32 *pu32CheckValueBuffer,
    Fapi_FlashStatusWordType *poFlashStatusWord
    );

    388D的库函数 ,正好缺少了这个读取的函数

    /* Read commands */
    extern Fapi_StatusType Fapi_doBlankCheck(
    uint32 *pu32StartAddress,
    uint32 u32Length,
    Fapi_FlashStatusWordType *poFlashStatusWord
    );

    extern Fapi_StatusType Fapi_doVerify(
    uint32 *pu32StartAddress,
    uint32 u32Length,
    uint32 *pu32CheckValueBuffer,
    Fapi_FlashStatusWordType *poFlashStatusWord
    );

    extern Fapi_StatusType Fapi_doVerifyBy16bits(
    uint16 *pu16StartAddress,
    uint32 u16Length,
    uint16 *pu16CheckValueBuffer,
    Fapi_FlashStatusWordType *poFlashStatusWord
    );

  • 有没有尝试过C2000ware中的例程?C2000Ware_5_00_00_00\driverlib\f2838x\examples\c28x\flash\flashapi_ex1_programming.c

    对于CPU2,需要在Predefined Symbols中将CPU1相关的部分替换为CPU2的。

    请看一下TMS320F2838x Flash API Version 1.60.00.00 Reference Guide 3.3 Read Functions

  • 谢谢回复,CPU2写入FLASH的问题解决了,第二问题这个文档里面 Read Functions只提供了verifly函数,并未提供可以直接读取FLASH的函数

  • 对于F28388,所有提供的FLASH API函数都在该doc中给出了

  • 你好,在应用过程中出现了一个问题,CPU1调用IpcInit()功能后再调用Fapi_issueAsyncCommandWithAddress(Fapi_EraseSector,
    (uint32 *)Bzero_SectorD_start)这个函数擦除SECTOR,擦除地址是0X86000,则会将0x86000以后的FLASH全部擦除,如果不调用IPC_Init ,该函数运行正常,只擦除0x86000~0x88000 这一个SECTOR,这是什么原因导致的呢

  • 方便提一个新的问题吗?方便我们的识别及跟进。谢谢~