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代码
- 初始化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延迟的话,就能完全接收到!文章来源:https://www.toymoban.com/news/detail-721651.html
8.总结
在过程中,需要两个时钟,一个是0.5S的心跳时钟,一个是10S的时钟,发现DM9051的工作方式为:0.5s时钟一到就会进行数据的交互,如果你想要传输数据,就可以再此进行。如果DM9051传输了一次数据,马上就会在轮询一次,检查是否还有数据要发,如果有的话,会一直轮询,如果没有数据要发送的话,就不会在轮询了。直到0.5s时间到了,进入TIMER,会进行数据交互。文章来源地址https://www.toymoban.com/news/detail-721651.html
到了这里,关于DM9051--TCP通信实验(基于STM32CUBEMX)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!