串行總線協議筆記

?

?

I2C

--INTER-IC串行總線的縮寫,是PHILIPS公司推出的芯片間串行傳輸總線。它以1根串行數據線(SDA)和1根串行時鐘線(SCL)實 現了雙工的同步數據傳輸。具有接口線少,控制方式簡化,器件封裝形式小,通信速率較高等優點。? I2C總線是雙向、兩線(SCL、SDA)、串行、多主控(multi-master)接口標準,具有總線仲裁機制,非常適合在器件之間進行近距離、非經常性的數據通信。在主從通信中,可以有多個I2C總線器件同時接到I2C總線 上,通過地址來識別通信對象。

IIC 接口的協議里面包括設備地址信息,可以同一總線上連接多個從設備,通過應答來互通數據及命令。但是傳輸速率有限,標準模式下可達到100Kbps,快速模式下可達到400Kbps(我們開發板一般在130Kbps),高速模式下達到4Mbps,不能實現全雙工,不適合傳輸很多的數據。

IIC總線是一個真正的多主機總線,總線上多個主機初始化傳輸,可以通過傳輸檢測和仲裁來防止數據被破壞 。

下來詳細了解IIC總線時序:

1.1 總線數據有效性

IIC總線是單工,因此同一時刻數據只有一個流向,因此采樣有效時鐘也是單一的,是在SCL時鐘的高電平采樣數據。

IIC總線上SDA數據在SCL時鐘低電平是可以發生變化,但是在時鐘高電平時必須穩定,以便主從設備根據時鐘采樣數據,如下圖:

1.2 總線空閑條件

IIC總線上設備都釋放總線(發出傳輸停止)后,IIC總線根據上拉電阻變成高電平,SDA SCL都是高電平。

?

1.3 總線數據傳輸起始和結束條件

IIC總線SCL高電平時SDA出現由高到低的跳變,標志總線上數據傳輸的開始條件

IIC總線SCL高電平時SDA出現由低到高的跳變,標志總線上數據傳輸的結束條件

?

1.4 總線數據傳輸順序以及ACK應答

IIC總線上數據傳輸室MSB在前,LSB在后,從示波器上看,從左向右依次讀出數據即可

IIC總線傳輸的數據不收限制,但是每次發到SDA上的必須是8位,并且主機發送8位后釋放總線,從機收到數據后必須拉低SDA一個時鐘,回應ACK表示數據接收成功,我們如果示波器上看到的波形就是每次9位數據,8bit+1bit ack。如下:

?

?

?

?

?

從機收到一字節數據后,如果需要一些時間處理,則會拉低SCL,讓傳輸進入等待狀態,處理完成,釋放SCL,繼續傳輸,如下:

?

1.5 總線讀寫時序

數據的傳輸在起始條件之后,發送一個7位的從機地址,緊接著第8位是數據方向(R/ W),0-表示發送數據(寫),1-表示接收數據(讀)。數據傳輸一般由主機產生的停止位(P)終止。但是如果主機仍希望在總線上通訊,它可以產生重復起始條件(Sr),和尋址另一個從機,而不是首先產生一個停止條件。在這種傳輸中,可能有不同的讀/寫格式結合。

IIC總線主設備讀寫從設備,一般都是與從設備的寄存器打交道,這個可以通過閱讀從設備的datasheet獲取。總線寫時序如下:

master start + master?addr|w + slave ack + master reg|w?+ slave ack + master data + slave ack + master restart。。master data + slave nack + master stop

總線讀時序如下:

master start + master addr|w + slave ack + master reg|w + slave ack + master restart + master addr|r + slave ack + slave data + master nack + master stop

總線讀時序與寫的不同之處在于讀需要2次傳輸才能完成一次讀取,首先要寫寄存器地址到從設備,其實是寫到了從設備的控制寄存器或者命令寄存器,從設備內部會根據這個地址來尋址所要操作的寄存器。

我在讀我們的bios和內核時發現,2者在總線讀時序上的實現不太一樣,在于第一次寄存器地址寫入后,一個發的是restart,一個發的是stop,然后再start開始讀取數據,示波器抓波形發現讀取數據都正確,說明這2種時序都是正確的。

IIC總線的讀寫時序比較固定,設備通信嚴格遵循協議,因此iIC總線設備驅動程序的編寫也就相對簡單一些。

主要應用的iIc總線設備有touchscreen rtc 外擴io等

http://blog.chinaunix.net/uid-21785445-id-2688689.html

IIC總線協議最重要的是起始信號,終止信號和應答信號。起始信號和終止信號由主機產生,應答信號是每次傳輸完成一個字節數據后必須有的,用于確認傳輸是否完成,主機向設備發一個字節數據后需要設備作應答,確認設備是否收到數據,主機收一個字節數據后需要向設備發一個應答信號,告訴設備數據是否收到。

(1) 起始信號:在時鐘線保持高電平期間,數據線出現由高電平向低電平變化時啟動I2C總線;
(2) 終止信號:在時鐘線保持高電平期間,數據線出現由低電平向高電平變化時停止I2C總線;
(3) 應答信號:應答信號在第9個時鐘位上出現,接收器輸出低電平為應答信號(A),輸出高電平則為非應答信號(/A)。

?

IIC數據傳輸:SCL為高電平時將SDA上數據發走,所以SDA上數據必須在SCL為高電平期間保持穩定,IIC總線首先傳輸的是數據最高位,最后是最低位。

?

設備地址:在起始信號后,需要向設備發送一個字節的設備地址,其中高七位為設備的地址,表示同哪個設備進行通信,最低位為數據傳輸方向,1表示讀(接收),0表示寫(發送)。

1.發送(寫)一個字節數據流程

a.起始信號

b.發送一個設備地址,這里為0,表示發送(寫)),設備應答

c.發送設備的寫的基地址,設備應答

d.發送數據到設備基地址,設備應答

e.停止信號

?

2.接收(讀)一個字節數據流程

a.起始信號

b.發送一個設備地址,這里為0,表示發送(寫)),設備應答

c.發送從設備要讀數據的基地址,設備應答

d.起始信號

e.發送一個設備地址,這里為1,表示接收(讀)),設備應答

f.從設備基地址處接收到一個字節的數據,主機應答

g.停止信號

?

從設備地址讀或寫一個字節數據后,設備讀寫地址會自動加1

3.連續發送(寫)多個字節數據

a.起始信號

b.發送一個設備地址,這里為0,表示發送(寫)),設備應答

c.發送設備的寫的基地址,設備應答

d.發送數據到設備基地址,設備應答

e.發送數據到設備(基地址+1),設備應答

f.發送數據到設備(基地址+2),設備應答

g.發送數據到設備(基地址+n),設備應答

h.停止信號

?

4.連續接收(讀)多個字節數據

a.起始信號

b.發送一個設備地址,這里為0,表示發送(寫)),設備應答

c.發送從設備要讀數據的基地址,設備應答

d.起始信號

e.發送一個設備地址,這里為1,表示接收(讀)),設備應答

f.從設備基地址處接收到一個字節的數據,主機應答

g.從設備(基地址處+1)接收到一個字節的數據,主機應答

h.從設備(基地址處+2)接收到一個字節的數據,主機應答

i.從設備(基地址處+n)接收到一個字節的數據,主機應答

j.停止信號

?

SPI

?? SPI 的通信原理很簡單,它需要至少4根線,事實上3根也可以。也是所有基于SPI的設備共有的,它們是SDI(數據輸入),SDO(數據輸出),SCK(時 鐘),CS(片選)。其中CS是控制芯片是否被選中的,也就是說只有片選信號為預先規定的使能信號時(高電位或低電位),對此芯片的操作才有效。這就允許 在同一總線上連接多個SPI設備成為可能。

接下來就負責通訊的3根線了。通訊是通過數據交換完成的,這里先要知道SPI是串行通訊協議,也就是說數據是一位一位的傳輸的。這就是SCK時鐘線存在的原因,由SCK提供時鐘脈沖,SDI,SDO則基于此脈沖完成數據傳輸。數據輸出通過SDO線,數據在時鐘上沿或下沿時改變,在緊接著的下沿或上沿被讀取。 完成一位數據傳輸,輸入也使用同樣原理。這樣,在至少8次時鐘信號的改變(上沿和下沿為一次),就可以完成8位數據的傳輸。

1) SCLK:串行時鐘,用來同步數據傳輸,由主機輸出;

?

2) MOSI:主機輸出從機輸入數據線;

?

3) MISO:主機輸入從機輸出數據線;

?

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

?

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

?

?? ?要注意的是,SCK信號線只由主設備控制,從設備不能控制信號線。同樣,在一個基于SPI的設備中,至少有一個主控設備。

這樣傳輸的特點:這樣的傳輸方式有一個優點,與普通的串行通訊不同,普通的串行通訊一次連續傳送至少8位數據,而SPI允許數據一位一位的傳送,甚至允許暫停,因為SCK時鐘線由主控設備控制,當沒有時鐘跳變時,從設備不采集或傳送數據。也就是說,主設備通過對SCK時鐘線的控制可以完成對通訊的控制。

SPI還是一個數據交換協議:因為SPI的數據輸入和輸出線獨立,所以允許同時完成數據的輸入和輸出。

不同的SPI設備的實現方式不盡相同,主要是數據改變和采集的時間不同,在時鐘信號上沿或下沿采集有不同定義,具體請參考相關器件的文檔。


? ?? 概述
??? ??

?


? ?? ?上圖只是對 SPI 設備間通信的一個簡單的描述, 下面就來解釋一下圖中所示的幾個組件(Module):
? ?? ? SSPBUF, Synchronous Serial Port Buffer, 泛指 SPI 設備里面的內部緩沖區, 一般在物理上是以 FIFO 的形式, 保存傳輸過程中的臨時數據;
? ?? ? SSPSR, Synchronous Serial Port Register, 泛指 SPI 設備里面的移位寄存器(Shift Regitser), 它的作用是根據設置好的數據位寬(bit-width) 把數據移入或者移出 SSPBUF;
? ?? ? Controller, 泛指 SPI 設備里面的控制寄存器, 可以通過配置它們來設置 SPI 總線的傳輸模式.
? ?? ???通常情況下, 我們只需要對上圖所描述的四個管腳(pin) 進行編程即可控制整個 SPI 設備之間的數據通信:
??? ???SCK, Serial Clock, 主要的作用是 Master 設備往 Slave 設備傳輸時鐘信號, 控制數據交換的時機以及速率;
? ?? ???SS/CS, Slave Select/Chip Select, 用于 Master 設備片選 Slave 設備, 使被選中的 Slave 設備能夠被 Master 設備所訪問;
? ?? ???SDO/MOSI, Serial Data Output/Master Out Slave In, 在 Master 上面也被稱為 Tx-Channel, 作為數據的出口, 主要用于 SPI 設備發送數據;
? ?? ???SDI/MISO, Serial Data Input/Master In Slave Out, 在 Master 上面也被稱為 Rx-Channel, 作為數據的入口, 主要用于SPI 設備接收數據;

? ?? ???SPI 設備在進行通信的過程中, Master 設備和 Slave 設備之間會產生一個數據鏈路回環(Data Loop), 就像上圖所畫的那樣, 通過 SDO 和 SDI 管腳, SSPSR 控制數據移入移出 SSPBUF, Controller 確定 SPI 總線的通信模式, SCK 傳輸時鐘信號.

?

  SSPSR.

? ?? ?????

?



? ?? ???SSPSR 是 SPI 設備內部的移位寄存器(Shift Register). 它的主要作用是根據 SPI 時鐘信號狀態, 往 SSPBUF 里移入或者移出數據, 每次移動的數據大小由 Bus-Width 以及 Channel-Width 所決定.

? ?? ???Bus-Width 的作用是指定地址總線到 Master 設備之間數據傳輸的單位.
? ?? ???例如, 我們想要往 Master 設備里面的 SSPBUF 寫入 16 Byte 大小的數據: 首先, 給 Master 設備的配置寄存器設置 Bus-Width 為 Byte; 然后往 Master 設備的 Tx-Data 移位寄存器在地址總線的入口寫入數據, 每次寫入 1 Byte 大小的數據(使用 writeb 函數); 寫完 1 Byte 數據之后, Master 設備里面的 Tx-Data 移位寄存器會自動把從地址總線傳來的1 Byte 數據移入 SSPBUF 里; 上述動作一共需要重復執行 16 次.

? ?? ???Channel-Width 的作用是指定 Master 設備與 Slave 設備之間數據傳輸的單位. 與 Bus-Width 相似,??Master 設備內部的移位寄存器會依據 Channel-Width 自動地把數據從 Master-SSPBUF 里通過 Master-SDO 管腳搬運到 Slave 設備里的 Slave-SDI 引腳, Slave-SSPSR 再把每次接收的數據移入 Slave-SSPBUF里.

? ?? ???通常情況下, Bus-Width 總是會大于或等于 Channel-Width, 這樣能保證不會出現因 Master 與 Slave 之間數據交換的頻率比地址總線與 Master 之間的數據交換頻率要快, 導致 SSPBUF 里面存放的數據為無效數據這樣的情況.


?????? ?SSPBUF.

? ?? ?? ???

?



? ?? ?? ? 我們知道, 在每個時鐘周期內, Master 與 Slave 之間交換的數據其實都是 SPI 內部移位寄存器從 SSPBUF 里面拷貝的. 我們可以通過往 SSPBUF 對應的寄存器 (Tx-Data / Rx-Data register) 里讀寫數據, 間接地操控 SPI 設備內部的 SSPBUF.

? ?? ?? ? 例如, 在發送數據之前, 我們應該先往 Master 的 Tx-Data 寄存器寫入將要發送出去的數據, 這些數據會被 Master-SSPSR 移位寄存器根據 Bus-Width 自動移入 Master-SSPBUF 里, 然后這些數據又會被 Master-SSPSR 根據 Channel-Width 從 Master-SSPBUF 中移出, 通過 Master-SDO??管腳傳給 Slave-SDI 管腳,??Slave-SSPSR 則把從??Slave-SDI 接收到的數據移入 Slave-SSPBUF 里.??與此同時, Slave-SSPBUF 里面的數據根據每次接收數據的大小(Channel-Width), 通過 Slave-SDO 發往 Master-SDI, Master-SSPSR 再把從 Master-SDI 接收的數據移入 Master-SSPBUF.在單次數據傳輸完成之后, 用戶程序可以通過從 Master 設備的 Rx-Data 寄存器讀取 Master 設備數據交換得到的數據.


? ?? ?Controller.

? ?? ?? ???

?



? ?? ?? ? Master 設備里面的 Controller 主要通過時鐘信號(Clock Signal)以及片選信號(Slave Select Signal)來控制 Slave 設備. Slave 設備會一直等待, 直到接收到 Master 設備發過來的片選信號, 然后根據時鐘信號來工作.

? ?? ?? ? Master 設備的片選操作必須由程序所實現. 例如: 由程序把 SS/CS 管腳的時鐘信號拉低電平, 完成 SPI 設備數據通信的前期工作; 當程序想讓 SPI 設備結束數據通信時, 再把 SS/CS 管腳上的時鐘信號拉高電平.

?

?

?

Ps:暫時用不到的概念:?

CPOL: 時鐘極性, 表示 SPI 在空閑時, 時鐘信號是高電平還是低電平. 若 CPOL 被設為 1, 那么該設備在空閑時 SCK 管腳下的時鐘信號為高電平. 當 CPOL 被設為 0 時則正好相反.

? ?? ???CPHA: 時鐘相位, 表示 SPI 設備是在 SCK 管腳上的時鐘信號變為上升沿時觸發數據采樣, 還是在時鐘信號變為下降沿時觸發數據采樣. 若 CPHA 被設置為 1, 則 SPI 設備在時鐘信號變為下降沿時觸發數據采樣, 在上升沿時發送數據. 當 CPHA 被設為 0 時也正好相反.

轉載于:https://www.cnblogs.com/daisyuer/p/5708743.html

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

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

相關文章

ibm服務器和微軟,微軟與IBM不得不說的事情

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓在Windows 3.x 開 始 為 世 人 接 受 之 初, 個 人 電 腦 的 操 作 系 統 中 唯 一 可 以 與Windows 操 作 系 統 分 庭 抗 禮 的 就 是OS/2。 這 套 原 先 是 微 軟 與IBM 合 作 生 產 的 操 作 系 統, 由 …

[置頂] 程序員編程生產力相差10倍意味著什么?

在軟件工程研究中,被驗證得最多的結論就是對于同等經驗的兩個不同程序員,在效率和質量上可能會有10倍的差距。研究人員還發現,這種差距也適用于團隊級別上,也就是說在同一行業內的不同的團隊也是如此。 軟件開發中的個人效率的變化…

生成隨機長度字符串,比如密碼等

2019獨角獸企業重金招聘Python工程師標準>>> public function createstr( $length ) {$chars "abcdefghijklmnopqrstuvwxyz0123456789"; $str "";for ( $i 0; $i < $length; $i ) { $str. substr($chars, mt_rand(0, strlen($chars)-1), 1…

css margin屬性,css margin屬性怎么用?css margin屬性用法教程

在css中&#xff0c;有一個重要的屬性margin&#xff0c;很多人都不知道css margin屬性是什么&#xff1f;怎么用&#xff0c;下面為您總結一下css margin屬性用法教程。margin是css用于在一個聲明中&#xff0c;對所有css margin屬性的簡寫&#xff0c;正因為margin來控制css中…

對于.swp文件的恢復方法

今天在使用Secure CRT在局域網內遠程服務器上編程時出了小狀況。在文件沒有保存的情況下&#xff0c;網線斷了。 然后等我重連上去后發現&#xff0c;剛剛編寫的程序不見了。用命令:ll 發現在目錄下有一個同名的.xxxx.c.swp文件。 通過這個文件&#xff0c;可以恢復程序。 恢復…

bzoj1679[Usaco2005 Jan]Moo Volume 牛的呼聲*

bzoj1679[Usaco2005 Jan]Moo Volume 牛的呼聲 題意&#xff1a; N只牛&#xff0c;每只牛都與其他N-1只牛聊著天。一個對話的進行&#xff0c;需要兩只牛都按照和她們間距離等大的音量吼叫&#xff0c;計算音量和。N≤10000 題解&#xff1a; 第i只牛與前i-1只牛對話的音量和是…

gaia引擎分析(二)場景管理

只是粗略的分析原理&#xff0c;大蝦輕噴~~ Gaia引擎中沒有場景管理器&#xff08;scenemanager&#xff09;這種東西&#xff0c;但是并不是沒有場景管理&#xff0c;而是在cGameHost類中有一課場景樹進行場景組織、一棵四叉樹用來進行剪裁。 class cGameHost class cGameHos…

ajax登錄非空判斷,email ajax傳輸數據去重和非空判斷(示例代碼)

前臺&#xff1a;ajax:$(document).ready(function(){$("#email").blur(function(){$("#email").css("background-color","#D6D6FF");$.ajax({type:"post",url:"check_email.do",data:{‘email‘:$("#email&…

某些專題頁面內容很好,但很長時間都不被及時收錄的可能原因之一

專題未被百度及時收錄的問題&#xff0c;經檢查驗證后發現就是因為頁面未建成就放置在線上&#xff0c;并返回404狀態碼&#xff0c;被百度當成死鏈刪除&#xff0c;造成收錄和流量損失。轉載于:https://www.cnblogs.com/adu0409/p/3499350.html

C++.Templates學習總結歸納1

函數模板 首先我們來看看函數模板&#xff0c;一個函數模板&#xff08;function template&#xff09;代表一族函數&#xff0c;其表現和一般的函數一樣&#xff0c;只是其中的某些元素在編寫的時候還不知道&#xff0c;也就是說這些還不知道的元素&#xff0c;我們將其參數化…

選擇更安全的方式執行你的puppet更新

選擇更安全的方式執行你的puppet更新生產環境中&#xff0c;puppet的更新有需要節點自動更新的&#xff0c;有需要通過puppetmaster推送更新的&#xff0c;還有需要節點更新時間離散的。下面講解三種更新方式2.7 Puppet更新方式2.7.1 節點定時更新[rootagent1 ~]# vim /etc/pup…

c ajax定時獲取,ajax的定時調用每5秒調用一次

這篇文章主要介紹了關于ajax的定時調用&#xff0c;本例為每5秒調用一次&#xff0c;大家可以根據自己的需求更改代碼如下:function initXMLRequest(){if (window.ActiveXObject) {xmlRequest new ActiveXObject("Microsoft.XMLHTTP");} else {if (window.XMLHttpRe…

[C++]有關深復制與copy constructor的一些問題與實例

紙上得來終覺淺&#xff0c;絕知此事要躬行 --- 今天對此話有了實際的領悟。之前學習C的時候&#xff0c;自以為已經把深復制和復制構造函數等這些知識已經掌握了&#xff0c;但真正寫起項目來的時候&#xff0c;還是不能提前考慮這些問題&#xff0c;直到問題出現&#xff0c;…

Xml Tips

Xml Tips//z 2012-3-7 16:43:47 PM IS2120CSDN1. xml 中的注釋<!-- 這是注釋 -->并非用于 XML 分析器的內容&#xff08;例如與文檔結構或編輯有關的說明&#xff09;可以包含在注釋中。注釋以 <!-- 開頭&#xff0c;以 --> 結尾&#xff0c;例如<!--catalog la…

算法復雜度為O(N) 的排序算法

題目&#xff1a;某公司有幾萬名員工&#xff0c;請完成一個時間復雜度為O(n)的算法對該公司員工的年齡作排序&#xff0c;可使用O(1)的輔助空間。分析&#xff1a;排序是面試時經常被提及的一類題目&#xff0c;我們也熟悉其中很多種算法&#xff0c;諸如插入排序、歸并排序、…

OpenJudge計算概論-字符串排序

/* 字符串排序 總時間限制: 1000ms 內存限制: 65536kB 描述 參考整數排序方法&#xff0c;設計一種為字符串排序的算法&#xff0c;將字符串從小到大輸出 輸入 第一行為測試數據組數t, 后面跟著t組數據。每組數據第一行是n&#xff0c;表示這組數據有n行字符串&#xff0c;接下…

Window7+vs2008+QT環境搭建

記錄下自己是如何搭建QT開發環境的&#xff0c;備忘吧。操作系統&#xff1a;win7&#xff0c;其實winXP&#xff0c;win7都沒有關系&#xff1b;我使用的機器安裝的操作系統是win7&#xff1b;開發環境是VS&#xff0c;使用2005,2008,2010或者即將發布的2011都行&#xff1b;因…

history命令

1. 歷史命令不會無休止的保存下去&#xff0c;默認的最大保存量為1000條輸入&#xff1a;echo $HISTSIZE1000條從profile文件中定義的&#xff0c;可以在里面修改保存數量。/etc/profile用于整個系統所有用戶&#xff0c; ~/.bash_profile, ~/.profile和~/.bashrc 用于各個用戶…

Javascript創建對象的幾種方式?

javascript 中常見的創建對象的幾種方式&#xff1a; 1. 使用Object構造函數創建&#xff1b; 使用Object構造函數來創建一個對象&#xff0c;下面代碼創建了一個person對象&#xff0c;并用兩種方式打印出了Name的屬性值。 var person new Object(); person.name"kevin&…

使用DIV之后 table何去何從

表格并非雞肋 相反是一道大餐 XHTML標準中的一些元素分為三大類&#xff1a; 輔助布局設計元素&#xff1a;DIV SPAN 這類元素的主要功能是用來布局整個頁面的&#xff0c;靈活使用這些元素的各種屬性&#xff0c;可以讓你的頁面表現豐富多彩。結構化元素或信息元素&#xff1…