簡介SPI
SPI(Serial Peripheral Interface)應用於單晶片系統與周邊的通訊界面,類似I2C的用途,以串列方式運作,由Motorola(摩托羅拉)所開發,用於SD卡與液晶顯示器的通訊界面,可以一個主控端(Master)與多個從端(Slave)一起進行訊號傳輸。需要使用MOSI、MISO、SCLK與SS四條線,MOSI(Master Output Slave Input)表示由主控端發送訊號給從端,MISO(Master Input Slave Output)表示由主控端接收來自從端的訊號,SCLK是同步時脈,所以SPI是同步方式進行傳輸,另外,主控端與每一個從端裝置都需要一條SS(晶片選擇)線,經由這一條SS線決定主控端與哪一個從端進行通訊,使用MOSI與MISO兩條傳輸線,與SPI裝置進行通訊,所以SPI屬於全雙工運作。SPI主控端與從端運作的示意圖,如下。
實驗目標
使用SPI介面驅動8x8LED,顯示箭頭形狀到8x8LED。
實驗所需元件
8x8LED(使用SPI介面)x1
實驗接線圖
接線圖如下,Arduino要連接到靠近MAX7219晶片的針腳,不要連錯邊了。因為8x8LED不會輸出資料到Arduino,所以不需要MISO的接腳。
程式實作提示
Arduino IDE內的函式庫SPI,Arduino當成SPI主控端與周邊的SPI從端傳送與接收資料,函式庫SPI的重要函式的說明與範例,如下表。
使用SPI介面的8x8LED,大多使用MAX7219晶片,此晶片的指令格式如下圖。
MAX7219的位址
函式與說明
transfer(r)
傳送暫存器位址給SPI設備,r為暫存器位址。
transfer(d)
傳送資料給SPI設備,d為傳送的資料。
範例
SPI.transfer(0xA);
SPI.transfer(7);
對暫存器位址0xA,傳送數值7,在MAX7219位址0xA用於設定LED的亮度,數值7表示中間亮度。
程式碼與解說
第1行:包含函式庫SPI的標頭檔。
第2到6行:設定各種功能暫存器的位址。
第7到12行:自訂函式max7219,經由SPI傳送資料到MAX7219晶片,設定SS接腳為低電壓表示選擇此晶片(第8行),先傳送暫存器位址(第9行),接著傳送資料(第10行),設定SS接腳為高電壓表示取消選擇此晶片(第11行)。
第13到17行:自訂函式clear,設定資料暫存器位址1到8都是0,表示關閉所有LED。
第19行:陣列data儲存依序傳送到資料暫存器位址1到8的資料。
第21到29行:在setup函式內,啟用SPI(第22行),設定MAX7219所有資料暫存器使用資料模式(第23行),設定LED亮度為7,表示中間亮度(第24行),設定啟用所有資料暫存器(第25行),設定啟用MAX7219(第26行),設定MAX7219不進入測試模式(第27行),呼叫函式clear設定所有資料暫存器為0(第28行)。
第31到35行:在loop函式內,使用迴圈將陣列data的數值透過函式max7219依序寫入位址1到8的資料暫存器。
執行程式
編譯及上傳程式到Arduino,就可以看到箭頭。
byte data[8]={0x18, 0x3c, 0x7E, 0xFF, 0x3c, 0x3c, 0x3c, 0x3c};
0x表示十六進位表示,陣列data的第一個元素為0x18,0x1轉換成二進位為0001,表示第一行前四個位元為0001,0x8轉換成二進位為1000,後四個位元為1000,1表示點亮該LED,因此點亮箭頭中間最前端的兩個LED;陣列data的第二個元素為0x3c,0x3轉換成二進位為0011,表示第二行前四個位元為0011,0xc轉換成二進位為1100,後四個位元為1100,因此點亮第二行中間的四個LED,其餘依此類推,就可以看到一個箭頭顯示在8x8LED上。