????????該實現(xiàn)由兩個組件組成:在 LabVIEW FPGA 中實現(xiàn)的 SPI 協(xié)議以及用于從主機 PC 或?qū)崟r控制器與 FPGA 進行通信的 LabVIEW 主機接口。該架構(gòu)允許從單個主機程序控制多個 SPI 端口,同時仍然允許定制 FPGA VI 以進行其他數(shù)據(jù)采集和處理。該實現(xiàn)不使用任何DMA(直接內(nèi)存訪問)通道,允許使用NI掃描引擎和RIO掃描接口以及FPGA和主機之間的其他高速/大容量數(shù)據(jù)傳輸。
1.SPI協(xié)議介紹
????????
????????SPI 是一種以全雙工方式運行的同步串行數(shù)據(jù)鏈路。也就是說,攜帶數(shù)據(jù)的信號同時在兩個方向上傳播。設(shè)備使用主/從協(xié)議進行通信,其中主設(shè)備啟動數(shù)據(jù)幀。當(dāng)主設(shè)備生成時鐘然后選擇從設(shè)備時,數(shù)據(jù)可以同時在一個或兩個方向上傳輸。由主設(shè)備和從設(shè)備決定接收到的字節(jié)是否有意義。這可能需要設(shè)備丟棄“僅發(fā)送”幀中接收到的字節(jié)或為“僅接收”幀生成虛擬字節(jié)。 ?
????????四種典型的 SPI 信號包括:
- 時鐘 (SCLK)?- 該信號由主機生成。傳輸中的其他信號根據(jù)該時鐘的邊沿時序而變化。
- 主數(shù)據(jù)輸出,從數(shù)據(jù)輸入(MOSI)?——該線是從主設(shè)備到從設(shè)備的輸出。與主時鐘邊沿同步地逐位傳輸。
- 主數(shù)據(jù)輸入,從數(shù)據(jù)輸出 (MISO)?- 該線是所有連接的從設(shè)備的輸出。從與主時鐘邊沿同步的從器件逐位傳輸。
- 片選 (CS) 或從機選擇 (SS)?- 這是一組信號,其中每條線都連接到系統(tǒng)中的各個從機。一次斷言一根線以啟用與相應(yīng)從機的通信。片選通常被置為低電平。
?
2.FPGA實現(xiàn)?
????????本文檔中的 SPI 總線是使用LabVIEW FPGA?實現(xiàn)的,以執(zhí)行總線主控和時鐘信號。單周期定時循環(huán) (SCTL) 用于執(zhí)行 SPI 主設(shè)備 (?LabVIEW FPGA?VI) 與每個端口最多 8 個從設(shè)備之間通信的每一步??梢允褂孟嗤?FPGA VI 和主機程序接口創(chuàng)建多個端口。
????????該總線封裝在更高級別的 LabVIEW FPGA VI 中,該 VI 利用狀態(tài)機在每個 SPI 端口和主機接口之間執(zhí)行中間通信。該VI同步主機接口和SPI端口,并將從主機發(fā)送到指定端口的數(shù)據(jù)復(fù)用。
3.總線實現(xiàn)
????????狀態(tài)機用于執(zhí)行特定操作,然后確定要轉(zhuǎn)換到哪個狀態(tài)。由于 SPI 具有總線轉(zhuǎn)換發(fā)生的特定順序,因此狀態(tài)機是實現(xiàn)該協(xié)議的不錯選擇。每個狀態(tài)完成通信的一部分,然后按順序轉(zhuǎn)換到下一步。
????????當(dāng) FPGA 上的 SPI 引擎收到命令時,一個通信周期開始。每個字節(jié)均從 VI 范圍 FIFO 中讀取,數(shù)據(jù)從多路復(fù)用器傳遞并作為布爾數(shù)組存儲在 FPGA 上。
????????接收到要發(fā)送到 SPI 總線的數(shù)據(jù)后,指定要寫入的器件的片選 (CS) 線被置位。當(dāng)器件的片選線被置位時,它就準(zhǔn)備好一次一位地接收和發(fā)送數(shù)據(jù)。在執(zhí)行過程中的任何時刻只能有一條片選線處于活動狀態(tài)。CS 線作為寫入 FPGA 硬件上數(shù)字 I/O 端口的整數(shù)來實現(xiàn)。每個 CS 端口可以尋址 8 個單獨的從站。
????????每個器件都需要由 FPGA 主器件生成時鐘信號 (SCLK)。對于端口上的所有設(shè)備,該時鐘的速率可能不一致,因此可以在每個數(shù)據(jù)傳輸周期之前設(shè)置時鐘速率。一旦片選被置位,主機和從機都準(zhǔn)備好進行數(shù)據(jù)傳輸。狀態(tài)機轉(zhuǎn)換到等待狀態(tài)并保持在該狀態(tài)足夠長的時間以考慮所選的時鐘速率。
????????當(dāng)延遲完成時,應(yīng)生成第一個時鐘信號以開始數(shù)據(jù)傳輸。SPI 設(shè)備可能需要四種時鐘模式之一進行傳輸。這些模式取決于時鐘極性 (CPOL) 和時鐘相位 (CPHA)。CPOL 指定時鐘的空閑狀態(tài)是邏輯低還是邏輯高(分別為 0 或 1)。CPHA 指定數(shù)據(jù)是在第一個邊沿還是第二個邊沿(分別為 0 或 1)記入/記出。
????????當(dāng)時鐘被設(shè)置時,它從空閑狀態(tài)轉(zhuǎn)換到活動狀態(tài)。如果 CPHA 為 0,則在此轉(zhuǎn)換期間也會對數(shù)據(jù)進行計時。如果 CPHA 為 1,則當(dāng) SCLK 從活動復(fù)位為空閑時對數(shù)據(jù)進行計時。在設(shè)置和重置 SCLK 之間,會出現(xiàn)另一個等待狀態(tài),以確保正確的時鐘速率。對于必須發(fā)送的每個位,這些狀態(tài)都會按順序重復(fù)。
????????每個字節(jié)傳輸完畢后,VI從從設(shè)備接收到的數(shù)據(jù)會被放入另一個VI范圍的FIFO中,以便傳輸回主機。如果發(fā)送到狀態(tài)機的所有數(shù)據(jù)都已發(fā)送完畢,則片選線復(fù)位為無效狀態(tài),程序等待下一個命令。如果數(shù)據(jù)多于一個字節(jié),則會轉(zhuǎn)換回設(shè)置時鐘狀態(tài),并傳輸其余數(shù)據(jù)。
????????除了SPI協(xié)議之外,每個端口的VI還具有配置狀態(tài)。當(dāng)主機發(fā)送的命令為配置時,SCLK 速率、CPOL、CPHA 和端口號將被讀取并用于下一個數(shù)據(jù)傳輸序列。
4.FPGA多路復(fù)用器
????????為了允許以最少的配置實例化多個端口,使用中間FPGA VI在SPI端口VI和主機VI之間進行通信。該VI由一個狀態(tài)機組成,管理主機/FPGA握手以及將數(shù)據(jù)復(fù)用到正確的端口。
????????主機負責(zé)傳達多路復(fù)用器應(yīng)執(zhí)行的狀態(tài)。多路復(fù)用器處于空閑狀態(tài),等待來自主機的啟動命令。當(dāng)接收到啟動命令時,多路復(fù)用器將數(shù)據(jù)指定的端口寫入每個端口可訪問的全局變量中。在開始執(zhí)行之前,每個端口VI都會檢查它是否是指定端口。
????????設(shè)置端口信息后,復(fù)用器檢查主機發(fā)送的命令。如果命令是Configure,則將CPOL、CPHA、CS和總字節(jié)數(shù)寫入全局變量,為下一次數(shù)據(jù)傳輸做準(zhǔn)備。如果命令是讀/寫 SPI,則從主機接收的數(shù)據(jù)將傳遞到每個端口可訪問的目標(biāo)范圍 FIFO。該數(shù)據(jù)從目標(biāo)范圍的 FIFO 傳輸?shù)侥繕?biāo)端口的 VI 范圍的 FIFO,以在寫入和讀取狀態(tài)下傳遞到 SPI 總線。
????????由于多路復(fù)用器設(shè)置了數(shù)據(jù)的目的地,因此即使有多個端口可用,一次也只能有一個端口傳輸數(shù)據(jù)。一旦一個端口的所有數(shù)據(jù)都已傳輸,下一個端口就可以開始其傳輸序列。
?5.主機接口
????????創(chuàng)建了 SPI 通信狀態(tài)機的 LabVIEW 接口,以方便主機 PC 或?qū)崟r控制器與 FPGA 多路復(fù)用器之間的簡單數(shù)據(jù)傳輸。借助此高級 API,多個 SPI 端口可以與應(yīng)用程序所需的任何其他LabVIEW FPGA代碼一起實例化。
????????該API由兩個VI組成:FPGA SPI_Configure和FPGA SPI_Read Write。FPGA SPI_Configure 設(shè)置 SCLK 速率、CPOL、CPHA、CS 和要使用的端口。該信息通過配置命令傳遞到 FPGA 多路復(fù)用器,并存儲在 FPGA 全局變量中。
????????FPGA SPI_Read Write 需要傳輸?shù)目偽粩?shù)以及指定該數(shù)據(jù)的端口。U8字節(jié)數(shù)組被傳遞到VI并返回相同大小的數(shù)組。主機和 FPGA 之間的所有握手和數(shù)據(jù)傳輸都封裝在這些 VI 中。
?
????????如果其他 FPGA 代碼要與 SPI 總線一起使用,來自 FPGA 多路復(fù)用器的 SPI 通信循環(huán)和所有前面板控件將需要出現(xiàn)在頂層 VI 中。如果沒有這些,則需要修改主機 API 以使用正確的標(biāo)簽與前面板控件進行通信。使用Open FPGA Reference VI創(chuàng)建的FPGA參考還需要綁定到API使用的FPGA Reference.ctl typedef。
????????FPGA 內(nèi)核和主機 API 附帶的示例程序展示了如何從多個端口寫入和讀取數(shù)據(jù)。每次按下 Write 按鈕時,Write Data 中的數(shù)據(jù)會發(fā)送到 FPGA,而 Read Data 則會從 SPI 總線返回。在寫入之間,可以更改端口和配置數(shù)據(jù)。
6.添加多個SPI端口
????????向 FPGA 添加多個 SPI 端口相對簡單。在項目中,必須為新端口的 SCLK、MOSI、MISO 和 CS 添加新的 FPGA I/O。不需要其他項目配置。
????????在 FPGA SPI_FPGA Top Level VI 中,所需要做的就是添加 FPGA SPI_SPI Port VI 的另一個實例,并添加端口號的輸入以及用于 SCLK、MOSI、MISO 和 CS 的 FPGA I/O。多路復(fù)用器VI中的SPI通信循環(huán)處理與新端口之間的數(shù)據(jù)傳遞。
7.更改FPGA目標(biāo)
????????如果需要在不同的目標(biāo)上編譯和運行該示例,則應(yīng)將主機VI和FPGA參考復(fù)制到新目標(biāo)的非FPGA部分。對于CompactRIO和 Single-Board RIO,這將是 RT 控制器。如果移動到R系列智能DAQ目標(biāo),主機VI應(yīng)移動到項目中的“我的電腦”目標(biāo)。
????????項目的 FPGA 部分中必須復(fù)制的項目是頂層 FPGA VI 和目標(biāo)范圍的 FPGA FIFO。需要將新的 FPGA I/O 添加到項目中,以便為 SPI 端口創(chuàng)建參考,以便在正確的線路上進行通信。如果FPGA I/O名稱與示例中的名稱不同,則需要更改端口VI的FPGA I/O常量輸入以匹配新項目的FPGA I/O。
?
文章來源:http://www.zghlxwxcb.cn/news/detail-796454.html
????????要使用主機API,當(dāng)在主機VI中調(diào)用Open FPGA VI Reference時,該引用應(yīng)綁定到項目中的FPGA Reference控件。這會將目標(biāo)信息傳播到主機 API 的子 VI。?文章來源地址http://www.zghlxwxcb.cn/news/detail-796454.html
到了這里,關(guān)于【LabVIEW FPGA入門】LabVIEW FPGA 實現(xiàn)SPI通信協(xié)議的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!