基于stm32之w5500以太网应用
强调一下前半段为基础知识普及(这段还是很重要的。不管用什么工具开发精通协议才是王道),后半段为实战代码干货。
如上图所示,最底下的一层叫做“物理层”,也叫“PHY 层”,最上面的一层叫做“应用层”,中间的三层(自下而上)分别是“链路层”,也叫“MAC 层”、 “网络层”和“传输层”。越下面的层,越靠近硬件;越上面的层,越靠近用户。
我们一层一层讲解
一、物理层
物理层就是最基础的类似于modbus中的硬件连接是rs485的两根线。物理层由计算机和网络介质之间的实际界面组成,可定义电气信号、符号、线的状态和时钟要求、数据编码和数据传输用的连接器。上面的4层都是基于物理层的。
二、数据链路层
实际上由两个独立的部分组成,介质存取控制(Media AccessControl,MAC)和逻辑链路控制层(Logical Link Control,LLC)。
每块网卡出厂的时候,都有一个全世界独一无二的 MAC 地址,长度是 48 个二进制位,通常用 12 个十六进制数表示。
在网络内广播数据帧,如果该数据帧的首部和自身的MAC地址一样就可以读取。这一点和我讲的can通讯ID号一样。有了数据帧的定义、网卡的 MAC 地址、广播的发送方式,“链路层”就可以在多台计算机之间传送数据了。
三、到了网络层,网络层负责在源和终点之间建立连接。它一般包括网络寻径,还可能包括流
量控制、错误检查等。相同 MAC 标准的不同网段之间的数据传输一般只涉及到数据链路层,而不同的 MAC 标准之间的数据传输都涉及到网络层。例如 IP 路由器工作在网络层,因而可以实现多种网络间的互联。上面这段话比较拗口,我总结一下:网络层是可以将不同的MAC标准打包,基于链路层更高级的层。
3.1ip协议
规定网络地址的协议,叫做 IP 协议。互联网上的每一台计算机,都会分配到一个 IP 地址(这里区别mac地址,这是不可改的很硬核的,ip地址是可以改的或者动态分配的)。它所定义的地址,就被称为 IP 地址。目前,广泛采用的是 IP 协议第四版,简称 IPv4。这个版本规定,网络地址由 32个二进制位组成。比如图中的192.168.1代表网络,255代表主机。192.168.1.254则是处在相同网络下的主机。
3.2ip数据报
传输层叫数据段(Segment),网络层叫数据报(Datagram),链路层叫数据帧(Frame)。以太网数据帧只包含 MAC 地址,并没有 IP 地址的信息***我们可以把 IP 数据报直接放进以太网数据帧的“数据”部分,也就是mac地址在首部,IP地址和IP数据都在以太网数据部分,所以和mac地址不干扰。
“标头”部分主要包括版本、长度、IP 地址等信息,IP 数据报的“标头”部分长度为 20 到 60 字节,整个数据报的总长度最大为65,535 字节。因此理论上,一个 IP 数据报的“数据”部分,最长为 65,515 字 节。前面说过,以太网数据帧的“数据”部分,最长只有 1500 字节。因此,如 果 IP 数据报超过了 1500 字节,它就需要分割成几个以太网数据帧,分开发送了。
四、传输层
定义:传输层向高层提供可靠的端到端的网络数据流服务。传输层的功能一般包括流控、多路传输、虚电路管理及差错校验和恢复。流控管理设备之间的数据传输,确保传输设备不发送比接收设备处理能力大的数据;多路传输使得多个应用程序的数据可以传输到一个物理链路上;虚电路由传输层建立、维护和终止;差错校验包括为检测传输错误而建立的各种不同结构;而差错恢复包括所采取的行动(如请求数据重发),以便解决发生的任何错误。我对这层的理解是,就是已经可以发送接收数据需要一些修正和改进。
4.1 UDP协议
UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联) 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。(记住这些缩写的全称,对理解协议有好处)
这些内容是放在ip数据报的数据内,***“标头”部分主要定义了发出端口和接收端口,“数据”部分就是具体的内容。然后,把整个 UDP 数据段放入 IP 数据报的“数据”部分,而 IP 数据报又
是放在以太网数据帧之中的。
4.2 TCP协议
相比UDP协议,tcp协议提高了可靠性。可以确认信息的准确性,如果丢失了,发出方将会重发。全称是Transmission Control Protocol ( 传输控制协议)。TCP 数据段和 UDP 数据段一样,都是内嵌在 IP 数据报的“数据”部分。TCP 数据段没有长度限制,理论上可以无限长,但是为了保证网络的效率,通常
TCP 数据段的长度不会超过 IP 数据报的长度,以确保单个 TCP 数据段不必再分割。
五、应用层
应用层是最接近终端用户的第一层,这就意味着应用层与用户之间是通过应用软件直接相互作用的。注意,应用层并非由计算机上运行的实际应用软件组成,而是由向应用程序提供访问网络资源的 API:Application Program Interface(应用程序接口)组成。功能:标识通信伙伴、定义资源的可用性和同步通信。
5.1应用层协议
应用层的作用就是基于传输层规定好数据格式,比如应用层的 HTTP(hypertext transfer protocol超文本传输)协议、DNS(Domain Name Server域名解析)协议——就是把ip地址和域名(网址)对应起来、FTP(File Transfer Protoco文件传送)协议、SMTP(简单邮件管理)协议等。
经过五层下来以太网的数据帧就变成了以下的样子
任何设备都需要搭建这五层物理连接以及处理层内和层与层之间的TCP/IP 协议方能实现网络应用
七、以太网接入方案
对于无操作系统要求的单片机如何实现网络接入,我下面将这些方案按 TCP/IP 协议栈的不同归
结为两大类:第一类是传统的软件TCP/IP协议栈方案;第二类是最新的硬件TCP/IP协议栈方案。
7.1 mac+phy(physical layer物理层)
这种方案,占用大量mcu资源,安全性差。应用这种软件 TCP/IP 协议栈方式实现的比较成熟方案有 ENC28J60,CS8900A,DM9000(即自带mac地址的芯片)当然也有像 STM32F107 这类(内部自带 MAC)+PHY 等方案
类似于iic的软件模式,就是不调用单片机外设,用软件模拟电平信号。但是如果使用硬件模式就不一样了,只需要很少的代码量就能数据的收发。接下来我们介绍硬件协议栈芯片方案。
7.2硬件协议栈芯片方案
硬件协议栈芯片方案如下图所示。由 MCU+硬件协议栈芯片(内含 MAC和 PHY)直接加网络接口,便可方便的实现单片机联网,所有的处理 TCP/IP 协议的工作都是通过这位 MCU 的“小秘书”——硬件协议栈芯片来完成
相当于把外设和mac地址再加物理连接都放在一块芯片上,这个方案是韩国的wiznet微知纳特公司提出来的,就引出了我们的主角w5500。所谓硬件协议栈是指通过将传统的软件 TCP/IP 协议栈用硬件化的逻辑门电路来实现,也就是我上文说的,类似于单片机上的iic外设。
以太网芯片的内核由传输层的 TCP、UDP、ICMP、IGMP 等协议、网络层的 IP、ARP、PPPoE 等协议以及链路层的 MAC 构成,再加上物理层的 PHY 和外围的寄存器、内存、SPI 接口组成了这一整套硬件化的以太网解决方案。这套硬件 TCP/IP 协议栈代替了以往的 MCU 来处理这些中断请求,即 MCU 只需要处理面向用户的应用层数据即可,传输层、网络层、链路层及物理层全部由外围 WIZnet 的芯片完成。
这就是我想讲的做单片机永远是层层封装,使用工具而已。真正计算量并不大。
;随着线程的增加,因为硬件协议栈是通过独立的 Socket (孔,插座)进行通信,因而通信速度实现累加,而且单片机工作效率仍然会维持在高位。当然也有缺点,不可避免的硬件化的协议栈相对来说失去了软件协议栈那样的灵活性。目前只支持 4 个/8 个 Socket,不能随时开启更多 Socket。但是,在嵌入式应用中 8 个 Socket 已经足够应对超过大部分的应用。
八、w5500与stm32
其中spi2的四根线要接上w5500的 SCSn, SCLK, MOSI, MISO 4 路信号。还有中断信号和复位信号。
W5500 有两种工作模式,分别是可变数据长度模式和固定数据长度模式。在可变数据长度模式中,W5500 可以与其他 SPI 设备共用 SPI 接口。但是一旦将 SPI接口指定给 W5500 之后,也就是 1 脚 CS 片选信号如果选中了这个 W5500,则不能再与其他 SPI 设备共用。在固定数据长度模式,SPI 将指定给 W5500,不能与其他 SPI 设备共享。因为 1 脚 CS 片选信号将直接接地为低电平。
8.1w5500初始化
W5500_conf.c 主要配置 W5500 的 MAC、IP 地址,W5500 基本的数据读写过程,复位设置函数等。
Socket.c 函数主要介绍了 W5500 的 SOCKET 相关配置函数,比如 SOCKET 的打开、关闭,以及接收数据、发送数据等等。
Utility.c 函数主要介绍了基本的延时函数,还有数据格式转化函数。
w5500.c 主要介绍 W5500 的寄存器读写过程
w5500最基本的操作设置需要设置以下寄存器。
接下来设置网络信息,以下寄存器
SHAR寄存器就是MAC层的硬件地址。
最后是关于端口存储信息,每个端口的基地址和屏蔽地址在这里确定并保存。W5500 有 1 个通用寄存器,8 个 Socket 寄存器区,以及对应每个 Socket 的收/发缓存区。16KB 的发送内存初始化被分配为每个 Socket 2KB 发送缓存区(2KB X 8 =16KB)。但是这是可以重新分配的,通过寄存器(Sn_TXBUF_SIZE), 但是 为了避免数据传输错 误 , 需要 避免发送缓存大小 寄 存 器
(Sn_TXBUF_SIZE)的和超过 16。
```c
*@brief This function set the transmit & receive buffer size as per the channels is used
*@Note: TMSR and RMSR bits are as follows\n
Maximum memory size for Tx, Rx in the W5500 is 16K Bytes,\n
In the range of 16KBytes, the memory size could be allocated dynamically by each channel.\n
Be attentive to sum of memory size shouldn't exceed 8Kbytes\n
and to data transmission and receiption from non-allocated channel may cause some problems.\n
If the 16KBytes memory is already assigned to centain channel, \n
other 3 channels couldn't be used, for there's no available memory.\n
If two 4KBytes memory are assigned to two each channels, \n
other 2 channels couldn't be used, for there's no available memory.\n
*@param tx_size: tx buffer size to set=tx_size[s]*(1024)
*@param rx_size: rx buffer size to set=rx_size[s]*(1024)
*@return None
*/
void socket_buf_init( uint8 * tx_size, uint8 * rx_size )
{
int16 i;
int16 ssum=0,rsum=0;
for (i = 0 ; i < MAX_SOCK_NUM; i++) // Set the size, masking and base address of Tx & Rx memory by each channel
{
IINCHIP_WRITE( (Sn_TXMEM_SIZE(i)), tx_size[i]);
IINCHIP_WRITE( (Sn_RXMEM_SIZE(i)), rx_size[i]);
#ifdef __DEF_IINCHIP_DBG__
printf("tx_size[%d]: %d, Sn_TXMEM_SIZE = %d\r\n",i, tx_size[i], IINCHIP_READ(Sn_TXMEM_SIZE(i)));
printf("rx_size[%d]: %d, Sn_RXMEM_SIZE = %d\r\n",i, rx_size[i], IINCHIP_READ(Sn_RXMEM_SIZE(i)));
#endif
SSIZE[i] = (int16)(0);
RSIZE[i] = (int16)(0);
if (ssum <= 16384)
{
SSIZE[i] = (int16)tx_size[i]*(1024);
}
if (rsum <= 16384)
{
RSIZE[i]=(int16)rx_size[i]*(1024);
}
ssum += SSIZE[i];
rsum += RSIZE[i];
}
}
这个函数是wiznet官方给的配置socket的发送缓存和接收缓存大小的函数。在主函数初始化中,将每个socket的收发缓存区变成2kb。note翻译:给缓存区最大内存是16kb,在16kb的范围内,内存是可以动态分配给每个socket,但是要留意内存大小不应该超过8kb,没有分配到内存的socket在传输的过程可能会导致一些问题。
主函数中实现了如上子函数。便基本上完成了网络的建立也就是你得设备有了mac地址,ip地址,完成了至传输层的配置。
8.2应用层协议的开发
以太网的应用层包括支撑协议和应用协议两部分。
支撑协议:域名服务系统(DNS),简单网络管理协议(SNMP)等,典型应用包过 Web 浏览、电子邮件、文件传输访问、远程登录等。
应用协议:超文本传输协议(HTTP),简单邮件传输协议(SMTP),文件传输协议(FTP),简单文件传输协议(TFTP)和远程登录(Telnet)。
我也刚开始学习tcp/ip,以一个新手的角度解读了整个以太网的基本框架,我没想到内容这么多,后面还会继续更新详细的代码及应用。更多的是作为我自己的学习笔记。