ARM与FPGA通讯
1 硬件接口介绍
FPGA与RK通信的接口有三种,分别为IIC、FSPI、PCIE。原理图如下所示:

2 IIC通信
在IIC通信中,FPGA作为从机,其设备地址为0x66。
目前代码中定义了三个寄存器地址为0x00、0x01、0x02。其中0x02为只读寄存器
对于0x00寄存器可以测试读写数据是否正确,例如写1,读出来也是1即通信正常。
i2cdetect -r -y -a 0

可以看到I2C总线上有个0x66的地址。
i2cset -r -y -a 0 0x66 0x00 0x40

执行完该命令后,就会往0x00寄存器写入0x40。
此时输入命令 i2cdump -f -y -a 0 0x66

该命令会列出0x66所有寄存器的值,可以看到寄存器0x00的值已经为刚才写入的0x40。
i2cget -f -y -a 0 0x66 0x00
读取寄存器0x00的值,可以看到读出了0x40,和写入的值一致。
0x01寄存器可以控制led的状态,输入以下命令:
i2cset -f -y -a 0 0x66 0x01 0x01
此时底板的LED点亮。
输入以下命令:
i2cset -f -y -a 0 0x66 0x01 0x00
此时底板的LED熄灭。
i2cset -f -y -a 0 0x66 0x01 0x03
此时底板两个LED均点亮。
因为代码中是将该寄存器的低2bit赋值给LED,所以只有在低2bit为1时才能点亮LED。至此,IIC读写通信正常。
3 FSPI通信
FPGA与RK之间通过FSPI进行交互,FPGA会有个RAM用来缓存数据,实现读写回环。
首先加载驱动:
insmod smdt_spi_controller.ko
之后输入命令: lsmod

出现上方红框的字样则表示驱动加载成功。
目录切换道smdt_spi_rw的可执行程序的文件夹下,之后输入命令:
./smdt_spi_rw -d /dev/spidev4.0 -s 50000000 -OH -m 3 -S 1024 -c 1

Byte error rate为0则表示通信正常,数据读写无误。
其中 -s 为设置通信频率,50MHZ。
-m 表示选择模式:1为单线模式,2为双线模式,3为四线模式。
-s 表示选择的传输大小,这里是1024,由于FPGA的ram深度设置为2048,因此一旦传输超过2048的话会出现byte error。
-c 表示传输次数,1表示传输1次。
4 PCIE通信
首先,FPGA端需要先固化PCIe的工程,因为RK在上电期间只会识别一次PCIe设备,所以要确保在RK启动起来前FPGA已经加载好PCIe的程序,否则会导致识别失败。
首先通过adb push将pcie的测试demo传输到设备里面。之后输入命令:
insmod smdt_pcie_dma_memcpy.ko
之后再输入命令: lsmod

出现上述红框的字样,表示驱动完成。
之后输入命令: lspcie -vv

能显示出0755:0755且lnkSta状态正常,Speed 5GT/S,Widthx2,则表示PCIe已经建链,同样可以看到板子上的LED灯在快速闪烁。
之后输入命令: echo 1 > /sys/class/pci_bus/0002:21/device/0002:21:00.0/enable
再输入 ./smdt_dma_memcpy_demo -a 0xf0200000 -s 20480 -c 1 -d /dev/input/event8

读写均没有error则表示DMA交互正常。
-a 表示地址
-s 表示传输字节数
-c 表示传输次数
-d 表示设备路径
可以调节s和c来改变DMA传输的数据量。