ZYNQ7020与PC机的UDP通信实现

本文介绍了如何在ZYNQ7020开发板上利用LWIP库实现与PC机的UDP通信。实验基于UDP的QSPI Flash bin文件网络烧写,当收到"start update"指令后,ZYNQ向PC发送10000字节数据,每次1024字节,验证双方通信。ZYNQ端代码展示了接收和发送数据的实现,而PC端使用Winsock2 API发送指令并接收数据。
摘要由CSDN通过智能技术生成

 由于实验室项目需求开始学习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");
        

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值