|
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ù)據0x12,然后將其讀取出來,從而獲得讀寫速度以及錯誤率。讀寫時,使用"memset/memcpy"函數(shù)。
FPGA連接到ARM的GPMC總線CS1的起始地址為0x1000000,GPMC數(shù)據線位寬為16bit,數(shù)據線地址線復用,已設置最大訪問范圍是16MB。
"error rate=0.0%"表示讀取回來的數(shù)據與寫入的數(shù)據一致,即GPMC通信正常。
- devmem2工具測試內存讀寫速率以及錯誤率,命令格式為:devmem2 phy_addr length type data,含義是向地址phy_addr中寫入length字節(jié)的data,然后將其讀取出來,從而獲得讀寫的速度以及錯誤率。
- 每次讀寫的寬度根據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ù)據的大小、讀寫速度以及錯誤率。當type 參數(shù)為d時,輸出寫到指定內存和從中讀取出來的值。
- data表示將要寫進內存的內容,為32位無符號整型數(shù)。但是在寫時會根據每次讀寫的寬度進行截取。當type參數(shù)為b或者m時,將data截取前8位。當type參數(shù)為h時,將data截取前16位。當type參數(shù)為w時,不截取。
(4)對同一個物理地址,根據不同的參數(shù),讀取的結果會有差異。經過測試,使用m選項進行讀寫時,可以獲得較高的讀寫速率。另外,讀寫數(shù)據的長度length越大,測得的讀寫速度越準確。
AD8568數(shù)據采集顯示綜合例程
表 3
開發(fā)板型號
| 是否支持本實驗
| TL437x-EVM
| 不支持
| TL437x-EasyEVM
| 不支持
| TL437x-IDK
| 不支持
| TL437xF-EVM
| 支持
|
本例程使用TL8568P/TL8568-B的AD采集模塊進行測試。此模塊基于TI公司的ADS8568芯片,8通道、雙極性、16位、510KSPS,用于并行采集多路AD數(shù)據。
例程實現(xiàn)的功能是:FPGA控制AD8568進行數(shù)據采集,再將采集到的數(shù)據通過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采集完成的中斷,如下圖所示:
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ù)據,并通過GPMC總線把數(shù)據送往ARM端。
在AD_Test所在路徑下,執(zhí)行如下命令運行Qt程序,顯示AD數(shù)據波形。
Target# ./AD_Test -plugin Tslib
​ 圖 12
點擊屏幕上的pause按鈕后,波形暫停在某個狀態(tài),再點擊start按鈕,屏幕又開始顯示動態(tài)的波形,點擊Exit退出顯示。
基于TL37xF-EVM的GPMC數(shù)據讀取
表 4
開發(fā)板型號
| 是否支持本實驗
| TL437x-EVM
| 不支持
| TL437x-EasyEVM
| 不支持
| TL437x-IDK
| 不支持
| TL437xF-EVM
| 支持
|
本實驗使用TL437xF-EVM開發(fā)板,SOM-TL437xF核心板硬件鏈接上,AM437x已通過GPMC總線連接FPGA芯片,并配置為異步、地址數(shù)據線復用的通信模式。實際連接中只用16位數(shù)據線,不使用地址線。
本實驗實現(xiàn)功能:ARM端通過GPMC讀取FPGA端的數(shù)據,F(xiàn)PGA端實現(xiàn)每個nOE信號下降沿來的時候,把16bit的數(shù)據送到GPMC_DATA端口,并自加一次。
​ 圖 13
設備樹源碼修改及編譯本實驗需要按照如下方法配置設備樹文件下的GPMC時序。為便于客戶測試,我司提供經驗證的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ù)據測試將光盤“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ù)據從FFFF遞減1到F000:
Target# insmod gpmc_edma_read.ko
​ 圖 19
本次傳輸數(shù)據大小為8 Kbytes,傳輸時間為169-35=134us,可以算出使用EDMA數(shù)據傳輸數(shù)率大小約為60MB/s。
不使用EDMA連續(xù)讀取數(shù)據測試將光盤“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ù)據:
Target# ./tl-devmem2_read 0x1000000 2048 m 0x12
​ 、圖 21
由上圖可見,在這種模式下,數(shù)據傳輸速率為33.675MB/s,并且CPU的占用率會比較高。
|
|