由于实验室项目需求开始学习ZYNQ7000系列开发板,了解zunq的udp通信实现,开发板的自带学习资料有 基于UDP的QSPI Flash bin文件网络烧写实验,该实验的基本原理如下:
首先,在 ZYNQ 的 ARM 中基于 LWIP 库建立一个 UDP,板卡通过网线与电脑连接。脑中通过网络调试助手以 UDP 模式与 ZYNQ 建立 UDP连接。然后,通过络调试助手将 BOOT.bin 文件以二进制形式发送至 ps端,并存储在 ZYNQ 所连接的 DDR 中。最后,当 ps端接收完 bin 文件所有的数据后,网络调试助手发送烧写启动命令,将 bin 文件的数据按顺序一一连续写入 QSPI Flash 中,随后再全部读出与所接收的 bin 文件进行一一比对检验。断电重启板卡,便可验证 bin 文件的更新。
由于我们的最终目的是在pc机上的上位机与zynq实现udp通信并互相发送指令和我们需要的数据,因此在原实验代码的基础上需要做出相应的改动,在此我们将代码改为:zynq的ps端和pc机建立udp连接之后,pc机发送“ start update"指令,zynq接收指令后向pc机发送10000字节大小的数据,(我们只是为了验证两者之间可以成功通信,至于发送的内容可以自己定义),每次发送1024字节,pc机接收数据后打印接收数据的大小,最后打印出所有数据的内容。
zynq端ps部分的相关代码:
/* udp_transmission.c
*
* Created on: 2017Äê1ÔÂ22ÈÕ
* www.osrc.cn
* www.milinker.com
* copyright by nan jin mi lian dian zi www.osrc.cn
*/
#include <stdio.h>
#include <string.h>
#include "lwip/err.h"
#include "lwip/udp.h"
#include "lwipopts.h"
#include "netif/xadapter.h"
#include "xqspips.h"
#include "xil_cache.h"
#include "xil_printf.h"
#include "sleep.h"
#include "udp_transmission.h"
#include "qspi_g128_flash.h"
#define FILE_BASE_ADDR 0x10000000
#define READ_BASE_ADDR 0x11000000
#define WRITE_BASE_ADDR 0x12000000
struct udp_pcb *connected_pcb = NULL;
static struct pbuf *pbuf_to_be_sent = NULL;
static unsigned local_port = 5010; /* server port */
static unsigned remote_port = 7;
volatile u32 file_length = 0;
u8 *file;
u8 *read_buffer;
u8 *write_buffer;
void udp_recv_callback(void *arg, struct udp_pcb *tpcb,
struct pbuf *p, struct ip_addr *addr, u16_t port)
{
struct pbuf *q;
u32 remain_length;
q = p;
xil_printf("get data:%s\r\n",(char *)q->payload);
if(q->tot_len == 12 && (!strcmp("start update", (char *)q->payload)))
{
xil_printf("flash update start!\r\n");
xil_printf("file length of BOOT.bin is %d Bytes\r\n", file_length);
pbuf_free(p);
//create an image that the size is 100*100
u8 *img = NULL;
img = (u8 *) malloc(sizeof(u8) * 10000);
for(int i = 0; i < 10000; i++)
{
if(i < 5000)
img[i] = 2;
if(i > 5000)
img[i] = 1;
}
udp_send_data(img,10000);
//udp_printf("flash update start!\r\n");