弄懂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 = 邊沿,即時鐘電平變化的時刻,即上升沿
對於一個時鐘週期內,有兩個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時鐘週期內,會完成如下操作:
1) 主機通過MOSI線傳送1位資料,從機通過該線讀取這1位資料;
2) 從機通過MISO線傳送1位資料,主機通過該線讀取這1位資料。
這是通過移位暫存器來實現的。如圖2所示,主機和從機各有一個移位暫存器,且二者連線成環。隨著時鐘脈衝,資料按照從高位到低位的方式依次移出主機暫存器和從機暫存器,並且依次移入從機暫存器和主機暫存器。當暫存器中的內容全部移出時,相當於完成了兩個暫存器內容的交換。
時鐘極性和時鐘相位
在SPI操作中,最重要的兩項設定就是時鐘極性(CPOL或UCCKPL)和時鐘相位(CPHA或UCCKPH)。時鐘極性設定時鐘空閒時的電平,時鐘相位設定讀取資料和傳送資料的時鐘沿。
主機和從機的傳送資料是同時完成的,兩者的接收資料也是同時完成的。所以為了保證主從機正確通訊,應使得它們的SPI具有相同的時鐘極性和時鐘相位。
CPOL極性
先說什麼是SCLK時鐘的空閒時刻,其就是當SCLK在傳送8個bit位元資料之前和之後的狀態,與此對應的,SCLK在傳送資料的時候,就是正常的工作的時候,有效active的時刻了。
先說英文,其精簡解釋為:Clock Polarity = IDLE state of SCK。
再用中文詳解:
SPI的CPOL,表示當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=0,idle時候的是低電平,第一個邊沿就是從低變到高,所以是上升沿;
對於CPHA=1,idle時候的是低電平,第二個邊沿就是從高變到低,所以是下降沿;
CPOL=1:
對於CPHA=0,idle時候的是高電平,第一個邊沿就是從高變到低,所以是下降沿;
對於CPHA=1,idle時候的是高電平,第二個邊沿就是從低變到高,所以是上升沿;
用圖文形式表示,更加容易看懂:
CKP和CKE
CKP和CKE是Microchip的PIC系列晶片中的說法。
(1)CKP是Clock 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
所以不多解釋。
(2)CKE是Clock 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相同。所以,CKP和CKE所對應的取值的含義為:
When CKP = 0:
CKE=0 => Data transmitted on rising edge of SCK(idle時候是低電平,從空閒到有效,就是從低電平到高電平,所以是上升沿)
CKE=1 => Data transmitted on falling edge of SCK(idle時候是低電平,從有效到空閒,就是從高電平到低電平,所以是下降沿)
When CKP = 1:
CKE=0 => Data transmitted on falling edge of SCK(idle時候是高電平,從空閒到有效,就是從高電平到低電平,所以是下降沿)
CKE=1 => Data transmitted on rising edge of SCK(idle時候是高電平,從有效到空閒,就是從低電平到高電平,所以是上升沿)
舉例來說,分別選取MSP430控制器和OLED驅動SH1101A為主從機,圖3和圖4為它們的SPI時序。由圖4可知,SH1101A的SPI時鐘空閒時為高電平,並且在後時鐘沿接收資料(後時鐘沿在資料的中間部位),則MSP430控制器SPI的設定應與此保持一致。從圖3中可以看出,要使得時鐘在空閒時為高電平,應將UCCKPL置1;要使得在後時鐘沿接收資料,應將UCCKPH清零。
下面再列出其他一些地方找到的,常見的SPI的四種模式的時序圖,供參考:
如何看懂和記憶CPOL和CPHA
所以,關於在其他地方介紹的,看似多麼複雜難懂難記憶的CPOL和CPHA,其實經過上面解釋,就肯容易看懂了:
去看時序圖,如果時鐘SCLK的起始電平是0,那麼CPOL=0,如果是1,那麼CPOL=1。
然後看資料取樣時刻,即時序圖資料線上的資料矩形區域的中間所對應的位置,對應到上面SCLK時鐘的位置,對應著是第一個邊沿或是第二個邊沿,即CPHA是0或1。(對應的是上升沿還是下降沿,要根據對應的CPOL的值,才能確定)。
即:
(1)如何判斷CPOL:SCLK的空閒時候電壓是0還是1,決定了CPOL是0還是1;
(2)如何判斷CPHA:而資料取樣時刻對應著的SCLK的電平,是第一個邊沿還是第二個邊沿,對應著CPHA為0還是1。
軟體中如何設定SPI的極性和相位
SPI分主裝置和從裝置,兩者通過SPI協議通訊。
設定SPI的模式,是從裝置的模式,決定了主裝置的模式。
所以要先去搞懂從裝置的SPI是何種模式,然後再將主裝置的SPI的模式,設定和從裝置相同的模式,即可正常通訊。
對於從裝置的SPI是什麼模式,有兩種:
(1)固定的,裝置硬體決定的。
SPI從裝置,具體是什麼模式,相關的datasheet中會有描述,需要自己去datasheet中找到相關的描述,即:
關於SPI從裝置,在空閒的時候,是高電平還是低電平,即決定了CPOL是0還是1;
然後再找到關於裝置是在上升沿還是下降沿去取樣資料,這樣就是,在定了CPOL的值的前提下,對應著可以推算出CPHA是0還是1了。
舉例1:
CC2500 - Low-Cost Low-Power 2.4 GHz RF Transceiver的datasheet中SPI的時序圖是:
從圖中可以看到,最開始的SCLK和結束時候的SCLK,即空閒時刻的SCLK,是低電平,推匯出CPOL=0,然後可以看到資料取樣的時候,即資料最中間的那一點,對應的是SCLK的第一個邊沿,所以CPHA=0(此時對應的是上升沿)。
舉例2:
SSD1289 - 240 RGB x 320 TFT LCD Controller Driver的datasheet中提到:
“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=0,CPHA=0,或者CPOL=1,CPHA=1的模式,但是至於是哪種模式。
按理來說,接下來應該再去確定SCLK空閒時候是高電平還是低電平,用以確定CPOL是0還是1,但是datasheet中沒有提到這點。
所以,此處,目前不太確定,是兩種模式都支援,還是需要額外找證據卻確定CPOL是0還是1.
(2)可配置的,由軟體自己設定
從裝置也是一個SPI控制器,4種模式都支援,此時只要自己設定為某種模式即可。
然後知道了從裝置的模式後,再去將SPI主裝置的模式,設定為和從裝置模式一樣,即可。
對於如何配置SPI的CPOL和CPHA的話,不多細說,多數都是直接去寫對應的SPI控制器中對應暫存器中的CPOL和CPHA那兩位,寫0或寫1即可。
舉例:
此處遇到的C8051F347中的SPI就是一個SPI的controller控制器,即支援軟體配置CPOL和CPHA的值,四種模式都支援,此處C8051F347作為SPI從裝置,設定了CPOL=1,CPHA=0的模式,因此,此處對應主晶片Blackfin F537中的SPI控制器,作為Master主裝置,其SPI的模式也要設定為CPOL=1,CPHA=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