关于以太网通信
最近用了两种以太网芯片了,先是STM32F446+W5500,然后是STM32F429+LAN8720A,第二种虽然现在也能发数了,但是发送的数据一超过一千字节就会报错,实际上根本没有吃透这个LWIP,只是简单的去测试源代码都不能成功,等我搞明白了再来记录。
关于W5500这个芯片就很友好了,(中文官网)有一堆测试demo和调试指南,对于我这种一开始连以太网是什么都不知道的小白来说,真的不能够再好了。
附上连接:https://www.w5500.com/index.html
. 以下是关于TCP sever的一些理解:
想要实现以上基本也就两步,一、ping通。二、socket。
- 首先是单片机通过SPI去配置w5500的网络参数,如果配置的对,且PC端也设置的同一网段的话,就可以ping通。我在实际操作的时候遇到一些问题,首先插上了网线时候link灯不亮,检查硬件发现没有给w5500提供25M晶振,其他输入电压正常,然后灯还是不亮,由于我使用的网络变压器RJ45的电路是外接的就是没有集成到一块板子上,果然问题在这,没有给RJ45供电,加上电后网线的灯就亮了。如果这时候还是ping不通的话就去debug一下看看有没有正确的把网络参数写到W5500的配置寄存器里。
关键点
硬件上晶振25M,工作电压正常。
软件上SPI通信 - Ping通了之后就是调用socket了,这个状态机就比较好理解,w5500一共有8个socket,而我只用了socket 0。如果socket处于连接状态就可以发送数据,如果socket处于关闭状态就打开一个本地端口。
switch (getSn_SR(SOCK_TCPS)) // 获取socket0的状态
{
case SOCK_INIT: // Socket处于初始化完成(打开)状态
listen(SOCK_TCPS);
break;
case SOCK_ESTABLISHED: // Socket处于连接建立状态
if (getSn_IR(SOCK_TCPS) & Sn_IR_CON)
{
setSn_IR(SOCK_TCPS, Sn_IR_CON);
//Sn_IR的CON位置1,通知W5500连接已建立
}
send(SOCK_TCPS, gDATABUF, 1024); //发送数据
break;
case SOCK_CLOSE_WAIT: // Socket处于等待关闭状态
disconnect(SOCK_TCPS);
break;
case SOCK_CLOSED:
socket(SOCK_TCPS, Sn_MR_TCP, 5000, 0x00);
// 打开Socket0,打开一个本地端口
break;
}