SPI Flash数据移位
背景
C6678外掛了一片SPI接口的Nor Flash,型號為Micron N25Q128A13BSF404F,其容量為128Mbit,由于電平匹配問題中間使用了一片EPLD作電平轉換,將6678的1.8V電平邏輯轉換為3.3V。
問題描述
開發和調試很順利,在完成軟件概要設計后約一周內就完成了所有編碼和部分測試工作。但是在測試過程中發現當SPI的時鐘配高一些(50MHz)的時候,就會出現Flash初始化不通過,具體現象是讀取ID不正確,與正確的ID總是移位1個比特。當把SPI時鐘調低到20MHz后又恢復正常,而在30~40MHz左右時又總是一會兒正常一會兒錯誤。
分析排查
這時先懷疑芯片不支持這么高時鐘速率,然而查手冊發現其中明確提到最高支持時鐘速率為108MHz。然后又詢問硬件設計人員物料來源,得知通過正常途徑采購,芯片本身應該沒有什么問題。最后問題應該還是歸結到軟件問題上。
先查SPI驅動中對分頻的配置,仔細對比手冊沒有找到問題。然后用示波器測量時鐘引腳頻率,仍然正常。測量讀ID時主機發送的命令信號,依然正常。再測量不同頻率下6678的接收引腳信號,在頻率逐漸提高過程中時鐘采樣沿居然逐漸接近了數據波形的邊沿處!最終40MHz時完全采在了前一個bit的后部,結果當然會移位1個比特。
根據這個測量結果仔細分析,終于找到了其中的原因。原來是中間的EPLD在搗鬼,信號經過它時除了電平轉換,還會有一定的時延效應,正是這個時延導致了數據錯誤。詳細分析如下。
理論分析
SPI總線由SPICS、SPICLK、SPISIMO和SPISOMI組成,其中前三根由6678驅動,后一根由N25Q驅動。假設信號經過EPLD的時延是Δt,以6678輸出CS的時刻為基準,t時刻SPICLK信號開始有效。
當Δt=0時正常時序如圖中的時序1所示,SPISIMO和SPISOMI在SPICLK的上升沿數據有效,6678和N25Q均能采樣得到正確數據。
當Δt>0時如圖中的時序2所示。由于SPICS、SPICLK、SPISIMO的時延相等相抵消,在SPICLK上升沿N25Q仍能采得正確數據,即主機向從機發送數據不受影響。
此時從機剛剛收到時鐘信號,因此觸發其發出SPISOMI的輸出也才剛剛開始,比正常時間順延Δt。此信號經過EPLD再回到6678端時再次順延Δt,而6678端的其他三根信號無時延,兩者相差達到2Δt。若此時間大于半個時鐘周期,則采樣將產生不穩定,甚至錯位。實際信號并非陡峭邊沿,因此對Δt要求更高。
理論分析完畢,接下來要實測來證實理論。用示波器的兩個通道分別測量EPLD兩端的SPICLK信號,結果兩通道上信號的時間差約4ns,雙向達到8ns,且信號邊沿形狀較差。因此SPI時鐘周期不應低于16ns,即62.5MHz,實際測試時鐘頻率在35MHz時可以正確傳輸數據,到達40MHz以上時傳輸失敗。證實了理論分析。
解決方案
最后在Flash驅動中將時鐘頻率限制在25MHz以下,規避了這個問題。
總結
以上是生活随笔為你收集整理的SPI Flash数据移位的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: WordPress获取当前TAG别名(s
- 下一篇: 唐骏:先做人再做事偶尔作作秀