用CH552E 552G 这两个芯片做了几个USB开关通讯设备。 出现了flash丢失问题。
测试情况是这样子的,设备接USB HUB 扩张器 或 设备接台式机前面的USB口 然后反复拔插就容易flash 出现频率特别高。
flash区被擦写掉了,代码中也按照网上提供的方案做了很多判定在稳定的情况才会写入flash。
这种是什么问题呢。求解。
用CH552E 552G 这两个芯片做了几个USB开关通讯设备。 出现了flash丢失问题。
测试情况是这样子的,设备接USB HUB 扩张器 或 设备接台式机前面的USB口 然后反复拔插就容易flash 出现频率特别高。
flash区被擦写掉了,代码中也按照网上提供的方案做了很多判定在稳定的情况才会写入flash。
这种是什么问题呢。求解。
可以分享一下允许flash操作的逻辑,看是否有漏洞存在。
CH552的Code flash的可擦写次数不是特别高,如果有数据存储的需求,优先考虑使用Data flash
使用的是 DataFlash 不是 code flash
是在官方的demo提供的 DataFlash.c 中拿过来做了修改使用的。
官方原生的也经常出现丢失问题, 后来经过网上有人分享的方案 做了一些判定处理 但是问题还是未能得到解决。
搭车问一下CH552的CodeFlash失效模式是什么?出现什么现象可以认定寿命已经到了。
我手头有一片开发用的CH552G,目前烧录可能已经上百次了,想知道它怎么就算坏了。
4楼的朋友,可以参考下面代码的全局标志保护。代码是CH54X上运行的擦除函数,思路是一样的。
extern UINT8 FLASH_CHECK_BYTE_1;
extern UINT8 FLASH_CHECK_BYTE_2;
UINT8 UserDefFlashErase( UINT16 Addr, UINT16 len )
{
bit e_all;
UINT8 status; /* 返回操作状态 */
UINT8 FlashType; /* Flash 类型标志 */
UINT16 addr = Addr+UserDefineFlashAddr;
UINT16 restlen = len;
/* 判断是否可以正常执行FLASH操作 */
if( ( FLASH_CHECK_BYTE_1 != DEF_FLASH_OP_CHECK1 ) && ( FLASH_CHECK_BYTE_2 != DEF_FLASH_OP_CHECK2 ) )
{ //FLASH_CHECK_BYTE_1和FLASH_CHECK_BYTE_2通常在USB中断中满足一定条件置位,或者在GPIO中断中置位,这个标志的置位来源一定是芯片外部操作实现的,防止自己就擦写了
return 0x02;
}
if((addr>=DATA_FLASH_ADDR) && (addr/* DataFlash区域 */
{
FlashType = bDATA_WE;
}
else /* CodeFlash区域 */
{
FlashType = bCODE_WE;
}
SAFE_MOD = 0x55; /* 进入安全模式 */
SAFE_MOD = 0xAA;
//下面就是FLASH的擦(554以下不需要擦)、写、读
//操作结束之后FLASH_CHECK_BYTE_1和FLASH_CHECK_BYTE_2及时复位
GLOBAL_CFG |= FlashType;
do
{
ROM_ADDR = addr; /* 写入目标地址 */
ROM_BUF_MOD = bROM_BUF_BYTE; /* 选择块擦除模式或单字节编程模式 */
ROM_DAT_BUF = 0; /* 擦写数据缓冲区寄存器为0 */
if ( ROM_STATUS & bROM_ADDR_OK ) /* 操作地址有效 */
{
ROM_CTRL = ROM_CMD_ERASE; /* 启动擦除 */
if(ROM_STATUS & bROM_CMD_ERR)
{
status = 0x02; /* 未知命令或超时 */
return status;
}
else
{
status = 0x00; /* 操作成功 */
}
}
else
{
status = 0x01; /* 地址无效 */
return status;
}
addr += 64;
if( restlen >= 64 )
{
restlen -= 64;
}
else if( restlen < 64 )
{
restlen = 0;
}
}while( restlen );
SAFE_MOD = 0x55; /* 进入安全模式 */
SAFE_MOD = 0xAA;
GLOBAL_CFG &= ~FlashType; /* 开启写保护 */
EA = e_all; /* 恢复全局中断状态 */
CH549WDTModeSelect(1); /* 启动看门狗 */
return status;
}
5楼的朋友,当flash的某一些比特位无法被代码修改的时候,flash就出问题了,可能在ISP工具对芯片进行烧录的时候会出现失败的现象。
@7楼的朋友,ISP会报错就好了,我看一下这个开发用的CH552G什么会挂掉。
6楼 老哥 你提供的这个 我也是参考过的,修改后就是我4楼贴图的也是加了全局标识位的 但是还是被擦写掉。
全局标志应该有多个,且生效的地方,逻辑都很重要,且在退出函数的时候应该将全局标志无效。
我们防止的是在上下电过程中程序运行的异常,意外的进入这个函数执行了flash操作,那全局标志的作用应该是只在一通复杂交互逻辑之后才会生效(类似打游戏AAABBBBBXXXXXXYYY开启隐藏功能),除此之外任何时候调用这个函数都是无效的。
你截图的代码中判断条件用的是“||”,相信调用这个函数的地方参数都是满足的,要是跑飞到:
jump to this line code; <----------------------------------------------------------------------
writedataflash(X,X,X);
上面的情况是不是紧接这调用了会传入正确参数的flash操作函数呢?同时READY(应该是个全局标志吧?)也无所谓是什么值。再里面一层判断条件return i的,意义也不是很大。
好的 感谢。 逻辑上好像是存在一些问题, 我先做下调整 在测试看看。