電子產(chǎn)業(yè)一站式賦能平臺

PCB聯(lián)盟網(wǎng)

搜索
查看: 1571|回復(fù): 1
收起左側(cè)

創(chuàng)龍基于AM437x的FPGA與ARM通信測試

[復(fù)制鏈接]

678

主題

902

帖子

8293

積分

高級會員

Rank: 5Rank: 5

積分
8293
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2020-9-3 11:22:20 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
1、FPGA與ARM基于I2C通信測試表 1
開發(fā)板型號
是否支持本實驗
TL437x-EVM
不支持
TL437x-EasyEVM
不支持
TL437x-IDK
不支持
TL437xF-EVM
支持

本測試程序?qū)PGA模擬成I2C設(shè)備,設(shè)備地址為0x2A,ARM使用I2C0總線對此I2C設(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 i2c_test.bit
​
圖 1

此.bit文件主要實現(xiàn)FPGA和ARM的I2C通信功能,.bit文件、.mcs文件和源碼位于FPGA光盤”Demo\app\IIC\”目錄下。
執(zhí)行如下命令查看掛載到I2C0總線的I2C設(shè)備地址,此處查詢到的地址為0x2A。
Target#i2cdetect -r -y 0
​
圖 2

執(zhí)行如下命令對I2C設(shè)備0x00地址寫0x55:
Target#i2cset -f -y 0 0x2a 0x00 0x55
執(zhí)行如下命令讀取I2C設(shè)備0x00地址的值:
Target#i2cget -f -y 0 0x2a 0x00
​
圖 3

執(zhí)行如下命令對I2C設(shè)備0x01地址寫0xe0,開發(fā)板底板FPGA端LED5、LED6、LED7會被點亮。
Target#i2cset -f -y 0 0x2a 0x01 0xe0
執(zhí)行如下命令對I2C設(shè)備0x01地址寫0x00,開發(fā)板底板FPGA端LED5、LED6、LED7會被熄滅。
Target#i2cset -f -y 0 0x2a 0x01 0x00
​
圖 4

FPGA端按鍵狀態(tài)會保存在I2C設(shè)備0x02地址中。執(zhí)行如下命令讀取I2C設(shè)備0x02地址的值:
Target#i2cget -f -y 0 0x2a 0x02
​
圖 5

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

2、FPGA與ARM基于GPMC通信測試表 2
開發(fā)板型號
是否支持本實驗
TL437x-EVM
不支持
TL437x-EasyEVM
不支持
TL437x-IDK
不支持
TL437xF-EVM
支持

本測試程序?qū)PGA模擬成GPMC內(nèi)存設(shè)備,對 Linux系統(tǒng)而言,等效于外接內(nèi)存。使用GMPC總線進行讀寫操作時,只需通過 mmap函數(shù)將物理地址映射為用戶空間地址,就可以像對內(nèi)存一樣進行讀寫操作。
進入開發(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"目錄的內(nèi)存讀寫工具可執(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ù)線地址線復(fù)用,已設(shè)置最大訪問范圍是16MB。
"error rate=0.0%"表示讀取回來的數(shù)據(jù)與寫入的數(shù)據(jù)一致,即GPMC通信正常。
  • devmem2工具使用說明
  • devmem2工具測試內(nèi)存讀寫速率以及錯誤率,命令格式為: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位。調(diào)用memset進行寫,調(diào)用memcpy進行讀。
d:每次讀寫32位。
當type參數(shù)為b、h、w、m時,輸出讀寫數(shù)據(jù)的大小、讀寫速度以及錯誤率。當type 參數(shù)為d時,輸出寫到指定內(nèi)存和從中讀取出來的值。
data表示將要寫進內(nèi)存的內(nèi)容,為32位無符號整型數(shù)。但是在寫時會根據(jù)每次讀寫的寬度進行截取。當type參數(shù)為b或者m時,將data截取前8位。當type參數(shù)為h時,將data截取前16位。當type參數(shù)為w時,不截取。
對同一個物理地址,根據(jù)不同的參數(shù),讀取的結(jié)果會有差異。經(jīng)過測試,使用m選項進行讀寫時,可以獲得較高的讀寫速率。另外,讀寫數(shù)據(jù)的長度length越大,測得的讀寫速度越準確。

3、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顯示采集到的信號波形。整個過程的流程示意圖大致如下:
​
進入內(nèi)核源碼,打開”arch/arm/boot/dts/”目錄下的對應(yīng)板型的設(shè)備樹源文件。
NAND FLASH版本TL437xF-EVM開發(fā)板:am437x-gp-evm-fpga-nandflash.dts
eMMC版本TL437xF-EVM開發(fā)板:am437x-gp-evm-fpga-emmc.dts
在如下對應(yīng)位置添加以下代碼,注冊按鍵事件來接收FPGA采集完成的中斷,如下圖所示:
button@2 {
label = "user-gpio5_7";
linux,code = <240>;
gpios = <&gpio5 7 GPIO_ACTIVE_LOW>;
gpio-key,wakeup;
debounce-interval=<0>;
};
&#8203;
圖 9

在如下對應(yīng)位置添加以下代碼,設(shè)置中斷管腳為輸入模式,如下圖所示:
0x25c (PIN_INPUT_PULLUP | MUX_MODE7) /*emu1.gpio5_7 */
&#8203;
圖 10

修改完成后,重新編譯設(shè)備樹,使用“arch/arm/boot/dts”目錄下新生成的.dtb設(shè)備樹文件啟動開發(fā)板文件系統(tǒng)。ARM光盤”Demo\qt\AD8568_GPMC\bin”目錄下的am437x-gp-evm.dtb為驗證通過的設(shè)備樹文件。
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”目錄下的所有相關(guān)庫文件拷貝到開發(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接口,并將模塊對應(yīng)通道連接信號源發(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
&#8203;
圖 11

此.bit文件主要實現(xiàn)FPGA端采集AD數(shù)據(jù),并通過GPMC總線把數(shù)據(jù)送往ARM端。
在AD_Test所在路徑下,執(zhí)行如下命令運行Qt程序,顯示AD數(shù)據(jù)波形。
Target# ./AD_Test -plugin Tslib
&#8203;
圖 12

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

4、基于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ù)線復(fù)用的通信模式。實際連接中只用16位數(shù)據(jù)線,不使用地址線。
本實驗實現(xiàn)功能:ARM端通過GPMC讀取FPGA端的數(shù)據(jù),F(xiàn)PGA端實現(xiàn)每個nOE信號下降沿來的時候,把16bit的數(shù)據(jù)送到GPMC_DATA端口,并自加一次。
&#8203;
圖 13

4.1設(shè)備樹源碼修改及編譯本實驗需要按照如下方法配置設(shè)備樹文件下的GPMC時序。為便于客戶測試,我司提供經(jīng)驗證的dtb文件位于“光盤\Demo\app\gpmc_edma_read\bin”目錄下。直接將其拷貝到開發(fā)板文件系統(tǒng)“/boot”目錄即可。
打開Ubuntu,進入Linux內(nèi)核源碼頂層目錄執(zhí)行如下指令,打開TL437xF-EVM開發(fā)板對應(yīng)的設(shè)備樹源文件:
Host#vi arch/arm/boot/dts/am437x-gp-evm-fpga-nandflash.dts
&#8203;
圖 14

按照下圖方法,在打開的設(shè)備樹源文件“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>;
&#8203;
圖 15

配置完成后保存退出,在內(nèi)核源碼頂層目錄下執(zhí)行如下指令編譯生成“arch/arm/boot/dts/am437x-gp-evm-fpga-nandflash.dts”設(shè)備樹文件。
Host#make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- am437x-gp-evm-fpga-nandflash.dtb
&#8203;
圖 16
將編譯生成的“am437x-gp-evm-fpga-nandflash.dtb”文件重命名為am437x-gp-evm.dtb,并替換掉SD系統(tǒng)啟動卡rootfs分區(qū)“/boot”目錄下原來的am437x-gp-evm.dtb文件。
4.2EDMA連續(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
&#8203;
圖 17

執(zhí)行如下命令燒寫FPGA端的gpmc_fifo.bit文件,打印信息中,如果FPGA_DONE的值為1,則表示.bit文件加載成功。
Target# ./flash_fpga.sh gpmc_fifo.bit
&#8203;
圖 18

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

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

4.3不使用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

&#8203;
圖 20
執(zhí)行如下指令,不使用EDMA,在CPU控制下連續(xù)讀取FPGA端的數(shù)據(jù):
Target# ./tl-devmem2_read 0x1000000 2048 m 0x12

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

嵌入式DSP、ARM、FPGA多核技術(shù)開發(fā),學(xué)習(xí)資料下載:http://site.tronlong.com/pfdownload
回復(fù)

使用道具 舉報

發(fā)表回復(fù)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則


聯(lián)系客服 關(guān)注微信 下載APP 返回頂部 返回列表