0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

怎么樣利用AXI Quad SPI快速打通Linux至PL端SPI從設(shè)備?

FPGA之家 ? 來源:CSDN技術(shù)社區(qū) ? 作者:嵌入式客棧 ? 2021-04-09 17:45 ? 次閱讀

[導(dǎo)讀] 前面寫過篇介紹ZYNQ基本情況的文章,今天來肝一篇實戰(zhàn)文章介紹AXI quad SPI 使用方法,如果你正使用ZYNQ的這個IP,希望對你有所幫助。

初識AXI quad SPI

f25d2ec4-990e-11eb-8b86-12bb97331649.png

自《PG153 AXI Quad SPI v3.2》

支持:

Legacy Mode

standard mode: 準SPI通常就稱SPI,它是一種串行外設(shè)接口規(guī)范,有4根通信腳:SCK (時鐘), CS(片選), MOSI(主出從入), MISO(主入從出)。

Dual/Quad SPI Mode:

f269a73a-990e-11eb-8b86-12bb97331649.png

AXI QuadSPI 模式

在標準模式下,支持高達32個從站,這是非常靈活的指標。本文對于手冊中的詳細技術(shù)細節(jié)不做過多闡述,有興趣的自行深入閱讀研究。

該SPI IP能干神馬呢?

完成如下這樣一個應(yīng)用場景:

f2ac0864-990e-11eb-8b86-12bb97331649.png

SPI IP訪問多從SPI芯片

所需要實現(xiàn)的需求用例為:

f2e1edbc-990e-11eb-8b86-12bb97331649.png

本文實現(xiàn)用例描述

利用AXI quad SPI 實現(xiàn)SPI外設(shè)控制器

實現(xiàn)SPI外設(shè)控制器驅(qū)動

實現(xiàn)多SPI從設(shè)備掛載在SPI總線

實現(xiàn)用戶空間訪問多從SPI物理從設(shè)備

從軟件分層的視角來看,上述的需求需要實現(xiàn)下面的訪問層級:

f30a8b32-990e-11eb-8b86-12bb97331649.png

PS/PL軟硬件層次架構(gòu)圖

為什么要研究這個呢?實際用ZYNQ芯片做產(chǎn)品時,很有可能外部有多個SPI從設(shè)備芯片需要利用Linux訪問,你或許會說ZYNQ的PS端不是自帶了兩個SPI控制器嗎?但有時候項目中這兩個SPI對應(yīng)的引腳可能用做其他用途了,而一個復(fù)雜的項目中又不得不使用多個SPI從設(shè)備芯片時,本文所討論的話題就能很好的解決這樣的需求場景了。通過本文,你會發(fā)現(xiàn),原來ZYNQ的SPI IP是如此靈活好用!

本文目的實戰(zhàn)描述,如何一步一步從PL端設(shè)計:

block design

約束

綜合

導(dǎo)出

乃至PS端:

SPI驅(qū)動配置

設(shè)備樹修改

系統(tǒng)編譯部署

設(shè)備驅(qū)動測試

按照這個流程,那么第一步需要設(shè)計PL端與PS端的配置,且看:

AXI Quad SPI 之配置

從IP catalog中按下圖從ip庫中添加如下IP:

ZYNQ7 processing System

AXI interconnect

AXI Quad SPI(可根據(jù)需要添加多個)

Processing System Reset(添加ZYNQ7 processing System 點自動連線會自動添加,當然也可以手動添加)

Concat

f3450aa0-990e-11eb-8b86-12bb97331649.png

Block設(shè)計圖

使能ZYNQ7 processing System的時鐘PL Fabric clocks,用以驅(qū)動PL端的IP:

f38dc678-990e-11eb-8b86-12bb97331649.png

PL Fabric clocks設(shè)置

使能M AXI GP0接口如下:

f3ddadf0-990e-11eb-8b86-12bb97331649.png

M AXI GP0設(shè)置

雙擊AXI interconnect,設(shè)置2主1從:

f41cf5d2-990e-11eb-8b86-12bb97331649.png

AXI interconnect設(shè)置

雙擊axi_quad_spi_0設(shè)置如下,設(shè)置4個從設(shè)備(最多可支持32個從設(shè)備,PS端內(nèi)置的SPI控制器1個最多支持3個從設(shè)備,從這一點可看出該IP的靈活性)

f44f9ee2-990e-11eb-8b86-12bb97331649.png

axi_quad_spi設(shè)置

同樣將axi_quad_spi_1設(shè)置為2個從設(shè)備接口。

然后按照前面的連線圖,將各塊連接好,做過硬件的盆友會比較適應(yīng),這就像畫原理圖一樣,就將各IP建立了邏輯連接關(guān)系了。除此之外,對于一個ZYNQ的板子而言,你還需要做如下的PS端設(shè)置:

DDR RAM設(shè)置,根據(jù)自身的板子的內(nèi)存芯片以及內(nèi)存大小進行設(shè)置

Peripheral IO外設(shè)設(shè)置,比如SD卡,UART,QUAD SPI Flash,erthernet等

clock時鐘系統(tǒng)設(shè)置,根據(jù)板子的情況進行設(shè)置CPU、DDR時鐘頻率、IO時鐘等

......

至于這些怎么配置,比較常見這里就不贅述了。

對于AXI quad SPI外設(shè)還有一個很重要的配置,就是其地址范圍:

f4786c50-990e-11eb-8b86-12bb97331649.png

AXI quad SPI地址設(shè)置

該地址最終將導(dǎo)出到設(shè)備樹描述文件,用于SPI控制器驅(qū)動訪問,從而讓SPI控制器驅(qū)動得以與該IP通過AXI總線進行通信。

導(dǎo)出硬件文件

點擊open elaborated design ,然后打開io ports進行管腳分配,這需要根據(jù)各自的硬件實際情況進行設(shè)置,比如我是這樣設(shè)置的:

f49cfaac-990e-11eb-8b86-12bb97331649.png

管腳約束設(shè)置

電平標準

是否上拉

驅(qū)動能力

.....

然后點擊Run synthesis進行綜合,成功之后點擊生成bit stream。再點擊export hardware,得到.hdf文件,這個文件用于構(gòu)建內(nèi)核。

f4e1be1c-990e-11eb-8b86-12bb97331649.png

導(dǎo)出硬件描述文件

將得到的硬件描述hdf文件以及bitstream文件拷貝至內(nèi)核編譯文件夾下:

f5297810-990e-11eb-8b86-12bb97331649.png

硬件描述及bit文件

配置編譯內(nèi)核

運行命令讀取硬件描述文件:

petalinux-config--get-hw-description../base.sdk

注:這里將hdf文件以及.bit文件放置在petalinux編譯路徑的上級目錄的base.sdk,根據(jù)習(xí)慣可自行設(shè)置,只有上述命令傳入的路徑正確即可。

等待一段時間后,可得到一個配置界面,用于配置內(nèi)核源、u-boot源、Image 等配置。

f546d3a6-990e-11eb-8b86-12bb97331649.png

petalinux-config

根據(jù)實際情況配置好后,退出配置并保存配置。使用過的會比較熟悉,這里不贅述了。

配置設(shè)備樹

編輯用戶設(shè)備樹文件,用戶設(shè)備樹文件在下面路徑中:

./project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi

配置設(shè)備樹如下:

/include/"system-conf.dtsi" /{ }; &axi_quad_spi_0{ status="okay"; clock-names="axi_clk","axi4_clk","spi_clk"; clocks=<&clkc?15>,<&clkc?15>,<&clkc?15>; spi0_dev_0@0{ compatible="spidev"; reg=<0>; spi-max-frequency=<500000>; #address-cells=<1>; #size-cells=<1>; }; spi0_dev_1@1{ compatible="spidev"; reg=<1>; spi-max-frequency=<500000>; #address-cells=<1>; #size-cells=<1>; }; spi0_dev_2@2{ compatible="spidev"; reg=<2>; spi-max-frequency=<500000>; #address-cells=<1>; #size-cells=<1>; }; spi0_dev_3@3{ compatible="spidev"; reg=<3>; spi-max-frequency=<500000>; #address-cells=<1>; #size-cells=<1>; }; }; &axi_quad_spi_1{ status="okay"; clock-names="axi_clk","axi4_clk","spi_clk"; clocks=<&clkc?15>,<&clkc?15>,<&clkc?15>; spi1_dev_0@0{ compatible="spidev"; reg=<0>; spi-max-frequency=<500000>; #address-cells=<1>; #size-cells=<1>; }; spi1_dev_1@1{ compatible="spidev"; reg=<1>; spi-max-frequency=<500000>; #address-cells=<1>; #size-cells=<1>; }; };

這里直接使用內(nèi)置spidev兼容從設(shè)備驅(qū)動,當然如果需要自己定義一個SPI設(shè)備驅(qū)動也是非常容易的,但是對于大部分普通的SPI從芯片而言直接使用spidev設(shè)備驅(qū)動即可,只需要在讀寫時按照芯片手冊協(xié)議進行訪問即可。

配置內(nèi)核

運行下面命令進行內(nèi)核配置:

petalinux-config-ckernel

f5720d1e-990e-11eb-8b86-12bb97331649.png

內(nèi)核配置

對于本應(yīng)用而言,需要配置SPI驅(qū)動:

DeviceDrivers---> +-SPIsupport--->

配置如下:

f5956458-990e-11eb-8b86-12bb97331649.png

SPI控制器及設(shè)備驅(qū)動配置

這里調(diào)試中遇到一個奇怪的問題,CONFIG_SUSPEND需要禁止,否則控制器驅(qū)動加載不成功,目前還沒有深入研究為什么不成功,猜想可能是主控制器驅(qū)動關(guān)于SUSPEND功能還不支持或者有bug,如果有哪位大神知道怎么解決請求留言指點。

Powermanagementoptions---> SuspendtoRAMandstandby

f5a3bbb6-990e-11eb-8b86-12bb97331649.png

功能管理配置

退出并保存配置,然后運行下面命令編譯系統(tǒng):

petalinux-build

等待編譯成功后,運行下面命令將bitstream文件包進BOOT.bin中。

petalipackage--boot--fsbl./images/linux/zynq_fsbl.elf--fpga../base.sdk/design_1_wrapper.bit--u-boot--force

將得到下面的輸出信息,表示操作成功:

INFO:FileinBOOTBIN:"/home/zynq/ALINX/spi_ip/ax_peta/images/linux/zynq_fsbl.elf" INFO:FileinBOOTBIN:"/home/zynq/ALINX/spi_ip/base.sdk/design_1_wrapper.bit" INFO:FileinBOOTBIN:"/home/zynq/ALINX/spi_ip/ax_peta/images/linux/u-boot.elf" INFO:GeneratingzynqbinarypackageBOOT.BIN... INFO:Binaryisready. WARNING:UnabletoaccesstheTFTPBOOTfolder/tftpboot!!! WARNING:SkipfilecopytoTFTPBOOTfolder!!!

注:/home/zynq/ALINX/spi_ip/ax_peta 是本文工程的目錄

測試SPI從設(shè)備

編寫驅(qū)動測試程序,代碼如下:

#include #include #include #include intmain(intargc,char**argv) { intfd; intlen; unsignedcharbuf[10]; unsignedchartmp; /*驗證輸入參數(shù)個數(shù)*/ if(3!=argc) { printf("nonepara "); return-1; } /*打開輸入的設(shè)備文件,獲取文件句柄*/ fd=open(argv[1],O_RDWR); if(fd='0'&&argv[2][i]<='9') ????????{ ????????????tmp?=?argv[2][i]?-?'0'; ????????} ????????else?if(argv[2][i]>='a'&&argv[2][i]<='f') ????????{ ????????????tmp?=?argv[2][i]?-?'a'+10; ????????} ????????else?if(argv[2][i]>='A'&&argv[2][i]<='F') ????????{ ????????????tmp?=?argv[2][i]?-?'A'+10; ????????} ????????else ????????{ ????????????printf("Invalid?input?parameters? "); ????????????return?-1; ????????} ????????if(i%2==0) ???????????buf[j]?=?tmp<<4; ????????else ????????{ ????????????buf[j]?+=?tmp; ????????????j++; ????????} ????} ????len?=?j; ????printf("Test?wr:"); ????for(i=0;i

編譯:arm-linux-gnueabihf-gcctest.c-otest

將編譯所得的BOOT.BIN以及image.ub文件拷貝至制作好的SD的BOOT區(qū),test文件拷貝至/home下。然后插上SD卡上電運行電路板:

登錄控制臺后,運行l(wèi)s /dev查看spidev設(shè)備是否加載成功:

f5d4c620-990e-11eb-8b86-12bb97331649.png

spidev設(shè)備掛載情況

可見spedev1.0、spidev1.1以及spidev2.0--spidev2.3加載成功,與預(yù)期一樣。

然后運行測試程序:

root@ax_peta:/run/media/mmcblk0p2/home#./test/dev/spidev1.078aa Testwr:78aa

示波器或者邏輯分析儀觀察對應(yīng)引腳,將出現(xiàn)正確的SPI通信波形。

總結(jié)一下

至此,就基本實現(xiàn)了從PS端Linux用戶空間訪問PL端的SPI從設(shè)備了。當然實際項目中還有很多細節(jié)需要進一步研究:

CPOL/CPHA 組合四種模式設(shè)置

SPI通信速率設(shè)置

從設(shè)備應(yīng)用協(xié)議程序編寫

AXI Quad SPI FIFO特性的深入應(yīng)用

AXI Quad SPI 其他模式及細節(jié)研究等

對于這些更細節(jié)的內(nèi)容,相信在將基本框架搭建成功后,只要深入細致研究都不會有太大的難度。從本文可看出,ZYNQ之所以如此靈活好用,是其廠家或者第三方提供了大量成熟可供使用的IP以及配套的驅(qū)動程序。如有興趣嘗試用來開發(fā)項目,相信你會很快喜歡上這個體系的芯片,真的可以做到片上即可實現(xiàn)系統(tǒng)這一目標!

編輯:jq

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • SPI
    SPI
    +關(guān)注

    關(guān)注

    17

    文章

    1688

    瀏覽量

    91215
  • CS
    CS
    +關(guān)注

    關(guān)注

    0

    文章

    54

    瀏覽量

    24477
  • AXI
    AXI
    +關(guān)注

    關(guān)注

    1

    文章

    127

    瀏覽量

    16575

原文標題:【ZYNQ實戰(zhàn)】利用AXI Quad SPI快速打通Linux至PL端SPI從設(shè)備

文章出處:【微信號:zhuyandz,微信公眾號:FPGA之家】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    利用Tl的智能高端開關(guān)實現(xiàn)SPI通信

    電子發(fā)燒友網(wǎng)站提供《利用Tl的智能高端開關(guān)實現(xiàn)SPI通信.pdf》資料免費下載
    發(fā)表于 09-24 09:28 ?0次下載
    <b class='flag-5'>利用</b>Tl的智能高端開關(guān)實現(xiàn)<b class='flag-5'>SPI</b>通信

    請問CYW20829能否通過Quad SPI連接固件、用戶數(shù)據(jù)和Quad SPI SRAM?

    我計劃在下圖所示的配置中使用 CYW20829。 是否可以使用 Quad SPI 連接固件、用戶數(shù)據(jù)和 Quad SPI SRAM?
    發(fā)表于 07-03 06:25

    請問ESP32-S3R8是否可以使用Quad SPI的Flash?

    手冊上標注其合封PSRAM為Octal SPI,外部flash時是否可以使用Quad SPI接口?是否需要額外的配置,對其選型有什么要求? 另外,外部PSRAM是否有推薦的型號或具體選型規(guī)格?我想評估一下成本怎樣組合比較合適,謝
    發(fā)表于 07-01 06:44

    使用ESP32C3的SPI2的時候,配置SPI接口后,SPI接口讀取設(shè)備的數(shù)據(jù)的時候會整體左偏移一bit,為什么?

    使用ESP32C3的SPI2的時候,配置SPI接口后,發(fā)現(xiàn)SPI接口讀取設(shè)備的數(shù)據(jù)的時候會整體左偏移一bit,
    發(fā)表于 06-20 06:55

    ESP32-C3作為SPI主機與機通訊,SPI切換為GPIO功能后無法再切換SPI功能了怎么解決?

    我的需求是ESP32-C3作為SPI主機與機通訊,通訊完成后SPI管腳切換為普通GPIO用于其他功能,待下次需要與機通訊時再切換為主機SPI
    發(fā)表于 06-06 06:49

    Vision Board上的SPI設(shè)備驅(qū)動配置和SPI主控的外部loopback功能測試

    感謝發(fā)燒友/* attach spi device */static int rt_spi_device_init(void){ ? ?struct rt_spi_configuration cfg
    的頭像 發(fā)表于 06-04 09:21 ?498次閱讀
    Vision Board上的<b class='flag-5'>SPI</b><b class='flag-5'>設(shè)備</b>驅(qū)動配置和<b class='flag-5'>SPI</b>主控的外部loopback功能測試

    有關(guān)PL利用AXI總線控制PSDDR進行讀寫(機wready信號一直不拉高)

    一直拉高的。這與寫數(shù)據(jù)通道好像有點區(qū)別。 我不清楚PS 的DDR到底發(fā)生了什么,但是和MIG核就是有點不一,通過仿真MIG核可以發(fā)現(xiàn),PL的DDR是會先一直發(fā)出wready信號的
    發(fā)表于 05-31 12:04

    讓STM32的SPI設(shè)備設(shè)備讀取數(shù)據(jù)時遇到的疑問求解

    STM32的SPI在作為主設(shè)備,與一個帶有SPI接口的AD芯片通信。 時鐘,相位都配置的對,數(shù)據(jù)位配置為8位。 我想問一下:在STM32的SPI設(shè)
    發(fā)表于 05-16 07:50

    STM32H7的Octo-SPI或者Quad-SPI能否支持讀取ADC的數(shù)據(jù)?

    ADC使用的AD7380.2通道4M的同步ADC。 SPI接口需要使用2個數(shù)據(jù)接收引腳 和一個數(shù)據(jù)輸出引腳。等于是三根數(shù)據(jù)線。 普通的SPI只有兩根線。Quad-SPI看描述說一般用于FLASH。 如果使用Octo-
    發(fā)表于 04-01 06:10

    請問QUAD SPI是否支持SD卡?

    如題,單線SPI讀取SD卡肯定沒有4線讀取的速率快,問題是STM32某些芯片沒有SDIO引腳,但是有QUAD SPI,不知道是否能4線驅(qū)動SD卡呢?
    發(fā)表于 03-25 06:34

    ModusToolbox中如何設(shè)置CYW20719B2的Quad SPI接口?

    您好, 請問Modus Toolbox 中如何設(shè)置CYW20719B2的Quad SPI接口? 我利用下圖方法 打開了wiced_btsdk下的design.modus文件,并配置了SPI
    發(fā)表于 03-01 11:16

    超詳細的SPI原理和通信模式

    SPI分為主、兩種模式,一個SPI通訊系統(tǒng)需要包含一個(且只能是一個)主設(shè)備,一個或多個設(shè)備
    發(fā)表于 02-29 12:33 ?3915次閱讀
    超詳細的<b class='flag-5'>SPI</b>原理和通信模式

    硬件spi和軟件spi的區(qū)別

    硬件SPI(串行外設(shè)接口)和軟件SPI是兩種不同的SPI傳輸方式。SPI是一種同步串行數(shù)據(jù)通信協(xié)議,通常用于連接微控制器和外部設(shè)備,如存儲器
    的頭像 發(fā)表于 12-26 16:55 ?5514次閱讀

    linux內(nèi)核中的SPI框架及SPI核心的初始化簡析

    在嵌入式linux開發(fā)中,SPI是一種常見的通信方式
    的頭像 發(fā)表于 12-11 09:10 ?1993次閱讀
    <b class='flag-5'>linux</b>內(nèi)核中的<b class='flag-5'>SPI</b>框架及<b class='flag-5'>SPI</b>核心的初始化簡析

    SPI接口的相關(guān)介紹

    SPI和IIC接口一是非常常見的開發(fā)板接口,但與IIC相比,SPI設(shè)計了一種二進制流的交互方式,擁有更快的傳輸速度,它可以在任何兩個嵌入式設(shè)備之間交換消息,ELF1開發(fā)板也是通過
    的頭像 發(fā)表于 12-06 15:49 ?1218次閱讀
    <b class='flag-5'>SPI</b>接口的相關(guān)介紹