一、W5500简介
W5500 网络扩展板集成了一个硬件 TCP/IP 协议栈芯片 W5500 以及一个含有网络变压器的 RJ-45(HR911105A)。 其中,W5500 是一款全硬件 TCP/IP 嵌入式以太网控制器,为嵌入式系统提供了更加简易的互联网连接方案, 使用硬件逻辑门电路实现 TCP/IP 协议栈的传输层及网络层(如:TCP, UDP, ICMP, IPv4, ARP, IGMP, PPPoE 等协议), 并集成了数据链路层,物理层,以及 32K 字节片上 RAM 作为数据收发缓存。使得上位机主控芯片, 只需承担TCP/IP 应用层控制信息的处理任务。从而大大节省了上位机对于数据复制、协议处理和中断处理等方面的工作量,提升了系统利用率及可靠性。
详情:4. w5500模块 — [野火]STM32模块例程介绍 文档 (embedfire.com)
二、厂家Demo演示
二、STM32+W5500+modbus协议编程
下载工程文件并打开
main.c
int main(void)
{
unsigned char i;
/* Initialize STM32F103 */
System_Initialization();//系统配置
SysTick_Init();//启动系统滴答定时器 SysTick
/* Config W5500 */
W5500_Configuration();//W5500配置
Delay_ms(200);//延时等待
/* Modbus-TCP Init */
eMBTCPInit(MB_TCP_PORT_USE_DEFAULT); //端口依赖事件模块初始化
Delay_ms(200); //延时等待
/* Enable Modbus-TCP Stack */
eMBEnable();//激活协议栈
printf("\r\nModbus-TCP Start!\r\n");
printf("IP:192.168.1.128\r\n");
while(1)
{
i=Read_SOCK_1_Byte(0,Sn_SR); //读W5500状态
if(i==0)
{
do
{
Delay_ms(100);//延时等待
}while(Socket_Listen(0)==FALSE);//设置“Socket n”为“TCP服务器模式”
}
else if(i==SOCK_ESTABLISHED) //建立TCP连接
{
eMBPoll();//启动modbus侦听
BSP_LED();//线圈控制LED灯
}
}
}
W5500
/* W5500 configuration */
void W5500_Configuration()
{
unsigned char array[6];
GPIO_SetBits(GPIO_W5500_RST_PORT, GPIO_W5500_RST_Pin);//上拉
Delay_ms(100); /*delay 100ms 使用systick 1ms时基的延时*/
//等待以太网链路
while((Read_1_Byte(PHYCFGR)&LINK)==0); /* Waiting for Ethernet Link */
Write_1_Byte(MR, RST);//写入W5500普通寄存器一个字节
Delay_ms(20); /*delay 20ms */
/* Set Gateway IP as: 192.168.1.1 */
array[0]=192;
array[1]=168;
array[2]=1;
array[3]=1;
Write_Bytes(GAR, array, 4);//设置网关IP
/* Set Subnet Mask as: 255.255.255.0 */
array[0]=255;
array[1]=255;
array[2]=255;
array[3]=0;
Write_Bytes(SUBR, array, 4);//设置子网掩码
/* Set MAC Address as: 0x48,0x53,0x00,0x57,0x55,0x00 */
array[0]=0x48;
array[1]=0x53;
array[2]=0x00;
array[3]=0x57;
array[4]=0x55;
array[5]=0x00;
Write_Bytes(SHAR, array, 6);//设置MAC地址
/* Set W5500 IP as: 192.168.1.128 */
array[0]=192;
array[1]=168;
array[2]=1;
array[3]=128;
Write_Bytes(SIPR, array, 4);//设置W5500的IP地址
}
三、STM32+W5500的web服务
打开工程文件
mian.c
int main(void)
{
Systick_Init(72);//系统时钟初始化
GPIO_Configuration(); //GPIO configuration
USART1_Init(); //串口初始化:115200@8-n-1
printf("W5500 EVB initialization over.\r\n");
Reset_W5500();
WIZ_SPI_Init();//W5500相关引脚配置
printf("W5500 initialized!\r\n");
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7))
{
DefaultSet();//出厂值
}
else
{
get_config();//read config data from flash
}
printf("Firmware ver%d.%d\r\n",ConfigMsg.sw_ver[0],ConfigMsg.sw_ver[1]);
if(ConfigMsg.debug==0) ConfigMsg.debug=1;
set_network();//配置网络信息
printf("Network is ready.\r\n");
while(1)
{
if(ConfigMsg.JTXD_Control == 0)
do_http();//开启http服务
else
JTXD_do_http();
if(reboot_flag)
NVIC_SystemReset();//发起系统复位请求复位单片机
// reboot();
}
}
W5500
#include <stdio.h>
#include <string.h>
#include "config.h"
#include "SPI2.h"
#include "w5500.h"
#include "socket.h"
#ifdef __DEF_IINCHIP_PPP__
#include "md5.h"
#endif
static uint8 I_STATUS[MAX_SOCK_NUM];
static uint16 SSIZE[MAX_SOCK_NUM]; /**< Max Tx buffer size by each channel */
static uint16 RSIZE[MAX_SOCK_NUM]; /**< Max Rx buffer size by each channel */
uint8 getISR(uint8 s)
{
return I_STATUS[s];
}
void putISR(uint8 s, uint8 val)
{
I_STATUS[s] = val;
}
uint16 getIINCHIP_RxMAX(uint8 s)
{
return RSIZE[s];
}
uint16 getIINCHIP_TxMAX(uint8 s)
{
return SSIZE[s];
}
void IINCHIP_CSoff(void)
{
WIZ_CS(LOW);
}
void IINCHIP_CSon(void)
{
WIZ_CS(HIGH);
}
u8 IINCHIP_SpiSendData(uint8 dat)
{
return(SPI2_SendByte(dat));
}
void IINCHIP_WRITE( uint32 addrbsb, uint8 data)
{
IINCHIP_ISR_DISABLE(); // Interrupt Service Routine Disable
IINCHIP_CSoff(); // CS=0, SPI start
IINCHIP_SpiSendData( (addrbsb & 0x00FF0000)>>16);// Address byte 1
IINCHIP_SpiSendData( (addrbsb & 0x0000FF00)>> 8);// Address byte 2
IINCHIP_SpiSendData( (addrbsb & 0x000000F8) + 4); // Data write command and Write data length 1
IINCHIP_SpiSendData(data); // Data write (write 1byte data)
IINCHIP_CSon(); // CS=1, SPI end
IINCHIP_ISR_ENABLE(); // Interrupt Service Routine Enable
}
uint8 IINCHIP_READ(uint32 addrbsb)
{
uint8 data = 0;
IINCHIP_ISR_DISABLE(); // Interrupt Service Routine Disable
IINCHIP_CSoff(); // CS=0, SPI start
IINCHIP_SpiSendData( (addrbsb & 0x00FF0000)>>16);// Address byte 1
IINCHIP_SpiSendData( (addrbsb & 0x0000FF00)>> 8);// Address byte 2
IINCHIP_SpiSendData( (addrbsb & 0x000000F8)) ;// Data read command and Read data length 1
data = IINCHIP_SpiSendData(0x00); // Data read (read 1byte data)
IINCHIP_CSon(); // CS=1, SPI end
IINCHIP_ISR_ENABLE(); // Interrupt Service Routine Enable
return data;
}
uint16 wiz_write_buf(uint32 addrbsb,uint8* buf,uint16 len)
{
uint16 idx = 0;
if(len == 0) printf("Unexpected2 length 0\r\n");
IINCHIP_ISR_DISABLE()