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.

[参考译文] TMS570LS1227:在 FreeRTOS 应用程序中执行多次写入/读取操作后的 EEPROM 问题

Guru**** 2589300 points
Other Parts Discussed in Thread: TMS570LS1227, HALCOGEN

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/804999/tms570ls1227-eeprom-issue-after-several-write-read-operation-in-freertos-app

器件型号:TMS570LS1227
主题中讨论的其他器件: HALCOGEN

你(们)好。

我在嵌入式项目中使用的是 TMS570LS1227。 我在其中使用 FreeRTOS V8.2.0。

该项目主要由3个任务组成:

int main (void)
{
/*用户代码 begin (3)*/
//初始化 DES 模块
gioInit();
spiInit();
sciInit();
vimInit();
adcInit();
TI_FEE ();
_enable_interrupt_();
_enable_IRQ ();

xTaskHandle xAcqTaskHandle、xAppeComTaskHandle、xSyncComTaskHandle、xSetResetTaskHandle;
if (xTaskCreate (vAcqTask、"vAcqTaskHandle"、configMINIMAL_STACK_SIZE * 4、NULL、1、&xAcqTaskHandle)!= pdTRUE)
{
while (1);//无法创建任务
}

if (xTaskCreate (vOxomTask、"vOxOxComTask"、configMINIMAL_STACK_SIZE*2、NULL、1、&xOxComTaskHandle)!= pdTRUE)
{
while (1);//无法创建任务
}

if (xTaskCreate (vSyncComTask、"vSyncComTask"、configMINIMAL_STACK_SIZE * 5、NULL、1|portPRIVILEGE_BIT、&xSyncComTaskHandle)!= pdTRUE)//portPRIVILEGE_BIT
{
while (1);//无法创建任务
}
//启动调度程序
vTaskStartScheduler();
//永久运行
while (1);
/*用户代码结束*/

返回0;
} 

Acq 任务负责从传感器获取数据。

已将数据 发送到 PC。

SyncCom 任务、负责接收来自 PC 的消息、更新 EEPROM 中的参数和应答 PC。

您可以看到、所有3个任务具有相同的优先级、但我向 SyncCom 任务添加了 portPRIVILEGE_BIT、因为需要使 EEPROM 写入函数正常工作。

使用我编写的以下函数修改 EEPROM:

void delay (void)
{
unsigned int dummycnt=0x000FFFU;
操作
{
dummycnt--;
}
while (dummycnt>0);
}

void EEPROM_readValue (uint8_t* buffer_o、unsigned int length、uint8_t block 编号){
TI_fee_ReadSync (block_number、0、buffer_o、length);
delay();

}

void EEPROM_writeValue (uint8_t* buffer_I、uint8_t block 编号){
TI_fee_WriteSync (block_number、buffer_i);
delay();
TI_fee_MainFunction ();
}

uint8_t tmp[576];//使用的最大块大小为576字节
void EEPROM_modifyParameter (uint8_t*参数、unsigned int parameter_size、unsigned int offset、uint8_t block_number){
const unsigned int max_block_size = 576;
//1)从 EEPROM 获取相应的块并复制到 tmp
EEPROM_readValue (tmp、max_block_size、block_number);

//2)修改 tmp
memcpy (tmp+offset* sizeof (double)、参数、parameter_size);

//3)用 tmp 重新 wrtie 块
EEPROM_writeValue (tmp、block_number);
} 

我所面临的问题如下:一切都运行良好一段时间(我可以从 PC 发送参数、这些参数是在 EEPROM 中写入的。 断电后无问题:在 EEPROM 中正确读取参数、数据 perspers立场 正常)

但昨天、它突然停止工作:TI_FEE 写入同步函数不再工作(卡在模块状态=忙状态中)。 这种情况发生在 PCB 原生电路板上。 我在评估 HerculeLaunchpad 上尝试了相同的代码、结果相同:一段时间内工作正常、但在多次写入参数后、TI_FEE WriteSync 中断。

我使用 CCS 加载程序、"debug"选项卡中的选项指定不擦除 FlashBank 7、以便在2个程序加载之间保存参数。

通过重置此参数来擦除所有闪存扇区、解决了问题、但这并不令人满意:我希望产品能够使用、而无需重新刷写代码即可"修复"闪存...

我完全不知道这里有什么触觉。

最后一段信息、以防它有助于:

-当 SyncCom 任务在 EEPROM 中执行读/写操作时、中断(Gio、UART Rx)可触发。 但是、此任务是访问 EEPROM 的唯一任务。

-由于 SPI 问题的原因、我不得不通过将分频器增加到7来降低 VCLCK1。

已连接相应的 halcogen 配置

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

    只是一个温馨的提醒……

    我在这个问题上真的迷路了:-/

    一旦闪存看起来"失败"(写入操作不再成功)、我就不得不调用布尔 TI_FEE 格式(uint32 u32FormatKey)

    这绝对不是正常行为

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

    很抱歉、我迟到了回复(刚刚看到您的帖子)、我会查看并很快回来。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Audry、

    您能告诉我您的代码中使用了多少个虚拟扇区吗? LS12x 在 EEPROM 中具有4个物理扇区。 所有虚拟扇区都应具有相同的大小。

    对于 writeSync 函数,不需要调用 TI_fee_MainFunction()。

    什么是 EWAIT? EWAIT 值用于定义组7中数据闪存的等待状态数。 -- EEPROM_CONFIG 寄存器

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

    您好 Audry、

    我假设您已经解决了这个问题。 我将关闭此主题。 如果您有任何其他问题、请打开另一个主题。 谢谢!