Thread 中讨论的其他器件:controlSUITE
大家好、
为同事发布。
我要做的是:
我正在尝试将一个小数据块写入一个未使用的闪存扇区。 随意地说、我将使用 TI EEPROM 仿真函数、但对于启动器、我一直在尝试使用 API 向闪存写入少量字节、然后通过直接寻址闪存中的存储器的简单函数将其读回。 供参考-我将向闪存写入8个字节、以尝试保持数据边界正确。
问题是什么:
当我执行闪存读取(在闪存写入之后)时、处理器会遇到未配置的中断。 我假定这是“可纠正的错误故障”,但它似乎不是该故障。 当我尝试捕获中断并确定中断的来源时,我看不到任何指向中断来源的标志。
我的假设:
我一直假设我遇到 ECC 错误,但我无法证明。 我的闪存写入代码是根据 controlSUITE 提供的示例进行调整的、因此我假设它写入正确。 但是,我对闪存写法不太了解,所以我甚至不知道在出现什么问题时要问什么问题。 我注意到这个器件的器件勘误表(文档 SPRZ423D)中提到了闪存错误、但是勘误表特别声明只有当错误是由程序提取操作引起的、而不是数据读取引起的时才会发生这种情况。 我正在读取数据、因此我假设这不适用。 此外、供参考的是、我使用的是 TMS rev C 器件。
在 CCS 版本中使用客户硬件:6.1.1.00022。 修改了一个软件示例。 以下代码:
我的项目中有:F021_API_F2837xD_FPU32.lib 文件、我的项目中有 F021_F2837xD_C28.h #included in Fapi_UserDefinedFuncations.c.
void EEPROM_WRITE (void)
{
uint32 u32Index = 0;
uint16 i = 0;
Fapi_StatusType o 返回检查;
易失性 Fapi_FlashStatusType o 闪存状态;
Fapi_FlashStatusWordType oFlashStatusWord;
//禁用 ECC。 ECC 不必被禁用即可执行类似的 FSM 操作
//编程和擦除。
//但是、在 Sonata Rev. 0芯片上、由于 OTP ECC 勘误表、
//禁用 ECC 以避免在使用闪存 API 函数时出现 ECC 错误
//读取 TI-OTP
INT_DISABLE;
/*
EALLOW;
Flash0EccRegs.ecc_enable.bit.enable = 0x0;
EDIS;
*
EALLOW;
//需要此函数来根据系统初始化闪存 API
//频率才能执行任何其他闪存 API 操作
oReturnCheck = Fapi_initializeAPI (F021_CPU0_BASE_ADDRESS、120);
if (oReturnCheck!= Fapi_Status_Success)
{
//检查闪存 API 文档以了解可能的错误
Example_Error (oReturnCheck);
}
// Fapi_setActiveFlashBank 函数进一步设置闪存组和 FMC
//闪存操作将在组上执行
oReturnCheck = Fapi_setActiveFlashBank (Fapi_FlashBank0);
if (oReturnCheck!= Fapi_Status_Success)
{
//检查闪存 API 文档以了解可能的错误
Example_Error (oReturnCheck);
}
//擦除扇区 B
oReturnCheck = Fapi_issueODE19 CommandWithAddress (Fapi_EraseSector、
(uint32 *) bzero_sectorb_start);
//等待 FSM 完成擦除扇区操作
while (fapi_checkFsmForReady()!= fapi_Status_FsmReady){}
//验证 sectorb 是否被擦除。 "擦除"步骤本身的验证方式为
//可以。 此验证是可以执行的第二次验证。
oReturnCheck = Fapi_doBlankCheck ((uint32 *) Bzero_sectorb_start、
Bzero_16KSector u32length、
oFlashStatusWord (&O);
if (oReturnCheck!= Fapi_Status_Success)
{
//检查闪存 API 文档以了解可能的错误
//如果擦除命令失败,请使用 Fapi_getFsmStatus()函数
//获取 fmstat 寄存器内容
//查看 EV 位、ESUSP 位、STAT 位或 VOLTSTAT 中是否有任何一个
//位被置位(更多细节请参考 API 文档)
Example_Error (oReturnCheck);
}
//最多可向程序函数提供8个字的数据缓冲区。
//每个字都被编程,直到整个缓冲区被编程或 A
//发现问题。 但是、要对具有大于8的缓冲区进行编程
//字、程序函数可在循环中调用、以便为编程8个字
//每个循环迭代直到整个缓冲区被编程
。//
//示例:使用输出 ECC 对闪存扇区 B 中的0xFF 字节进行编程
//禁用 ECC,以便在读取闪存内容时不生成错误
//无 ECC
Flash0EccRegs.ecc_enable.bit.enable = 0x0;
*
for (i=0;i<=word_in_flash_buffer;i++)
{
Buffer[i]= i;
}
对于(i=0、u32Index = Bzero_sectorb_start;
(u32Index <(Bzero_sectorb_start + wors_in_flash_buffer)))
&&(oReturnCheck = Fapi_Status_Success);i+= 8、u32Index+= 8)
{
oReturnCheck = fapi_issueProgrammingCommand ((UINT32 *) u32Index、
Read_flash_buffer + i、
8、
0、
0、
Fapi_AutoEccGeneration);
while (fapi_checkFsmForReady ()=fapi_Status_FsmBusy);
if (oReturnCheck!= Fapi_Status_Success)
{
//检查闪存 API 文档以了解可能的错误
Example_Error (oReturnCheck);
}
//读取 fmstat 寄存器内容以了解 FSM 的状态
//在用于任何调试的程序命令之后
oFlashStatus = fapi_getFsmStatus();
//验证编程的值。 Program 步骤本身会进行验证
//进行。 此验证是可以执行的第二次验证。
oReturnCheck = fapi_doVerify (((uint32 *) u32Index、
4、
Buffer32+(I/2)、
oFlashStatusWord (&O);
if (oReturnCheck!= Fapi_Status_Success)
{
//检查闪存 API 文档以了解可能的错误
Example_Error (oReturnCheck);
}
}
EDIS;
INT_ENABLE;
}
void Example_Error (Fapi_StatusType 状态)
{
//错误代码将位于状态参数
//中 _asm (" ESTOP0");
}
void flash_read (void)
{
uint16 i;
extern UINT16 EEPROM_DATA_LOAD_START;
对于(i=0;i < word_in_flash_buffer;i++)
{
*(read_flash_buffer + i)=*(&EEPROM_DATA_load_start + i);
}
flash_pack_struct_from 缓冲区(); //从闪存取值并打包到 EEPROM_DATA_buffer 结构
中} //函数末尾 flash_read()
此代码段来自.cmd 文件,该文件调用闪存中 EEPROM_DATA 的位置。
EEPROM_DATA :LOAD = FLASHB、
load_start (_EEPROM_DATA_LOAD_START)、
load_end (_EEPROM_DATA_LOAD_END)、
PAGE = 0、ALIGN (4)
感谢您的帮助、
不需要
