日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【SPI总线常见错误】

發布時間:2023/12/8 编程问答 59 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【SPI总线常见错误】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

SPI總線常見錯誤

1 SPR設定錯誤
 在從器件時鐘頻率小于主器件時鐘頻率時,如果SCK的速率設得太快,將導致接收到的數據不正確(SPI接口本身難以判斷收到的數據是否正確,要在軟件中處理)。
 整個系統的速度受三個因素影響:主器件時鐘CLK主、從器件時鐘CLK從和同步串行時鐘SCK,其中SCK是對CLK主的分頻,CLK從和CLK主是異步的。要使SCK無差錯無遺漏地被從器件所檢測到,從器件的時鐘CLK從必須要足夠快。下面以SCK設置為CLK主的4分頻的波形為例,分析同步串行時鐘、主時鐘和從時鐘之間的關系。

圖1主從時鐘和SCK的關系
 如圖1所示,當T從<Tsck/2,即T從<2T主時,無論主時鐘和從時鐘之間的相位關系如何,在從器件CLK從的上升沿必然能夠檢測到SCK的低電平,即SCK=0的范圍內至少包含一個CLK從的上升沿。
 圖2中,當T從≥TSCK/2=2T主時,在clk_s的兩個上升沿都檢測不到SCK的低電平,這樣從器件就會漏掉一個SCK。在某些相位條件下,即使CLK從僥幸能檢測到SCK的低電平,也不能保證可以繼續檢測到下一個SCK。只要遺漏了一個SCK,就相當于串行數據漏掉了一個位,后面繼續接收/發送的數據就都是錯誤的了。

圖2主從時鐘和SCK的關系
 根據以上的分析,SPR和主從時鐘比的關系如表1所列。

表1 SPR的設置和主從時鐘周期比值之間的關系
 在發送數據之前按照表1對SPR進行設置,SPR設定錯誤可以完全避免。
2 模式錯誤(MODF)
 模式錯誤表示的是主從模式選擇的設置和引腳SS的連接不一致。
 器件工作在主模式的時候(MSTR=1),它的片選信號SS引腳必須接高電平。在發送數據的過程中,如果它的SS從高電平跳至低電平,在SS的下降沿,SPI模塊將檢測到模式錯誤,對MODF位置1,強制器件從主模式轉入從模式(即令MSTR=0),清空內部計數器counter,并結束正在進行的數據傳輸,如圖3(a)所示。
 對從模式(MSTR=0),在沒有數據傳送的時候,SS高電平表示從器件未被選中,從器件不工作,MISO輸出高阻;在數據傳輸過程中,片選信號SS必須接低電平,且SS不允許跳變。如果SS從低電平跳到高電平,在SS的上跳沿,SPI模塊也將檢測到模式錯誤,清空內部計數器counter,并結束正在進行的數據傳輸。直到SS恢復為低電平,重新使SPEN=1時,才重新開始工作,如圖3(b)所示。

圖3模式錯誤的檢測
3 溢出錯誤(OVR)
 溢出錯誤表示連續傳輸多個數據時,后一個數據覆蓋了前一個數據而產生的錯誤。
 狀態標志SPIF表示的是數據傳輸正在進行中,它對數據的傳輸有較大的影響。主器件的SPIF有效由數據寄存器的空標志SPTE=0產生,而從器件的SPIF有效則只能由收到的第一個SCK的跳變產生,且又由于從器件的SPIF和主器件發出的SCK是異步的,因此從器件的傳輸標志SPIF從相對于主器件的傳輸標志SPIF主有一定的滯后。如圖4所示,在主器件連續發送兩個數據的時候將有可能導致從器件的傳輸標志和主器件下一個數據的傳輸標志相重疊(圖4中虛線和陰影部分),第一個收到的數據必然被覆蓋,第二個數據的收/發也必然出錯,產生溢出錯誤。

圖4溢出錯誤
  通過對從器件的波形分析發現,counter=8后的第一個時鐘周期,數據最后一位的傳輸已經完成。在數據已經收/發完畢的情況下,counter=8狀態的長短對數據的正確性沒有影響,因此可以縮短counter=8的狀態,以避免前一個SPIF和后一個SPIF相重疊。這樣,從硬件上避免了這一階段的溢出錯誤。
  但是,如果從器件工作速度不夠快或者軟件正在處理其他事情,在SPI接口接收到的數據尚未被讀取的情況下,又接收到一個新的數據,溢出錯誤還是會發生的。此時,SPI接口保護前一個數據不被覆蓋,舍棄新收到的數據,置溢出標志OVR=1;另外發出中斷信號(如果該中斷允許),通知從器件及時讀取數據。
4 偏移錯誤(OFST)
  SPI接口一般要求從器件先工作,然后主器件才開始發送數據。有時在主器件往外發送數據的過程中,從器件才開始工作,或者SCK受到外界干擾,從器件未能準確地接收到8個SCK。如圖5所示,從器件接收到的8個SCK其實是屬于主器件發送相鄰的兩個數據的SCK主。這時,主器件的SPIF和從器件的SPIF會發生重疊,數據發生了錯位,從器件如果不對此進行糾正的話,數據的接收/發送便一直地錯下去。

圖5偏移錯誤
 在一個數據的傳輸過程中,SPR是不允許改變的,即SCK是均勻的,而從圖5可以看出,從器件接收到的8個SCK并不均勻,它們是分別屬于兩個數據的,因此可以計算SCK的占空時間來判斷是否發生了偏移錯誤。經分析,正常時候SCK=1時的時鐘周期數n的取值滿足如下關系:

但由于主從時鐘之間是異步的,并且經過了取整,所以正常時候SCK=1時的時鐘周期計數值COUNT應滿足:

比如在圖5中,COUNT的最大值COUNT(max)=2或者1,都可認為是正常的。但當出現COUNT(max)=8時,可以判定出現了偏移錯誤。在實際設計中,先記錄下第一個COUNT(max)的值,如果后面又出現與記錄值相差1以上的COUNT(max)出現,可知有偏移錯誤OFST
發生。SPI接口在“不均勻”的地方令SPIF=1,然后準備等待下一個數據的第一個SCK。其中COUNT的位數固定為8位,為了避免溢出時重新從00H開始計數,當計數達到ffH時停止計數。
5 其他錯誤
 設定不當,或者受到外界干擾,數據傳輸難免會發生錯誤,或者有時軟件對錯誤的種類判斷不清,必須要有一種方法強制SPI接口從錯誤狀態中恢復過來。在SPI不工作,即SPEN=0的時候,清除SPI模塊內部幾乎所有的狀態(專用寄存器除外)。如果軟件在接收數據的時候,能夠發現數據有錯誤,無論是什么錯誤,都可以強制停止SPI的工作,重新進行數據傳輸。例如,在偏移錯誤(OFST)中,如果SPR2、SPR1和SPR0的設置適當,也可以使SCK顯得比較“均勻”。SPI接口硬件本身不可能檢測到有錯誤,若用戶軟件能夠發現錯誤,這時就可以強制停止SPI的傳輸工作,這樣就可以避免錯誤一直持續下去。
在應用中,如果對數據的正確性要求較高,除了要在軟件上滿足SPI接口的時序要求外,還需要在軟件上作適當的處理。
五.設計SPI總線控制器
目前的項目中使用了SPI總線接口的FLASH存儲器存儲圖像數據。FLASH的SPI總線頻率高達66M,但MCU的頻率較低,晶振頻率7.3728M,SPI最大頻率為主頻1/2。對于32024016的圖像讀取時間為333ms,而且還忽略了等待SPI傳輸完成、寫顯存、地址坐標設定等時間。實際測試約為1s。成為GUI設計的極大瓶頸。由于TFT驅動是自己FPGA設計的,資源尚有余量,決定把SPI控制器(主)及寫圖像部分邏輯放入FPGA中用硬件完成。
首先接觸到的是SPI的SCK時鐘頻率問題。FPGA的頻率是48M,未使用PLL。能否以此頻率作為SCK頻率呢?要知道所有的MCU提供的SPI頻率最大為主頻的1/2!為什么呢?查過一些資料后發現,SPI從機接收數據并不是以SCK為時鐘的,而是以主頻為時鐘對SCK和MISO進行采樣,由采樣原理得知SCK不能大于1/2主頻,也就有了MCU提供最大master頻率是1/2主頻,最大slaver頻率是1/4主頻。FPGA在只作為主機時能否實現同主頻一樣頻率的SCK呢??答案貌似是肯定的!但我還是有點擔心,用組合邏輯控制SCK會不會出現較大毛刺影響系統穩定性呢?一切的一切待我完成再來解答好了~

所以,關于SPI頻率具體設置好多,要分2種情況

  • MCU作為主設備
    (只發數據,不收數據):f_SCK你可以設置成和SLK主同頻;
    (既要收數據,也要發數據):f_SCK <=f_SLK主/2(收數據時候,是以主頻對SCK采樣)
  • MCU作為從設備
    可接受的最大f_SCK和作為主設備一樣f_SCK<=f_SLK從/2
  • 綜上!MCU提供最大master頻率是1/2主頻,最大slaver頻率是1/4主頻

    針對3288的SPI,其掛在在APB總線下,SPI_CLK為48Mhz。

    根據如上標準,提供最大MASTER頻率為 SPI_CLK/2 = 24MHZ, 最大SLAVER頻率為 SPI_CLK/4= 12MHZ

    這個結果似乎和參考手冊上有些出入!
    A summary of the frequency ratio restrictions between the bit-rate clock (sclk_out / sclk_in)
    and the SPI peripheral clock (spi_clk) are described as,
    When SPI Controller works as master, the F spi_clk >= 2 × (maximum F sclk_out )
    When SPI Controller works as slave, the F spi_clk >= 6 × (maximum F sclk_in )

    我理解為,這是SPI作位從設備的時候,可接受的最大SCK(F sclk_in),為SPI_CLK/6=8M,作為主設備,可輸出最大SCK( F sck_out),為SPI_CLK/2=24M

    總結

    以上是生活随笔為你收集整理的【SPI总线常见错误】的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。