基于AM437xFPGA與ARM通信測試

      網(wǎng)友投稿 7577 2022-05-28

      FPGA與ARM基于I2C通信測試

      表 1

      開發(fā)板型號

      是否支持本實驗

      TL437x-EVM

      不支持

      TL437x-EasyEVM

      不支持

      TL437x-IDK

      不支持

      TL437xF-EVM

      支持

      本測試程序將FPGA模擬成I2C設備,設備地址為0x2A,ARM使用I2C0總線對此I2C設備進行讀寫。

      進入開發(fā)板文件系統(tǒng)的”/opt”目錄,執(zhí)行如下命令初始化FPGA程序加載功能的管腳。

      Target# ./set_flash_fpga_pin.sh

      執(zhí)行如下命令啟動FPGA程序加載功能,由ARM通過SPI總線加載.bit文件到FPGA中運行。打印信息中,如果FPGA_DONE的值為1,則表示.bit文件加載成功。

      Target# ./flash_fpga.sh i2c_test.bit

      圖 1

      此.bit文件主要實現(xiàn)FPGA和ARM的I2C通信功能,.bit文件、.mcs文件和源碼位于FPGA光盤”Demo\app\IIC\”目錄下。

      執(zhí)行如下命令查看掛載到I2C0總線的I2C設備地址,此處查詢到的地址為0x2A。

      Target# i2cdetect -r -y 0

      圖 2

      執(zhí)行如下命令對I2C設備0x00地址寫0x55:

      Target# i2cset -f -y 0 0x2a 0x00 0x55

      執(zhí)行如下命令讀取I2C設備0x00地址的值:

      Target# i2cget -f -y 0 0x2a 0x00

      圖 3

      執(zhí)行如下命令對I2C設備0x01地址寫0xe0,開發(fā)板底板FPGA端LED5、LED6、LED7會被點亮。

      Target# i2cset -f -y 0 0x2a 0x01 0xe0

      執(zhí)行如下命令對I2C設備0x01地址寫0x00,開發(fā)板底板FPGA端LED5、LED6、LED7會被熄滅。

      Target# i2cset -f -y 0 0x2a 0x01 0x00

      圖 4

      FPGA端按鍵狀態(tài)會保存在I2C設備0x02地址中。執(zhí)行如下命令讀取I2C設備0x02地址的值:

      Target# i2cget -f -y 0 0x2a 0x02

      圖 5

      分別長按開發(fā)板FPGA端按鍵KEY6、KEY7,并讀取I2C設備0x02地址的值,分別為0xC0、0xA0。

      圖 6

      FPGA與ARM基于GPMC通信測試

      表?2

      開發(fā)板型號

      是否支持本實驗

      TL437x-EVM

      不支持

      TL437x-EasyEVM

      不支持

      TL437x-IDK

      不支持

      TL437xF-EVM

      支持

      本測試程序將FPGA模擬成GPMC內存設備,對?Linux系統(tǒng)而言,等效于外接內存。使用GMPC總線進行讀寫操作時,只需通過?mmap函數(shù)將物理地址映射為用戶空間地址,就可以像對內存一樣進行讀寫操作。

      進入開發(fā)板文件系統(tǒng)的”/opt”目錄,執(zhí)行如下命令初始化FPGA程序加載功能的管腳。

      Target# ./set_flash_fpga_pin.sh

      執(zhí)行如下命令啟動FPGA程序加載功能,由ARM通過SPI總線加載.bit文件到FPGA中運行。打印信息中,如果FPGA_DONE的值為1,則表示.bit文件加載成功。

      Target# ./flash_fpga.sh gpmc.bit

      圖 7

      此.bit文件主要實現(xiàn)FPGA和ARM的GPMC通信功能,.bit文件、.mcs文件和源碼位于FPGA光盤”Demo\app\GPMC\”目錄下。

      將ARM光盤"Demo\app\devmem2\bin"目錄的內存讀寫工具可執(zhí)行鏡像文件devmem2拷貝到開發(fā)板文件系統(tǒng)任意路徑。devmem2使用mmap將物理地址映射為進程的虛擬地址,然后對這個虛擬地址進行讀寫操作。

      在devmem2文件所在路徑,執(zhí)行如下命令進行讀寫。

      Target# ./devmem2?0x1000000?10000000?m?0x12

      圖 8

      以上命令的作用是:向物理地址0x01000000中,寫入長度為10000000字節(jié)數(shù)據(jù)0x12,然后將其讀取出來,從而獲得讀寫速度以及錯誤率。讀寫時,使用"memset/memcpy"函數(shù)。

      FPGA連接到ARM的GPMC總線CS1的起始地址為0x1000000,GPMC數(shù)據(jù)線位寬為16bit,數(shù)據(jù)線地址線復用,已設置最大訪問范圍是16MB。

      "error rate=0.0%"表示讀取回來的數(shù)據(jù)與寫入的數(shù)據(jù)一致,即GPMC通信正常。

      devmem2工具使用說明

      devmem2工具測試內存讀寫速率以及錯誤率,命令格式為:devmem2 phy_addr length type data,含義是向地址phy_addr中寫入length字節(jié)的data,然后將其讀取出來,從而獲得讀寫的速度以及錯誤率。

      每次讀寫的寬度根據(jù)type來確定,phy_addr表示物理地址,length表示讀寫的長度(以字節(jié)為單位),type可選b、h、w、m 或 d。

      b:每次讀寫8位。

      h:每次讀寫16位。

      w:每次讀寫32位。

      m:每次讀寫8位。調用memset進行寫,調用memcpy進行讀。

      d:每次讀寫32位。

      當type參數(shù)為b、h、w、m時,輸出讀寫數(shù)據(jù)的大小、讀寫速度以及錯誤率。當type 參數(shù)為d時,輸出寫到指定內存和從中讀取出來的值。

      data表示將要寫進內存的內容,為32位無符號整型數(shù)。但是在寫時會根據(jù)每次讀寫的寬度進行截取。當type參數(shù)為b或者m時,將data截取前8位。當type參數(shù)為h時,將data截取前16位。當type參數(shù)為w時,不截取。

      (4)對同一個物理地址,根據(jù)不同的參數(shù),讀取的結果會有差異。經(jīng)過測試,使用m選項進行讀寫時,可以獲得較高的讀寫速率。另外,讀寫數(shù)據(jù)的長度length越大,測得的讀寫速度越準確。

      AD8568數(shù)據(jù)采集顯示綜合例程

      表?3

      開發(fā)板型號

      是否支持本實驗

      TL437x-EVM

      不支持

      TL437x-EasyEVM

      不支持

      TL437x-IDK

      不支持

      TL437xF-EVM

      支持

      本例程使用TL8568P/TL8568-B的AD采集模塊進行測試。此模塊基于TI公司的ADS8568芯片,8通道、雙極性、16位、510KSPS,用于并行采集多路AD數(shù)據(jù)。

      例程實現(xiàn)的功能是:FPGA控制AD8568進行數(shù)據(jù)采集,再將采集到的數(shù)據(jù)通過GPMC總線送到ARM端,ARM端使用運行Qt顯示采集到的信號波形。整個過程的流程示意圖大致如下:

      進入內核源碼,打開”arch/arm/boot/dts/”目錄下的對應板型的設備樹源文件。

      NAND FLASH版本TL437xF-EVM開發(fā)板:am437x-gp-evm-fpga-nandflash.dts

      eMMC版本TL437xF-EVM開發(fā)板:am437x-gp-evm-fpga-emmc.dts

      在如下對應位置添加以下代碼,注冊按鍵事件來接收FPGA采集完成的中斷,如下圖所示:

      基于AM437x的FPGA與ARM通信測試

      button@2 {

      label = "user-gpio5_7";

      linux,code = <240>;

      gpios = <&gpio5 7 GPIO_ACTIVE_LOW>;

      gpio-key,wakeup;

      debounce-interval=<0>;

      };

      圖 9

      在如下對應位置添加以下代碼,設置中斷管腳為輸入模式,如下圖所示:

      0x25c (PIN_INPUT_PULLUP | MUX_MODE7) /*emu1.gpio5_7 */

      圖 10

      修改完成后,重新編譯設備樹,使用“arch/arm/boot/dts”目錄下新生成的.dtb設備樹文件啟動開發(fā)板文件系統(tǒng)。ARM光盤”Demo\qt\AD8568_GPMC\bin”目錄下的am437x-gp-evm.dtb為驗證通過的設備樹文件。

      ARM光盤”Demo\qt\AD8568_GPMC\bin”目錄下的AD_Test為Qt程序可執(zhí)行鏡像。ARM光盤”Demo\qt\AD8568_GPMC\src\AD_Test”目錄為工程源碼。如果需要重新編譯工程,請修改工程源碼目錄下的AD_Test.pro文件中的QWT組件的安裝路徑參數(shù)為實際安裝路徑。

      將Qt程序可執(zhí)行鏡像AD_Test拷貝開發(fā)板文件系統(tǒng)任意路徑下。將ARM光盤”Demo\qt\AD8568_GPMC\bin\lib”目錄下的所有相關庫文件拷貝到開發(fā)板文件系統(tǒng)“/usr/lib”目錄下。

      將FPGA光盤“Demo\app\AD8568_GPMC\bin”目錄下的.bit文件ad8568_gpmc-0.bit/ad8568_gpmc-1.bit拷貝到開發(fā)板文件系統(tǒng)”/opt”目錄。FPGA光盤“Demo\app\AD8568_GPMC\src”為FPGA工程源碼。

      開發(fā)板連接7寸LCD顯示屏,將AD模塊插入到開發(fā)板的FPGA ExPORT0/ExPORT1接口,并將模塊對應通道連接信號源發(fā)生器的輸入端,然后將模塊AGND連接信號源發(fā)生器的地。模塊量程為±10V。

      執(zhí)行如下命令終止Matrix程序:

      Target# /etc/init.d/matrix-gui-2.0 stop

      進入開發(fā)板文件系統(tǒng)的”/opt”目錄,執(zhí)行如下命令初始化FPGA程序加載功能的管腳。

      Target# ./set_flash_fpga_pin.sh

      執(zhí)行如下命令啟動FPGA程序加載功能,由ARM通過SPI總線加載.bit文件到FPGA中運行。打印信息中,如果FPGA_DONE的值為1,則表示.bit文件加載成功。

      Target# ./flash_fpga.sh ad8568_gpmc-0.bit

      圖 11

      此.bit文件主要實現(xiàn)FPGA端采集AD數(shù)據(jù),并通過GPMC總線把數(shù)據(jù)送往ARM端。

      在AD_Test所在路徑下,執(zhí)行如下命令運行Qt程序,顯示AD數(shù)據(jù)波形。

      Target# ./AD_Test -plugin Tslib

      圖 12

      點擊屏幕上的pause按鈕后,波形暫停在某個狀態(tài),再點擊start按鈕,屏幕又開始顯示動態(tài)的波形,點擊Exit退出顯示。

      基于TL37xF-EVM的GPMC數(shù)據(jù)讀取

      表 4

      開發(fā)板型號

      是否支持本實驗

      TL437x-EVM

      不支持

      TL437x-EasyEVM

      不支持

      TL437x-IDK

      不支持

      TL437xF-EVM

      支持

      本實驗使用TL437xF-EVM開發(fā)板,SOM-TL437xF核心板硬件鏈接上,AM437x已通過GPMC總線連接FPGA芯片,并配置為異步、地址數(shù)據(jù)線復用的通信模式。實際連接中只用16位數(shù)據(jù)線,不使用地址線。

      本實驗實現(xiàn)功能:ARM端通過GPMC讀取FPGA端的數(shù)據(jù),F(xiàn)PGA端實現(xiàn)每個nOE信號下降沿來的時候,把16bit的數(shù)據(jù)送到GPMC_DATA端口,并自加一次。

      圖 13

      設備樹源碼修改及編譯

      本實驗需要按照如下方法配置設備樹文件下的GPMC時序。為便于客戶測試,我司提供經(jīng)驗證的dtb文件位于“光盤\Demo\app\gpmc_edma_read\bin”目錄下。直接將其拷貝到開發(fā)板文件系統(tǒng)“/boot”目錄即可。

      打開Ubuntu,進入Linux內核源碼頂層目錄執(zhí)行如下指令,打開TL437xF-EVM開發(fā)板對應的設備樹源文件:

      Host# vi arch/arm/boot/dts/am437x-gp-evm-fpga-nandflash.dts

      圖 14

      按照下圖方法,在打開的設備樹源文件“nor@1,0”節(jié)點中配置GPMC的時序:

      gpmc,mux-add-data = <0>;?/* 1: address-address-data multiplexing mode, 2: address-data multiplexing mode. ?配置為模式0表示不使用地址*/

      gpmc,cs-on-ns = <0>;

      gpmc,cs-rd-off-ns = <28>;

      gpmc,cs-wr-off-ns = <5>;

      gpmc,adv-on-ns = <0>;

      gpmc,adv-rd-off-ns = <0>;

      gpmc,adv-wr-off-ns = <0>;

      gpmc,oe-on-ns = <10>;

      gpmc,oe-off-ns = <10>;

      gpmc,we-on-ns = <5>;

      gpmc,we-off-ns = <5>;

      gpmc,rd-cycle-ns = <28>;

      gpmc,wr-cycle-ns = <10>;

      gpmc,access-ns = <20>;

      gpmc,page-burst-access-ns = <0>;

      gpmc,wr-data-mux-bus-ns = <0>;

      gpmc,wr-access-ns = <0>;

      圖 15

      配置完成后保存退出,在內核源碼頂層目錄下執(zhí)行如下指令編譯生成“arch/arm/boot/dts/am437x-gp-evm-fpga-nandflash.dts”設備樹文件。

      Host# make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- am437x-gp-evm-fpga-nandflash.dtb

      圖 16

      將編譯生成的“am437x-gp-evm-fpga-nandflash.dtb”文件重命名為am437x-gp-evm.dtb,并替換掉SD系統(tǒng)啟動卡rootfs分區(qū)“/boot”目錄下原來的am437x-gp-evm.dtb文件。

      使用EDMA連續(xù)讀取數(shù)據(jù)測試

      將光盤“Demo\app\gpmc_edma_read\bin”目錄下gpmc_edma_read.ko和gpmc_fifo.bit文件拷貝到開發(fā)板文件系統(tǒng)“/opt”目錄下。

      開發(fā)板上電啟動,進入文件系統(tǒng)的“/opt”目錄,執(zhí)行如下命令初始化FPGA程序加載功能的管腳。

      Target#? ./set_flash_fpga_pin.sh

      圖 17

      執(zhí)行如下命令燒寫FPGA端的gpmc_fifo.bit文件,打印信息中,如果FPGA_DONE的值為1,則表示.bit文件加載成功。

      Target# ./flash_fpga.sh gpmc_fifo.bit

      圖 18

      執(zhí)行如下指令加載gpmc_edma_read.ko驅動模塊,由下圖可見使用EDMA連續(xù)讀取到的數(shù)據(jù)從FFFF遞減1到F000:

      Target# insmod gpmc_edma_read.ko

      圖 19

      本次傳輸數(shù)據(jù)大小為8 Kbytes,傳輸時間為169-35=134us,可以算出使用EDMA數(shù)據(jù)傳輸數(shù)率大小約為60MB/s。

      不使用EDMA連續(xù)讀取數(shù)據(jù)測試

      將光盤“Demo\app\gpmc_edma_read\bin”目錄下的tl-devmem2_read文件拷貝到開發(fā)板文件系統(tǒng)“/opt”目錄下。

      開發(fā)板上電進入文件系統(tǒng)的“/opt”目錄,依次執(zhí)行如下命令初始化FPGA程序加載功能的管腳,并燒寫FPGA端的gpmc_fifo.bit文件:

      Target#? ./set_flash_fpga_pin.sh

      Target# ./flash_fpga.sh gpmc_fifo.bit

      圖 20

      執(zhí)行如下指令,不使用EDMA,在CPU控制下連續(xù)讀取FPGA端的數(shù)據(jù):

      Target# ./tl-devmem2_read 0x1000000 2048 m 0x12

      、圖 21

      由上圖可見,在這種模式下,數(shù)據(jù)傳輸速率為33.675MB/s,并且CPU的占用率會比較高。

      ARM FPGA

      版權聲明:本文內容由網(wǎng)絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內刪除侵權內容。

      上一篇:【90 天挑戰(zhàn) HCIE Cloud】第 3 天 編輯器之神 VI
      下一篇:華為云數(shù)據(jù)庫攜新品驚艷亮相2019華為全聯(lián)接大會
      相關文章
      亚洲午夜av影院| 久久精品九九亚洲精品天堂| 国产精品亚洲二区在线观看 | 亚洲AV无码国产一区二区三区| 亚洲国产美女视频| 亚洲a一级免费视频| 亚洲av无码一区二区三区不卡 | 亚洲午夜福利精品久久| 日韩色日韩视频亚洲网站| 亚洲中文字幕乱码AV波多JI| 亚洲精品午夜国产va久久| 456亚洲人成在线播放网站| 亚洲精品伊人久久久久| 亚洲AV日韩综合一区尤物| 亚洲熟妇成人精品一区| 亚洲色大成网站www尤物| 亚洲欧美不卡高清在线| 亚洲AV一区二区三区四区| 久久亚洲AV成人无码国产最大| 亚洲av成人一区二区三区观看在线| 亚洲国产精品日韩av不卡在线| 亚洲av午夜国产精品无码中文字| 欧洲亚洲国产精华液| 国产精品亚洲一区二区无码| 久久久亚洲精华液精华液精华液| 国产精品久久久久久亚洲小说| 亚洲成AⅤ人影院在线观看| 国产黄色一级毛片亚洲黄片大全| 中文字幕亚洲无线码| 亚洲产国偷V产偷V自拍色戒| 亚洲第一视频网站| 亚洲国产美女视频| 亚洲人成网站999久久久综合| 色偷偷噜噜噜亚洲男人| 亚洲精品成人片在线观看| 亚洲精品午夜无码电影网| 国产AV无码专区亚洲A∨毛片| 99久久亚洲精品无码毛片| 亚洲国产成人91精品| 亚洲欧美日韩中文字幕在线一区| 国产成人综合亚洲一区|