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