SPI接口的出錯分析及其改進
2、模式錯誤(MODF)
模式錯誤表示的是主從模式選擇的設(shè)置和引腳SS的連接不一致。
器件工作在主模式的時候(MSTR=1),它的片選信號SS引腳必須接高電平。在發(fā)送數(shù)據(jù)的過程中,如果它的SS從高電平跳至低電平,在SS的下降沿,SPI模塊將檢測到模式錯誤,對MODF位置1,強制器件從主模式轉(zhuǎn)入從模式(即令MSTR=0),清空內(nèi)部計數(shù)器counter,并結(jié)束正在進行的數(shù)據(jù)傳輸,如圖3(a)所示。
對從模式(MSTR=0),在沒有數(shù)據(jù)傳送的時候,SS高電平表示從器件未被選中,從器件不工作,MISO輸出高阻;在數(shù)據(jù)傳輸過程中,片選信號SS必須接低電平,且SS不允許跳變。如果SS從低電平跳到高電平,在SS的上跳沿,SPI模塊也將檢測到模式錯誤,清空內(nèi)部計數(shù)器counter,并結(jié)束正在進行的數(shù)據(jù)傳輸。直到SS恢復為低電平,重新使SPEN=1時,才重新開始工作,如圖3(b)所示。
圖3模式錯誤的檢測
3、溢出錯誤(OVR)
溢出錯誤表示連續(xù)傳輸多個數(shù)據(jù)時,后一個數(shù)據(jù)覆蓋了前一個數(shù)據(jù)而產(chǎn)生的錯誤。
狀態(tài)標志SPIF表示的是數(shù)據(jù)傳輸正在進行中,它對數(shù)據(jù)的傳輸有較大的影響。主器件的SPIF有效由數(shù)據(jù)寄存器的空標志SPTE=0產(chǎn)生,而從器件的SPIF有效則只能由收到的第一個SCK的跳變產(chǎn)生,且又由于從器件的SPIF和主器件發(fā)出的SCK是異步的,因此從器件的傳輸標志SPIF從相對于主器件的傳輸標志SPIF主有一定的滯后。如圖4所示,在主器件連續(xù)發(fā)送兩個數(shù)據(jù)的時候?qū)⒂锌赡軐е聫钠骷膫鬏敇酥竞椭髌骷乱粋€數(shù)據(jù)的傳輸標志相重疊(圖4中虛線和陰影部分),第一個收到的數(shù)據(jù)必然被覆蓋,第二個數(shù)據(jù)的收/發(fā)也必然出錯,產(chǎn)生溢出錯誤。
圖4溢出錯誤
通過對從器件的波形分析發(fā)現(xiàn),counter=8后的第一個時鐘周期,數(shù)據(jù)最后一位的傳輸已經(jīng)完成。在數(shù)據(jù)已經(jīng)收/發(fā)完畢的情況下,counter=8狀態(tài)的長短對數(shù)據(jù)的正確性沒有影響,因此可以縮短counter=8的狀態(tài),以避免前一個SPIF和后一個SPIF相重疊。這樣,從硬件上避免了這一階段的溢出錯誤。
但是,如果從器件工作速度不夠快或者軟件正在處理其他事情,在SPI接口接收到的數(shù)據(jù)尚未被讀取的情況下,又接收到一個新的數(shù)據(jù),溢出錯誤還是會發(fā)生的。此時,SPI接口保護前一個數(shù)據(jù)不被覆蓋,舍棄新收到的數(shù)據(jù),置溢出標志OVR=1;另外發(fā)出中斷信號(如果該中斷允許),通知從器件及時讀取數(shù)據(jù)。
4、偏移錯誤(OFST)
SPI接口一般要求從器件先工作,然后主器件才開始發(fā)送數(shù)據(jù)。有時在主器件往外發(fā)送數(shù)據(jù)的過程中,從器件才開始工作,或者SCK受到外界干擾,從器件未能準確地接收到8個SCK。如圖5所示,從器件接收到的8個SCK其實是屬于主器件發(fā)送相鄰的兩個數(shù)據(jù)的SCK主。這時,主器件的SPIF和從器件的SPIF會發(fā)生重疊,數(shù)據(jù)發(fā)生了錯位,從器件如果不對此進行糾正的話,數(shù)據(jù)的接收/發(fā)送便一直地錯下去。
評論