|
FPGA與ARM基于I2C通信測(cè)試
表 1
開(kāi)發(fā)板型號(hào)
| 是否支持本實(shí)驗(yàn)
| TL437x-EVM
| 不支持
| TL437x-EasyEVM
| 不支持
| TL437x-IDK
| 不支持
| TL437xF-EVM
| 支持
|
本測(cè)試程序?qū)PGA模擬成I2C設(shè)備,設(shè)備地址為0x2A,ARM使用I2C0總線對(duì)此I2C設(shè)備進(jìn)行讀寫(xiě)。
進(jìn)入開(kāi)發(fā)板文件系統(tǒng)的”/opt”目錄,執(zhí)行如下命令初始化FPGA程序加載功能的管腳。
Target#./set_flash_fpga_pin.sh
執(zhí)行如下命令啟動(dòng)FPGA程序加載功能,由ARM通過(guò)SPI總線加載.bit文件到FPGA中運(yùn)行。打印信息中,如果FPGA_DONE的值為1,則表示.bit文件加載成功。
Target#./flash_fpga.sh i2c_test.bit
​
圖 1
此.bit文件主要實(shí)現(xiàn)FPGA和ARM的I2C通信功能,.bit文件、.mcs文件和源碼位于FPGA光盤(pán)”Demo\app\IIC\”目錄下。
執(zhí)行如下命令查看掛載到I2C0總線的I2C設(shè)備地址,此處查詢到的地址為0x2A。
Target#i2cdetect -r -y 0
​
圖 2
執(zhí)行如下命令對(duì)I2C設(shè)備0x00地址寫(xiě)0x55:
Target#i2cset -f -y 0 0x2a 0x00 0x55
執(zhí)行如下命令讀取I2C設(shè)備0x00地址的值:
Target#i2cget -f -y 0 0x2a 0x00
​
圖 3
執(zhí)行如下命令對(duì)I2C設(shè)備0x01地址寫(xiě)0xe0,開(kāi)發(fā)板底板FPGA端LED5、LED6、LED7會(huì)被點(diǎn)亮。
Target#i2cset -f -y 0 0x2a 0x01 0xe0
執(zhí)行如下命令對(duì)I2C設(shè)備0x01地址寫(xiě)0x00,開(kāi)發(fā)板底板FPGA端LED5、LED6、LED7會(huì)被熄滅。
Target#i2cset -f -y 0 0x2a 0x01 0x00
​
圖 4
FPGA端按鍵狀態(tài)會(huì)保存在I2C設(shè)備0x02地址中。執(zhí)行如下命令讀取I2C設(shè)備0x02地址的值:
Target#i2cget -f -y 0 0x2a 0x02
​
圖 5
分別長(zhǎng)按開(kāi)發(fā)板FPGA端按鍵KEY6、KEY7,并讀取I2C設(shè)備0x02地址的值,分別為0xC0、0xA0。
​
圖 6
FPGA與ARM基于GPMC通信測(cè)試
表 2
開(kāi)發(fā)板型號(hào)
| 是否支持本實(shí)驗(yàn)
| TL437x-EVM
| 不支持
| TL437x-EasyEVM
| 不支持
| TL437x-IDK
| 不支持
| TL437xF-EVM
| 支持
|
本測(cè)試程序?qū)PGA模擬成GPMC內(nèi)存設(shè)備,對(duì) Linux系統(tǒng)而言,等效于外接內(nèi)存。使用GMPC總線進(jìn)行讀寫(xiě)操作時(shí),只需通過(guò) mmap函數(shù)將物理地址映射為用戶空間地址,就可以像對(duì)內(nèi)存一樣進(jìn)行讀寫(xiě)操作。
進(jìn)入開(kāi)發(fā)板文件系統(tǒng)的”/opt”目錄,執(zhí)行如下命令初始化FPGA程序加載功能的管腳。
Target#./set_flash_fpga_pin.sh
執(zhí)行如下命令啟動(dòng)FPGA程序加載功能,由ARM通過(guò)SPI總線加載.bit文件到FPGA中運(yùn)行。打印信息中,如果FPGA_DONE的值為1,則表示.bit文件加載成功。
Target#./flash_fpga.sh gpmc.bit
​ 圖 7
此.bit文件主要實(shí)現(xiàn)FPGA和ARM的GPMC通信功能,.bit文件、.mcs文件和源碼位于FPGA光盤(pán)”Demo\app\GPMC\”目錄下。
將ARM光盤(pán)"Demo\app\devmem2\bin"目錄的內(nèi)存讀寫(xiě)工具可執(zhí)行鏡像文件devmem2拷貝到開(kāi)發(fā)板文件系統(tǒng)任意路徑。devmem2使用mmap將物理地址映射為進(jìn)程的虛擬地址,然后對(duì)這個(gè)虛擬地址進(jìn)行讀寫(xiě)操作。
在devmem2文件所在路徑,執(zhí)行如下命令進(jìn)行讀寫(xiě)。
Target#./devmem2 0x1000000 10000000 m 0x12
​
圖 8
以上命令的作用是:向物理地址0x01000000中,寫(xiě)入長(zhǎng)度為10000000字節(jié)數(shù)據(jù)0x12,然后將其讀取出來(lái),從而獲得讀寫(xiě)速度以及錯(cuò)誤率。讀寫(xiě)時(shí),使用"memset/memcpy"函數(shù)。
FPGA連接到ARM的GPMC總線CS1的起始地址為0x1000000,GPMC數(shù)據(jù)線位寬為16bit,數(shù)據(jù)線地址線復(fù)用,已設(shè)置最大訪問(wèn)范圍是16MB。
"error rate=0.0%"表示讀取回來(lái)的數(shù)據(jù)與寫(xiě)入的數(shù)據(jù)一致,即GPMC通信正常。
- devmem2工具測(cè)試內(nèi)存讀寫(xiě)速率以及錯(cuò)誤率,命令格式為:devmem2 phy_addr length type data,含義是向地址phy_addr中寫(xiě)入length字節(jié)的data,然后將其讀取出來(lái),從而獲得讀寫(xiě)的速度以及錯(cuò)誤率。
- 每次讀寫(xiě)的寬度根據(jù)type來(lái)確定,phy_addr表示物理地址,length表示讀寫(xiě)的長(zhǎng)度(以字節(jié)為單位),type可選b、h、w、m 或 d。
b:每次讀寫(xiě)8位。
h:每次讀寫(xiě)16位。
w:每次讀寫(xiě)32位。
m:每次讀寫(xiě)8位。調(diào)用memset進(jìn)行寫(xiě),調(diào)用memcpy進(jìn)行讀。
d:每次讀寫(xiě)32位。
當(dāng)type參數(shù)為b、h、w、m時(shí),輸出讀寫(xiě)數(shù)據(jù)的大小、讀寫(xiě)速度以及錯(cuò)誤率。當(dāng)type 參數(shù)為d時(shí),輸出寫(xiě)到指定內(nèi)存和從中讀取出來(lái)的值。
- data表示將要寫(xiě)進(jìn)內(nèi)存的內(nèi)容,為32位無(wú)符號(hào)整型數(shù)。但是在寫(xiě)時(shí)會(huì)根據(jù)每次讀寫(xiě)的寬度進(jìn)行截取。當(dāng)type參數(shù)為b或者m時(shí),將data截取前8位。當(dāng)type參數(shù)為h時(shí),將data截取前16位。當(dāng)type參數(shù)為w時(shí),不截取。
(4)對(duì)同一個(gè)物理地址,根據(jù)不同的參數(shù),讀取的結(jié)果會(huì)有差異。經(jīng)過(guò)測(cè)試,使用m選項(xiàng)進(jìn)行讀寫(xiě)時(shí),可以獲得較高的讀寫(xiě)速率。另外,讀寫(xiě)數(shù)據(jù)的長(zhǎng)度length越大,測(cè)得的讀寫(xiě)速度越準(zhǔn)確。
AD8568數(shù)據(jù)采集顯示綜合例程
表 3
開(kāi)發(fā)板型號(hào)
| 是否支持本實(shí)驗(yàn)
| TL437x-EVM
| 不支持
| TL437x-EasyEVM
| 不支持
| TL437x-IDK
| 不支持
| TL437xF-EVM
| 支持
|
本例程使用TL8568P/TL8568-B的AD采集模塊進(jìn)行測(cè)試。此模塊基于TI公司的ADS8568芯片,8通道、雙極性、16位、510KSPS,用于并行采集多路AD數(shù)據(jù)。
例程實(shí)現(xiàn)的功能是:FPGA控制AD8568進(jìn)行數(shù)據(jù)采集,再將采集到的數(shù)據(jù)通過(guò)GPMC總線送到ARM端,ARM端使用運(yùn)行Qt顯示采集到的信號(hào)波形。整個(gè)過(guò)程的流程示意圖大致如下:
​
進(jìn)入內(nèi)核源碼,打開(kāi)”arch/arm/boot/dts/”目錄下的對(duì)應(yīng)板型的設(shè)備樹(shù)源文件。
NAND FLASH版本TL437xF-EVM開(kāi)發(fā)板:am437x-gp-evm-fpga-nandflash.dts
eMMC版本TL437xF-EVM開(kāi)發(fā)板:am437x-gp-evm-fpga-emmc.dts
在如下對(duì)應(yīng)位置添加以下代碼,注冊(cè)按鍵事件來(lái)接收FPGA采集完成的中斷,如下圖所示:
button@2 {
label = "user-gpio5_7";
linux,code = <240>;
gpios = <&gpio5 7 GPIO_ACTIVE_LOW>;
gpio-key,wakeup;
debounce-interval=<0>;
};
​ 圖 9
在如下對(duì)應(yīng)位置添加以下代碼,設(shè)置中斷管腳為輸入模式,如下圖所示:
0x25c (PIN_INPUT_PULLUP | MUX_MODE7) /*emu1.gpio5_7 */
​ 圖 10
修改完成后,重新編譯設(shè)備樹(shù),使用“arch/arm/boot/dts”目錄下新生成的.dtb設(shè)備樹(shù)文件啟動(dòng)開(kāi)發(fā)板文件系統(tǒng)。ARM光盤(pán)”Demo\qt\AD8568_GPMC\bin”目錄下的am437x-gp-evm.dtb為驗(yàn)證通過(guò)的設(shè)備樹(shù)文件。
ARM光盤(pán)”Demo\qt\AD8568_GPMC\bin”目錄下的AD_Test為Qt程序可執(zhí)行鏡像。ARM光盤(pán)”Demo\qt\AD8568_GPMC\src\AD_Test”目錄為工程源碼。如果需要重新編譯工程,請(qǐng)修改工程源碼目錄下的AD_Test.pro文件中的QWT組件的安裝路徑參數(shù)為實(shí)際安裝路徑。
將Qt程序可執(zhí)行鏡像AD_Test拷貝開(kāi)發(fā)板文件系統(tǒng)任意路徑下。將ARM光盤(pán)”Demo\qt\AD8568_GPMC\bin\lib”目錄下的所有相關(guān)庫(kù)文件拷貝到開(kāi)發(fā)板文件系統(tǒng)“/usr/lib”目錄下。
將FPGA光盤(pán)“Demo\app\AD8568_GPMC\bin”目錄下的.bit文件ad8568_gpmc-0.bit/ad8568_gpmc-1.bit拷貝到開(kāi)發(fā)板文件系統(tǒng)”/opt”目錄。FPGA光盤(pán)“Demo\app\AD8568_GPMC\src”為FPGA工程源碼。
開(kāi)發(fā)板連接7寸LCD顯示屏,將AD模塊插入到開(kāi)發(fā)板的FPGA ExPORT0/ExPORT1接口,并將模塊對(duì)應(yīng)通道連接信號(hào)源發(fā)生器的輸入端,然后將模塊AGND連接信號(hào)源發(fā)生器的地。模塊量程為±10V。
執(zhí)行如下命令終止Matrix程序:
Target# /etc/init.d/matrix-gui-2.0 stop
進(jìn)入開(kāi)發(fā)板文件系統(tǒng)的”/opt”目錄,執(zhí)行如下命令初始化FPGA程序加載功能的管腳。
Target#./set_flash_fpga_pin.sh
執(zhí)行如下命令啟動(dòng)FPGA程序加載功能,由ARM通過(guò)SPI總線加載.bit文件到FPGA中運(yùn)行。打印信息中,如果FPGA_DONE的值為1,則表示.bit文件加載成功。
Target#./flash_fpga.sh ad8568_gpmc-0.bit
​ 圖 11
此.bit文件主要實(shí)現(xiàn)FPGA端采集AD數(shù)據(jù),并通過(guò)GPMC總線把數(shù)據(jù)送往ARM端。
在AD_Test所在路徑下,執(zhí)行如下命令運(yùn)行Qt程序,顯示AD數(shù)據(jù)波形。
Target# ./AD_Test -plugin Tslib
​ 圖 12
點(diǎn)擊屏幕上的pause按鈕后,波形暫停在某個(gè)狀態(tài),再點(diǎn)擊start按鈕,屏幕又開(kāi)始顯示動(dòng)態(tài)的波形,點(diǎn)擊Exit退出顯示。
基于TL37xF-EVM的GPMC數(shù)據(jù)讀取
表 4
開(kāi)發(fā)板型號(hào)
| 是否支持本實(shí)驗(yàn)
| TL437x-EVM
| 不支持
| TL437x-EasyEVM
| 不支持
| TL437x-IDK
| 不支持
| TL437xF-EVM
| 支持
|
本實(shí)驗(yàn)使用TL437xF-EVM開(kāi)發(fā)板,SOM-TL437xF核心板硬件鏈接上,AM437x已通過(guò)GPMC總線連接FPGA芯片,并配置為異步、地址數(shù)據(jù)線復(fù)用的通信模式。實(shí)際連接中只用16位數(shù)據(jù)線,不使用地址線。
本實(shí)驗(yàn)實(shí)現(xiàn)功能:ARM端通過(guò)GPMC讀取FPGA端的數(shù)據(jù),F(xiàn)PGA端實(shí)現(xiàn)每個(gè)nOE信號(hào)下降沿來(lái)的時(shí)候,把16bit的數(shù)據(jù)送到GPMC_DATA端口,并自加一次。
​ 圖 13
設(shè)備樹(shù)源碼修改及編譯本實(shí)驗(yàn)需要按照如下方法配置設(shè)備樹(shù)文件下的GPMC時(shí)序。為便于客戶測(cè)試,我司提供經(jīng)驗(yàn)證的dtb文件位于“光盤(pán)\Demo\app\gpmc_edma_read\bin”目錄下。直接將其拷貝到開(kāi)發(fā)板文件系統(tǒng)“/boot”目錄即可。
打開(kāi)Ubuntu,進(jìn)入Linux內(nèi)核源碼頂層目錄執(zhí)行如下指令,打開(kāi)TL437xF-EVM開(kāi)發(fā)板對(duì)應(yīng)的設(shè)備樹(shù)源文件:
Host#vi arch/arm/boot/dts/am437x-gp-evm-fpga-nandflash.dts
​ 圖 14
按照下圖方法,在打開(kāi)的設(shè)備樹(shù)源文件“nor@1,0”節(jié)點(diǎn)中配置GPMC的時(shí)序:
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
配置完成后保存退出,在內(nèi)核源碼頂層目錄下執(zhí)行如下指令編譯生成“arch/arm/boot/dts/am437x-gp-evm-fpga-nandflash.dts”設(shè)備樹(shù)文件。
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)啟動(dòng)卡rootfs分區(qū)“/boot”目錄下原來(lái)的am437x-gp-evm.dtb文件。
使用EDMA連續(xù)讀取數(shù)據(jù)測(cè)試將光盤(pán)“Demo\app\gpmc_edma_read\bin”目錄下gpmc_edma_read.ko和gpmc_fifo.bit文件拷貝到開(kāi)發(fā)板文件系統(tǒng)“/opt”目錄下。
開(kāi)發(fā)板上電啟動(dòng),進(jìn)入文件系統(tǒng)的“/opt”目錄,執(zhí)行如下命令初始化FPGA程序加載功能的管腳。
Target# ./set_flash_fpga_pin.sh
​ 圖 17
執(zhí)行如下命令燒寫(xiě)FPGA端的gpmc_fifo.bit文件,打印信息中,如果FPGA_DONE的值為1,則表示.bit文件加載成功。
Target# ./flash_fpga.sh gpmc_fifo.bit
​ 圖 18
執(zhí)行如下指令加載gpmc_edma_read.ko驅(qū)動(dòng)模塊,由下圖可見(jiàn)使用EDMA連續(xù)讀取到的數(shù)據(jù)從FFFF遞減1到F000:
Target# insmod gpmc_edma_read.ko
​ 圖 19
本次傳輸數(shù)據(jù)大小為8 Kbytes,傳輸時(shí)間為169-35=134us,可以算出使用EDMA數(shù)據(jù)傳輸數(shù)率大小約為60MB/s。
不使用EDMA連續(xù)讀取數(shù)據(jù)測(cè)試將光盤(pán)“Demo\app\gpmc_edma_read\bin”目錄下的tl-devmem2_read文件拷貝到開(kāi)發(fā)板文件系統(tǒng)“/opt”目錄下。
開(kāi)發(fā)板上電進(jìn)入文件系統(tǒng)的“/opt”目錄,依次執(zhí)行如下命令初始化FPGA程序加載功能的管腳,并燒寫(xiě)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
由上圖可見(jiàn),在這種模式下,數(shù)據(jù)傳輸速率為33.675MB/s,并且CPU的占用率會(huì)比較高。
|
|