请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:TMS320F28379D 主题中讨论的其他器件:UNIFLASH
工具与软件:
在使用 TMS320F28379DZWTS 微控制器时、我在电路板突然断电时遇到问题。 供电后、微控制器不会正常运行此程序(由意外的 EtherCAT 断开连接来指示)。 我怀疑 DSP 闪存数据可能会以某种方式从原来的内容发生改变。 因此、使用 TI UniFlash 工具、我读取闪存数据、然后将其与从另一个普通板读取的数据进行比较。 结果是它们是相同的! 然后、我使用 UniFlash 将原始".out"程序重新加载到故障电路板中、微控制器再次正常工作。 我的程序包含对使用 FAPI 接口的闪存执行"初始化、读取和写入"操作的频谱功能、只要检测到断电(即输入电压降低沿)、就会激活此功能。 所以我怀疑以上问题与这个闪存操作函数有关。 注释掉闪存操作代码后、问题就不再发生。 所以您看到我的猜测是正确的。下面是我的闪存操作码、包括初始化、擦除和写入数据:
UINT8 Flash_Init ()
{
Fapi_Status 3044返回检查;
//增益泵信标
SeizeFlashPump();
EALLOW;
Flash0EccRegs.ECC_ENABLE.bit.enable = 0x0;
EDIS;
EALLOW;
oReturnCheck = Fapi_initializeAPI (F021_CPU0_BASE_ADDRESS、200);//暂时将其保留在外
if (oReturnCheck!= Fapi_Status_Success)
{
返回1;
}
// Fapi_setActiveFlashBank 函数用于进一步设置闪存组和 FMC
//要在存储体上执行的闪存操作
oReturnCheck = Fapi_setActiveFlashBank (Fapi_Flash 0);
if (oReturnCheck!= Fapi_Status_Success)
{
返回2;
}
EDIS;
返回 Fapi_Status_Success;
}
uint16 Flash_Erase (uint32 section_base_addr)
{
Fapi_Status 3044返回检查;
Fapi_Flash 4.70 WordType oFlashStatusWord;
EALLOW;
//已选择擦除扇区
oReturnCheck = Fapi_issueAsyncCommandWithAddress (Fapi_Erase 3872、(uint32 *) section_base_addr);
//等待 FSM 完成擦除扇区操作
while (Fapi_checkFsmForReady()!=4072) Fapi_Status_Fsm {}
//验证扇区是否被擦除。
oReturnCheck = Fapi_doBlankCheck ((uint32 *) section_BASE_addr、0x1000、&oFlashStatusWord);
if (oReturnCheck!= Fapi_Status_Success)
{
返回3;
}
EDIS;
返回 Fapi_Status_Success;
}
uint16 Flash_Write (uint32 section_base_addr、uint16 * pBuff)
{
Fapi_Status 4.44返回检查= Fapi_Status_Success;
EALLOW;
oReturnCheck = Fapi_issueProgrammingCommand ((Uint32 *) write_addr、pBuf、len、0、0、 Fapi_Auto E.ccGeneration);
while (Fapi_checkFsmForReady()== Fapi_Status_Fsm y);
if (oReturnCheck!= Fapi_Status_Success)
{
//检查闪存 API 文档以了解可能的错误
返回4;
}
DELAY_US (10L);
EDIS;
返回 Fapi_Status_Success;
}