Abstract
SPI為IC之間溝通中常見的介面,Qsys已經提供SPI Core,Nios II可以直接使用,本文詳細探討SPI core的使用方式以及實務上該如何開發使用SPI介面的韌體。
Introduction
使用環境:Windows XP SP3 + VirtualBox 4.1.2 + Quartus II 11.0 + + DE2-70
實務上IC最常見的3大通訊介面:I2C、SPI與UART,其中Qsys已經內建SPI core,Nios II可以直接使用。
本文將討論以下主題:
1.SPI Bus簡介
2.Qsys的SPI Core簡介
3.詳細探討alt_avalon_spi_command()的內部運作機制
4.實際使用SPI Core存取SPI Flash
5.實際開發存取SPI Flash的SDK
1.SPI Bus簡介
在DE2-70平台上的IC,唯有TRDB-LTM這個Touch Panel的觸控IC使用SPI將觸控的座標傳回,使用上較為複雜,若初學者只想單純的學習SPI,恐怕會模糊焦點,因此我特地找了一顆使用SPI的Flash,透過GPIO與DE2-70連接,如此就可在Nios II使用SPI core對Flash的register做read/write,也能實際對Flash做讀寫。


SPI為Serial Peripheral Interface縮寫,為Motorola所制定的標準,總共只有4根1 bit的信號,如下圖所示:
SCLK:為Serial Clock縮寫,由master所產生的clock給slave使用。
MOSI:為Master Output Slave Input縮寫,由master output至slave input。
MISO:為Master Input Slave Output縮寫,由slave output至master input。
SS_N:為Slave Select縮寫,由master告知slave是否enable。(active low)。
在多SPI slave的環境下,會以如下圖的方式連接:
其中SPI master會有n個SS_N port對應SPI slave 0, SPI slave 1…的SS_N,當該SPI slave的SS_N為low時,表示master選定了該slave。
其中較特殊的是master與slave的MISO port連接時,須加上一個tristate buffer,使該slave沒有被master選取時,MISO為Hi-Z,如此才能避免兩個slave同時drive一個MISO。
Clock polarity and phase
SPI根據其clock polarity與clock phase的排列組合,總共有以下4種可能:
Clock Polarity = 0, Clock Phase = 0
1.SCLK在idle時為low。
2.MOSI在SCLK的rising edge時被latch,在SCLK的falling edge時做transition。
Clock Polarity = 0, Clock Phase = 1

1.SCLK在idle時為low。
2.MOSI在SCLK的falling edge時被latch,在SCLK的rising edge時做transition。
Clock Polarity = 1, Clock Phase = 0

1.SCLK在idle時為high。
2.MOSI在SCLK的falling edge時被latch,在SCLK的rising edge時做transition。
Clock Polarity = 1, Clock Phase = 1

1.SCLK在idle時為high。
2.MOSI在SCLK的rising edge時被latch,在SCLK的falling edge時做transition。
看到這裡,或許你會問:『在實務上,我們是如何利用SPI介面與其他IC做溝通呢?』
我們以[3] Winbond SPI Flash datasheet的Read Status Register為例:

其中DIO就是MOSI,DO就是MISO(naming convention不同而已),在前8個clk由master從MOSI送出instruction:05h,在下8個clk由slave從MISO傳回status register的值,由於status register可以連續的讀取,因此MISO可以連續的傳回status register值。
其中Mode 0就相當於clock polarity = 0,clock phase = 0,而Mode 3就相當於clock polarity = 1,clock phase = 1。
Reference
[1] Embedded Peripherals IP User Guide
[2] Serial Peripheral Interface Bus Wiki
[3] Winbond SPI Flash datasheet
未完,待續。