Other Parts Discussed in Thread: TMS320F2800156-Q1
器件型号: TMS320F2800156-Q1
你好。
我想对 main 函数内的用户 OTP 区域执行闪存写入、以在 main 函数启动时配置 TOE DCSM。
我编写的源代码如下。
静态 void MAIN_DiagManager (void)
{
uint16_t* ptrErrorCodePage;
ptrErrorCodePage = Nvm_Init ();
Diag Manager_Init (); /*诊断管理初始化*/
MakeCheckSum();
MemIF_DCSM_OTP_Write (16);
/* 3. 将 UDS_BSIDID 注册到 ReadDataByIdentifier Service */
Diag.ParameterOfDataIdentifier Manager_Add (UDS_BSIDID、ptrErrorCodePage、255、&Calls Back_Boot Identifier_Wrapper);
Diag.ParameterOfDataIdentifier Manager_Add (UDS_CHECKSUM、OnLineCheckSum、4、&Calls Back_Report Sum_Wrapper);
Diag Manager_Add 参数化数据标识符 (UDS_RESET_ERROR、CommandOfEeprom、3、&Call Back_Report Eeprom_Wrapper);
uds_init(); // pllab
}
内部主 (void)
{
//禁用全局中断
(void)Interrupt_disableMaster ();
//禁用看门狗
sysctl_disableWatchdog ();
main_Flash_syss Ctl_Init ();
SetupPeripheralClks();
SetupGpio();
main_init ();
main_DiagManager();
(void)Interrupt_enableMaster (); /*启用全局中断*/
while (1)
{
schedulerRun(schedulerGetTick());
}
返回 0;
}
在 main 函数中、
MemIF_JLM_Enable_OTP_Write ();被调用、并且在传递接口函数后、
uint32_t test_Val;
void MemIF_DCSM_OTP_Write (uint32_t dataLength)
{
uint32_t Z1_OTP_Val =*(uint32_t *) 0x78022;
TEST_Val = Z1_OTP_Val;
IF (Z1_OTP_Val = 0x4D7FFFFF)
{
Write_Internal (dataLength);
}
暴露
{
}
}
执行下面的闪存写入函数。
uint16_t dcsm_init[16];
Std_Return 类型 dcsm_OTP_Write (uint32_t dataLength)
{
uint16_t writeBuffer[10]={0、0、0、0、 0、0、0、0、0};
uint32_t i = 0、j = 0;
uint32_t startAddress = 0x78020;
Fapi_Status 类型 返回检查= Fapi_Status_Success;
Fapi_Flash 状态类型 oFlashStatus;
Fapi_Flash 状态字类型 oFlashStatusWord;
Std_Return 类型 retValue = E_NOT_OK;
dcsm_init[0]=(uint16_t) 0xFFFF;
dcsm_init[1]=(uint16_t) 0xFFFF;
dcsm_init[2]=(uint16_t) 0x5432;
dcsm_init[3]=(uint16_t) 0x4D76;
dcsm_init[4]=(uint16_t) 0xFFFF;
dcsm_init[5]=(uint16_t) 0xFFFF;
dcsm_init[6]=(uint16_t) 0xFFFF;
dcsm_init[7]=(uint16_t) 0xFFFF;
dcsm_init[8]=(uint16_t) 0x5555;
dcsm_init[9]=(uint16_t) 0x5555;
dcsm_init[10]=(uint16_t) 0x5555;
dcsm_init[11]=(uint16_t) 0x5555;
dcsm_init[12]=(uint16_t) 0x5500;
dcsm_init[13]=(uint16_t) 0x5555;
dcsm_init[14]=(uint16_t) 0x5555;
dcsm_init[15]=(uint16_t) 0x0000;
if (dataLength >= 4096u)
{
o 返回检查= Fapi_Error_Feature 不可用;
}
if (oReturnCheck == Fapi_Status_Success)
{
// FlashIF_Erase (blockNumber);
for (i = 0;i < dataLength;i += 8u)
{
对于 (j = 0;j < 8u;j++)
{
if ((i + j)>= dataLength)
{
writeBuffer[j]=(uint16_t) 0xFFFFu;
}
暴露
{
writeBuffer[j]=(uint16_t) dcsm_init[i + j];
}
}
(void)FlashIF_ClearFsmStatus();
//启用选定扇区的编程/擦除保护
// CMDWEPROTA 适用于扇区 0-31
// CMDWEPROTB 的位 0-11 适用于扇区 32-127、每个位代表
//一组 8 个扇区、例如、位 0 表示扇区 32-39、位 1 表示
//扇区 40-47 等
(void) Fapi_setupBankSectorEnable (FLASH_WRAPPER_PROGRAM_BASE+FLASH_O_CMDWEPROTA、FLASH_CMDWEPROTA_VALUE);
oReturnCheck = Fapi_issueProgrammingCommand ((Uint32 *) startAddress、writeBuffer、8、NULL、0、 Fapi_Auto EccGeneration);
//等待闪存编程操作结束
while (Fapi_checkFsmForReady ()= Fapi_Status_Fsm){}
if (oReturnCheck!= Fapi_Status_Success)
{
//检查闪存 API 文档是否存在可能的错误
FlashIF_Error();
}
//读取 FMSTAT 寄存器内容以了解之后 FSM 的状态
//编程命令以查看是否有任何与编程操作相关的错误
oFlashStatus = Fapi_getFsmStatus();
IF(oFlashStatus != 3U)
{
//相应地检查 FMSTAT 和调试
FlashIF_FMSTAT_Fail ();
}
//验证编程值。 检查是否存在任何 ECC 错误。
//编程命令本身会进行验证。
//通过 CPU 读取进行 Hence 程序验证 (Fapi_doVerify ()) 是可选的。
oReturnCheck = Fapi_doVerify ((Uint32 *) startAddress、4、(uint16 *) writeBuffer、&oFlashStatusWord);
if (oReturnCheck!= Fapi_Status_Success)
{
//检查闪存 API 文档是否存在可能的错误
FlashIF_Error();
}
startAddress = startAddress + 8u;
}
}
if (oReturnCheck == Fapi_Status_Success)
{
retValue = E_OK;
}
暴露
{
retValue = E_NOT_OK;
}
return retValue;
}
不过。 在构建并运行代码时出现错误。

过去、使用 F280025C 时、可以使用相同的方法刷写到用户 OTP 区域。
为什么 F2800156 无法实现该功能?