文章目录
一.概要
我们介绍过单片机的以太网系统一般是由:单片机+MAC+PHY+RJ45。有些单片机比如STM32F407VET6芯片内部自带MAC,STM32F407VET6+PHY(LAN8720)+RJ45就能组成以太网系统,但比如常见的STM32F103C8T6单片机是不带MAC控制器,需要组成以太网系统,就不能采用STM32F407的方式。
STM32F103C8T6+W5500芯片(SPI转以太网)+RJ45就能很好组成以太网系统。W5500 是一款全硬件 TCP/IP嵌入式以太网控制器,集成PHY和MAC带硬件TCP/IP协议栈,为嵌入式系统提供了更加简易的互联网连接方案, 使用硬件逻辑门电路实现, TCP/IP 协议栈的传输层及网络层(如:TCP,UDP,ICMP,IPV4ARP, IGMP.PPPoE 等协议),并集成了数据链路层,物理层,以及 32K字节片上 RAM 作为数据收发缓存。使得单片机只需承担TCP/P 应用层控制信息的处理任务。从而大大节省了单片机对于数据复制、协议处理和中断处理等方面的工作量,提升了系统利用率及可靠性。
W5500模块集成了个硬件 TCP/IP 协议栈芯片 W5500 以及1个含有网络变压器的 RJ45(HR911105A)。
本文介绍了 W5500芯片以及W5500模块,并通过STM32F103C8T6单片机驱动W5500模块实现TCP/IP数据通讯。
二.W5500芯片介绍
W5500芯片是WIZnet公司出品的全硬件 TCP/IP 协议栈支持 TCP,UDP,IPv4,ICMP,ARP,IGMP 以及 PPPoE 协议。W5500 内嵌 32K 字节片上缓存以供以太网包处理。如果你使用 W5500, 你只需要一些简单的 Socket 编程就能实现以太网应用。这将会比其他嵌入式以太网方案 更加快捷、简便。用户可以同时使用 8 个硬件 Socket 独立通讯。
W5500 提供了 SPI(串行外部接口)作为外设主机接口,共有 SCSn, SCLK, MOSI, MISO 4 路信
号,且作为 SPI 从机工作。 W5500 的使用了新的高效 SPI 协议支持 80MHz 速率,从而能够更好的实现高速网络通讯。 为了减少系统能耗,W5500 提供了网络唤醒模式(WOL)及掉电模式供客户选择使用。
W5500特点:
支持硬件 TCP/IP 协议:TCP, UDP, ICMP, IPv4, ARP, IGMP, PPPoE
支持 8 个独立端口(Socket)同时通讯
支持掉电模式
支持网络唤醒
支持高速串行外设接口(SPI 模式 0,3)
内部 32K 字节收发缓存
内嵌 10BaseT/100BaseTX 以太网物理层(PHY)
支持自动协商(10/100-Based 全双工/半双工)
不支持 IP 分片
3.3V 工作电压,I/O 信号口 5V 耐压;
LED 状态显示(全双工/半双工,网络连接,网络速度,活动状态)
48 引脚 LQFP 无铅封装(7x7mm, 0.5mm 间距)
基于W5500芯片组成的基本以太网设备
W5500通讯协议介绍
W5500与单片机采用SPI数据格式进行通讯
W5500的SPI帧分为 3 段:地址段,控制段,数据段,如下图所示。
SPI帧格式图
W5500的SPI 数据帧包括了 16 位地址段的偏移地址,8 位控制段和 N 字节数据段。8 位控制段可以通过修改区域选择位 (BSB[4:0]),读/写访问模式位(RWB)以及 SPI工作模式位(OM[1:0])来重新定义。 区域选择位选择了归属于偏移地址的区域。
地址段
地址段为 W5500 的寄存器或 TX/RX 缓存区指定了 16 位的偏移地址。 这 16 位偏移地址的值来自
于从最高标志位到最低标志位的顺序传输。 SPI 数据帧的数据段(2/4/N 字节)通过偏移地址自增(每传输 1 字节偏移地址加 1) 支持连续数据读/写。
控制段
控制段指定了地址段设定的偏移区域的归属,读/写访问模式以及 SPI 工作模式。
在 VDM 模式下(可变数据长度模式 Variable Data Length Mode),SPI 数据帧的长度被外设主机控制的 SCSn 所定义。这就意味着数据 段长度根据 SCSn 的控制,可以是一个随机值(从 1 字节到 N 字节任何长度均可),在 VDM 模式下,OM[1:0]位必须为'00'。
数据段
在 SPI 工作模式位 OM[1:0]设定了控制端之后,数据段被设定为 2 种长度类型:1 种为可变的 N 字
节长度(可变数据长度模式),另以一种为确定的 1/2/4 字节长度(固定数 据长度模式)。 此时,1 字节数据从最大标志位到最小标志位,通过 MOSI 或者 MISO 信号传输。
VDM 模式下SPI写时序
SPI 的MODE0和MODE3唯一不同的就是在非活动状态下, SCLK 信号的极性,我们一般都采用空闲下是低电平,就是STM32 SPI协议中CPOL为0,CPHA为0,所以默认采用MODE0方式。
VDM 模式下SPI读时序
三.W5500模块介绍
W5500模块集成了个W5500芯片以及1个含有网络变压器的 RJ45(HR911105A)。
W5500模块可以使用杜邦线与STM32F103C8T6开发板连接,其中W5500模块引脚丝印可在模块正面看到。
STM32单片机板子与W5500模块通过7根杜邦线相连
板子GND----模块GND
板子5V-------模块5V
板子PB12---模块SCS
板子PB13---模块SCLK
板子PB14---模块MISO
板子PB15---模块MOSI
板子PA8-----模块RST
四.W5500模块原理图
五.W5500以太网模通讯实验
硬件准备:
STLINK接STM32F103C8T6开发板,STLINK接电脑USB口,开发板通过杜邦线接W5500模块,W5500模块通过网线接电脑网口。
打开STM32CubeMX软件,新建工程
Part Number处输入STM32F103C8,再双击就创建新的工程
配置下载口引脚
配置外部晶振引脚
配置系统主频
PA8,PB12配置成GPIO输出
SPI2引脚配置以及速度配置
配置工程文件名,保存路径,KEIL5工程输出方式
生成工程
用Keil5打开工程
添加代码
配置IP地址等信息,确保板子的IP地址,电脑IP地址在同一网关内
两个GPIO控制引脚进行相应配置
SPI读写函数调用换成HAL库
调用W5500初始化,以及数据收发函数,实现数据通讯
主要代码
c
uint8_t remote_ip[4]={192,168,1,15}; /*远端IP地址*///服务器IP地址,电脑网口的IP地址
uint8_t Gateway_ip[4]={192,168,1,1}; /*网关地址*/
uint8_t Board_ip[4]={192,168,1,55}; /*板子IP地址*/
//上述三个IP地址需配置正确///
uint16_t local_port=8888; /*定义本地端口*///可以固定成8888,实验时候不需要改
uint16_t remote_port=8888; /*远端端口号*/ //服务器的端口号,可以固定成8888,实验时候不需要改
#define W5500_NSS_Pin GPIO_PIN_12
#define W5500_NSS_GPIO_Port GPIOB
#define W5500_RES_Pin GPIO_PIN_8
#define W5500_RES_GPIO_Port GPIOA
#define W5500_RES_High() HAL_GPIO_WritePin(W5500_RES_GPIO_Port,W5500_RES_Pin,GPIO_PIN_SET) // /*W5500的RESET管脚*/
#define W5500_RES_Low() HAL_GPIO_WritePin(W5500_RES_GPIO_Port,W5500_RES_Pin,GPIO_PIN_RESET)// /*W5500的RESET管脚*/
#define W5500_NSS_High() HAL_GPIO_WritePin(W5500_NSS_GPIO_Port,W5500_NSS_Pin,GPIO_PIN_SET) ///*W5500的片选管脚*/
#define W5500_NSS_Low() HAL_GPIO_WritePin(W5500_NSS_GPIO_Port,W5500_NSS_Pin,GPIO_PIN_RESET) ///*W5500的片选管脚*//
//W5500初始化
void W5500_ChipInit(void)
{
W5500_RESET();//复位芯片
reg_wizchip_cris_cbfunc(SPI_CrisEnter, SPI_CrisExit); //注册临界函数
reg_wizchip_cs_cbfunc(SPI_CS_Select, SPI_CS_Deselect); //注册SPI片选函数
reg_wizchip_spi_cbfunc(SPI_ReadByte, SPI_WriteByte); //注册SPI读写函数
ChipParametersConfiguration();//初始化芯片
NetworkParameterConfiguration();//初始化网络参数配置 MAC 静态IP配置等
}
//SPI发送1字节
void SPI_WriteByte(uint8_t TxData)
{
uint8_t data;
HAL_SPI_TransmitReceive(&hspi2,&TxData,&data,1,100);
}
//SPI接收1字节
uint8_t SPI_ReadByte(void)
{
uint8_t data[2]={0xFF,0xFF};
HAL_SPI_TransmitReceive(&hspi2,data,data+1,1,100);
return data[1];
}
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();//8M外部晶振,72M系统主频
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();//复位管脚,片选管脚初始化
MX_SPI2_Init();//初始化SP2引脚,PB13,PB14,PB15
/* USER CODE BEGIN 2 */
W5500_ChipInit(); //芯片初始化
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
Net_Status = getSn_SR(SOCK_TCPC);
switch(Net_Status) /*获取socket的状态*/
{
case SOCK_CLOSED: /*socket处于关闭状态*/
socket(SOCK_TCPC,Sn_MR_TCP,local_port,Sn_MR_ND);
break;
case SOCK_INIT: /*socket处于初始化状态*/
connect(SOCK_TCPC,remote_ip,remote_port);/*socket连接服务器*/
break;
case SOCK_ESTABLISHED: /*socket处于连接建立状态*/
if(getSn_IR(SOCK_TCPC) & Sn_IR_CON)
{
setSn_IR(SOCK_TCPC, Sn_IR_CON); /*清除接收中断标志位*/
}
Len=getSn_RX_RSR(SOCK_TCPC); /*获取接收的数据长度*/
if(Len>0) //接收到数据
{
recv(SOCK_TCPC,RevBuf,Len); /*接收来自Server的数据*/
send(SOCK_TCPC,RevBuf,Len); //接收到的数据返回给服务器
}else
{
send(SOCK_TCPC,TEST_buff,sLen); //发送默认的数组
HAL_Delay(1000);//等待1000ms
}
break;
case SOCK_CLOSE_WAIT: /*socket处于等待关闭状态*/
close(SOCK_TCPC);
break;
}
}
/* USER CODE END 3 */
}
实验效果:
IP,端口都配置完成后,网线连接上电脑后,电脑TCP上位机打开服务器模式,就能接收到数据
六.CubeMX工程源代码下载
通过网盘分享的文件:W5500以太网模块通信实验(HAL库).rar
链接: https://pan.baidu.com/s/150GohcZUoWHk0-gcq9HbkA 提取码: 5cqi
如果链接失效,可以联系博主给最新链接
程序下载下来之后解压就行
七.小结
W5500模块只需要一些简单的 Socket 编程就能实现以太网通讯,适合STM32F103单片机实现以太网相关应用。