随着嵌入式技术和市场需求的不断发展,嵌入式设备之间进行信息交互以及数据远端传输成为嵌 入式系统的一个重要的环节。在嵌入式应用中以太网是解决远端传输高效可行的技术,如进行远端监 控、控制和远端异常检测,可节省大量的人力和财力 。如今,硬件设备间的通信通常采用WISHBONE 总线协议、I2C总线协议、UART协议等。SPI是串行外围接口协议,相比其他协议具有传输速度快、应用 简单和占用引脚资源少等优点 。本文利用全可编程片上系统特性实现了一种基于ZedBoard的SPI接口及以太网远端传输的设计方案,完成Linux下硬件设备间应用SPI协议通信和数据的远端传输功能,采用PL端制定接口控制模块SPI IP核并且编写Linux下IP核驱动的方法实现接口控制,Linux系统下UDP/IP协议进行以太网远端传输。同时充分利用了ZedBoard平台主芯片Zynq-7000双核Cortex A9 ARM核和可编程逻辑于一体的特性,为软硬件设计提供了很强的灵活性。
1 系统总体设计
本设计的主控板为ZedBoard开发板,主芯片Zynq-7000结合高性能双核ARM Cortex A9MP Core处理系统和可编程逻辑于一体。系统主要功能是:可编程逻辑端通过SPI协议实现硬件设备间的通信,通过Pmod口实现硬件设备的物理连接,接收的数据再采用Linux系统下UDP/IP协议实现以太网远端传输。系统框图如图1所示。
图1 系统框图
1.1 硬件设计
1.1.1 SPI硬件接口
通过ZedBoard上的Pmod接口实现硬件的物理连接,ZedBoard上的4个Pmod接口(JA、JB、JC、JD)支持LVCMOS3.3V和LVTTL3.3V信号,其中的2个(JC、JD)能够支持525Mb/s的LVDS信号。为了避免短路电流和静电,Pmod接口电路设计中为每个信号口增加了1个静电保护二极管和串接了1个 200Ω的电阻 。Pmod接口电路设计如图2所示。其中SPI协议传输只用到Pmod的4个引脚,SPI的4个信号线SS、MOSI、MISO、SCK分别连接到Pmod的JA1、JA2、JA3、JA4。
图2 Pmod接口电路
1.1.2 硬件配置
Xilinx可编程嵌入式系统工程在Xilinx公司的嵌入式开发套件(Embedded Development Kit,EDK) 环境实现,Xilinx EDK具有完成嵌入式系统设计的一套工具和硬件配置需要的IP核 。EDK环境下硬 件结构设计的主要工具是Xilinx开发平台(Xilinx Platform Studio,XPS),硬件设计步骤如下:
(1)设置新工程路径;
(2)用IPCatalog中的IP或自定义IP配置外设;
(3)建立UCF文件;
(4)bits流生成;
(5)下载bit流到FPGA中。
本设计中添加一个AXI4-Lite总线设备SPI模块来控制Pmod接口实现硬件设备之间通信,其中 AXI4-Lite全局时钟ACLK设置为100MHz。SPI模块分配的物理地址为0x42020000,以及64K小的空间,SPI配置信息,如图3所示
图3 SPI模块物理地址及大小
1.2 软件设计
软件设计包含Linux下SPI核驱动和Linux下UDP/IP以太网传输应用程序两部分。SPI核驱动在软件设计包含Linux下SPI核驱动和Linux下UDP/IP以太网传输应用程序两部分。SPI核驱动在虚拟机中Ubuntu下交叉编译完成,传输应用程序在EDK开发套件中的软件开发环境下完成。
1.2.1 SPI核驱动
由于远端传输由在Linux系统下UDP/IP协议实现的,因此,编写Linux下的IP驱动,应用程序就可以通过Linux的标准接口访问SPI设备。本设计编写的是MISC型设备驱动程序,包含设备加载、设备卸载以及文件操作函数。
SPI模块加载时系统调用module_ init(spi_init)宏实现模块的初始化操作,在本系统中spi_init()函数主要完成以下工作:
(1)内核注册MISC型设备驱动;
(2)将SPI模块物理地址映射到虚拟地址上。 调用module_ exit(spi_exit)宏来实现SPI模块的卸载,在spi_exit()函数完成模块的清除工作,具体为实现虚拟地址释放和删除设备文件。
系统驱动程序定义了SPI读写和开关文件操作接口函数,文件操作结构为:
其中,spi_open和spi_release为打开和关闭操作封装函数。在spi_open中完成SPI从机选择寄存器和控制寄存器的配置:SPI使能、
SPImaster 设置、SPI传输模式(CPHA=CPOL=0)、以及禁止传输位设置。spi_read方法为将读取的数返回到应用空间,具体实现采用的是
copy_to_user内核函数。spi_write是传输数据的封装函数,通过内核函数copy_from_user实现。
1.2.2 以太网传输应用程序设计
系统采用的是实时性比较强的面向无连接的UDP/IP协议进行Socket网络编程来实现以太网传输。在本系统网络传输中应用程序通过AXI4—Lite
总线将直接读取PL端采集数据送入协议栈中,然 后逐步封装成以太网数据帧通过网络发送出去 。网络传输具体实现流程为:(1)调用Socket()创建一个数据流套接字;(2)调用sendto()向服务器发送read()函数读取的数字信号;(3)调用close()关闭套接字。实现流程如图4所示。
图4中,read()函数为驱动程序定义的接口函数,sendto()函数为Socket编程发送消息接口函数,参数sockfd为建立通信创建的套接字。
图4 系统传输实现流程
2 实验测试
系统测试硬件平台为可移植Linux系统ZedBoard开发板一块,装有 Socket调试助手PC机一台。 ZedBoard中编写UDP客户端程序,Linux系统IP地址为192.168.1.10,所以测试时PC机中Socket调试助手创建一个UDP服务器设置IP地址为192.168.1.11,端口号为3490。通过SPI协议发送一串测试字符到Pmod口,再通过网口传输到PC机上显示,服务器信息设置和以太网接收数据如图5所示。实验 证明该系统能够实现设备间SPI通信和以太网远端传输。
图5 Socket调试助手接收以太网传输的数据
3 结束语
本文基于ZedBoard的SPI接口和以太网传输系统实现了PL端硬件设备间SPI协议通信,PS端进行以太网远端传输技术。在PL端添加SPI核完成硬件设备间通信,这充分利用了FPGA硬件设计的灵活性,PS端以太网传输充分利用了嵌入式开源Linux操作系统特性和UDP/IP协议的实时性,为视频和软件无线电等嵌入式领域提供了一个很好的传输解决方案。