17章 SPI控制器(XIlinx ZYNQ-7000 SOC UG-585文档)
第17章 SPI控制器
注:本文為筆者自己翻譯的XILINX ZYNQ-7000 SOC UG-585官方文檔,文檔版本UG585 (v1.12.2) July 1, 2018
文章目錄
- 第17章 SPI控制器
- 17.1 簡介
- 17.1.1 功能
- 17.1.2 系統(tǒng)結(jié)構(gòu)
- 17.1.3 模塊框圖
- 17.2 功能描述
- 17.2.1 主機模式
- 17.2.2 多主機兼容
- 17.2.3 從機模式
- 17.2.4 FIFO
- 17.2.5 FIFO中斷
- 17.2.6 中斷寄存器位和邏輯流
- 17.2.7 SPI-to-SPI互連
- 17.3 配置步驟
- 17.3.1 啟動順序
- 17.3.2 控制器配置
- 17.3.3 主機模式數(shù)據(jù)傳輸
- 17.3.4 從機模式數(shù)據(jù)傳輸
- 17.3.5 中斷服務(wù)規(guī)程
- 17.3.6 寄存器概述
- 17.4 系統(tǒng)功能
- 17.4.1 復位
- 17.4.2 時鐘
- 17.5 I/O接口
- 17.5.1 協(xié)議
- 17.5.2 背靠背傳輸器
- 17.5.3 MIO/EMIO映射
- 17.5.4 接線說明
17.1 簡介
SPI總線控制器支持與各種外圍設(shè)備的通信,如存儲器、溫度傳感器、壓力傳感器、模擬轉(zhuǎn)換器、實時時鐘、顯示器和任何支持串行模式的SD卡。SPI控制器可以在主模式、從模式或多主模式下工作。Zynq-7000設(shè)備包括兩個基于Cadence-SPI內(nèi)核的SPI控制器。
在主模式下,控制器驅(qū)動串行時鐘,從機選擇支持SPI的多主模式。串行時鐘來自PS時鐘子系統(tǒng)。控制器使用最多3個單獨的從選擇(SS)輸出信號(可從外部擴展)來啟動消息。控制器通過向32位讀/寫數(shù)據(jù)端口寄存器寫入字節(jié)來讀取和寫入從設(shè)備。
在多主機模式下,在控制器未激活時其輸出信號為三態(tài),當使能時會檢測競爭錯誤。通過重置SPI使能位,輸出被立即設(shè)定為三態(tài)。中斷狀態(tài)寄存器會顯示模式故障。
在從機模式下,控制器從外部設(shè)備接收串行時鐘,并使用SPI_Ref_Clk來同步數(shù)據(jù)捕獲。從機模式包括一個可編程啟動檢測機制,當片選信號SS變得有效時啟用控制器。
讀寫FIFO通過APB從接口為SPI I/O接口與為控制器服務(wù)的軟件之間提供緩存。FOFO在主機和從機I/O模式都可以使用。
本章包含以下部分:
17.1 簡介
17.2 功能描述
17.3 配置步驟
17.4 系統(tǒng)功能
17.5 I/O接口
17.1.1 功能
每個SPI控制器的配置和控制都是獨立的,它們包含以下功能:
- 四線總線 ---- MOSI,MISO,SCLK和SS
主機模式下最多3個從機選擇 - 全雙工操作提供同時接收和發(fā)送
- 通過APB從機接口進行32位寄存器編程
- 用于Rx/Tx FIFO的內(nèi)存映射讀/寫數(shù)據(jù)端口(字節(jié)寬)
128字節(jié)讀和128字節(jié)寫FIFO
可編程的FIFO閾值狀態(tài)和中斷 - 主機I/O模式
手動和自動啟動數(shù)據(jù)傳輸
手動和自動從機選擇(SS)模式
從機選擇信號可以直接連接到從機設(shè)備或從外部擴展
可編程的SS和MOSI延時 - 從機I/O模式
可編程的啟動檢測模式 - 多主機I/O兼容
當控制器未使能,I/O緩存驅(qū)動到三態(tài)
當檢測到其他主機時產(chǎn)生模式錯誤中斷 - 當I/O信號映射到MIO引腳時,SCK時鐘頻率50MHz
當I/O信號通過EMIO映射到PL引腳時,SCLK時鐘頻率25MHz - 可編程時鐘相位和極性(CHPA,CPOL)
- 可編程中斷驅(qū)動設(shè)備或輪詢狀態(tài)
17.1.2 系統(tǒng)結(jié)構(gòu)
SPI控制器的系統(tǒng)結(jié)構(gòu)框圖如圖17-1所示
SPI接口控制器
有兩個獨立的SPI接口控制器(SPIx,x為0或1)。每個獨立的SPI控制器的I/O信號都可以映射到MIO引腳或EMIO接口。每個控制器同樣有送到PS中斷控制器的獨立中斷信號和各自的復位信號。每個控制器有各自的一系列控制和狀態(tài)寄存器
時鐘
PS時鐘子系統(tǒng)給SPI控制器提供參考時鐘。SPI_Ref_Clk用于控制器的邏輯和主機模式下通過波特率生產(chǎn)期產(chǎn)生SCLK時鐘。
MIO-EMIO
如<Figure 17.5 I/O interfaces >所示SPI的I/O信號可以映射到MIO引腳或通過EMIO映射到PL引腳。信號的基本映射方法在 < 第二章信號、接口和引腳 > 中有介紹。
17.1.3 模塊框圖
SPI控制器的功能模塊框圖如圖17-2所示,
APB從機接口
32位APB從機接口對寄存器讀寫做出響應(yīng),包括用于從FIFO讀寫命令和數(shù)據(jù)的數(shù)據(jù)端口。所有的寄存器數(shù)據(jù)傳輸都是32位的。數(shù)據(jù)接口使用這些接口的bits[7:0]。配置和狀態(tài)寄存器在 Appendix B, Register Details 中介紹。
SPI主機模式
當控制器在主機模式下工作時,其驅(qū)動SCLK時鐘和最多3個從選擇輸出信號。從機選擇和MOSI上的傳輸啟動可以由軟件手動控制,也可以由硬件自動控制。
SPI從機模式
當控制器在從機模式下工作時,它使用一個單獨的從機選擇輸入(ss0)。SPI信號如 圖17-2 所示,其I/O接口在 <第17.5節(jié)> 中列出。SCLK與控制器參考時鐘(SPI_Ref_Clk)同步。詳細信息參考 <第17.2.3節(jié)從機模式 >。
發(fā)送和接收FIFO(Tx and Rx FIFOs)
每個FIFO有128個字節(jié)。軟件通過使用寄存器映射數(shù)據(jù)端口寄存器讀取和寫入這些FIFO。主機模式的FIFO管理在 <17.3.3主模式數(shù)據(jù)傳輸> 中有介紹,從機模式的FIFO管理在 <17.3.4從模式數(shù)據(jù)傳輸> 中有介紹。
FIFO橋接兩個時鐘域:APB接口和控制器的SPI_Ref_Clk。軟件寫入APB時鐘域中的TxFIFO,控制器讀取在SPI_Ref_Clk域中的TxFIFO。
控制器填充SPI_Ref_Clk域中的RxFIFO,軟件讀取APB時鐘域中的RxFIFO。
17.1.4 注意
7z007s和7z010 CLG225設(shè)備
7z007s單芯和7z010雙核CLG225設(shè)備支持32個MIO引腳(不是54個)。這在<第2.5.4節(jié)MIO-at-a-Glance表>的MIO表中顯示。這些設(shè)備限制了可用的MIO引腳,因此應(yīng)考慮通過EMIO的連接。<第1.1.3節(jié) “注意事項”>中列出了所有這些CLG225設(shè)備限制。
17.2 功能描述
17.2.1 主機模式
17.2.2 多主機兼容
17.2.3 從機模式
17.2.4 FIFO
17.2.5 FIFO中斷
17.2.6 中斷寄存器位和邏輯流
17.2.7 SPI-to-SPI互連
17.2.1 主機模式
在主機模式下,SPI的I/O接口可以向從機發(fā)送數(shù)據(jù)或發(fā)起傳輸以便從機接收數(shù)據(jù)。控制器使用三個從選擇線中的一個選擇一個從設(shè)備。如果需要將三個以上的從設(shè)備連接到主設(shè)備,可以在板上添加外部外圍選擇設(shè)備 – “3-8譯碼器”。
數(shù)據(jù)發(fā)送
SCLK時鐘和MOSI信號由主機控制。待傳輸?shù)臄?shù)據(jù)由軟件使用寄存器寫入TxFIFO,然后由控制器硬件以手動或自動啟動順序下載傳輸。數(shù)據(jù)被驅(qū)動到主輸出(MOSI)數(shù)據(jù)引腳上。當TxFIFO中有數(shù)據(jù)時,傳輸將連續(xù)進行。數(shù)據(jù)在MISO數(shù)據(jù)引腳上串行接收,一次加載8位到RxFIFO中。軟件使用寄存器讀取讀取RxFIFO。對于寫入TxFIFO的每“n”字節(jié),RxFIFO中存儲的“n”字節(jié)必須在開始下一次傳輸之前從軟件讀取。
自動或手動從機選擇(SS)和啟動
I/O接口上的數(shù)據(jù)傳輸可以使用軟件手動啟動,也可以由控制器硬件自動啟動。此外,從機選擇激活/釋放也可以由控制器硬件或軟件完成。這四種組合如<Table 17-1>所示。
手動從機選擇
軟件通過將spi.Config_reg0 [Manual_CS] 位 = 1 來選擇手動從機選擇模式。在這種模式下,軟件必須顯式地控制從機選擇激活/釋放。當[Manual_CS] 位 = 0 時,控制器硬件可以在數(shù)據(jù)傳輸過程中自動激活從機選擇。
自動從機選擇
軟件通過配置spi.Config_reg0 [Manual_CS] 位 = 0來選擇自動從機選擇模式。SPI控制器在每次TxFIFO內(nèi)容傳輸?shù)組OSI信號的過程中激活/釋放從機選擇。軟件將數(shù)據(jù)寫入TXFIO,控制器自動激活從機選擇,TxFIFO中的數(shù)據(jù)發(fā)送后自動釋放從機選擇。在發(fā)送完Tx FIFO中的所有數(shù)據(jù)后,從機選擇被釋放。傳送到此結(jié)束。
軟件確保在自動從機選擇模式下實現(xiàn)以下功能。
- 軟件不斷地將要傳輸?shù)臄?shù)據(jù)字節(jié)填充TxFIFO,而TxFIFO就不會變?yōu)榭?#xff0c;以此保持激活的從機選擇。
- 軟件連續(xù)讀取RxFIFO中接收的數(shù)據(jù)字節(jié),以避免溢出。
軟件使用TxFIFO和RxFIFO閾值級別來避免FIFO流量不足和過量。當TxFIFO中的字節(jié)數(shù)小于TxFIFO閾值級別時,將標記TxFIFO Not Full標志。當RxFIFO中的字節(jié)數(shù)等于128時,將標記RxFIFO full標志。
手動啟動
使能
軟件通過設(shè)置spi.Config_reg0 [Man_start_en] 位 = 1來選擇手動啟動模式。在此模式下,軟件必須使用手動啟動命令機制來顯式地啟動數(shù)據(jù)傳輸。當[Man_start_en] 位 = 0時,當TxFIFO中有可用數(shù)據(jù)時,控制器硬件自動啟動數(shù)據(jù)傳輸。
命令
軟件向spi.Config_reg0 [Man_start_com]位寫1,即可啟動一次手動傳輸。當軟件寫入1時,控制器硬件啟動數(shù)據(jù)傳輸并傳輸TxFIFO中存在的所有數(shù)據(jù)字節(jié)。[Man_start_com]位是自動清除的。如果[Man_start_en]=0,則忽略向該位寫入1。無論是什么模式,向[Man_start_com]位寫0都是無效的。
17.2.2 多主機兼容
對于多主模式,控制器編程為主機模式[MODE_SEL],并且可以在任何從機選擇上啟動傳輸。當軟件準備好啟動傳輸時,它使用[SPI_EN]位啟用控制器。事務(wù)處理完成后,軟件將禁用控制器。當控制器處于主機模式時,外部主機無法選擇控制器。
控制器通過監(jiān)測開漏從選擇信號(低電平有效)來檢測總線上的另一個主機。檢測機制由[Modefail_gen_en]使能。當控制器檢測到另一個主機時,它設(shè)置spi.Intr_status_reg0 [MODE_FAIL]中斷狀態(tài)位并清除spi.En_reg0 [SPI_EN]控制位。軟件可以接收[MODE_FAIL]中斷,因此可以中斷傳輸、復位控制器,或者重新發(fā)送傳輸。
17.2.3 從機模式
在從機模式下,控制器從外部主機接收消息并同時輸出應(yīng)答。控制器在以下情況下進入從機模式:spi.Config_reg0[MODE_SEL] = 0 和 spi.En_reg0 [SPI_EN] = 1。
SCLK將數(shù)據(jù)鎖存在MOSI輸入上。如果從機選擇輸入信號高(未激活),控制器將忽略MOSI輸入。當從機選擇激活時,它必須在傳輸期間保持活動狀態(tài)。如果從機選擇SS在傳輸期間被釋放,控制器會將spi.Intr_status_reg0 [MODE_FAIL]中斷位置位。軟件可以接收[MODE_FAIL]中斷,因此可以中斷傳輸、復位控制器,或者重新發(fā)送傳輸。
錯誤機制由[Modefail_gen_en]位使能。
發(fā)送到主設(shè)備的數(shù)據(jù)由軟件寫入TxFIFO,然后由控制器序列化到主輸入(MISO)信號。傳輸繼續(xù),且TXFIO中仍有數(shù)據(jù),從機選擇信號保持激活(低電平有效)。
時鐘
從機選擇輸入引腳必須與SCLK輸入同步驅(qū)動。控制器在SPI_Ref_Clk時鐘域中工作。輸入信號在SPI_Ref_Clk域中進行同步和分析。
字檢測
字的開頭是在SPI_Ref_Clk時鐘域中檢測到的。
- 控制器使能時的檢測:如果在SS為低(有效)時啟用控制器(從禁用狀態(tài)),則控制器捕獲數(shù)據(jù)前,將忽略數(shù)據(jù)并等待SCLK處于非活動狀態(tài)(字邊界)。控制器統(tǒng)計SPI_Ref_Clk域中SCLK的不激活狀態(tài)。當SCLK空閑計數(shù)達到[Slave_idle_coun]位字段中編程的值時,將假定一個新字。
- 當從機選擇激活時檢測:當控制器使能且SS檢測到高電平(非有效)時,控制器將假設(shè)單字的開始出現(xiàn)在SS轉(zhuǎn)換為低(激活)之后SCLK的下一個活動邊緣。
注意:啟動條件必須保持激活狀態(tài)至少四個SPI_Ref_Clk循環(huán)才能檢測到。
如果在外部主機非常接近開始數(shù)據(jù)傳輸時才啟動從機模式,有較小的可能性發(fā)生錯誤同步,從而導致數(shù)據(jù)包損壞。可通過以下任何方法避免此問題:
- 確保在啟用從機模式后,至少經(jīng)過10個SPI_Ref_Clk周期后,外部主機才啟動數(shù)據(jù)傳輸。
- 確保在啟用外部主設(shè)備之前啟用從機模式。
- 當從機啟用時,確保從機選擇輸入信號未激活。
17.2.4 FIFO
接收和發(fā)送FIFO各有128字節(jié)深度。
接收FIFO
如果控制器試圖將數(shù)據(jù)推送到已經(jīng)滿了的RxFIFO中,則內(nèi)容將丟失、粘滯溢出標志將置位。沒有數(shù)據(jù)可以添加到滿了的RxFIFO。軟件將1寫入[RX_OVERFLOW]位以清除該位。
發(fā)送FIFO
如果TxFIFO已滿,[TX_FIFO_full] = 1,則不要寫入更多數(shù)據(jù)。TX_FIFO_Full位保持激活狀態(tài),直到TxFIFO級別低于[TxFIFO_Not_Full]閾值級別。向滿了的TxFIFO寫入的數(shù)據(jù)可能會丟失而沒有任何指示。
17.2.5 FIFO中斷
Rx和Tx FIFO中斷如圖17-3所示。
17.2.6 中斷寄存器位和邏輯流
中斷狀態(tài)位(粘滯和動態(tài))由掩碼寄存器過濾,然后發(fā)送到系統(tǒng)中斷控制器。屏蔽寄存器由使能/禁止中斷控制寄存器控制(見圖17-4)。
17.2.7 SPI-to-SPI互連
當slcr.MIO_LOOPBACK [SPI_LOOP_SPI1]為被設(shè)置為 = 1時,PC中兩個SPI控制器的I/O信號連接在一起。在該模式下,一個控制器的時鐘、從機選擇、MISO、MISO信號分別連接到另一個控制器的時鐘、從機選擇、MISO、MISO信號。
限制
SPI控制器寄存器需要單32位讀/寫訪問,不使用字節(jié)、半字或雙字引用。
17.3 配置步驟
17.3.1 啟動順序
17.3.2 控制器配置
17.3.3 主機模式數(shù)據(jù)傳輸
17.3.4 從機模式數(shù)據(jù)傳輸
17.3.5 中斷服務(wù)規(guī)程
17.3.6 寄存器概述
17.3.1 啟動順序
實例:啟動順序
- 主機模式操作選擇:手動/自動啟動和SS,參見<第17.3.3節(jié)主模式數(shù)據(jù)傳輸>。
- 從機模式操作,參考<第17.3.4節(jié)從模式數(shù)據(jù)傳輸>。
17.3.2 控制器配置
通過寫spi.Config_reg寄存器來配置控制器:
- 設(shè)置波特率 [BAUD_RATE_DIV]。
- 設(shè)置時鐘相位[CLK_PH]和極性[CLK_POL]。
- 設(shè)置主機/從機模式[MODE_SEL]。
- 配置多主機模式系統(tǒng)的模式失敗產(chǎn)生[Modefail_gen_en]。
- 將SS設(shè)置為0b1111以在傳輸開始之前取消激活所有從機選擇。
實例:SPI0主機模式配置
這個例子使用單片選,波特率為12.5 Mb/s,時鐘相位設(shè)置為非激活,時鐘極性為靜態(tài)高。
a.釋放所有的片選(現(xiàn)在): [CS] = 1111。
b.不使用外部3-8譯碼器:[PERI_SEL] = 0。
c.波特率設(shè)置為 12.5 Mbps. [BAUD_RATE_DIV] = 1。
實例配置SPI_Ref_Clk為50MHz。波特率發(fā)生器說明見<第17.3.3節(jié)主模式數(shù)據(jù)傳輸>。
d.將時鐘相位[CLK_PH]和極性[CLK_POL]設(shè)置為1。這些參數(shù)在<第17.5.1節(jié)協(xié)議>中討論。
e.設(shè)置主機模式: [MODE_SEL] = 1。
f.查看是否有總線碰撞:[Modefail_gen_en]=1。
g.不要啟動傳輸。[Man_start_com]=0。
17.3.3 主機模式數(shù)據(jù)傳輸
主機操作模式的四種組合在<第17.2.1節(jié)主機模式>中進行了說明。下面的例子說明了每種模式的編程步驟。
示例:主機模式 – 手動SS和手動啟動
使能手動SS:向spi.Config_reg [Manual_CS]寫1。
選擇手動啟動:向spi.Config_reg [Man_start_en]寫1。
激活從機選擇:設(shè)置spi.Config_reg [CS] = 1101,激活從機選擇1。
使能控制器:向spi.EN_reg0 [SPI_EN]寫1。
向發(fā)送FIFO寫字節(jié):
a. 使用pi.Tx_data_reg寄存器向發(fā)送FIFO寫數(shù)據(jù)。
b. 持續(xù)向發(fā)送FIFO寫入數(shù)據(jù),直到其深度裝滿或沒有數(shù)據(jù)需要寫入。
c. 將每個字節(jié)寫入TxFIFO后,驅(qū)動程序軟件中的數(shù)據(jù)字節(jié)計數(shù)器將加1。
使能中斷:向spi.Intrpt_en_reg寫入0x27,以使能接收FIFO滿、接收FIFO溢出、發(fā)送FIFO空和故障狀況。
啟動數(shù)據(jù)傳輸:設(shè)置spi.Config_reg0 [Man_start_com] = 1。
等待中斷
中斷處理:使用中斷處理程序?qū)⑷魏胃郊訑?shù)據(jù)傳輸?shù)綇臋C,并將所需數(shù)據(jù)傳輸?shù)絊PI從機。
禁止中斷: 向spi.Intrpt_dis_reg 寫0x27,以禁止接收FIFO滿、接收FIFO溢出、發(fā)送FIFO空和故障狀況。
禁止控制器:設(shè)置spi.En_reg0 [SPI_EN] = 0。
釋放從機選擇:設(shè)置spi.Config_reg0 [CS] = 1111。
示例:主機模式 – 手動SS和自動啟動
a. 使用pi.Tx_data_reg寄存器向發(fā)送FIFO寫數(shù)據(jù)。
b. 持續(xù)向發(fā)送FIFO寫入數(shù)據(jù),直到其深度裝滿或沒有數(shù)據(jù)需要寫入。
c. 將每個字節(jié)寫入TxFIFO后,驅(qū)動程序軟件中的數(shù)據(jù)字節(jié)計數(shù)器將加1。
示例:主機模式 – 自動SS和手動啟動
選擇手動啟動:向spi.Config_reg [Man_start_en]寫1。
激活從機選擇:設(shè)置spi.Config_reg [CS] = 1101,激活從機選擇1。
使能控制器:向spi.EN_reg0 [SPI_EN]寫1。
向發(fā)送FIFO寫字節(jié):
a. 使用pi.Tx_data_reg寄存器向發(fā)送FIFO寫數(shù)據(jù)。
b. 持續(xù)向發(fā)送FIFO寫入數(shù)據(jù),直到其深度裝滿或沒有數(shù)據(jù)需要寫入。
c. 將每個字節(jié)寫入TxFIFO后,驅(qū)動程序軟件中的數(shù)據(jù)字節(jié)計數(shù)器將加1。
設(shè)置FIFO閾值等級:設(shè)置spi.TX_thres_reg0和spi.RX_thres_reg0閾值等級。可以參考<自動模式操作>部分的介紹。
使能中斷:向spi.Intrpt_en_reg寫入0x27,以使能接收FIFO滿、接收FIFO溢出、發(fā)送FIFO空和故障狀況。
啟動數(shù)據(jù)傳輸:設(shè)置spi.Config_reg0 [Man_start_com] = 1。
中斷處理:使用中斷處理程序?qū)⑷魏胃郊訑?shù)據(jù)傳輸?shù)綇臋C,并將所需數(shù)據(jù)傳輸?shù)絊PI從機。
禁止中斷: 向spi.Intrpt_dis_reg 寫0x27,以禁止接收FIFO滿、接收FIFO溢出、發(fā)送FIFO空和故障狀況。
禁止控制器:設(shè)置spi.En_reg0 [SPI_EN] = 0。
釋放從機選擇:設(shè)置spi.Config_reg0 [CS] = 1111。
17.3.4 從機模式數(shù)據(jù)傳輸
示例:從機模式 – 中斷驅(qū)動
確保控制器配置完畢后,在執(zhí)行以下步驟:
注意:在從機模式操作中,建議將spi.RX_Thres_reg0[Threshold_of_RX_FIFO設(shè)置為1,以將接收FIFO閾值設(shè)置為1.
17.3.5 中斷服務(wù)規(guī)程
示例:中斷服務(wù)規(guī)程
這個例子處理RxFIFO溢出/下溢、多主沖突(模式失敗)以及處理Rx和Tx數(shù)據(jù)傳輸。
禁止除了發(fā)送FIFO滿和接收FIFO空以外的所有中斷:向spi.Intr_dis_REG寫0x27。
檢測中斷源:從中斷狀態(tài)寄存器spi.Intr_status_reg0中讀取。
清除中斷:向中斷狀態(tài)寄存器spi.Intr_status_reg0對應(yīng)位寫1。
檢查模式錯誤中斷:(多主機模式)。在模式錯誤狀態(tài),當前發(fā)送中止:
a. 復位控制器。
b. 重新配置控制器。
c. 重新發(fā)送數(shù)據(jù)。
清空接收FIFO:讀取spi.Intr_status_reg0 [RX_FIFO_full]位:
a. 從pi.Rx_Data_reg 寄存器中讀取數(shù)據(jù)。持續(xù)讀取字節(jié)數(shù)等于數(shù)據(jù)字節(jié)計數(shù)器。
填充發(fā)送FIFO:如果需要,可以向發(fā)送FIFO寫入更多數(shù)據(jù):
a. 向spi.Tx_Data_reg0寄存器寫入數(shù)據(jù)。
b. 持續(xù)寫入數(shù)據(jù),直至達到FIFO的深度或不在需要寫入數(shù)據(jù)。
c. 在數(shù)據(jù)壓入FIFO后,數(shù)據(jù)字節(jié)計數(shù)器增加。
檢查溢出或下溢:讀取TX_FIFO_underflow] 或 [RX_OVERFLOW]狀態(tài)位。按需要處理溢出或下溢情況。
使能中斷:如果還有更多數(shù)據(jù)需要發(fā)送或接收,把spi.Intrpt_en_reg0 [TX_FIFO_not_full] 和 [RX_FIFO_full] 都設(shè)置 = 1。
如果有數(shù)據(jù)傳輸(發(fā)送或接收)則啟動數(shù)據(jù)傳輸:
- 當處于主機模式,且使用手動啟動的數(shù)據(jù)傳輸已經(jīng)完成(手動/自動的SS皆可),設(shè)置spi.Config_reg [Man_start_en] = 1。
17.3.6 寄存器概述
SPI寄存器的詳細介紹參見<附錄 B,寄存器數(shù)據(jù)(Appendix B, Register Details)>。寄存器概覽參見<Table 17-2>。
17.4 系統(tǒng)功能
17.4.1 復位
17.4.2 時鐘
17.4.1 復位
控制器有兩個復位域:APB接口和控制器自身。兩個復位域必須一塊使用。每個復位類型的作用匯總在<Table 17-3>。
示例:復位APB接口和SPI0控制器
17.4.2 時鐘
每個SPI控制器的核心由同一參考時鐘(SPI_Ref_Clk)驅(qū)動,該基準時鐘由PS時鐘子系統(tǒng)生成,詳見<第25章 時鐘>。APB接口由CPU 1x時鐘計時。CPU 1x時鐘與參考時鐘異步運行。說明書(data sheet)中定義了控制器時鐘的工作頻率規(guī)格。I/O信號由SCLK同步計時。
注意:時鐘選通用作SPI的電源管理功能。有關(guān)詳細信息,請參閱<第24.3.2節(jié)外設(shè)>。
CPU_1x
CPI_1x時鐘是CPU時鐘域的一部分,詳細介紹在<15.2 CPU時鐘>。
SPI_Ref_Clk
使用slcr.SPI_CLK_CTRL寄存器設(shè)置時鐘使能、PLL選擇和分頻,詳細介紹在<25.6.3 SDIO、SMC、SPI、Quad-SPI和UART時鐘>。
頻率限制注意:SPI_Ref_Clk必須始終設(shè)置為高于CPU 1x時鐘頻率的頻率。
主機模式SCLK
SCLK是主機模式的控制器驅(qū)動的。其通過設(shè)置spi.Config_reg0 [BAUD_RATE_DIV]位域?qū)PI_Ref_Clk分頻得到。
頻率比例說明:波特率分頻的以二進制步長覆蓋從最小的4到最大的256的范圍(比如分頻為,4,8,16,…,256)。
示例:主機模式SCLK
該示例介紹了如何將100MHz的SPI_Ref_Clk配置為25MHz的SCLK。該示例假設(shè)I/O PLL為1000 MHz。CPU U 1x時鐘頻率必須小于100 MHz。
a. 選擇I/O PLL:SRCSEL] = 00。
b. 將I/O PLL 10分頻: [DIVISOR] = 0x0A。
c. 使能SPI 0參考時鐘: [CLKACT0] = 1。
從機模式SCLK
控制器使用來自外部主機的SCLK作為MOSI和SS信號的時鐘。這些信號與SPI_Ref_Clk同步,并由控制器進行處理。
頻率比例說明:SPI_Ref_Clk頻率至少是SCLK的2倍(2x),以便控制器可以很好地檢測SPI總線上的字傳輸。
17.5 I/O接口
17.5.1 協(xié)議
17.5.2 背靠背傳輸
17.5.3 MIO/EMIO映射
17.5.4 接線方式
17.5.5 MIO/EMIO信號表
17.5.1 協(xié)議
主機模式
控制器支持主模式的各種I/O信令關(guān)系。通過設(shè)置相位和極性控制位spi.Config_reg0 [CLK_PH] 和 [CLK_POL],可以得到四種組合。這些參數(shù)影響串行時鐘的激活邊沿、從屬選擇的激活和SCLK的空閑狀態(tài)。時鐘相位參數(shù)定義了字與字之間SS的狀態(tài),以及控制器不傳輸位時SCLK的狀態(tài)。相位和極性參數(shù)匯總在<Table 17-4>中,如<Figure 17-5>所示。
時鐘相位設(shè)置,CPHA(CLK_PH)
在主機模式下,時鐘相位控制位spi.Config_reg0 [CLK_PH]的值會影響使用spi.Delay_reg0寄存器中參數(shù)的I/O協(xié)議(見 Figure 17-5):
CLK_PH = 0
- SS激活:主機會自動驅(qū)動SS輸出無效(高電平),保持時間由spi.Delay_reg0 [d_nss]位定義: Time = (1 + [d_nss]) * SPI_Ref_Clk 時鐘周期。最小的時間是2個SPI_Ref_Clk時鐘周期。
- 字間延時:當前字的最后一個字節(jié)周期與下一個字第一個字節(jié)周期之間的延時:Time = (2 + [d_btwn]) * SPI_Ref_Clk時鐘周期。最小的延時是3個SPI_Ref_Clk時鐘周期。該延時使發(fā)送FIFO(TXFIFO)可以卸載并準備下一次并行到串行的轉(zhuǎn)換,也會將從機選擇翻轉(zhuǎn)為無效的高電平。
CLK_PH = 1
- SS激活:在字和字之間,SS輸出信號不會驅(qū)動為無效。
- 字間延時:當前字的最后一個字節(jié)周期與下一個字第一個字節(jié)周期之間的延時采用默認值 – 一個SPI_Ref_Clk循環(huán)(由spi.Delay_reg0寄存器配置)。該延時使發(fā)送FIFO(TXFIFO)可以卸載并準備下一次并行到串行的轉(zhuǎn)換。
17.5.2 背靠背傳輸器
(見 Figure 17-6)
從機模式需求
在從機模式下,控制器可以接收背靠背傳輸器。
主機模式選項
- 自動SS,自動啟動(從重要性開始對這四個進行排序,并包含每一個列的交叉引用)
- 自動SS,手動啟動
- 手動SS,自動啟動
- 手動SS,手動啟動
17.5.3 MIO/EMIO映射
SPI接口信號既可以映射到MIO引腳,可以映射到EMIO接口。當系統(tǒng)復位時(例如,PS_POR_B、PS_SRST_B和其他方法),默認情況下,所有I/O信號都路由到EMIO接口。
當SPI總線通過MIO映射時,其最高可以允許在50MHz下。當信號通過EMIO映射PL引腳時,正常的時鐘速率是25MHz。更多關(guān)于頻率的介紹可以參考說明書(data sheet)。
要使用EMIO接口,用戶必須在PL創(chuàng)建邏輯,以直接連接SPI EMIO接口到的PL引腳的PL I/O緩存。EMIO映射支持最高25MHz的I/O時鐘。
SPI信號可以映射到特定的MIO引腳。其接線圖在<如17.5.4 接線說明>有介紹。<第2.5節(jié)PS-PL MIO-EMIO信號和接口>中解釋了一般映射概念和MIO I/O緩沖器配置。
示例:配置I/O。使SPI0映射到MIO引腳16-21
該示例使能主機模式SPI0映射到MIO引腳16-21,使用多達3個從機選擇。
配置MIO引腳16為時鐘輸出。向slcr.MIO_PIN_16 register寫0x0000_22A0。
a. 映射SPI0時鐘到引腳16.
b. 使能輸出,[TRI_ENABLE] = 0。
c. LVCMOS18: [IO_TYPE] = 001。
d. 慢速CMOS驅(qū)動邊沿。
e. 禁止內(nèi)部上拉電阻。
f. 禁止HSTL接收器。
配置MIO引腳17為MISO輸入。向slcr.MIO_PIN_17寫入0x0000_02A0。
a. 映射SPI0 MISO到引腳17.
b. 禁止輸出,[TRI_ENABLE] = 1。
c. LVCMOS18: [IO_TYPE] = 001。
d. 慢速CMOS驅(qū)動邊沿。
e. 禁止內(nèi)部上拉電阻。
f. 禁止HSTL接收器。
配置MIO引腳18、19和/或20用于從機片選輸出。向slcr.MIO_PIN_18、19 和/或 20寄存器寫入0x0000_32A0。內(nèi)部上拉使能。
a. 映射SPI0從機選擇信號到引腳18、19和/或20。在主機模式下,某個或全部的從機選擇都可以被激活。在從機模式下,SS0必須使用。
b. SPI三態(tài)控制:[TRI_ENABLE] = 0。
c. LVCMOS18: [IO_TYPE] = 001。
d. 慢速CMOS驅(qū)動邊沿。
e. 使能內(nèi)部上拉電阻。
f. 禁止HSTL接收器。
配置MIO引腳21作為MOSI。向slcr.MIO_PIN_21寄存器寫入0x0000_22A0。
a. 將SPI0 MOSI映射到引腳21。
b. SPI三態(tài)控制:[TRI_ENABLE] = 0。
c. LVCMOS18: [IO_TYPE] = 001。
d. 慢速CMOS驅(qū)動邊沿。
e. 禁止內(nèi)部上拉電阻。
f. 禁止HSTL接收器。
17.5.4 接線說明
用戶可以通過MIO引腳或EMIO接口到PL引腳,將每個SPI控制器連接到外部SPI從機或SPI主機。接線示例為,
- 通過MIO的主機模式,如<Figure 17-7>。
- 通過EMIO的主機模式,如<Figure 17-8>。
- 通過MIO的從機模式,如<Figure 17-9>。
在PS中兩個SPI控制器的I/O信號可以按照<第17.2.7節(jié)“SPI到SPI連接”>中的說明連接在一起。
重要聲明:在主機模式下,如果不適用SS0則需要將其連接到Vcc。這一點很重要,因為控制器在主機模式下監(jiān)聽此信號以檢測多主模式情況;如果SS0是邏輯低電平,則控制器將采用多主模式,并在發(fā)出事務(wù)之前等待SS0釋放。
通過MIO的主機模式
重要聲明:當使用MIO引腳時,SS0一直被使用。對于不使用SS0的現(xiàn)有設(shè)計,請參考<Xilinx AR58294>。
通過EMIO的主機模式
重要聲明:當使用EMIO引腳時,需要將SSIN在PL bitstream中拉高。請確定PS-PL電平轉(zhuǎn)換器已經(jīng)使能,且PL已經(jīng)上電、配置完畢。否則SPI控制器將無法正常工作。有關(guān)使能電壓移位寄存器的更多信息,請參閱<PS–PL voltage Level Shifter Enables,第46頁>。
通過MIO的從機模式
17.5.5 MIO/EMIO信號表
SPI I/O接口信號映射有一些選項。映射選項包括MIO管腳中的多個位置。選項見<2.5.4 MIO-at-a-Glance 表>和<Table 17-5>。
默認輸入信號映射:如果I/O信號未被映射到一組MIO引腳(MIO_PIN_xx寄存器配置),則EMIO接口輸入信號被啟用。
MIO引腳限制
小封裝注意事項:基于設(shè)備版本的MIO引腳限制見<2.5.4 MIO-at-a-Glance 表>中的MIO表。每個SPI I/O接口被選為一個組。
EMIO信號
SPI I/O接口信號可用的EMIO接口在<Table 17-6>中有定義。
說明:純?nèi)斯しg費時費力、而且意義不大。大多數(shù)翻譯采用的是翻譯軟件+人工校對,對于筆者本人的學習和理解已經(jīng)足夠。如果需要準確理解,請看官方英文原始文檔。
總結(jié)
以上是生活随笔為你收集整理的17章 SPI控制器(XIlinx ZYNQ-7000 SOC UG-585文档)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Vivado 自定义VHDL的IP核
- 下一篇: 新建VHDL的Vivado工程