前言
談完最簡單的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。