前言

完整的硬體產品是由多種模塊組合實現產品功能的,微控制器 MCU 充當大腦,外圍的存儲單元、顯示單元、發聲單元、感測器單元、運動單元等等是其軀幹和四肢,而不同類型的硬體單元需要有機的結合起來,就離不開相互之間的數據通信,電子工業經過了百餘年的發展,衍生出了繁多的協議,其中既有行業公認的標準協議,也有企業自研的內部標準,這些協議通常可以分為並行通信協議和串列通信協議。

  • 並行通信,在同一時刻發送多位數據(可以是多根線)。優點是發送速度快;缺點是傳輸距離短 資源佔用多。
  • 串列通信,用一根線 在不同的時刻發送8位數據。優點是傳輸距離遠 佔用資源少;缺點是發送速度慢。

通信的方式可以分為:全雙工、半雙工、單工

  • 單工通信 只能接受或者發送 收音機 遙控器,一般只有一根線
  • 半雙工通信 在同一時刻只能發送或者接收 對講機,至少有兩根線
  • 全雙工通信 在同一時刻 既能接收又能發送 電話,至少有兩根線

根據是接收端和發送端時鐘頻率的異同又可分為同步通信和非同步通信,本章將簡單介紹主流的一些硬體通信協議。

SPI 協議

協議概括

SPI是串列外設介面(Serial Peripheral Interface)的縮寫。SPI,是一種高速的,全雙工,同步的通信匯流排,並且在晶元的管腳上只佔用四根線,節約了晶元的管腳,同時為PCB的佈局上節省空間,提供方便,正是出於這種簡單易用的特性,如今主流的微控制器都集成有spi介面,如 stm32 家族。

通信原理

SPI的通信原理很簡單,它以主從方式工作,這種模式通常有一個主設備和一個或多個從設備,需要至少4根線,事實上3根也可以(單向傳輸時)。也是所有基於SPI的設備共有的,它們是SDI(數據輸入)、SDO(數據輸出)、SCLK(時鐘)、CS(片選)。

  • SDI – SerialData In,串列數據輸入;
  • SDO – SerialDataOut,串列數據輸出;
  • SCLK – Serial Clock,時鐘信號,由主設備產生;
  • CS – Chip Select,從設備使能信號,由主設備控制。

其中,CS是從晶元是否被主晶元選中的控制信號,也就是說只有片選信號為預先規定的使能信號時(高電位或低電位),主晶元對此從晶元的操作纔有效。這就使在同一條匯流排上連接多個SPI設備成為可能。

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

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

通過邏輯分析儀採集 spi 匯流排數據,可以看到四個通道的波形變化,判斷信號的時鐘週期、時鐘相位和極性,並能夠解碼獲取實際傳輸的數據和指令。

SPI還是一個數據交換協議:因為SPI的數據輸入和輸出線獨立,所以允許同時完成數據的輸入和輸出。不同的SPI設備的實現方式不盡相同,主要是數據改變和採集的時間不同,在時鐘信號上沿或下沿採集有不同定義,具體請參考相關器件的文檔。

最後,SPI介面的一個缺點:沒有指定的流控制,沒有應答機制確認是否接收到數據。

I2C 協議

協議概括

I2C匯流排是由Philips公司開發的一種簡單、雙向二線制同步串列匯流排。它只需要兩根線即可在連接於匯流排上的器件之間傳送信息。

主器件用於啟動匯流排傳送數據,併產生時鐘以開放傳送的器件,此時任何被定址的器件均被認為是從器件.在匯流排上主和從、發和收的關係不是恆定的,而取決於此時數據傳送方向。如果主機要發送數據給從器件,則主機首先定址從器件,然後主動發送數據至從器件,最後由主機終止數據傳送;如果主機要接收從器件的數據,首先由主器件定址從器件.然後主機接收從器件發送的數據,最後由主機終止接收過程。在這種情況下.主機負責產生定時時鐘和終止數據傳送。

通信原理

SDA(串列數據線)和SCL(串列時鐘線)都是雙向I/O線,介面電路為開漏輸出.需通過上拉電阻接電源VCC.當匯流排空閑時.兩根線都是高電平,連接匯流排的外同器件都是CMOS器件,輸出級也是開漏電路.在匯流排上消耗的電流很小,因此,匯流排上擴展的器件數量主要由電容負載來決定,因為每個器件的匯流排介面都有一定的等效電容.而線路中電容會影響匯流排傳輸速度.當電容過大時,有可能造成傳輸錯誤.所以,其負載能力為400pF,因此可以估算出匯流排允許長度和所接器件數量。

主器件用於啟動匯流排傳送數據,併產生時鐘以開放傳送的器件,此時任何被定址的器件均被認為是從器件.在匯流排上主和從、發和收的關係不是恆定的,而取決於此時數據傳送方向。如果主機要發送數據給從器件,則主機首先定址從器件,然後主動發送數據至從器件,最後由主機終止數據傳送;如果主機要接收從器件的數據,首先由主器件定址從器件.然後主機接收從器件發送的數據,最後由主機終止接收過程。在這種情況下.主機負責產生定時時鐘和終止數據傳送。

邏輯分析儀採集 I2C 匯流排數據,可以看到 SDA 和 SCL 的數據波形,查看每次的指令和數據、地址等。

CAN 協議

協議概括

控制器區域網匯流排(CAN,Controller Area Network)是一種用於實時應用的串列通訊協議匯流排,它可以使用雙絞線來傳輸信號,是世界上應用最廣泛的現場匯流排之一。CAN協議用於汽車中各種不同元件之間的通信,以此取代昂貴而笨重的配電線束。該協議的健壯性使其用途延伸到其他自動化和工業應用。CAN協議的特性包括完整性的串列數據通訊、提供實時支持、傳輸速率高達1Mb/s、同時具有11位的定址以及檢錯能力。

通信原理

CAN匯流排使用串列數據傳輸方式,可以1Mb/s的速率在40m的雙絞線上運行,也可以使用光纜連接,而且在這種匯流排上匯流排協議支持多主控制器。 CAN與I2C匯流排的許多細節很類似,但也有一些明顯的區別。當CAN匯流排上的一個節點(站)發送數據時,它以報文形式廣播給網路中所有節點。對每個節點來說,無論數據是否是發給自己的,都對其進行接收。每組報文開頭的11位字元為標識符,定義了報文的優先順序,這種報文格式稱為面向內容的編址方案。在同一系統中標識符是唯一的,不可能有兩個站發送具有相同標識符的報文。當幾個站同時競爭匯流排讀取時,這種配置十分重要。

當一個站要向其它站發送數據時,該站的CPU將要發送的數據和自己的標識符傳送給本站的CAN晶元,並處於準備狀態;當它收到匯流排分配時,轉為發送報文狀態。CAN晶元將數據根據協議組織成一定的報文格式發出,這時網上的其它站處於接收狀態。每個處於接收狀態的站對接收到的報文進行檢測,判斷這些報文是否是發給自己的,以確定是否接收它。由於CAN匯流排是一種面向內容的編址方案,因此很容易建立高水準的控制系統並靈活地進行配置。我們可以很容易地在CAN匯流排中加進一些新站而無需在硬體或軟體上進行修改。當所提供的新站是純數據接收設備時,數據傳輸協議不要求獨立的部分有物理目的地址。它允許分佈過程同步化,即匯流排上控制器需要測量數據時,可由網上獲得,而無須每個控制器都有自己獨立的感測器。

USB 協議

協議概括

通用串列匯流排(英語:Universal Serial Bus,縮寫:USB)是連接計算機系統與外部設備的一種串口匯流排標準,也是一種輸入輸出介面的技術規範,被廣泛地應用於個人電腦和移動設備等信息通訊產品,並擴展至攝影器材、數字電視(機頂盒)、遊戲機等其它相關領域。

通信原理

USB匯流排屬於一種輪詢式匯流排,主機控制埠初始化所有的數據傳輸。每一匯流排動作最多傳送三個數據包,包括令牌(Token)、數據(Data)、聯絡(HandShake)。

按照傳輸前制定好的原則,在每次傳送開始時,主機送一個描述傳輸動作的種類、方向、USB設備地址和終端號的USB數據包,這個數據包通常被稱為令牌包(TokenPacket)。USB設備從解碼後的數據包的適當位置取出屬於自己的數據。數據傳輸方向不是從主機到設備就是從設備到主機。

USB 2.0 介面

USB 3.0 介面

在傳輸開始時,由標誌包來標誌數據的傳輸方向,然後發送端開始發送包含信息的數據包或表明沒有數據傳送。接收端也要相應發送一個握手的數據包表明是否傳送成功。發送端和接收端之間的USB數據傳輸,在主機和設備的埠之間,可視為一個通道。USB中有一個特殊的通道一預設控制通道,它屬於消息通道,設備一啟動即存在,從而為設備的設置、狀態查詢和輸入控制信息提供一個入口。

UART 協議

協議概括

通用非同步收發傳輸器(Universal Asynchronous Receiver/Transmitter),通常稱作UART,是一種非同步收發傳輸器,是電腦硬體的一部分。它將要傳輸的資料在串列通信與並行通信之間加以轉換。作為把並行輸入信號轉成串列輸出信號的晶元,UART通常被集成於其他通訊介面的連結上。

具體實物表現為獨立的模塊化晶元,或作為集成於微處理器中的周邊設備。一般是RS-232C規格的,與類似Maxim的MAX232之類的標準信號幅度變換晶元進行搭配,作為連接外部設備的介面。在UART上追加同步方式的序列信號變換電路的產品,被稱為USART(Universal Synchronous Asynchronous Receiver Transmitter)。

通信原理

計算機內部採用並行數據,不能直接把數據發到Modem,必須經過UART整理才能進行非同步傳輸,其過程為:CPU先把準備寫入串列設備的數據放到UART的寄存器(臨時內存塊)中,再通過FIFO(First Input First Output,先入先出隊列)傳送到串列設備,若是沒有FIFO,信息將變得雜亂無章,不可能傳送到Modem。

UART作為非同步串口通信協議的一種,工作原理是將傳輸數據的每個字元一位接一位地傳輸。

其中各位的意義如下:

  • 起始位:先發出一個邏輯」0」的信號,表示傳輸字元的開始。
  • 資料位:緊接著起始位之後。資料位的個數可以是4、5、6、7、8等,構成一個字元。通常採用ASCII碼。從最低位開始傳送,靠時鐘定位。
  • 奇偶校驗位:資料位加上這一位後,使得「1」的位數應為偶數(偶校驗)或奇數(奇校驗),以此來校驗資料傳送的正確性。
  • 停止位:它是一個字元數據的結束標誌。可以是1位、1.5位、2位的高電平。 由於數據是在傳輸線上定時的,並且每一個設備有其自己的時鐘,很可能在通信中兩臺設備間出現了小小的不同步。因此停止位不僅僅是表示傳輸的結束,並且提供計算機校正時鐘同步的機會。適用於停止位的位數越多,不同時鐘同步的容忍程度越大,但是數據傳輸率同時也越慢。
  • 空閑位:處於邏輯「1」狀態,表示當前線路上沒有資料傳送。
  • 波特率:是衡量資料傳送速率的指標。表示每秒鐘傳送的符號數(symbol)。一個符號代表的信息量(比特數)與符號的階數有關。例如資料傳送速率為120字元/秒,傳輸使用256階符號,每個符號代表8bit,則波特率就是120baud,比特率是120*8=960BIT/S。

通過邏輯分析儀抓取 uart 匯流排數據,可以清楚的看到數據幀格式。

參考鏈接

1.《物聯網安全百科》 iot-security.wiki


伏宸安全實驗室-主頁?

future-sec.com
圖標

新浪微博:伏宸安全實驗室

微信公眾號: 伏宸安全實驗室 (微信搜索「伏宸安全實驗室」關注即可)

推薦閱讀:

查看原文 >>
相關文章