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.

[参考译文] TMS320F28P650DK:TMS320F28P65x:编程时无法使用闪存 API v3.00.02.00 将超过 16 个字节编程到闪存组 1 中、Fapi_doVerify () 失败

Guru**** 2611705 points
Other Parts Discussed in Thread: C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1577192/tms320f28p650dk-tms320f28p65x-unable-to-program-more-than-16-bytes-into-flash-bank1-using-flash-api-v3-00-02-00-and-fapi_doverify-fails-when-programming

器件型号:TMS320F28P650DK
主题:C2000WARE 中讨论的其他器件

TI 团队大家好、

我目前正在使用将数据编程到 F28P65x 器件上的特定闪存组(组 1)中 闪存 API v3.00.02.00
我能够成功地擦除以下地址的闪存扇区并对其进行编程:

FLASH_BANK1_START_ADDR   0x0A0000U“闪存组 1
 但是、我发现编程次数多于时会出现可重复的问题 17 字节 最大差值。  
#define FLASH_BANK0_START_ADDR      0x080000U
#define FLASH_BANK1_START_ADDR      0x0A0000U
#define FLASH_BANK2_START_ADDR      0x0C0000U
#define FLASH_BANK3_START_ADDR      0x0E0000U
#define FLASH_BANK4_START_ADDR      0x100000U

#define VIN_FLASH_ADDR              FLASH_BANK1_START_ADDR
#define VIN_SECTOR_SIZE             0x0800U     // 2 KB sector
#define VIN_LEN_BYTES               17U         // VIN length
#define VIN_PAYLOAD_BYTES           24U         // padded to 8-byte multiple
#define VIN_PAYLOAD_WORDS           12U         // 24 / 2
#define VIN_MAX_HALFWORDS           (VIN_PAYLOAD_BYTES / 2U)
#define FSM_STATUS_SUCCESS          (0x3U)
状态= Fapi_doVerify (dest、4U、(uint32_t *)&VIN_buf[i]、&flashStatusWord);但当我注释该 Fapi_doverify 时、我可以写入扇区、但最多可以写入 16 字节的数据(8 字)。
 
注意:1.为什么每次尝试编程 16 个以上字节(例如 17 或 24 个字节)时、以下验证调用都会失败?  
Fapi_issueProgrammingCommand() F28P65x 器件上的单次调用中可以编程到闪存扇区中的最大字节数(或半字)是多少?  
是否可以在 F28P65x 上使用闪存 API v3.00.02.00 执行固件更新(应用内编程)? 回路。
 
Fapi_StatusType VIN_ProgramUsingAutoECC(const uint8_t *vin_bytes)
{
    Fapi_StatusType status = Fapi_Status_Success;
    Fapi_FlashStatusWordType flashStatusWord;
    Fapi_FlashStatusType fsmStatus;
    
    uint16_t vin_buf[VIN_PAYLOAD_WORDS + 8] __attribute__((aligned(8)));
    uint16_t i;
    uint32_t prog_halfwords;

    memset(vin_buf, 0xFF, sizeof(vin_buf)); 

    for (i = 0; i < VIN_LEN_BYTES; i += 2U) {
        uint16_t lo = vin_bytes[i];
        uint16_t hi = (i + 1U < VIN_LEN_BYTES) ? vin_bytes[i + 1U] : 0xFFU;
        vin_buf[i / 2U] = (uint16_t)((hi << 8) | lo);
    }
    /* 2) pad to 4-halfword (8-byte) boundary */
    prog_halfwords = VIN_WORDS_16BIT;
    
    IPC_claimFlashSemaphore(IPC_FLASHSEM_OWNER_CPU1);

    status = Fapi_setActiveFlashBank(Fapi_FlashBank1);
    if (status != Fapi_Status_Success) {
        printf("[VIN] Bank select failed: %d\n", status);
        IPC_releaseFlashSemaphore();
        return status;
    }

    Flash_disablePrefetch(FLASH0CTRL_BASE);
    Flash_disableCache(FLASH0CTRL_BASE);
    ClearFSMStatus();

    Fapi_setupBankSectorEnable(FLASH_WRAPPER_PROGRAM_BASE + FLASH_O_CMDWEPROTA, 0x00000000U);
    Fapi_setupBankSectorEnable(FLASH_WRAPPER_PROGRAM_BASE + FLASH_O_CMDWEPROTB, 0x00000000U);
    DEVICE_DELAY_US(50);

    for (i = 0; i < prog_halfwords; i += 4U) {
        uint32_t *dest = (uint32_t *)(VIN_FLASH_ADDR + (i * 2U)); 

        ClearFSMStatus();

        status = Fapi_issueProgrammingCommand(
            dest,
            &vin_buf[i],
            8U,
            NULL,
            0,
            Fapi_AutoEccGeneration
        );
        if (status != Fapi_Status_Success) {
            Flash_enablePrefetch(FLASH0CTRL_BASE);
            Flash_enableCache(FLASH0CTRL_BASE);
            IPC_releaseFlashSemaphore();
            return status;
        }

        while (Fapi_checkFsmForReady() == Fapi_Status_FsmBusy) { }

        DEVICE_DELAY_US(20);

        fsmStatus = Fapi_getFsmStatus();
        if (status != Fapi_Status_Success)
         {
            printf("[VIN] Programming failed @0x%06lX (status=%d, FSM=0x%08lX)\n",
                   (unsigned long)dest, (int)status, (unsigned long)fsmStatus);
            Flash_enablePrefetch(FLASH0CTRL_BASE);
            Flash_enableCache(FLASH0CTRL_BASE);
            IPC_releaseFlashSemaphore();
            return Fapi_Error_Fail;
        }

        status = Fapi_doVerify(dest, 4U, (uint32_t *)&vin_buf[i], &flashStatusWord);
         
        if (status != Fapi_Status_Success) {
            Flash_enablePrefetch(FLASH0CTRL_BASE);
            Flash_enableCache(FLASH0CTRL_BASE);
            IPC_releaseFlashSemaphore();
            return status;
        }
    }
    /* 10) Re-enable prefetch/cache (and ECC if you disabled it) */
    Flash_enablePrefetch(FLASH0CTRL_BASE);
    Flash_enableCache(FLASH0CTRL_BASE);
    IPC_releaseFlashSemaphore();
    return Fapi_Status_Success;
}
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Suresh、

    如果起始地址进行了 128 位对齐、则应根据需要同时对 8 个或 4 个 16 位字进行编程。 如果起始地址进行了 64 位对齐而不是 128 位对齐、则应同时对 4 个 16 位字进行编程。 您必须相应地增加循环。 请注意,fapi_doVerify 函数一次验证 32 位,您必须调整长度。

    有关更多详细信息、请参阅 C2000ware 中的闪存 API 示例。

    此致、

    Rajeshwary