DM9051--TCP通信实验(基于STM32CUBEMX)

文章详细记录了作者在研究DM9051芯片时的调试过程,通过SPI接口将其与STM32F103连接,建立TCP服务器,实现单片机与网络调试助手的通信。在调试中遇到的问题是连续发送数据时,帧间隔5ms会导致数据丢失,而增加至20ms延迟后可正常接收。文章还介绍了DM9051的工作机制,包括0.5s心跳时钟和10s时钟的作用。
摘要由CSDN通过智能技术生成

1.前言

最近作者一直在研究DM9051芯片的工作机理,在此过程中,上网上找了很多资料,但根据资料还是不能了解很通透。因此我直接开始实战,经过多番周折,终于调通了程序。再此篇文章分享下自己的调试过程,也把疑问分享一下!(写的比较潦草,资料在最后)

2.DM9051介绍

DM9051NP SPI接口网卡芯片是为了方便MCU单片机系统进行以太网通信而开发出的解决方案。DM9051NP芯片是带有行业标准串列外设接口(Serial Peripheral Interface,SPI)的独立以太网控制器。DM9051NP符合IEEE 802.3 规范,它还支持以DMA 模式來传输,以实现资料传送快速。DM9051NP通过1个中断引脚和SPI接口來进行与主控制器/MCU单片机的通信,资料传输规格为10/100 M。

3.主要实现的功能

作者想通过DM9051,实现STM32F103与网络调试助手进行通信。并且能够定时上传数据,或者能够连续传输数据。其中DM9051作为TCP服务器端。

4.单片机配置

在这里插入图片描述
SPI配置:
在这里插入图片描述
SPI通过DMA进行传输,其它配置根据自己的单片机设置就行。PB12是管脚是SPI-NSS(选择管脚),要通信的话,需要拉低这个管脚。

5.代码分析

1.此处代码是为了配置DM9051的IP地址

 	dm9051_init();       //DM9051初始化
    uip_init();				//uIP初始化
    uip_arp_init();		//arp表初始化
    uip_ipaddr(ipaddr, 10,0,115,70);	//设置本地设置IP地址
    uip_sethostaddr(ipaddr);
    uip_ipaddr(ipaddr, 10,0,115,1); 	//设置网关IP地址(其实就是你路由器的IP地址)
    uip_setdraddr(ipaddr);
    uip_ipaddr(ipaddr, 255,0,0,0);	//设置网络掩码
    uip_setnetmask(ipaddr);   
    uip_listen(HTONS(80));			//80端口,用于TCP Server

2.while循环

  while (1)
    {
        uip_polling();		//处理uip任务
			//开始传送30次数据帧的任务
        if(flag_transdata == 1)
        {
            for(int i = 0; i<30; i++)
            {
againa:
                tttt=0; //为了确保每次都会进入mtcp_appcall()函数
                rrrr =1;//标志位,为了告诉DM9051需要处理数据了
                uip_polling();//处理uip任务
                delay_ms(5);
                if(tttt == 0) //如果没有进入mtcp_appcall()函数,则再来一次
                {

                    goto againa;
                }

            }
            rrrr= 0; //标志位清0
            flag_transdata = 0;//30次数据发送完成
        }
        delay_ms(20);
   }

3.DM9051代码

  1. 初始化uIP协定栈:uip_init()
    2.处理输入包:uip_input()
    3.处理周期计时事件:uip_periodic()
    4.开始监听端口:uip_listen()
    5.连接到远程主机:uip_connect()
    6.接收到连接请求:uip_connected()
    7.主动关闭连接:uip_close()
    8.连接被关闭:uip_closed()
    9.发出去的数据被应答:uip_acked()
    10.在当前连接发送数据:uip_send()
    11.在当前连接上收到新的数据:uip_newdata()
    12.告诉对方要停止连接:uip_stop()
    13.连接被意外终止:uip_aborted()
//处理tcp消息接口
void mtcp_appcall()
{

    if(uip_newdata()) //如果有新数据进来
    {
        for(int i = 0; i<968; i++)
        {
            rec[i] =0x00+i;
        }
        flag_transdata =1; //

    }
    if( rrrr ==1)
    {
        uip_send((uint8_t *)rec,968);
        tttt = 1;
        dddd++;
    }

    if(uip_connected())
    {
        d = 1;
    }
    if(uip_closed())
    {
        d = 0;
    }

}

6.资料链接

网上的资料:
DM9051资料介绍以及代码编程
自己的代码:
链接:https://pan.baidu.com/s/1tHzC6nG2TiSftCsEItueOA?pwd=2022
提取码:2022

7.调试中的问题

1.如果在连续发射的时候,一帧与一帧的间隔为5ms,会发生传输到网络调试助手的数据包少一半,比如说,想传个30帧,但接收到的就是15帧了(保证每次都会进入mtcp_appcall()函数)。不知道为什么会这样?但如果改个20ms延迟的话,就能完全接收到!

8.总结

在过程中,需要两个时钟,一个是0.5S的心跳时钟,一个是10S的时钟,发现DM9051的工作方式为:0.5s时钟一到就会进行数据的交互,如果你想要传输数据,就可以再此进行。如果DM9051传输了一次数据,马上就会在轮询一次,检查是否还有数据要发,如果有的话,会一直轮询,如果没有数据要发送的话,就不会在轮询了。直到0.5s时间到了,进入TIMER,会进行数据交互。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值