我正在运行Microchip dsPIC30F6012a。我在多个运行相同软件的PCB上安装了该芯片,并在所有PCB上观察到相同的问题。这意味着系统性问题,而不是一次性生产问题。这个问题也是可以重现的,这意味着如果我知道在哪里看,我应该可以杀死它。但是我仍然很难调试应用程序。
被测板接受24V,通过V7805降压至5V。该芯片在带有16x PLL的内部振荡器上运行,运行速度约为29.5 MIPS。该板上的相关代码本质上非常简单:唤醒,从EEPROM读取数据,然后进入无限循环。每毫秒中断一次,观察一些环境数据,并将更新的值写入EEPROM。还有其他事情,但是即使不相关的代码被注释掉,问题仍然会发生,因此我可以肯定地确定它与当前的问题无关。
在一般情况下,板卡有95%的时间以正确的内存值唤醒,然后继续其业务。但是,其他5%的时间会以错误的值唤醒。具体来说,它会以本应具有的数据的位翻转版本唤醒。我正在看的是一个四字节的无符号长整数,长整数的高位或低位字都可能被翻转。例如,10变成2 ^ 16-10,之后变成2 ^ 32-10。我可以通过手动重启数十次来重现故障,但这并不是很一致,并且我的开关手指已经磨损了。
为了以受控方式重现该问题,我制作了第二块板,该板驱动被测板的24V电源。(另一个dsPIC驱动达林顿光电耦合器。)测试板将24V关断1.5秒(足够长的时间使5V电源轨降到基本为0并停留在那里一秒钟),然后将24V开通一段可配置的时间长度。凭借大约520 mS的接通时间,我每次都能在五个电源周期内重现该EEPROM故障。
5V电源轨表现合理。假设我可以相信我的示波器,它会在开机1毫秒内稳定在5V,可能会有0.4V的过冲。关断时,它以指数方式衰减至0V,在50 mS内达到1V。我没有看似相关的构建警告,只有未使用的变量和文件末尾缺少换行符。
我已经尝试了几件事:
- 启用/禁用MCLR
- 启用/禁用WDT
- 启用/禁用代码保护
- 启用/禁用/更改掉电检测电压
- 启用/禁用/更改开机定时器
- 主内部振荡器上的不同PLL设置
- 连接/断开我的PICkit 3编程器
- 在5V电压轨上增加470 uF的电容
- 在我的MCLR引脚上的4.7k上拉电阻上添加/移除0.1 uF
- 禁用代码中的所有中断,并且在主循环中仅保留EEPROM更新
- 开始读取EEPROM之前,在启动例程中增加了1.5秒的延迟
我还编写了单独的测试代码,除了继续将值写入EEPROM然后再将它们读回以确保该值没有更改外,它什么也没做。数以万计的迭代没有出错。我所能得出的结论是,EEPROM读取或写入出现问题,特别是在上电/掉电时。
自2007年以来,我一直在使用相同的EEPROM库。我偶尔看到故障,但没有可重复的内容。相关代码可以在这里找到:http:
//srange.net/code/eeprom.c
http://srange.net/code/readEEByte.s
http://srange.net/code/eraseEEWord.s
http:/ /srange.net/code/writeEEWord.s
我以前在其他应用程序中曾见过EEPROM错误,但始终都是一次过的小故障,没有任何可重复的或一致的。
有人知道发生了什么吗?我没办法尝试了。