漫談傳輸介面-SPI


前言

談完最簡單的UART,再來就是SPI和I2C了,相對於UART只有一根訊號線,SPI有四根訊號線(有機會只用到三根),I2C則是有兩根訊號線,雖然多出來的訊號線不多,但資料傳輸方向則有增強,UART只能從master傳資料給slave,兩個裝置要用UART達成READ/WRITE能力就要掛上兩組master-slave UART介面,再架上一層協定來規範兩組UART如何互動,SPI和I2C則不同,一組介面就能讓master對slave做READ/WRITE動作,而SPI雖然有四根訊號線,但訊號方向是固定的,軟體人比較好理解,先解說這個。


SPI簡介 (Serial Peripheral Interface)

1. INPUT/OUTPUT

master端有3個output、1個input,slave端就是反過來的3個input、1個output,名字類似下面,以master觀點介紹:

  • CS:
    chip select,也可能看到叫SS(slave select),當master要對slave做動作,或是master要求slave做反應時就致能(activate)這一根訊號,動作完成再還原(de-activate)這訊號
  • CLK:
    clock,不像UART是master和slave各有自己的clock,slave自己解碼訊號線,所以稱非同步(Asynchronous),SPI是由master提供clock給slave來解碼訊號線,
  • MOSI:
    master output slave input,相當於UART的TX,但從高位元送到低位元。
  • MISO:
    master input slave output,和MOSI差不多,只是slave吐data給master,如果在只有master write slave的應用根本不用做這根。

2. CLOCK

雖然已經有CLK這個訊號線了,但slave如果老實用CLK當作自己的clock通常會出事,也許有隻貓經過一下就讓CLK訊號有個變化(glitch),通常還是要用比較高的頻率的clock輔助濾掉不必要的雜訊,因此slave也會規範最高能支援到多快。

3. handshake

可以先這麼想,SPI基本的就是WRITE和READ兩個動作,之後再用WRITE/READ動作做出應用上的意義。

Write動作


master先拉CS,因為是active low所以是由1變0,名稱也會帶個N或是B,同時間準備好write data bit 7,再來做出CLK的上升緣讓slave知道該取樣(sample)訊號,然後等半個週期再造出CLK的下降緣,再來準備write data bit 6,重複這些動作到bit 0也送出,再取消CS。

read動作


類似write動作,一樣master先拉CS,因為要read所以再造CLK的上升緣讓slave知道要吐read data bit7到MISO,master可能再CLK下降緣取樣,一樣重複這動作到read data bit0收完為止。

簡單應用

例如一顆SPI ROM作為slave,可以規範自己的行為是先write動作取得ROM_address,再來持續有read動作就會吐出ROM_data_byte_offset0,ROM_data_byte_offset1,....,ROM_data_byte_offsetN,這樣要讀取ROM內容的master就可以write動作、read動作、read動作、read動作....直到不想讀為止,或是打出新的address換個起點開始讀。


以上簡單介紹了軟體人怎麼去認識SPI,明天再來講比較特別的I2C。

#SPI







你可能感興趣的文章

為什麼 codepen 不會自動跳出相關語法?

為什麼 codepen 不會自動跳出相關語法?

How to solve the perpetual loading issue in Evernote? Evernote 一直轉圈圈的解決辦法

How to solve the perpetual loading issue in Evernote? Evernote 一直轉圈圈的解決辦法

更新 Node 的版本

更新 Node 的版本






留言討論