• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

    EEPW首頁 > 嵌入式系統 > 設計應用 > spi協議時序圖和四種模式實際應用詳解

    spi協議時序圖和四種模式實際應用詳解

    作者: 時間:2023-12-19 來源:無際單片機編程 收藏

    大家好,我是無際。

    本文引用地址:http://www.czjhyjcfj.com/article/202312/454033.htm

    上個章節我們講解了定義,今天我們更加深入講解下spi協議和spi四種模式的用法。

    剛開始接觸單片機開發時,最怕就是看,對于我來說就是奇怪的知識。

    特別是SPI和IIC的,以前寫程序都直接復制別人程序,功能實現就行了也沒去研究過數據傳輸的時候時序具體是怎么樣的。

    那個時候經驗也不足,網上搜的資料說的都太學術化了,也看不懂。

    后面項目做多了,發現最常用到的通信總線無非就是SPI、IIC、USART、CAN、單口通信。

    理解也慢慢深刻了,現在去分析也更加清晰了。

    所以,我經常和無際單片機編程的學員灌輸一種理念,先學會用,用多了經驗豐富了再深入就輕松了。

    不要在你沒經驗的時候去死磕,否則會付出很多不必要的時間成本。

    下面,我們進入主題。

    一、spi四種模式詳解

    在講時序圖之前,我們先要了解spi的四種模式,不同的模式采集數據的方式不一樣。

    一般內置SPI功能的單片機上,都有兩個寄存器配置位CPOL和CPHA。

    我們拿STM32單片機來舉例,可以通過結構體成員配置。


    這是通過固件庫直接配置,固件庫底層代碼也是去配置相應寄存器的。




    下面來介紹下CPOL和CPHA到底有什么用。

    CPOL就是決定SCLK這個時鐘信號線,在沒有數據傳輸的時候的電平狀態。

    CPOL=0:空閑狀態時,SCLK保持低電平

    CPOL=1:空閑狀態時,SCLK保持高電平


    CPHA就是決定數據位傳輸是從第一個時鐘(SCLK)邊沿開始,還是第二個從二個時鐘(SCLK)邊沿開始。

    CPHA=0:數據從第一個時鐘(SLCK)邊沿開始采集

    CPHA=1:數據從第二個時鐘(SLCK)邊沿開始采集


    Ok,理解CPOL和CPHA基本概念以后,下面這兩個要開始”合體”了。

    CPOL和CPHA合體就形成了SPI四種模式。


    聲明:部分圖片源自網絡,并非原創哈。

    下面再分析下4種模式的區別,比較重要。

    因為從機,從機指的是使用SPI協議通信的芯片,比如說w25q64(Flash)芯片,OLED屏等等。

    很多從機沒有CPOL和CPHA寄存器設置位,如果你看它們數據手冊會一臉懵逼,根本找不到這兩個東西。

    這些都是需要看他們時序圖去分析是用什么模式,如果模式不對,數據傳輸會有問題。

    這也是為什么明明自己寫了時序用在這個芯片可以,換到別的spi通信的芯片就不行。

    1.模式0(CPOL=0,CPHA=0)

    模式0特性:

    CPOL = 0:空閑時是低電平,第1個跳變沿是上升沿,第2個跳變沿是下降沿

    CPHA = 0:數據在第1個跳變沿(上升沿)采樣


    2.模式1(CPOL=0,CPHA=1)

    模式1特性:

    CPOL = 0:空閑時是低電平,第1個跳變沿是上升沿,第2個跳變沿是下降沿

    CPHA = 1:數據在第2個跳變沿(下降沿)采樣


    3.模式2(CPOL=1,CPHA=0)

    CPOL = 1:空閑時是高電平,第1個跳變沿是下降沿,第2個跳變沿是上升沿

    CPHA = 0:數據在第1個跳變沿(下降沿)采樣


    4.模式3(CPOL=1,CPHA=1)

    CPOL = 1:空閑時是高電平,第1個跳變沿是下降沿,第2個跳變沿是上升沿

    CPHA = 1:數據在第2個跳變沿(上升沿)采樣


    不知道你有沒有發現,不同的模式,其實就是SCLK空閑時間電平狀態和數據采樣起點不同

    你學廢了嗎?當初我就是這幾種模式看得一臉懵逼。

    如果不懂,先從開頭繼續看,這4種模式是后面分析整體時序圖的前提。


    二、spi時序圖詳解

    看到這里恭喜你,你馬上就能徹底攻破SPI協議了。

    Spi時序圖,最好的方式就是通過實際應用去學習。

    我們拿W25Q64這個Flash芯片舉例,這種芯片在SPI通信里都是作為從機的角色,也就SPI Slave。

    一般由單片機或者其它處理器作為主控和它通信,SLCK時鐘也是由主控發出。

    下面是W25Q64讀數據指令的時序圖,我們以這個例子來講解下時序圖要怎么看。


    1.先確定芯片支持什么SPI哪種模式讀寫數據

    確定了用哪種模式,主控,也就是單片機這邊才能確定數據采集的方式,主控和從機要保持一致。

    從時序圖中,不難發現,W25Q64的數據手冊直接告訴你支持用SPI模式0和模式3來通信。

    有些芯片的數據手冊,是沒有告訴你的,那怎么知道用芯片哪種模式?


    第一步:通過時序圖分析CLK空閑時的電平狀態,通過上面那個時序圖,我們可以得知,高低電平都可以對吧?那我們現在先用CLK空閑時是低電平這種狀態繼續往下分析。

    第二步:分析DI和DO是在CLK的上升沿還是下降沿采集數據,注意DI代表從機(W25Q64)的MISO引腳,DO代表從機(W25Q64)MOSI引腳。

    我們主要通過DI和DO在數據有效區時CLK是上升沿還是下降沿,來判斷

    什么是數據有效區?


    大家看上面這張圖,我用紅色框起來的區域就是數據有效區。

    一般數據是通過DI和DO兩個引腳傳輸的,所以數據有效區就是,這一時刻,這兩個引腳的只能是穩定高電平或者低電平。

    相當于數據有效區的電平就是最終要傳輸的數據位,低電平代表0,高電平代表1。

    傳輸8個位,代表1個字節的數據。

    什么是無效數據區?


    例如上圖藍色框的區域就是無效數據區,就是這個時刻CLK數據采集時鐘還沒來,所以DI和DO引腳的電平都可以任意變化。

    理解了這兩個概念以后,我們重點需要關心是的DI和DO在數據有效區的時候,CLK是上升沿還是下降沿。


    從上圖可以看出,DI和DO在數據有效區時,CLK是上升沿,下降沿的時候,DI和DO處于電平可任意變化的無效數據區。

    這樣,就可以分析出模式了。

    首先上升沿采集數據,通過排除法,這樣只有模式0和模式3符合條件。

    然后就是CLK空閑時間要為低電平,這樣就只有模式0符合了。

    所以,知道用模式0以后,單片機那邊寫程序就知道數據是從CLK上升沿讀取,或者發送,還是從下降沿了。


    2.分析整體時序

    分析時序,我們一定要先熟悉這個時序要實現什么功能,不同的功能雖然時序不一樣,但是發送數據的順序和定義不同。

    我們現在分析的這個時序是從W25Q64這個Flash芯片讀取存儲的數據。


    我把整個時序按CLK脈沖順序拆分成3個部分:

    ①讀指令

    這里要注意的是,讀指令數據是在W25Q64的DI引腳產生的,DI相當于W25Q64的MISO,就是接收主控(一般是單片機)發送過來的數據。

    所以,這個讀指令(0x03)是單片機發給W25Q64的。

    0x03被拆分成8個Bit在DI線上傳輸,每個CLK上升沿傳輸1個Bit。


    ②24位地址

    發完讀指令以后,單片機繼續發24位的內存地址,相當于要讀W25Q64哪個內存地址的數據。

    這個數據是由單片機程序定的,所以不是固定的,大家可以看到數據位都是可以高電平,也可以是低電平。

    ③單片機接收數據

    這個時候通信雙方的角色就變了,單片機變成了數據接收方,W25Q64變成了數據發送方。

    因為數據從W25Q64的DO發出了,也就是W25Q64的MOSI引腳。

    通過這個時序,單片機就可以讀到存儲在W25Q64指定地址的數據了。

    如果你是我們無際單片機編程學員,看文章還不是很理解的話,可以跟我反饋,反饋的人多就直播講解,如果少就針對性一對一遠程電話講解。

    三、單片機程序注意

    51單片機一般沒有內置SPI模塊,所以整個時序需要自己寫程序去模擬,簡稱模擬SPI。

    而STM32單片機一般有內置SPI,就不用自己寫程序去模擬時序,直接應用。

    但是如果用內置SPI有一個細節,特別容易被忽略,就是你讀數據的時候,讀一個字節之前要先發一個字節任意值數據。

    發一個字節任意值數據是為了在CLK總線上產生時鐘,給從機的SPI信號提供時鐘用的,從機SPI不會自己產生CLK信號的。

    比如我下面這個讀數據函數:


    能理解到這一步,你基本上就已經吃透SPI協議了。

    不管從機怎么換,比如說不是W25Q24了,換成OLED屏了,時序原理也是一樣的,只是相關的指令和寄存器不同。




    關鍵詞: spi接口 MCU 時序圖

    評論


    相關推薦

    技術專區

    關閉
    主站蜘蛛池模板: 晋州市| 平定县| 桑植县| 大同市| 建瓯市| 曲周县| 芜湖市| 陆河县| 长乐市| 武定县| 平利县| 思南县| 新化县| 浦城县| 津南区| 阆中市| 鄂伦春自治旗| 济宁市| 乌海市| 射洪县| 清涧县| 双流县| 申扎县| 深泽县| 桐柏县| 武汉市| 洛宁县| 巴塘县| 北海市| 保康县| 尉氏县| 井陉县| 南丹县| 连平县| 鄂托克旗| 和平区| 万安县| 运城市| 宝鸡市| 秀山| 同江市|