[導(dǎo)讀] 前面寫過篇介紹ZYNQ基本情況的文章,今天來肝一篇實戰(zhàn)文章介紹AXI quad SPI 使用方法,如果你正使用ZYNQ的這個IP,希望對你有所幫助。
初識AXI quad SPI
自《PG153 AXI Quad SPI v3.2》
支持:
Legacy Mode
standard mode: 準SPI通常就稱SPI,它是一種串行外設(shè)接口規(guī)范,有4根通信腳:SCK (時鐘), CS(片選), MOSI(主出從入), MISO(主入從出)。
Dual/Quad SPI Mode:
AXI QuadSPI 模式
在標準模式下,支持高達32個從站,這是非常靈活的指標。本文對于手冊中的詳細技術(shù)細節(jié)不做過多闡述,有興趣的自行深入閱讀研究。
該SPI IP能干神馬呢?
完成如下這樣一個應(yīng)用場景:
SPI IP訪問多從SPI芯片
所需要實現(xiàn)的需求用例為:
本文實現(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)下面的訪問層級:
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
Block設(shè)計圖
使能ZYNQ7 processing System的時鐘PL Fabric clocks,用以驅(qū)動PL端的IP:
PL Fabric clocks設(shè)置
使能M AXI GP0接口如下:
M AXI GP0設(shè)置
雙擊AXI interconnect,設(shè)置2主1從:
AXI interconnect設(shè)置
雙擊axi_quad_spi_0設(shè)置如下,設(shè)置4個從設(shè)備(最多可支持32個從設(shè)備,PS端內(nèi)置的SPI控制器1個最多支持3個從設(shè)備,從這一點可看出該IP的靈活性)
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è)還有一個很重要的配置,就是其地址范圍:
AXI quad SPI地址設(shè)置
該地址最終將導(dǎo)出到設(shè)備樹描述文件,用于SPI控制器驅(qū)動訪問,從而讓SPI控制器驅(qū)動得以與該IP通過AXI總線進行通信。
導(dǎo)出硬件文件
點擊open elaborated design ,然后打開io ports進行管腳分配,這需要根據(jù)各自的硬件實際情況進行設(shè)置,比如我是這樣設(shè)置的:
管腳約束設(shè)置
電平標準
是否上拉
驅(qū)動能力
.....
然后點擊Run synthesis進行綜合,成功之后點擊生成bit stream。再點擊export hardware,得到.hdf文件,這個文件用于構(gòu)建內(nèi)核。
導(dǎo)出硬件描述文件
將得到的硬件描述hdf文件以及bitstream文件拷貝至內(nèi)核編譯文件夾下:
硬件描述及bit文件
配置編譯內(nèi)核
運行命令讀取硬件描述文件:
petalinux-config--get-hw-description../base.sdk
注:這里將hdf文件以及.bit文件放置在petalinux編譯路徑的上級目錄的base.sdk,根據(jù)習(xí)慣可自行設(shè)置,只有上述命令傳入的路徑正確即可。
等待一段時間后,可得到一個配置界面,用于配置內(nèi)核源、u-boot源、Image 等配置。
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
內(nèi)核配置
對于本應(yīng)用而言,需要配置SPI驅(qū)動:
DeviceDrivers---> +-SPIsupport--->
配置如下:
SPI控制器及設(shè)備驅(qū)動配置
這里調(diào)試中遇到一個奇怪的問題,CONFIG_SUSPEND需要禁止,否則控制器驅(qū)動加載不成功,目前還沒有深入研究為什么不成功,猜想可能是主控制器驅(qū)動關(guān)于SUSPEND功能還不支持或者有bug,如果有哪位大神知道怎么解決請求留言指點。
Powermanagementoptions---> SuspendtoRAMandstandby
功能管理配置
退出并保存配置,然后運行下面命令編譯系統(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
編譯:arm-linux-gnueabihf-gcctest.c-otest
將編譯所得的BOOT.BIN以及image.ub文件拷貝至制作好的SD的BOOT區(qū),test文件拷貝至/home下。然后插上SD卡上電運行電路板:
登錄控制臺后,運行l(wèi)s /dev查看spidev設(shè)備是否加載成功:
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
-
SPI
+關(guān)注
關(guān)注
17文章
1688瀏覽量
91215 -
CS
+關(guān)注
關(guān)注
0文章
54瀏覽量
24477 -
AXI
+關(guān)注
關(guān)注
1文章
127瀏覽量
16575
原文標題:【ZYNQ實戰(zhàn)】利用AXI Quad SPI快速打通Linux至PL端SPI從設(shè)備
文章出處:【微信號:zhuyandz,微信公眾號:FPGA之家】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論