28335接兩個spi設備_IIC和SPI如此流行,誰才是嵌入式工程師的必備工具?

IICvs SPI

現今,在低端數字通信應用領域,我們隨處可見 IIC (Inter-Integrated Circuit) 和 SPI (Serial Peripheral Interface)的身影。原因是這兩種通信協議非常適合近距離低速芯片間通信。Philips(for IIC)和 Motorola(for SPI) 出于不同背景和市場需求制定了這兩種標準通信協議。

IIC 開發于 1982 年,當時是為了給電視機內的 CPU 和外圍芯片提供更簡易的互聯方式。電視機是最早的嵌入式系統之一,而最初的嵌入系統是使用內存映射(memory-mapped I/O)的方式來互聯微控制器和外圍設備的。要實現內存映射,設備必須并聯入微控制器的數據線和地址線,這種方式在連接多個外設時需大量線路和額外地址解碼芯片,很不方便并且成本高。

為了節省微控制器的引腳和和額外的邏輯芯片,使印刷電路板更簡單,成本更低,位于荷蘭的 Philips 實驗室開發了 ‘Inter-Integrated Circuit’,IIC 或 IIC ,一種只使用二根線接連所有外圍芯片的總線協議。最初的標準定義總線速度為 100kbps。經歷幾次修訂,主要是 1995 年的 400kbps,1998 的 3.4Mbps。

有跡象表明,SPI 總線首次推出是在 1979 年,Motorola 公司將 SPI 總線集成在他們第一支改自 68000 微處理器的微控制器芯片上。SPI 總線是微控制器四線的外部總線(相對于內部總線)。與 IIC 不同,SPI 沒有明文標準,只是一種事實標準,對通信操作的實現只作一般的抽象描述,芯片廠商與驅動開發者通過 data sheets 和 application notes 溝通實現上的細節。

SPI

對于有經驗的數字電子工程師來說,用 SPI 互聯兩支數字設備是相當直觀的。SPI 是種四根信號線協議(如圖):

4eae94c0924394fc83d59aebd4238684.png

SCLK: Serial Clock (output from master);

MOSI; SIMO: Master Output, Slave Input(output from master);

MISO; SOMI: Master Input, Slave Output(output from slave);

SS: Slave Select (active low, outputfrom master).

SPI 是[單主設備( single-master )]通信協議,這意味著總線中的只有一支中心設備能發起通信。當 SPI 主設備想讀 / 寫[從設備]時,它首先拉低[從設備]對應的 SS 線(SS 是低電平有效),接著開始發送工作脈沖到時鐘線上,在相應的脈沖時間上,[主設備]把信號發到 MOSI 實現“寫”,同時可對 MISO 采樣而實現“讀”,如下圖:

5d29927a63719d24ea9b748e46f0e83a.png

SPI 有四種操作模式——模式 0、模式 1、模式 2 和模式 3,它們的區別是定義了在時鐘脈沖的哪條邊沿轉換(toggles)輸出信號,哪條邊沿采樣輸入信號,還有時鐘脈沖的穩定電平值(就是時鐘信號無效時是高還是低)。每種模式由一對參數刻畫,它們稱為時鐘極(clock polarity)CPOL 與時鐘期(clock phase)CPHA。

d9fbf4b70172a62c4816aafec083d8e3.png

[主從設備]必須使用相同的工作參數——SCLK、CPOL 和 CPHA,才能正常工作。如果有多個[從設備],并且它們使用了不同的工作參數,那么[主設備]必須在讀寫不同[從設備]間重新配置這些參數。以上 SPI 總線協議的主要內容。SPI 不規定最大傳輸速率,沒有地址方案;SPI 也沒規定通信應答機制,沒有規定流控制規則。事實上,SPI[主設備]甚至并不知道指定的[從設備]是否存在。這些通信控制都得通過 SPI 協議以外自行實現。例如,要用 SPI 連接一支[命令 - 響應控制型]解碼芯片,則必須在 SPI 的基礎上實現更高級的通信協議。SPI 并不關心物理接口的電氣特性,例如信號的標準電壓。在最初,大多數 SPI 應用都是使用間斷性時鐘脈沖和以字節為單位傳輸數據的,但現在有很多變種實現了連續性時間脈沖和任意長度的數據幀。

IIC

與 SPI 的單主設備不同,IIC 是多主設備的總線,IIC 沒有物理的芯片選擇信號線,沒有仲裁邏輯電路,只使用兩條信號線—— ‘serial data’ (SDA) 和 ‘serial clock’ (SCL)。IIC 協議規定:

第一,每一支 IIC 設備都有一個唯一的七位設備地址;

第二,數據幀大小為 8 位的字節;

第三,數據(幀)中的某些數據位用于控制通信的開始、停止、方向(讀寫)和應答機制。

IIC 數據傳輸速率有標準模式(100 kbps)、快速模式(400 kbps)和高速模式(3.4 Mbps),另外一些變種實現了低速模式(10 kbps)和快速+模式(1 Mbps)。

物理實現上,IIC 總線由兩根信號線和一根地線組成。兩根信號線都是雙向傳輸的,參考下圖。IIC 協議標準規定發起通信的設備稱為主設備,主設備發起一次通信后,其它設備均為從設備。

f36f36840b14905b215749539007e15e.png

IIC 通信過程大概如下。首先,主設備發一個 START 信號,這個信號就像對所有其它設備喊:請大家注意!然后其它設備開始監聽總線以準備接收數據。接著,主設備發送一個 7 位設備地址加一位的讀寫操作的數據幀。當所設備接收數據后,比對地址自己是否目標設備。如果比對不符,設備進入等待狀態,等待 STOP 信號的來臨;如果比對相符,設備會發送一個應答信號——ACKNOWLEDGE 作回應。

當主設備收到應答后便開始傳送或接收數據。數據幀大小為 8 位,尾隨一位的應答信號。主設備發送數據,從設備應答;相反主設備接數據,主設備應答。當數據傳送完畢,主設備發送一個 STOP 信號,向其它設備宣告釋放總線,其它設備回到初始狀態。

8885314bbfefc4f65e44657a801e54a4.png

基于 IIC 總線的物理結構,總線上的 START 和 STOP 信號必定是唯一的。另外,IIC 總線標準規定 SDA 線的數據轉換必須在 SCL 線的低電平期,在 SCL 線的高電平期,SDA 線的上數據是穩定的。

672a82bc3638b87aabc5016399cdfdfe.png

在物理實現上,SCL 線和 SDA 線都是漏極開路(open-drain),通過上拉電阻外加一個電壓源。當把線路接地時,線路為邏輯 0,當釋放線路,線路空閑時,線路為邏輯 1。基于這些特性,IIC 設備對總線的操作僅有“把線路接地”——輸出邏輯 0。

IIC 總線設計只使用了兩條線,但相當優雅地實現任意數目設備間無縫通信,堪稱完美。我們設想一下,如果有兩支設備同時向 SCL 線和 SDA 線發送信息會出現什么情況。

基于 IIC 總線的設計,線路上不可能出現電平沖突現象。如果一支設備發送邏輯 0,其它發送邏輯 1,那么線路看到的只有邏輯 0。也就是說,如果出現電平沖突,發送邏輯 0 的始終是“贏家”。

總線的物理結構亦允許主設備在往總線寫數據的同時讀取數據。這樣,任何設備都可以檢測沖突的發生。當兩支主設備競爭總線的時候,“贏家”并不知道競爭的發生,只有“輸家”發現了沖突——當它寫一個邏輯 1,卻讀到 0 時——而退出競爭。

10 位設備地址

任何 IIC 設備都有一個 7 位地址,理論上,現實中只能有 127 種不同的 IIC 設備。實際上,已有 IIC 的設備種類遠遠多于這個限制,在一條總線上出現相同的地址的 IIC 設備的概率相當高。為了突破這個限制,很多設備使用了雙重地址——7 位地址加引腳地址(external configuration pins)。IIC 標準也預知了這種限制,提出 10 位的地址方案。

10 位的地址方案對 IIC 協議的影響有兩點:

第一,地址幀為兩個字節長,原來的是一個字節;

第二,第一個字節前五位最高有效位用作 10 位地址標識,約定是“11110”。

92e57c3ab15abdd0bca80aaa94a0763c.png

除了 10 位地址標識,標準還預留了一些地址碼用作其它用途,如下表:

e0237e335f9a66ad2f838f52053e7bc7.png

時鐘拉伸

在 IIC 通信中,主設備決定了時鐘速度。因為時鐘脈沖信號是由主設備顯式發出的。但是,當從設備沒辦法跟上主設備的速度時,從設備需要一種機制來請求主設備慢一點。這種機制稱為時鐘拉伸,而基于 I2C 結構的特殊性,這種機制得到實現。當從設備需要降低傳輸的速度的時候,它可以按下時鐘線,逼迫主設備進入等待狀態,直到從設備釋放時鐘線,通信才繼續。

高速模式

原理上講,使用上拉電阻來設置邏輯 1 會限制總線的最大傳輸速度。而速度是限制總線應用的因素之一。這也說明為什么要引入高速模式(3.4 Mbps)。在發起一次高速模式傳輸前,主設備必須先在低速的模式下(例如快速模式)發出特定的“High Speed Master”信號。為縮短信號的周期和提高總線速度,高速模式必須使用額外的 I/O 緩沖區。另外,總線仲裁在高速模式下可屏蔽掉。更多的信息請參與總線標準文檔。

IIC vs SPI: 哪位是贏家?

我們來對比一下 IIC 和 SPI 的一些關鍵點:

第一,總線拓撲結構 / 信號路由 / 硬件資源耗費

IIC 只需兩根信號線,而標準 SPI 至少四根信號,如果有多個從設備,信號需要更多。一些 SPI 變種雖然只使用三根線——SCLK, SS 和雙向的 MISO/MOSI,但 SS 線還是要和從設備一對一根。另外,如果 SPI 要實現多主設備結構,總線系統需額外的邏輯和線路。用 IIC 構建系統總線唯一的問題是有限的 7 位地址空間,但這個問題新標準已經解決——使用 10 位地址。從第一點上看,IIC 是明顯的大贏家。

第二,數據吞吐 / 傳輸速度

如果應用中必須使用高速數據傳輸,那么 SPI 是必然的選擇。因為 SPI 是全雙工,IIC 的不是。SPI 沒有定義速度限制,一般的實現通常能達到甚至超過 10 Mbps。IIC 最高的速度也就快速+模式(1 Mbps)和高速模式(3.4 Mbps),后面的模式還需要額外的 I/O 緩沖區,還并不是總是容易實現的。

第三,優雅性

IIC 常被稱更優雅于 SPI。公正的說,我們更傾向于認為兩者同等優雅和健壯。IIC 的優雅在于它的特色——用很輕盈的架構實現了多主設備仲裁和設備路由。但是對使用的工程師來講,理解總線結構更費勁,而且總線的性能不高。

SPI 的優點在于它的結構相當的直觀簡單,容易實現,并且有很好擴展性。SPI 的簡單性不足稱其優雅,因為要用 SPI 搭建一個有用的通信平臺,還需要在 SPI 之上構建特定的通信協議軟件。也就是說要想獲得 SPI 特有而 IIC 沒有的特性——高速性能,工程師們需要付出更多的勞動。另外,這種自定的工作是完全自由的,這也說明為什么 SPI 沒有官方標準。IIC 和 SPI 都對低速設備通信提供了很好的支持,不過,SPI 適合數據流應用,而 IIC 更適合“字節設備”的多主設備應用。

小結

在數字通信協議簇中,IIC 和 SPI 常稱為“小”協議,相對 Ethernet, USB, SATA, PCI-Express 等傳輸速度達數百上千兆字節每秒的總線。但是,我們不能忘記的是各種總線的用途是什么。“大”協議是用于系統外的整個系統之間通信的,“小”協議是用于系統內各芯片間的通信,沒有跡象表明“大”協議有必要取代“小”協議。IIC 和 SPI 的存在和流行體現了“夠用就好”的哲學。回應文首,IIC 和 SPI 如此流行,它是任何一位嵌入式工程師必備的工具。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/379072.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/379072.shtml
英文地址,請注明出處:http://en.pswp.cn/news/379072.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

線性表15|魔術師發牌問題和拉丁方陣 - 數據結構和算法20

線性表15 : 魔術師發牌問題和拉丁方陣 讓編程改變世界 Change the world by program 題外話 今天小甲魚看到到微博有朋友在問,這個《數據結構和算法》系列課程有木有JAVA版本的? 因為這個問題之前也有一些朋友問過,所以咱在這里統一說下哈…

[ZT]Three ways to tell if a .NET Assembly is Strongly Named (or has Strong Name)

Here are several convenient ways to tell whether a .NET assembly is strongly named. (English language note: I assume the form “strongly named” is preferred over “strong named” since that’s the form used in the output of the sn.exe tool shown immediat…

最佳頁面置換算法

在一個請求分頁系統中,采用最佳頁面置換算法時,假如一個作業的頁面走向為4、3、2、1、4、3、5、4、3、2、1、5,當分配給該作業的物理塊數M分別為3和4時,試計算在訪問過程中所發生的缺頁次數和缺頁率。請給出分析過程。 解析&…

網絡名稱 轉換 網絡地址_網絡地址轉換| 計算機網絡

網絡名稱 轉換 網絡地址At the time of classful addressing, the number of household users and small businesses that want to use the Internet kept increasing. In the beginning, a user was connected to the Internet with a dial-up line, for a specific period of…

rstudio 修改代碼間距_第一章 R和RStudio

R與RStudioR是一種統計學編程語言,在科學計算領域非常流行。它是由Ross Ihaka和Robert Gentleman開發的,是 "S "編程語言的開源實現。R也是使用這種語言進行統計計算的軟件的名字。它有一個龐大的在線支持社區和專門的軟件包,可以為…

ubuntu下最穩定的QQ

一、安裝好 Wine 1.2(1.2 版安裝好就支持中文界面的了) 當然得有WINE 了 當然我的有 如果沒有可以如下方法得到: 第一種方法:如果你已經安裝過 Wine 的老版本,那么只要添加 Wine 1.2 的軟件源,然后去新立得…

字體Times New Roman

Windows系統中的字體是Monotype公司為微軟公司制作的Times New Roman PS(TrueType字體),視窗系統從3.1版本開始就一直附帶這個字體。而在蘋果電腦公司的麥金塔系統中使用的是Linotype公司的 Times Roman (在Macintosh系統中直接簡稱為‘Times…

最近最久未使用頁面置換算法

在一個請求分頁系統中,采用最近最久未使用頁面置換算法時,假如一個作業的頁面走向為4、3、2、1、4、3、5、4、3、2、1、5,當分配給該作業的物理塊數M分別為3和4時,試計算在訪問過程中所發生的缺頁次數和缺頁率。請給出分析過程。 …

ffplay的數據結構分析

《ffplay分析(從啟動到讀取線程的操作)》 《ffplay分析(視頻解碼線程的操作)》 《ffplay分析(音頻解碼線程的操作)》 《ffplay 分析(音頻從Frame(解碼后)隊列取數據到SDL輸出)》 《f…

tolowercase_Java String toLowerCase()方法與示例

tolowercase字符串toLowerCase()方法 (String toLowerCase() Method) toLowerCase() method is a String class method, it is used to convert given string into the lowercase. toLowerCase()方法是String類方法,用于將給定的字符串轉換為小寫。 Syntax: 句法&a…

python web 服務器實時監控 websocket_python websocket網頁實時顯示遠程服務器日志信息...

功能:用websocket技術,在運維工具的瀏覽器上實時顯示遠程服務器上的日志信息一般我們在運維工具部署環境的時候,需要實時展現部署過程中的信息,或者在瀏覽器中實時顯示程序日志給開發人員看。你還在用ajax每隔段時間去獲取服務器日…

磁盤調度算法

1,假設磁頭當前位于第105道,正在向磁道序號增加的方向移動,現有一個磁道訪問請求序列為:35,45,12,68,100,180,170,195,試用先來先服務…

C# Using用法三則

(1)引用命名空間 using作為引入命名空間指令的用法準則為: using Namespace; 在.NET程序中,最多見的代碼莫過于在程序文件的開頭引入System命名空間,其原由在于System命名空間中封裝了許多最基本最常用的操作&#xff…

iOS開發 工程

一直沒正兒八經的寫過技術文章。今日開個小窗,準備寫點東西。。。完了 1、傳統的MVC結構需要至少M、V、C三個模塊,在實際開發中往往需要添加額外的模塊,添加的模塊當然也大體上屬于這三個模塊之內。以下為較為常用的子模塊。 (1&a…

C++11 std::shared_ptr的std::move()移動語義底層分析

std::shared_ptr的std::move()移動語義底層分析 執行std::move()之前: 執行std::move()之后: 結論:一個淺拷貝 sizeof(std::shared_ptr) 8字節 pss1 : 0x0028fea8 pss2 : 0x0028fea0 (棧是逆增長的) 觀察執行std::m…

一個使用numpy.ones()的矩陣| 使用Python的線性代數

Ones Matrix - When all the entries of a matrix are one, then it is called as ones matrix. It may be of any dimension (MxN). 一個矩陣 -當矩陣的所有條目均為1時,則稱為一個矩陣。 它可以是任何尺寸( MxN )。 Properties: 特性: The determina…

python去掉字符串最外側的引號_瘋狂Python講義第二章讀書筆記

本章講解變量和簡單類型2.1 從注釋講起單行注釋使用#,#后面的代碼被注釋掉不會運行,如:# print(123) 注釋掉后123不會輸出。多行注釋使用""" """,三個雙引號,雙引號中的內容注釋掉&…

Xpath[轉]

Xpath[轉] XPath 是一門在 XML 文檔中查找信息的語言。XPath 可用來在 XML 文檔中對元素和屬性進行遍歷。 XPath 是 W3C XSLT 標準的主要元素,并且 XQuery 和 XPointer 同時被構建于 XPath 表達之上。 因此,對 XPath 的理解是很多高級 XML 應用的基礎。 …

【轉】深入分析 ASP.NET Mvc 1.0 – 1. 深入MvcHandler

MvcHandler是一個mvc程序真正開始的地方,因為你可以直接看到并調試它的源碼。 MvcHandler的主要代碼如下:protected internal virtual void ProcessRequest(HttpContextBase httpContext) {AddVersionHeader(httpContext);// Get the controller typestring control…