我正在運行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 ms內穩定在5V,可能會有0.4V的過衝。關斷時,它以指數形式衰減至0V,在50 mS內達到1V。我沒有看似相關的構建警告,只是未使用的變量和文件末尾缺少換行符。
我已經嘗試了幾件事:
- 啟用/禁用MCLR
- 啟用/禁用WDT
- 啟用/禁用代碼保護
- 啟用/禁用/更改掉電檢測電壓
- 啟用/禁用/更改上電計時器
- 主內部振盪器上的不同PLL設置
- 連接/斷開PICkit 3編程器
- 為5V添加470uF電容rail
- 在我的MCLR引腳上的4.7k上拉電阻上添加/移除.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錯誤,但始終是一次過的小故障,沒有這種可重現或一致的結果。
任何人都有知道發生了什麼嗎?我沒辦法嘗試了。