1. 程式人生 > >弄懂SPI介面

弄懂SPI介面

SPI(Serial Peripheral Interface,序列外設介面)是Motorola公司提出的一種同步序列資料傳輸標準是一種高速的,全雙工,同步的通訊匯流排在很多器件中被廣泛應用。

SPI相關縮寫

SS: Slave Select,選中從裝置,片選。

CKPOL (Clock Polarity) = CPOL = POL = Polarity = (時鐘)極性

CKPHA (Clock Phase)   = CPHA = PHA = Phase = (時鐘)相位

SCK = SCLK = SCL = SPI的時鐘(Serial Clock)

Edge = 邊沿,即時鐘電平變化的時刻,即上升沿

(rising edge)或者下降沿(falling edge)。

對於一個時鐘週期內,有兩個edge,分別稱為:

Leading edge = 前一個邊沿 第一個邊沿,對於開始電壓是1,那麼就是1變成0的時候,對於開始電壓是0,那麼就是0變成1的時候;

Trailing edge = 後一個邊沿 第二個邊沿,對於開始電壓是1,那麼就是0變成1的時候(即在第一次1變成0之後,才可能有後面的0變成1),對於開始電壓是0,那麼就是1變成0的時候;


介面

SPI介面經常被稱為4線序列匯流排,以主/從方式工作,資料傳輸過程由主機初始化

如圖1所示,其使用的4條訊號線分別為:

1) SCLK:序列時鐘,用來同步資料傳輸,由主機輸出;

2) MOSI:主機輸出從機輸入(Master Output Slaver Input)資料線;

3) MISO:主機輸入從機輸出資料線;

4) SS:片選線,低電平有效,由主機輸出。

在SPI總線上,某一時刻可以出現多個從機,但只能存在一個主機,主機通過片選線來確定要通訊的從機。這就要求從機的MISO口具有三態特性,使得該口線在器件未被選通時表現為高阻抗。

SPI由於介面相對簡單(只需要4根線),用途算是比較廣泛,主要應用在 EEPROM,FLASH,實時時鐘,AD轉換器,還有數字訊號處理器和數字訊號解碼器之間。

即一個SPI的Master通過SPI與一個從裝置,即上述的那些Flash,ADC等的Slaver SPI進行通訊。

而主從裝置之間通過SPI進行通訊,首先要保證兩者之間時鐘SCLK要一致,互相要商量好了,要匹配,否則,就沒法正常通訊了,即保證時序上的一致才可正常訊而這裡的SPI中的時鐘和相位,指的就是SCLk時鐘的特性,即保證主從裝置兩者的時鐘的特性一致了,以保證兩者可以正常實現SPI通訊。


資料傳輸

在一個SPI時鐘週期內,會完成如下操作:

1) 主機通過MOSI線傳送1位資料,從機通過該線讀取這1位資料;

2) 從機通過MISO線傳送1位資料,主機通過該線讀取這1位資料。

這是通過移位暫存器來實現的。如圖2所示,主機和從機各有一個移位暫存器,且二者連線成環。隨著時鐘脈衝,資料按照從高位到低位的方式依次移出主機暫存器和從機暫存器,並且依次移入從機暫存器和主機暫存器。當暫存器中的內容全部移出時,相當於完成了兩個暫存器內容的交換。


時鐘極性和時鐘相位

在SPI操作中,最重要的兩項設定就是時鐘極性(CPOL或UCCKPL)和時鐘相位(CPHA或UCCKPH)。時鐘極性設定時鐘空閒時的電平,時鐘相位設定讀取資料和傳送資料的時鐘沿。

主機和從機的傳送資料是同時完成的,兩者的接收資料也是同時完成的。所以為了保證主從機正確通訊,應使得它們的SPI具有相同的時鐘極性和時鐘相位。

CPOL極性

先說什麼是SCLK時鐘的空閒時刻,其就是當SCLK在傳送8bit位元資料之前和之後的狀態,與此對應的,SCLK在傳送資料的時候,就是正常的工作的時候,有效active的時刻了。

先說英文,其精簡解釋為:Clock Polarity = IDLE state of SCK

再用中文詳解:

SPICPOL,表示當SCLK空閒idle的時候,其電平的值是低電平0還是高電平1

CPOL=0,時鐘空閒idle時候的電平是低電平,所以當SCLK有效的時候,就是高電平,就是所謂的active-high

CPOL=1,時鐘空閒idle時候的電平是高電平,所以當SCLK有效的時候,就是低電平,就是所謂的active-low

CPHA相位

首先說明一點,capture strobe = latch = read = sample,都是表示資料取樣,資料有效的時刻。

相位,對應著資料取樣是在第幾個邊沿(edge),是第一個邊沿還是第二個邊沿,0對應著第一個邊沿,1對應著第二個邊沿。

CPOL=0

對於CPHA=0idle時候的是低電平,第一個邊沿就是從低變到高,所以是上升沿;

對於CPHA=1idle時候的是低電平,第二個邊沿就是從高變到低,所以是下降沿;

CPOL=1

對於CPHA=0idle時候的是高電平,第一個邊沿就是從高變到低,所以是下降沿;

對於CPHA=1idle時候的是高電平,第二個邊沿就是從低變到高,所以是上升沿;

用圖文形式表示,更加容易看懂:


CKPCKE

CKPCKE是MicrochipPIC系列晶片中的說法。

1CKPClock Polarity Select,就是極性=CPOL

CKP,雖然名字和CPOL不一樣,但是都是指時鐘極性的選擇,定義也一樣

CKP: Clock Polarity Select bit

1 = Idle state for clock (CK) is a high level

0 = Idle state for clock (CK) is a low level

所以不多解釋。

2CKEClock Edge Select,就是相位=CPHA

CKE: SPI Clock Edge Select bit

1 = Transmit occurs on transition from active to Idle clock state

0 = Transmit occurs on transition from Idle to active clock state

意思是:

1 =(資料)傳輸發生在時鐘從有效狀態轉到空閒狀態的那一時刻

0 =(資料)傳輸發生在時鐘從空閒狀態轉到有效狀態的那一時刻

其中,資料傳輸的時刻,即上圖中標出的“資料transmit傳輸的時刻”。

CKE的定義也跟CPHA相同。

所以,CKPCKE所對應的取值的含義為:

When CKP = 0:

CKE=0 => Data transmitted on rising edge of SCKidle時候是低電平,從空閒到有效,就是從低電平到高電平,所以是上升沿)

CKE=1 => Data transmitted on falling edge of SCK(idle時候是低電平,從有效到空閒,就是從高電平到低電平,所以是下降沿)

When CKP = 1:

CKE=0 => Data transmitted on falling edge of SCKidle時候是高電平,從空閒到有效,就是從高電平到低電平,所以是下降沿)

CKE=1 => Data transmitted on rising edge of SCKidle時候是高電平,從有效到空閒,就是電平到電平,所以是上升沿


舉例來說,分別選取MSP430控制器和OLED驅動SH1101A為主從機,圖3和圖4為它們的SPI時序。由圖4可知,SH1101A的SPI時鐘空閒時為高電平,並且在後時鐘沿接收資料(後時鐘沿在資料的中間部位)則MSP430控制器SPI的設定應與此保持一致。從圖3中可以看出,要使得時鐘在空閒時為高電平,應將UCCKPL置1;要使得在後時鐘沿接收資料,應將UCCKPH清零。



下面再列出其他一些地方找到的,常見的SPI的四種模式的時序圖,供參考:



如何看懂和記憶CPOLCPHA

所以,關於在其他地方介紹的,看似多麼複雜難懂難記憶的CPOLCPHA,其實經過上面解釋,就肯容易看懂了:

去看時序圖,如果時鐘SCLK的起始電平是0,那麼CPOL=0,如果是1,那麼CPOL=1

然後看資料取樣時刻,即時序圖資料線上的資料矩形區域的中間所對應的位置,對應到上面SCLK時鐘的位置,對應著是第一個邊沿或是第二個邊沿,即CPHA01。(對應的是上升沿還是下降沿,要根據對應的CPOL的值,才能確定)。

即:

1)如何判斷CPOLSCLK的空閒時候電壓是0還是1,決定了CPOL0還是1

2)如何判斷CPHA:而資料取樣時刻對應著的SCLK的電平,是第一個邊沿還是第二個邊沿,對應著CPHA0還是1

軟體中如何設定SPI的極性和相位

SPI分主裝置和從裝置,兩者通過SPI協議通訊。

設定SPI的模式,是從裝置的模式,決定了主裝置的模式。

所以要先去搞懂從裝置的SPI是何種模式,然後再將主裝置的SPI的模式,設定和從裝置相同的模式,即可正常通訊。

對於從裝置的SPI是什麼模式,有兩種:

1)固定的,裝置硬體決定的。

SPI從裝置,具體是什麼模式,相關的datasheet中會有描述,需要自己去datasheet中找到相關的描述,即:

關於SPI從裝置,在空閒的時候,是高電平還是低電平,即決定了CPOL0還是1

然後再找到關於裝置是在上升沿還是下降沿去取樣資料,這樣就是,在定了CPOL的值的前提下,對應著可以推算出CPHA0還是1了。

舉例1

CC2500 - Low-Cost Low-Power 2.4 GHz RF TransceiverdatasheetSPI的時序圖是:


從圖中可以看到,最開始的SCLK和結束時候的SCLK,即空閒時刻的SCLK,是低電平,推匯出CPOL=0,然後可以看到資料取樣的時候,即資料最中間的那一點,對應的是SCLK的第一個邊沿,所以CPHA=0(此時對應的是上升沿)。

舉例2

SSD1289 - 240 RGB x 320 TFT LCD Controller Driverdatasheet中提到:

SDI is shifted into 8-bit shift register on everyrising edge of SCK in the order of data bit 7, data bit 6 …… data bit 0.

意思是,資料是在上升沿取樣,所以可以斷定是CPOL=0CPHA=0,或者CPOL=1CPHA=1的模式,但是至於是哪種模式。

按理來說,接下來應該再去確定SCLK空閒時候是高電平還是低電平,用以確定CPOL0還是1,但是datasheet中沒有提到這點。

所以,此處,目前不太確定,是兩種模式都支援,還是需要額外找證據卻確定CPOL0還是1.

2)可配置的,由軟體自己設定

從裝置也是一個SPI控制器,4種模式都支援,此時只要自己設定為某種模式即可。

然後知道了從裝置的模式後,再去將SPI主裝置的模式,設定為和從裝置模式一樣,即可。

對於如何配置SPICPOLCPHA的話,不多細說,多數都是直接去寫對應的SPI控制器中對應暫存器中的CPOLCPHA那兩位,寫0或寫1即可。

舉例:

此處遇到的C8051F347中的SPI就是一個SPIcontroller控制器,即支援軟體配置CPOLCPHA的值,四種模式都支援,此處C8051F347作為SPI從裝置,設定了CPOL=1CPHA=0的模式,因此,此處對應主晶片Blackfin F537中的SPI控制器,作為Master主裝置,其SPI的模式也要設定為CPOL=1CPHA=0


優缺點

SPI介面具有如下優點:

1) 支援全雙工操作;

2) 操作簡單;

3) 資料傳輸速率較高。

同時,它也具有如下缺點:

1) 需要佔用主機較多的口線(每個從機都需要一根片選線);

2) 只支援單個主機。


相關推薦

SPI介面

SPI(Serial Peripheral Interface,序列外設介面)是Motorola公司提出的一種同步序列資料傳輸標準,是一種高速的,全雙工,同步的通訊匯流排,在很多器件中被廣泛應用。 SPI相關縮寫 SS: Slave Select,選中從裝置,片選。

這次,徹底介面及抽象類

本文出自伯特的《LoulanPlan》,轉載務必註明作者及出處。 本文旨在討論抽象類和介面的作用、例項及使用場景,都是我的理解和總結。更多關於介面和抽象類的概念知識,可自行查閱相關文件。 1. 抽象類及其作用 抽象類,顧名思義,即類的抽象。 在介紹面向物件概念時,我們知道類是客觀事物的抽象,

幾個例子JS 的setTimeout的運行方式

-a highlight margin java p s .com cti x11 on() function test() { var a = 1; setTimeout(function() {

徹底px,em和rem的區別

無法 屏幕分辨率 中國 重新 分辨 應對 小時 font targe   國內的設計大師都喜歡用px,而國外的網站大都喜歡用em和rem,那麽三者有什麽區別,又各自有什麽優劣呢?   px特點:   1.IE無法調整那些使用px作為單位的字體大小;   2.國外大部分網站能

帶你徹徹底底Scroller

用兩個 author 官方文檔 adapt extends fadein ges script getch Scroller的使用 這是一個滑動幫助類。並不能夠使View真正的滑動,而是依據時間的流逝。獲取插值器中的數據。傳遞給我們。讓我們去配合s

5分鐘Docker

硬件 hat 相互 amazon -h kernel eight pen https 盡管之前久聞Docker的大名了,但是天資愚鈍,對其到底是個啥東西一直摸不清,最近花了一段時間整理了一下,算是整理出一點頭緒來。 官網的介紹是這樣的: Docker is an open

徹底 JavaScript 執行機制

函數 大名 定時 意思 技術 渲染 文字 根據 java 本文的目的就是要保證你徹底弄懂javascript的執行機制,如果讀完本文還不懂,可以揍我。 不論你是javascript新手還是老鳥,不論是面試求職,還是日常開發工作,我們經常會遇到這樣的情況:給定的幾行

入坑/轉型人工智能你必須要的20個問題

編程程序 wrap 解決 back 1.5 應用層 答案 adding 轉型 一、前言昨晚做了一期關於《如何系統學習人工智能》的線上公開課,一個半小時,嗓子都冒煙了,看來這個行當還真不是一般人能做的來的。關於如何系統學習人工智能,線上回答了大家關於人工智能相關的很多問題,在

JDK、JRE和JVM之間的聯系。

也會 設備 持久 lan 原理 指令 ref mage 體系 轉載地址:http://blog.csdn.net/songkai320/article/details/51819046 首先是JDK JDK(Java Development Kit) 是 Java 語言的軟

未完全的題的題51nod1532

gcd inpu unsigned namespace roc n-1 http mem csdn 轉載自:https://blog.csdn.net/luricheng/article/details/527520941352 集合計數 基準時間限制:1 秒 空間限制

[轉]js模塊化編程之徹底CommonJS和AMD/CMD!

歷史 js插件 服務 conf 原因 遇到 reg func depend 原文: https://www.cnblogs.com/chenguangliang/p/5856701.html -----------------------------------------

徹底字符串常量池等相關問題

加載 結果 包裝 == str2 ringbuf 總結 範圍 con 前言:   在平時我們使用字符串一般就是拿來直接搞起,很少有深入的去想過這方面的知識,導致別人在考我們的時候,會問 String str = new String("123"); 這個一行代碼執行創建了幾

移動設備分辨率(終於了為什麽移動端設計稿總是640px和750px)

blank 深入理解 之間 可能 -s nba 網上 清晰 href   在我開始寫移動端頁面至今,一直有2個疑問困擾著我,我只知道結果但不知道為什麽   問題1:為什麽設計師給的設計稿總是640px或750px(現在一般以Phone6為基準,給的750px)   問題

徹底HTTP緩存機制及原理(轉載)

一次 chrom https 分開 res 技術 觸發 明顯 總結 https://www.cnblogs.com/chenqf/p/6386163.html 前言 Http 緩存機制作為 web 性能優化的重要手段,對於從事 Web 開發的同學們來說,應該是知識體系庫中的

一文神經網絡中的反向傳播法——BackPropagation

簡化 range get -s 數學公式 eight 可能 width 文章   最近在看深度學習的東西,一開始看的吳恩達的UFLDL教程,有中文版就直接看了,後來發現有些地方總是不是很明確,又去看英文版,然後又找了些資料看,才發現,中文版的譯者在翻譯的時候會對省略的公式推

徹底python編碼

def 不能 全世界 寬度 解決方法 增加 str cnblogs style 在編寫python程序的過程中,中英文混用經常會出現編碼問題。圍繞此問題,本文首先介紹編碼的含義及常用編碼,隨後列舉幾個python經常遇到的編碼異常及解決方法,接著列舉筆者在實踐中遇到的異

30分鐘徹底flex布局

display 分享 成了 一次 ane 計算 是不是 老師 developer 歡迎大家前往騰訊雲+社區,獲取更多騰訊海量技術實踐幹貨哦~ 本文由elson發表於雲+社區專欄 目前在不考慮IE以及低端安卓機(4.3-)的兼容下,已經可以放心使用flex進行布局了。什麽

GPIO模擬SPI介面程式碼(3線8位)

http://blog.csdn.net/sanchuyayun/article/details/48394381 關於SPI,不同的晶片具體通訊方式可能會不大一樣,所以要具體問題具體分析,下面是最近做LCD時碰到的兩個模擬SPI協議的程式碼,晶片通訊方式不同,程式碼也就不同了

「前端面試」2018前端面試總結,看完,工資少說加3K

前端問題記錄 HTML相關 CSS相關 JAVASCRIPT相關 DOM相關 HTTP相關 VUE相關 演算法相關 網路安全相關 webpack相關 其他 Html相關 1 html語義化 意義:根據內

3分鐘讓你搞交換機介面資料處理過程

1、需求兩臺主機屬於同一個網段,但是屬於不同vlan,要求實現業務能夠互訪。2、網路拓撲圖3、配置交換機SW1配置如下:vlan 10interface gi 0/0/1 port link accessport de vlan 10 #連線SW2interface gi 0/0/2port link acc