(原創) 如何在Nios II使用SPI Core? (SOC) (Nios II) (Qsys) (DE2-70)

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做讀寫。

spi000

spi001

SPI為Serial Peripheral Interface縮寫,為Motorola所制定的標準,總共只有4根1 bit的信號,如下圖所示:

spi002 

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的環境下,會以如下圖的方式連接:

spi003 

其中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

spi004 

1.SCLK在idle時為low。

2.MOSI在SCLK的rising edge時被latch,在SCLK的falling edge時做transition。

Clock Polarity = 0, Clock Phase = 1

spi005

1.SCLK在idle時為low。

2.MOSI在SCLK的falling edge時被latch,在SCLK的rising edge時做transition。

Clock Polarity = 1, Clock Phase = 0

spi006

1.SCLK在idle時為high。

2.MOSI在SCLK的falling edge時被latch,在SCLK的rising edge時做transition。

Clock Polarity = 1, Clock Phase = 1

spi007

1.SCLK在idle時為high。

2.MOSI在SCLK的rising edge時被latch,在SCLK的falling edge時做transition。

看到這裡,或許你會問:『在實務上,我們是如何利用SPI介面與其他IC做溝通呢?』

我們以[3] Winbond SPI Flash datasheet的Read Status Register為例:

spi008

其中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

未完,待續。

posted on 2011-12-08 22:04 真 OO无双 阅读(762) 评论(4) 编辑 收藏

评论

#1楼 2011-12-09 18:42 .COM 缺氧®      

期待OO大新作。  回复 引用 查看   

#2楼 2012-01-17 23:10 Chang-ken      

博主 請問您
您在11.1版有架過sopc之前您所寫的
(原創) 如何自己用SOPC Builder建立一個能在DE2-70上跑μC/OS-II的Nios II系統? (SOC) (Nios II) (μC/OS-II) (DE2-70)

我在11.1版裡架了一下 在step 34 Quartus II編譯 發生錯誤了
Error (204012): Can't generate netlist output files because the file "C:/DE2-70/hello_ucosii/cpu.v" is an OpenCore Plus time-limited file
Error (204009): Can't generate netlist output files because the license for encrypted file "C:/DE2-70/hello_ucosii/cpu.v" is not available
Error (204012): Can't generate netlist output files because the file "C:/DE2-70/hello_ucosii/cpu.v" is an OpenCore Plus time-limited file
Error (204009): Can't generate netlist output files because the license for encrypted file "C:/DE2-70/hello_ucosii/cpu.v" is not available
Error (204012): Can't generate netlist output files because the file "C:/DE2-70/hello_ucosii/cpu.v" is an OpenCore Plus time-limited file
Error (204009): Can't generate netlist output files because the license for encrypted file "C:/DE2-70/hello_ucosii/cpu.v" is not available
Error (204012): Can't generate netlist output files because the file "C:/DE2-70/hello_ucosii/cpu.v" is an OpenCore Plus time-limited file
Error (204009): Can't generate netlist output files because the license for encrypted file "C:/DE2-70/hello_ucosii/cpu.v" is not available
是我前面哪裡設錯了嗎?? 期待博主解答
 回复 引用 查看   

#3楼[楼主] 2012-01-18 06:36 真 OO无双      

引用Chang-ken:
博主 請問您
您在11.1版有架過sopc之前您所寫的
(原創) 如何自己用SOPC Builder建立一個能在DE2-70上跑μC/OS-II的Nios II系統? (SOC) (Nios II) (μC/OS-II) (DE2-70)

我在11.1版裡架了一下 在step 34 Quartus II編譯 發生錯誤了
Error (204012): Can't generate netlist output files because the file "C:/DE2-70/hello_ucosii/cpu.v" is an OpenCore Plus time...

你的Quartus II license沒裝好
導致無法合成Nios II CPU
Nios II CPU是一個經過編碼的verilog檔
必須要有license才能夠sythesize  回复 引用 查看   

#4楼 2012-02-16 12:22 3539591      

能不能写写怎么使用SPI核完成SD卡的读写?  回复 引用 查看   

导航

公告

emblem-2010

first2009-011

我是一個小小的數位IC工程師,從事SOC IP開發,業餘則喜歡研究FPGA、Embedded System、OS、MFC、NET與OOP相關技術。我並不是靠寫Blog或寫書維生,只是記下來怕自己忘記,所以不加任何廣告。所有文章與程式碼歡迎轉載使用。

昵称:真 OO无双
园龄:5年5个月
粉丝:291
关注:0

随笔分类(2100)