ZYNQ7020与PC机的UDP通信实现

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

  • 12
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
以下是基于Xilinx Zynq SoC的LWIP UDP通信配置步骤: 1. 创建一个新的Zynq SoC设计并添加lwip库。 2. 在lwipopts.h文件中,将以下选项设置为1来启用UDP协议栈: #define LWIP_UDP 1 3. 在lwip下的apps文件夹中,创建一个新的文件夹udp_echo,并在其中添加udp_echo.c和udp_echo.h文件。 4. 在udp_echo.c文件中,添加以下代码来创建UDP服务器: #include "lwip/udp.h" #define UDP_SERVER_PORT 7 static struct udp_pcb *udp_server = NULL; void udp_server_callback(void *arg, struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *addr, u16_t port) { // TODO: process received data // send response udp_sendto(pcb, p, addr, port); // free the pbuf pbuf_free(p); } void udp_server_init(void) { // create a new UDP PCB structure udp_server = udp_new(); // bind the UDP PCB to the specified port number udp_bind(udp_server, IP_ADDR_ANY, UDP_SERVER_PORT); // set the callback function for UDP server udp_recv(udp_server, udp_server_callback, NULL); } 5. 在main函数中,调用udp_server_init()函数来启动UDP服务器: int main() { // initialize the UDP server udp_server_init(); // TODO: other initialization while(1) { // TODO: main loop } return 0; } 6. 在另一个设备上,使用UDP客户端向Zynq SoC发送数据。以下是示例代码: #include "lwip/udp.h" #define UDP_SERVER_IP "192.168.1.10" #define UDP_SERVER_PORT 7 void udp_client_send(char *data, int len) { struct udp_pcb *pcb; ip_addr_t dest_ip; // convert server IP address from string to binary format ipaddr_aton(UDP_SERVER_IP, &dest_ip); // create a new UDP PCB structure pcb = udp_new(); // send the data to the server udp_sendto(pcb, pbuf_alloc(PBUF_TRANSPORT, len, PBUF_RAM), &dest_ip, UDP_SERVER_PORT); // free the UDP PCB and pbuf udp_remove(pcb); } 7. 在UDP服务器的回调函数中,可以使用p->payload指针来访问接收到的数据。以下是示例代码: void udp_server_callback(void *arg, struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *addr, u16_t port) { // print received data xil_printf("Received data: %s\r\n", (char*)p->payload); // send response udp_sendto(pcb, p, addr, port); // free the pbuf pbuf_free(p); } 注意:在使用UDP通信时,需要确保两个设备在同一网络中,并且服务器的IP地址和端口号需要在客户端代码中正确设置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值