日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

17章 SPI控制器(XIlinx ZYNQ-7000 SOC UG-585文档)

發(fā)布時間:2024/10/14 编程问答 79 豆豆
生活随笔 收集整理的這篇文章主要介紹了 17章 SPI控制器(XIlinx ZYNQ-7000 SOC UG-585文档) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

第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 啟動順序

實例:啟動順序

  • 復位控制器:對Ref和CPU_1X復位進行激活和釋放,請參閱<第17.4.1節(jié) 復位>。
  • 配置時鐘:對SPI_Ref_Clk進行配置,參見<第17.4.2節(jié) 時鐘>。
  • Tx/Rx信號映射:參考<第17.5節(jié) I/O接口>。
  • 控制器配置:參考<17.3.2 控制器配置>。
  • 中斷配置:配置ISR以處理中斷狀況。最簡單的ISR是從RxFIFO讀取數(shù)據(jù)并將內(nèi)容寫入TxFIFO。PS中斷控制器在<第7章 中斷>中描述。SPI控制器的中斷機制在<第17.3.5節(jié)中斷服務(wù)程序>中描述。
  • 啟動數(shù)據(jù)傳輸:
    • 主機模式操作選擇:手動/自動啟動和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)高。

  • 配置控制器:向spi.Config_reg寄存器寫0x0002_FC0F。
    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和自動啟動

  • 使能手動SS:向spi.Config_reg [Manual_CS]寫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空和故障狀況。
  • 等待中斷
  • 中斷處理:使用中斷處理程序?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和手動啟動

  • 選擇手動啟動:向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_Config_reg0寫0。
  • 使能中斷:向spi.Intrpt_en_reg 寫入0x37,以使能接收FIFO非空、接收FIFO滿、接收FIFO溢出和故障狀況等中斷。
  • 使能控制器:向spi.EN_reg0 [SPI_EN]寫1。
  • 中斷處理:使用中斷處理函數(shù)從主機接收數(shù)據(jù)。
  • 禁止中斷:向spi.Intrpt_DIS_reg寫入0x37,以使能接收FIFO非空、接收FIFO滿、接收FIFO溢出和故障狀況等中斷。
  • 禁止控制器:向pi_En_reg0 [SPI_EN]寫0。
  • 注意:在從機模式操作中,建議將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控制器

  • 為SPI寫入slcr復位寄存器。向slcr.SPI_RST_CTRL [SPI0_REF_RST] 和 [SPI0_CPU1X_RST] 位域中先寫1,等待幾個延時之后再寫0。
  • 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。

  • 配置SPI_Ref_Clk:選擇PLL源,使能分頻器:向slcr.SPI_CLK_CTR寄存器寫入0x0000_0A01。
    a. 選擇I/O PLL:SRCSEL] = 00。
    b. 將I/O PLL 10分頻: [DIVISOR] = 0x0A。
    c. 使能SPI 0參考時鐘: [CLKACT0] = 1。
  • 配置波特率發(fā)生器:當配置控制器時,向spi.Contro_reg0 [BAUD_RATE_DIV]寫入001。
  • 從機模式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)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。