W5500驱动函数库

合集下载

STM32F103驱动W5500网络程序

STM32F103驱动W5500网络程序

#include "W5500.h"/***************----- 网络参数变量定义-----***************/unsigned char Gateway_IP[4];//网关IP地址unsigned char Sub_Mask[4]; //子网掩码unsigned char Phy_Addr[6]; //物理地址(MAC)unsigned char IP_Addr[4]; //本机IP地址unsigned char S0_Port[2]; //端口0的端口号(5000)unsigned char S0_DIP[4]; //端口0目的IP地址unsigned char S0_DPort[2]; //端口0目的端口号(6000)unsigned char UDP_DIPR[4]; //UDP(广播)模式,目的主机IP地址unsigned char UDP_DPORT[2]; //UDP(广播)模式,目的主机端口号/***************----- 端口的运行模式-----***************/unsigned char S0_Mode =3; //端口0的运行模式,0:TCP服务器模式,1:TCP客户端模式,2:UDP(广播)模式#define TCP_SERVER 0x00 //TCP服务器模式#define TCP_CLIENT 0x01 //TCP客户端模式#define UDP_MODE 0x02 //UDP(广播)模式/***************----- 端口的运行状态-----***************/unsigned char S0_State =0; //端口0状态记录,1:端口完成初始化,2端口完成连接(可以正常传输数据)#define S_INIT 0x01 //端口完成初始化#define S_CONN 0x02 //端口完成连接,可以正常传输数据/***************----- 端口收发数据的状态-----***************/unsigned char S0_Data; //端口0接收和发送数据的状态,1:端口接收到数据,2:端口发送数据完成#define S_RECEIVE 0x01 //端口接收到一个数据包#define S_TRANSMITOK 0x02 //端口发送一个数据包完成/***************----- 端口数据缓冲区-----***************/unsigned char Rx_Buffer[2048]; //端口接收数据缓冲区unsigned char Tx_Buffer[2048]; //端口发送数据缓冲区unsigned char W5500_Interrupt; //W5500中断标志(0:无中断,1:有中断)/*外部中断4服务程序*/void EXTI4_IRQHandler(void){if(W5500_INT==0){W5500_Interrupt=1;EXTI->PR=1<<4; //清除LINE4上的中断标志位}}void SPI1_Init(void){RCC->APB2ENR|=1<<2; //PORTA时钟使能RCC->APB2ENR|=1<<12; //SPI1时钟使能RCC->APB2ENR|=1<<0;GPIOA->CRL&=0XFFF0FFFF;GPIOA->CRL|=0X00030000;//PA4通用挽推输出,输出速度50MHzGPIOA->ODR|=1<<4; //PA4上拉,设置片选引脚//这里只针对SPI口初始化GPIOA->CRL&=0X000FFFFF;GPIOA->CRL|=0XBBB00000;//PA5.6.7复用功能挽推输出,输出速度50MHzGPIOA->ODR|=0X7<<5; //PA5.6.7上拉SPI1->CR1&=~(1<<10);//全双工模式SPI1->CR1=1<<9; //外部管理NSS引脚SPI1->CR1&=~(1<<11);//8bit数据格式SPI1->CR1&=~(1<<1); //CPOL=0时空闲模式下SCK为0 CPOL=0SPI1->CR1&=~(1<<0); //数据采样从第一个时间边沿开始,CPHA=0SPI1->CR1|=1<<8;SPI1->CR1|=1<<2; //SPI主机SPI1->CR1|=0<<3; //Fsck=Fcpu/2SPI1->CR1&=~(1<<7); //MSBfirst先发送高位SPI1->CRCPR = 0X07;SPI1->CR1|=1<<6; //SPI设备使能}/****************************************************************************** ** 函数名: W5500_GPIO_Configuration* 描述: W5500 GPIO初始化配置* 输入: 无* 输出: 无* 返回值: 无* 说明: 无******************************************************************************* /void W5500_GPIO_Configuration(void){RCC->APB2ENR|=1<<4; //PORTC时钟使能GPIOC->CRL&=0XFF00FFFF;GPIOC->CRL|=0X00380000;GPIOC->ODR|=3<<4; //PC4上拉,PC5输出高SPI1_Init();Ex_NVIC_Config(GPIO_C,4,FTIR); //下降沿触发MY_NVIC_Init(2,0,EXTI4_IRQChannel,2); //抢占2,子优先级0,组2}/****************************************************************************** ** 函数名: Write_W5500_1Byte* 描述: 通过SPI1向指定地址寄存器写1个字节数据* 输入: reg:16位寄存器地址,dat:待写入的数据* 输出: 无* 返回值: 无* 说明: 无******************************************************************************* /void Write_W5500_1Byte(u16 reg, u8 dat){W5500_CS_Low();//置W5500的SCS为低电平SPI1_Send_Short(reg);//通过SPI1写16位寄存器地址SPI1_ReadWriteByte(FDM1|RWB_WRITE|COMMON_R);//通过SPI1写控制字节,1个字节数据长度,写数据,选择通用寄存器SPI1_ReadWriteByte(dat);//写1个字节数据W5500_CS_High(); //置W5500的SCS为高电平}/****************************************************************************** ** 函数名: Write_W5500_2Byte* 描述: 通过SPI1向指定地址寄存器写2个字节数据* 输入: reg:16位寄存器地址,dat:16位待写入的数据(2个字节)* 输出: 无* 返回值: 无* 说明: 无******************************************************************************* /void Write_W5500_2Byte(u16 reg, u16 dat){W5500_CS_Low();//置W5500的SCS为低电平SPI1_Send_Short(reg);//通过SPI1写16位寄存器地址SPI1_ReadWriteByte(FDM2|RWB_WRITE|COMMON_R);//通过SPI1写控制字节,2个字节数据长度,写数据,选择通用寄存器SPI1_Send_Short(dat);//写16位数据W5500_CS_High(); //置W5500的SCS为高电平}/****************************************************************************** ** 函数名: Write_W5500_nByte* 描述: 通过SPI1向指定地址寄存器写n个字节数据* 输入: reg:16位寄存器地址,*dat_ptr:待写入数据缓冲区指针,size:待写入的数据长度* 输出: 无* 返回值: 无* 说明: 无******************************************************************************* /void Write_W5500_nByte(u16 reg, u8 *dat_ptr, u16 size){u16 i;W5500_CS_Low();//置W5500的SCS为低电平SPI1_Send_Short(reg);//通过SPI1写16位寄存器地址SPI1_ReadWriteByte(VDM|RWB_WRITE|COMMON_R);//通过SPI1写控制字节,N个字节数据长度,写数据,选择通用寄存器for(i=0;i<size;i++)//循环将缓冲区的size个字节数据写入W5500{SPI1_ReadWriteByte(*dat_ptr++);//写一个字节数据}W5500_CS_High(); //置W5500的SCS为高电平/****************************************************************************** ** 函数名: Write_W5500_SOCK_1Byte* 描述: 通过SPI1向指定端口寄存器写1个字节数据* 输入: s:端口号,reg:16位寄存器地址,dat:待写入的数据* 输出: 无* 返回值: 无* 说明: 无******************************************************************************* /void Write_W5500_SOCK_1Byte(SOCKET s, u16 reg, u8 dat){W5500_CS_Low();//置W5500的SCS为低电平SPI1_Send_Short(reg);//通过SPI1写16位寄存器地址SPI1_ReadWriteByte(FDM1|RWB_WRITE|(s*0x20+0x08));//通过SPI1写控制字节,1个字节数据长度,写数据,选择端口s的寄存器SPI1_ReadWriteByte(dat);//写1个字节数据W5500_CS_High(); //置W5500的SCS为高电平}/****************************************************************************** ** 函数名: Write_W5500_SOCK_2Byte* 描述: 通过SPI1向指定端口寄存器写2个字节数据* 输入: s:端口号,reg:16位寄存器地址,dat:16位待写入的数据(2个字节)* 输出: 无* 返回值: 无* 说明: 无******************************************************************************* /void Write_W5500_SOCK_2Byte(SOCKET s, u16 reg, u16 dat){W5500_CS_Low();//置W5500的SCS为低电平SPI1_Send_Short(reg);//通过SPI1写16位寄存器地址SPI1_ReadWriteByte(FDM2|RWB_WRITE|(s*0x20+0x08));//通过SPI1写控制字节,2个字节数据长度,写数据,选择端口s的寄存器SPI1_Send_Short(dat);//写16位数据W5500_CS_High(); //置W5500的SCS为高电平/****************************************************************************** ** 函数名: Write_W5500_SOCK_4Byte* 描述: 通过SPI1向指定端口寄存器写4个字节数据* 输入: s:端口号,reg:16位寄存器地址,*dat_ptr:待写入的4个字节缓冲区指针* 输出: 无* 返回值: 无* 说明: 无******************************************************************************* /void Write_W5500_SOCK_4Byte(SOCKET s, u16 reg, u8 *dat_ptr){W5500_CS_Low();//置W5500的SCS为低电平SPI1_Send_Short(reg);//通过SPI1写16位寄存器地址SPI1_ReadWriteByte(FDM4|RWB_WRITE|(s*0x20+0x08));//通过SPI1写控制字节,4个字节数据长度,写数据,选择端口s的寄存器SPI1_ReadWriteByte(*dat_ptr++);//写第1个字节数据SPI1_ReadWriteByte(*dat_ptr++);//写第2个字节数据SPI1_ReadWriteByte(*dat_ptr++);//写第3个字节数据SPI1_ReadWriteByte(*dat_ptr++);//写第4个字节数据W5500_CS_High(); //置W5500的SCS为高电平}/****************************************************************************** ** 函数名: Read_W5500_1Byte* 描述: 读W5500指定地址寄存器的1个字节数据* 输入: reg:16位寄存器地址* 输出: 无* 返回值: 读取到寄存器的1个字节数据* 说明: 无******************************************************************************* /u8 Read_W5500_1Byte(u16 reg){u8 i;W5500_CS_Low();//置W5500的SCS为低电平SPI1_Send_Short(reg);//通过SPI1写16位寄存器地址i=SPI1_ReadWriteByte(FDM1|RWB_READ|COMMON_R);//通过SPI1写控制字节,1个字节数据长度,读数据,选择通用寄存器// i=Read_W5500_1Byte(0x00);// SPI1_Send_Byte(0x00);//发送一个哑数据i=SPI1_ReadWriteByte(0x00);//读取1个字节数据W5500_CS_High();//置W5500的SCS为高电平return i;//返回读取到的寄存器数据}/****************************************************************************** ** 函数名: Read_W5500_SOCK_1Byte* 描述: 读W5500指定端口寄存器的1个字节数据* 输入: s:端口号,reg:16位寄存器地址* 输出: 无* 返回值: 读取到寄存器的1个字节数据* 说明: 无******************************************************************************* /u8 Read_W5500_SOCK_1Byte(SOCKET s, u16 reg){u8 i;W5500_CS_Low();//置W5500的SCS为低电平SPI1_Send_Short(reg);//通过SPI1写16位寄存器地址i=SPI1_ReadWriteByte(FDM1|RWB_READ|(s*0x20+0x08));//通过SPI1写控制字节,1个字节数据长度,读数据,选择端口s的寄存器// i=SPI_I2S_ReceiveData(SPI1);// SPI1_Send_Byte(0x00);//发送一个哑数据i=SPI1_ReadWriteByte(0X00);//读取1个字节数据W5500_CS_High();//置W5500的SCS为高电平return i;//返回读取到的寄存器数据}/****************************************************************************** ** 函数名: Read_W5500_SOCK_2Byte* 描述: 读W5500指定端口寄存器的2个字节数据* 输入: s:端口号,reg:16位寄存器地址* 输出: 无* 返回值: 读取到寄存器的2个字节数据(16位)* 说明: 无******************************************************************************* /u16 Read_W5500_SOCK_2Byte(SOCKET s, u16 reg){u16 i;W5500_CS_Low();//置W5500的SCS为低电平SPI1_Send_Short(reg);//通过SPI1写16位寄存器地址i=SPI1_ReadWriteByte(FDM2|RWB_READ|(s*0x20+0x08));//通过SPI1写控制字节,2个字节数据长度,读数据,选择端口s的寄存器// i=SPI_I2S_ReceiveData(SPI1);// SPI1_Send_Byte(0x00);//发送一个哑数据i=SPI1_ReadWriteByte(0x00);//读取高位数据// SPI1_Send_Byte(0x00);//发送一个哑数据i*=256;i+=SPI1_ReadWriteByte(0x00);//读取低位数据W5500_CS_High();//置W5500的SCS为高电平return i;//返回读取到的寄存器数据}/****************************************************************************** ** 函数名: Read_SOCK_Data_Buffer* 描述: 从W5500接收数据缓冲区中读取数据* 输入: s:端口号,*dat_ptr:数据保存缓冲区指针* 输出: 无* 返回值: 读取到的数据长度,rx_size个字节* 说明: 无******************************************************************************* /u16 Read_SOCK_Data_Buffer(SOCKET s, u8 *dat_ptr){u16 rx_size;u16 offset, offset1;u16 i;u8 j;rx_size=Read_W5500_SOCK_2Byte(s,Sn_RX_RSR);if(rx_size==0) return 0;//没接收到数据则返回if(rx_size>1460) rx_size=1460;offset=Read_W5500_SOCK_2Byte(s,Sn_RX_RD);offset1=offset;offset&=(S_RX_SIZE-1);//计算实际的物理地址W5500_CS_Low();//置W5500的SCS为低电平SPI1_Send_Short(offset);//写16位地址j=SPI1_ReadWriteByte(VDM|RWB_READ|(s*0x20+0x18));//写控制字节,N个字节数据长度,读数据,选择端口s的寄存器// j=SPI_I2S_ReceiveData(SPI1);if((offset+rx_size)<S_RX_SIZE)//如果最大地址未超过W5500接收缓冲区寄存器的最大地址{for(i=0;i<rx_size;i++)//循环读取rx_size个字节数据{// SPI1_Send_Byte(0x00);//发送一个哑数据j=SPI1_ReadWriteByte(0X00);//读取1个字节数据*dat_ptr=j;//将读取到的数据保存到数据保存缓冲区dat_ptr++;//数据保存缓冲区指针地址自增1}}else//如果最大地址超过W5500接收缓冲区寄存器的最大地址{offset=S_RX_SIZE-offset;for(i=0;i<offset;i++)//循环读取出前offset个字节数据{// SPI1_Send_Byte(0x00);//发送一个哑数据j=SPI1_ReadWriteByte(0X00);//读取1个字节数据*dat_ptr=j;//将读取到的数据保存到数据保存缓冲区dat_ptr++;//数据保存缓冲区指针地址自增1}W5500_CS_High(); //置W5500的SCS为高电平W5500_CS_Low();//置W5500的SCS为低电平SPI1_Send_Short(0x00);//写16位地址j=SPI1_ReadWriteByte(VDM|RWB_READ|(s*0x20+0x18));//写控制字节,N个字节数据长度,读数据,选择端口s的寄存器// j=SPI_I2S_ReceiveData(SPI1);for(;i<rx_size;i++)//循环读取后rx_size-offset个字节数据{// SPI1_Send_Byte(0x00);//发送一个哑数据j=SPI1_ReadWriteByte(0X00);//读取1个字节数据*dat_ptr=j;//将读取到的数据保存到数据保存缓冲区dat_ptr++;//数据保存缓冲区指针地址自增1}}W5500_CS_High(); //置W5500的SCS为高电平offset1+=rx_size;//更新实际物理地址,即下次读取接收到的数据的起始地址Write_W5500_SOCK_2Byte(s, Sn_RX_RD, offset1);Write_W5500_SOCK_1Byte(s, Sn_CR, RECV);//发送启动接收命令return rx_size;//返回接收到数据的长度}/****************************************************************************** ** 函数名: Write_SOCK_Data_Buffer* 描述: 将数据写入W5500的数据发送缓冲区* 输入: s:端口号,*dat_ptr:数据保存缓冲区指针,size:待写入数据的长度* 输出: 无* 返回值: 无* 说明: 无******************************************************************************* /void Write_SOCK_Data_Buffer(SOCKET s, u8 *dat_ptr, u16 size){u16 offset,offset1;u16 i;//如果是UDP模式,可以在此设置目的主机的IP和端口号if((Read_W5500_SOCK_1Byte(s,Sn_MR)&0x0f) != SOCK_UDP)//如果Socket打开失败{UDP_DIPR[0] = Flash_Tab[2]; //UDP(广播)模式,目的主机IP地址UDP_DIPR[1] = Flash_Tab[3];UDP_DIPR[2] = Flash_Tab[4];UDP_DIPR[3] = Flash_Tab[5];//UDP_DPORT[0] = Flash_Tab[8]; //UDP(广播)模式,目的主机端口号UDP_DPORT[1] = Flash_Tab[7];Write_W5500_SOCK_4Byte(s, Sn_DIPR, UDP_DIPR);//设置目的主机IPWrite_W5500_SOCK_2Byte(s, Sn_DPORTR, UDP_DPORT[0]*256+UDP_DPORT[1]);//设置目的主机端口号}offset=Read_W5500_SOCK_2Byte(s,Sn_TX_WR);offset1=offset;offset&=(S_TX_SIZE-1);//计算实际的物理地址W5500_CS_Low();//置W5500的SCS为低电平SPI1_Send_Short(offset);//写16位地址SPI1_ReadWriteByte(VDM|RWB_WRITE|(s*0x20+0x10));//写控制字节,N个字节数据长度,写数据,选择端口s的寄存器if((offset+size)<S_TX_SIZE)//如果最大地址未超过W5500发送缓冲区寄存器的最大地址{for(i=0;i<size;i++)//循环写入size个字节数据{SPI1_ReadWriteByte(*dat_ptr++);//写入一个字节的数据}}else//如果最大地址超过W5500发送缓冲区寄存器的最大地址{offset=S_TX_SIZE-offset;for(i=0;i<offset;i++)//循环写入前offset个字节数据{SPI1_ReadWriteByte(*dat_ptr++);//写入一个字节的数据}W5500_CS_High(); //置W5500的SCS为高电平W5500_CS_Low();//置W5500的SCS为低电平SPI1_Send_Short(0x00);//写16位地址SPI1_ReadWriteByte(VDM|RWB_WRITE|(s*0x20+0x10));//写控制字节,N个字节数据长度,写数据,选择端口s的寄存器for(;i<size;i++)//循环写入size-offset个字节数据{SPI1_ReadWriteByte(*dat_ptr++);//写入一个字节的数据}}W5500_CS_High(); //置W5500的SCS为高电平offset1+=size;//更新实际物理地址,即下次写待发送数据到发送数据缓冲区的起始地址Write_W5500_SOCK_2Byte(s, Sn_TX_WR, offset1);Write_W5500_SOCK_1Byte(s, Sn_CR, SEND);//发送启动发送命令}/****************************************************************************** ** 函数名: W5500_Hardware_Reset* 描述: 硬件复位W5500* 输入: 无* 输出: 无* 返回值: 无* 说明: W5500的复位引脚保持低电平至少500us以上,才能重围W5500******************************************************************************* /void W5500_Hardware_Reset(void){W5500_RST_Low();//复位引脚拉低delay_ms(50);W5500_RST_High();//复位引脚拉高delay_ms(200);// while((Read_W5500_1Byte(PHYCFGR)&LINK)==0);//等待以太网连接完成}/****************************************************************************** ** 函数名: W5500_Init* 描述: 初始化W5500寄存器函数* 输入: 无* 输出: 无* 返回值: 无* 说明: 在使用W5500之前,先对W5500初始化******************************************************************************* /void W5500_Init(void){u8 i=0;Write_W5500_1Byte(MR, RST);//软件复位W5500,置1有效,复位后自动清0delay_ms(10);//延时10ms,自己定义该函数//设置网关(Gateway)的IP地址,Gateway_IP为4字节unsigned char数组,自己定义//使用网关可以使通信突破子网的局限,通过网关可以访问到其它子网或进入Internet Write_W5500_nByte(GAR, Gateway_IP, 4);//设置子网掩码(MASK)值,SUB_MASK为4字节unsigned char数组,自己定义//子网掩码用于子网运算Write_W5500_nByte(SUBR,Sub_Mask,4);//设置物理地址,PHY_ADDR为6字节unsigned char数组,自己定义,用于唯一标识网络设备的物理地址值//该地址值需要到IEEE申请,按照OUI的规定,前3个字节为厂商代码,后三个字节为产品序号//如果自己定义物理地址,注意第一个字节必须为偶数Write_W5500_nByte(SHAR,Phy_Addr,6);//设置本机的IP地址,IP_ADDR为4字节unsigned char数组,自己定义//注意,网关IP必须与本机IP属于同一个子网,否则本机将无法找到网关Write_W5500_nByte(SIPR,IP_Addr,4);//设置发送缓冲区和接收缓冲区的大小,参考W5500数据手册for(i=0;i<8;i++){Write_W5500_SOCK_1Byte(i,Sn_RXBUF_SIZE, 0x02);//Socket Rx memory size=2kWrite_W5500_SOCK_1Byte(i,Sn_TXBUF_SIZE, 0x02);//Socket Tx mempry size=2k }//设置重试时间,默认为2000(200ms)//每一单位数值为100微秒,初始化时值设为2000(0x07D0),等于200毫秒Write_W5500_2Byte(RTR, 0x07d0);//设置重试次数,默认为8次//如果重发的次数超过设定值,则产生超时中断(相关的端口中断寄存器中的Sn_IR 超时位(TIMEOUT)置“1”)Write_W5500_1Byte(RCR,8);//启动中断,参考W5500数据手册确定自己需要的中断类型//IMR_CONFLICT是IP地址冲突异常中断,IMR_UNREACH是UDP通信时,地址无法到达的异常中断//其它是Socket事件中断,根据需要添加Write_W5500_1Byte(IMR,IM_IR7 | IM_IR6);Write_W5500_1Byte(SIMR,S0_IMR);Write_W5500_SOCK_1Byte(0, Sn_IMR, IMR_SENDOK | IMR_TIMEOUT | IMR_RECV | IMR_DISCON | IMR_CON);}/****************************************************************************** ** 函数名: Detect_Gateway* 描述: 检查网关服务器* 输入: 无* 输出: 无* 返回值: 成功返回TRUE(0xFF),失败返回FALSE(0x00)* 说明: 无******************************************************************************* /u8 Detect_Gateway(void){u8 ip_adde[4];ip_adde[0]=IP_Addr[0]+1;ip_adde[1]=IP_Addr[1]+1;ip_adde[2]=IP_Addr[2]+1;ip_adde[3]=IP_Addr[3]+1;//检查网关及获取网关的物理地址Write_W5500_SOCK_4Byte(0,Sn_DIPR,ip_adde);//向目的地址寄存器写入与本机IP不同的IP值Write_W5500_SOCK_1Byte(0,Sn_MR,MR_TCP);//设置socket为TCP模式Write_W5500_SOCK_1Byte(0,Sn_CR,OPEN);//打开Socketdelay_ms(5);//延时5msif(Read_W5500_SOCK_1Byte(0,Sn_SR) != SOCK_INIT)//如果socket打开失败{Write_W5500_SOCK_1Byte(0,Sn_CR,CLOSE);//打开不成功,关闭Socketreturn FALSE;//返回FALSE(0x00)}Write_W5500_SOCK_1Byte(0,Sn_CR,CONNECT);//设置Socket为Connect模式do{u8 j=0;j=Read_W5500_SOCK_1Byte(0,Sn_IR);//读取Socket0中断标志寄存器if(j!=0)Write_W5500_SOCK_1Byte(0,Sn_IR,j);delay_ms(5);//延时5msif((j&IR_TIMEOUT) == IR_TIMEOUT){return FALSE;}else if(Read_W5500_SOCK_1Byte(0,Sn_DHAR) != 0xff){Write_W5500_SOCK_1Byte(0,Sn_CR,CLOSE);//关闭Socketreturn TRUE;}}while(1);}/****************************************************************************** ** 函数名: Socket_Init* 描述: 指定Socket(0~7)初始化* 输入: s:待初始化的端口* 输出: 无* 返回值: 无* 说明: 无******************************************************************************* /void Socket_Init(SOCKET s){//设置分片长度,参考W5500数据手册,该值可以不修改Write_W5500_SOCK_2Byte(0, Sn_MSSR, 1460);//最大分片字节数=1460(0x5b4)//设置指定端口switch(s){case 0://设置端口0的端口号Write_W5500_SOCK_2Byte(0, Sn_PORT, S0_Port[0]*256+S0_Port[1]);break;case 1:break;case 2:break;case 3:break;case 4:break;case 5:break;case 6:break;case 7:break;default:break;}}/****************************************************************************** ** 函数名: Socket_Connect* 描述: 设置指定Socket(0~7)为客户端与远程服务器连接* 输入: s:待设定的端口* 输出: 无* 返回值: 成功返回TRUE(0xFF),失败返回FALSE(0x00)* 说明: 当本机Socket工作在客户端模式时,引用该程序,与远程服务器建立连接* 如果启动连接后出现超时中断,则与服务器连接失败,需要重新调用该程序连接* 该程序每调用一次,就与服务器产生一次连接******************************************************************************* /unsigned char Socket_Connect(SOCKET s){Write_W5500_SOCK_1Byte(s,Sn_MR,MR_TCP);//设置socket为TCP模式Write_W5500_SOCK_1Byte(s,Sn_CR,OPEN);//打开Socketdelay_ms(5);//延时5msif(Read_W5500_SOCK_1Byte(s,Sn_SR)!=SOCK_INIT)//如果socket打开失败{Write_W5500_SOCK_1Byte(s,Sn_CR,CLOSE);//打开不成功,关闭Socketreturn FALSE;//返回FALSE(0x00)}Write_W5500_SOCK_1Byte(s,Sn_CR,CONNECT);//设置Socket为Connect模式return TRUE;//返回TRUE,设置成功}/****************************************************************************** ** 函数名: Socket_Listen* 描述: 设置指定Socket(0~7)作为服务器等待远程主机的连接* 输入: s:待设定的端口* 输出: 无* 返回值: 成功返回TRUE(0xFF),失败返回FALSE(0x00)* 说明: 当本机Socket工作在服务器模式时,引用该程序,等等远程主机的连接* 该程序只调用一次,就使W5500设置为服务器模式******************************************************************************* /unsigned char Socket_Listen(SOCKET s){Write_W5500_SOCK_1Byte(s,Sn_MR,MR_TCP);//设置socket为TCP模式Write_W5500_SOCK_1Byte(s,Sn_CR,OPEN);//打开Socketdelay_ms(5);//延时5msif(Read_W5500_SOCK_1Byte(s,Sn_SR)!=SOCK_INIT)//如果socket打开失败{Write_W5500_SOCK_1Byte(s,Sn_CR,CLOSE);//打开不成功,关闭Socketreturn FALSE;//返回FALSE(0x00)}Write_W5500_SOCK_1Byte(s,Sn_CR,LISTEN);//设置Socket为侦听模式delay_ms(5);//延时5msif(Read_W5500_SOCK_1Byte(s,Sn_SR)!=SOCK_LISTEN)//如果socket设置失败{Write_W5500_SOCK_1Byte(s,Sn_CR,CLOSE);//设置不成功,关闭Socketreturn FALSE;//返回FALSE(0x00)}return TRUE;//至此完成了Socket的打开和设置侦听工作,至于远程客户端是否与它建立连接,则需要等待Socket中断,//以判断Socket的连接是否成功。

w5500驱动使用方法调试笔记

w5500驱动使用方法调试笔记

w5500驱动使⽤⽅法调试笔记
1、w5500有两种⽅式可以运⾏的,server端⼀般⽤中断的⽅式,效率⽐较⾼,client使⽤查询的模式,本⾝⾃带2k的发送缓存和2k的接收缓存。

2、查询模式:有数据的时候,查询模式可以每隔⼀段时间去查询,有数据是读出,没有数据的继续查询,挺⽅便的。

这个代码我参考的野⽕的驱动。

3、中断模式:当服务器使⽤时,还是需要使⽤中断模式,因为技术代理说最好不要⽤,但我使⽤了中断,感觉没啥问题,但是有⼀个点需要注意的。

4、中断模式的注意点:
因为w5500有很多中断的,连接超时中断,接收中断,发送中断,链接成功中断,断开成功中断。

可以使能,也可以屏蔽,具体可以看看数据⼿册,有中⽂版的。

调试过程:
我把发送完成中断取消了之后,发现还是有提⽰发送完成的信息,我以为没有关闭,⼀直瞎调试,后来看看波形之后,的确是关掉了,所以正如⼿册所说的,屏蔽位清0了,即便发送了中断,他上会在int引脚中产⽣下降沿,因此就屏蔽了。

总结:因为发送完成中断在我这⾥不需要,上位机会根据收到的数据进⾏⾃⼰判断,发送中断有点类似于串⼝发送中断。

STM32的W5500以太网通信模块快速实现方法

STM32的W5500以太网通信模块快速实现方法

接口外扩 W5500以太网控制器来搭建模块硬件,然后利用 STM32CubeMX 快速完成 STM32F407初 始 化 配 置 程 序 的 设
计,再利用 W5500官方库函数快速完成以太网通信 程 序 的 开 发,同 时 为 提 升 以 太 网 通 信 速 率,对 W5500 官 方 库 函 数 实
施了优化。最后为了验证设计方案的有效性及测试通信速率,设计 了 基 于 LabVIEW 的 测 试 软 件。 实 验 结 果 表 明,利 用
本 文 提 出 的 方 案 可 较 快 实 现 以 太 网 通 信 模 块 的 开 发 ,且 通 信 速 率 比 优 化 前 提 高 接 近 两 倍 。
关 键 词 :STM32CubeMX;W5500;LabVIEW;网 络 速 率 测 试 ;SPI
STM32的 W5500以太网通信模块快速实现方法
杨 红 波 ,朱 磊 ,张 博 ,鲁 露
(西 安 工 程 大 学 电 子 信 息 学 院 ,西 安 710048)
摘要:提出了一种基于 STM32CubeMX 的 W5500以太网通信模块快速实现方案。该方案先 以 STM32F407 处 理 器 SPI
近 年 来 开 发 STM32 比 较 流 行 的 一 个 工 具 STM32CubeMX,它是意 法 半 导 体 的 主 动 原 创 工 具,可 以 缩短开发的工作时 间,降 低 费 用,它 也 是 一 个 图 形 化 的 工 具,配置和完 成 开 发 初 期 关 于 芯 片 相 关 的 一 些 初 始 化 代 码 。 [8] 同 时 也 集 成 了 一 个 全 面 的 软 件 平 台 ,支 持 STM32 每一个系列的 MCU 开发。快速 完 成 初 始 化 代 码 的 配 置, 提高了代 码 编 写 速 度。 W5500 是 WIZnet公 司 推 出 的 一

W5500数据手册V1.2

W5500数据手册V1.2

特点
支持硬件 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 状态显示(全双工/半双工,网络连接,网络速度,活动状态) LQFP48 无铅封装(7x7mm,间距 0.5mm)
W5500 数据手册 版本 1.2 (2015 年 01 月)
3 / 74
方框图Leabharlann W5500 数据手册 版本 1.2 (2015 年 01 月)
2 / 74
目 录
1 引脚分配 ....................................................................... 3 1.1 引脚描述 ................................................................... 3 2 主机接口 ....................................................................... 8 2.1 SPI 工作模式 ............................................................... 9 2.2 SPI 数据帧 ................................................................. 2 2.2.1 地址段 .............................................................. 2 2.2.2 控制段 .............................................................. 3 2.2.3 数据段 .............................................................. 5 2.3 可变数据长度模式(VDM)Variable Length Data Mode (VDM) ..................... 2 2.3.1 写访问—VDM 模式 ..................................................... 2 2.3.2 读访问—VDM 模式 ..................................................... 2 2.4 固定数据长度模式(FDM)Fixed Length Data Mode (FDM) ........................ 2 2.4.1 写访问—FDM 模式 Write Access in FDM ................................. 2 2.4.2 读访问—FDM 模式 Read Access in FDM .................................. 2 3 寄存器和内存构成 Register and Memory Organization .............................. 2 3.1 通用寄存器区 Common Register Block ......................................... 2 3.2 Socket 寄存器区 Socket Register Block ...................................... 2 3.3 内存 Memory ................................................................ 3 4 寄存器描述 Register Descriptions ............................................... 4 4.1 通用寄存器 Common Registers ................................................ 4 4.2 Socket 端口寄存器 Socket Registers .......................................... 2 5 电气规范 ...................................................................... 16 5.1 绝对最大额定值 ............................................................ 16 5.2 绝对最大额定值 (电气灵敏度) ............................................... 16 5.3 直流特性 .................................................................. 18 5.4 功耗 Power Dissipation .................................................... 19 5.5 交流特性 .................................................................. 19 5.5.1 复位时钟 ........................................................... 19 5.5.2 唤醒时间 ........................................................... 19 5.5.3 晶体特性 ........................................................... 20 5.5.4 SPI 时钟 ............................................................ 20 5.5.5 变压器特性 ......................................................... 21 5.5.6 极性变换 MDIX ....................................................... 22 6 封装描述 ...................................................................... 23 文档历史信息 .................................................................... 24

W5500问题集锦

W5500问题集锦

W5500问题集锦(一)发布时间:2013-11-27 阅读次数:1445 字体大小: 【小】【中】【大】在”WIZnet杯”以太网技术竞赛中,有很多参赛者在使用中对W5500有各种各样的疑问,对于这款WIZnet新推出的以太网芯片,使用中大家是不是也一样存在以下问题呢?来看一看:1.W5500不支持自动极性变换,有点失望……答:其实,只要对方支持极性变换就可以实现,现在的设备不支持极性变换的很少的。

你要是碰到个别老设备连不上,再换交叉线也不迟。

基本上2000年以后的设备都没问题的啦~原帖来自:9MCU2.W5500+STM32F0无法通信问题描述1:我现在做毕设,老师推荐买了W5500这款芯片,与STM32F0进行通信。

但是根据收集到的资料,修改的例程找不到问题所在。

对于网络这部分,本人小白一个,附上程序,希望大家指导一下!谢谢!答1:先附上W5500的例程问题描述2:如果ping 不通,TCP连接不能建立是代码的问题吗?loopback的程序步骤是怎样的答2:W5500 若想Ping通的话需要保证以下2点:1)物理信道通信正常:初步判定Link 灯及状态灯指示正常。

2)配置了W5500的IP,网关,子网掩码,MAC地址这些特殊寄存器由于W5500内部硬件逻辑电路实现了ARP协议。

所以,一旦收到ping包请求的话,会自动回复。

以上的设置不过是为了保证基本信道及通讯能够建立的而已。

反向而言,如果Ping不通,也可以先从这两方面着手。

原帖来自:9MCU3.W5500没指明接收缓冲数据格式,和W5100一样?问题描述:习惯码字和调试分离,虽然待会调试就知道了,也不妨提出来沟通下。

答:注意SPI帧的不同。

W5100:W5500:原帖来自:9MCU4.关于w5500程序的几个问题问题描述:有几个关于w5500程序的问题想请教大家:void Reset_W5500(void){WIZ_RESET_0; //低电平Delay_us(50); //这个的时间如果设为500us,貌似指示灯就全暗了??WIZ_RESET_1;Delay_ms(200);}while(( (getPHYCFGR()) & PHYCFGR_LNK_ON) == PHYCFGR_LNK_OFF); //PHYCFGR_LNK_OFF是0×00,PHYCFGR_LNK_ON是0×01。

基于FPGA和W5500的串口数据切换系统研究与设计

基于FPGA和W5500的串口数据切换系统研究与设计

基于FPGA和W5500的串口数据切换系统研究与设计基于FPGA和W5500的串口数据切换系统研究与设计摘要:串口作为一种常见的通信接口,在嵌入式系统中广泛应用。

本文基于FPGA(Field Programmable Gate Array)和W5500芯片,设计了一种串口数据切换系统。

该系统能够实现多个串口的数据交换和切换操作,并具备高速传输和稳定性。

关键词:FPGA,W5500,串口,数据切换1. 引言串口是一种用于在设备之间进行数据传输的通信接口,在各种嵌入式系统中得到广泛应用。

然而,常见的串口接口数量有限,无法满足复杂系统对多串口的需求。

为了解决这一问题,本文提出了一种基于FPGA和W5500芯片的串口数据切换系统。

2. FPGA和W5500芯片简介2.1 FPGAFPGA是一种可编程逻辑器件,可以根据需求进行编程,实现不同的电路功能。

其灵活性和高度可定制性使得FPGA成为嵌入式系统设计的重要工具。

2.2 W5500芯片W5500是一种以太网控制器,其集成了MAC(Media Access Control)和PHY(Physical Layer)功能。

该芯片能够实现高速数据传输,并支持TCP/IP协议栈。

3. 系统设计3.1 硬件设计本系统使用FPGA作为核心控制器,通过FPGA与多个串口通信。

为了实现数据切换,本文引入W5500芯片,利用其高速传输和稳定性,实现串口数据的交换和切换。

具体的硬件设计包括FPGA和W5500的连接,以及串口与W5500的连接。

3.2 软件设计本系统的软件设计主要包括FPGA的逻辑设计和W5500的驱动程序设计。

FPGA的逻辑设计根据具体需求,编写程序实现串口数据的交换和切换。

W5500的驱动程序设计则包括数据的接收和发送等功能。

4. 系统性能测试为了验证本系统的性能,对其进行了多方面的测试。

首先,测试系统能够稳定运行并实现串口数据的交换和切换。

其次,测试系统的数据传输速度和实时性,确保系统能够满足实际应用的需求。

WIZnet W5500 产品说明书

WIZnet W5500 产品说明书

DriverThe ioLibrary means “Internet Offload Library” for WIZnet chip. It includes drivers and application protocols. There are three kinds of libraries explained on this page The first two drivers (ioLibrary_BSD, ioLibrary) can be used for W5500 application designs. These will be updated continuously. The former BSD-Type driver will not be updated, as it is only meant to be a migration help from W5200 to W5500.1. ioLibrary_BSD2. ioLibrary3. BSD Type driver for W5200 User1. ioLibrary_BSDOverviewThis driver provides the Berkeley Socket type APIs. The function names of this ioLibrary_BSD are the same as the function names of the ioLibrary.Directory StructureqEthernet : SOCKET APIs like BSD & WIZCHIP(W5500,W5200 and etc) Driver rInternet :rDHCP clientsDNS clientsOthers will be added.sDownload< ioLibrary_BSD : latest version >Type Version Note Download LinkSource code Ethernet(Berkeley Socket type APIs)1.0.2-Click Internet(Application protocols)1.1.1-ClickDocuments Socket APIs Help(chm, html)1.0.2-Click< ioLibrary_BSD : old version >Type Version Note Download LinkSource code Ethernet(Berkeley Socket type APIs)1.0.1-Click1.0.0-Click Internet(Application protocols)1.1.0-Click1.0.0-ClickDocuments Socket APIs Help(chm, html)1.0.1-Click1.0.0-Click< Update History >ioLibrary_BSDqEthernet : Berkeley Socket type APIsrDocument (chm, html): Socket APIs HelpsRevision HistorysV102qsocket.c (Refer to 20131220)rsetsockopt() : Remove warning message (delete tmp variable)1.w5500.c (Refer to 20131220)rWIZCHIP_READ_BUF() & WIZCHIP_WRITE_BUF() in _WIZCHIP_IO_MODE_SPI_FDM_ 1.caseRemove warning message1.Remove unnecessary 'for' loop2.V101qsocket.c (Refer to 20131104)rsendto() : Add to clear the timeout interrupt status of socket(Sn_IR_TIMEOUT).1.V100qFirst released.rInternet : Application protocolsrRevision HistorysV111 (2013-12-26)qDHCP ClinetrModify variable declaration(dhcp_tick_1s) for code optimization in dhcp.c 1.V110qDHCP ClientrOptimize code1.Add reg_dhcp_cbfunc()2.Add DHCP_stop()3.Integrate check_DHCP_state() & DHCP_run() into DHCP_run()4.Don't care system endian5.Move unreferenced DEFINE to dns.c6.Remove the unused DEFINE7.Add comments8.DNS ClientrRemove secondary DNS server in DNS_run1.If 1st DNS_run failed, call DNS_run with 2nd DNS again1.DNS_timerHandler → DNS_time_handler2.Move unreferenced DEFINE to dns.c3.Remove the unused define4.Integrated dns.h dns.c & dns_parse.h dns_parse.c into dns.h & dns.c 5.V100qFirst released.rDHCP Client (Dynamic Host Configuration Protocol Client)sDNS Client (Domain Name System Client)s< Application code examples : latest version >Application Update Note Download LinkSTM32F103X CooCox CoIDE Project Loopback Test2013-11-04-Click DHCP Client2013-12-26-Click DNS Client2013-12-26-ClickEnergyMicroTiny GECKO(EFM32TG840F32)IAR Project Loopback TestDHCP ClientDNS Client2013-12-20-Click< Application code examples : old version >Application Update Note Download LinkSTM32F103X CooCox CoIDE Project Loopback Test2013-10-23-Click DHCP Client2013-11-08-Click DNS Client2013-11-08-ClickThese projects do not contain [Ethernet] and [Internet]codes. (Empty directory)Please download ioLibrary_BSD APIs and Applicationprotocols,and then insert to each of same named directory in providedproject.< History >Application code exampleqExample project was made by CooCox CoIDE with the STM32F103X Cortex-M3 platform.rLoopback Tests2013-11-04 Changesqmain.c : refine and rearrange source code.1.Separated Project code / APIs and Applications2.DHCP Clients2013-12-26 Changesqmain.c : refine and rearrange source code for improved DHCP code.1.DNS Clients2013-12-26 Changesqmain.c : refine and rearrange source code for improved DNS code1.DescriptionThis driver provides BSD-type Socket APIs for W5500. Because the function names of this driver are more user-friendly than those of the older drivers, …, current WIZnet chip users can easily migrate from their WIZnet chip application to the W5500 application. All drivers for W5100, W5200 and W5300 will be merged into the ioLibrary in the near future. All application protocols will also be merged into ioLibrary based on this BSD-type Socket APIs.This table shows the differences between other BSD drivers and new W5500 driver.Driver Other BSD Drivers W5500 DriverVariables Type type.h (made by wiznet)ex) uint16stdint.h (standard)ex) uint16_tRegister Naming REGName + Indexex) SIPR0 , SIPR1, SIPR2,SIPR3REGName & WIZCHIP_OFFSET_INCex> SIP,WIZCHIP_OFFSET_INC(SIP,1),WIZCHIP_OFFSET_INC(SIP,2),WIZCHIP_OFFSET_INC(SIP,3)Basic IO function IINCHIP_READIINCHIP_WRITEIINCHIP_READ_BUFIINCHIP_WRITE_BUF16bit Address SpaceUser should implementFunctionsMCU DependentWIZCHIP_READWIZCHIP_WRITEWIZCHIP_READ_BUFWIZCHIP_WRITE_BUF32bit Address SpaceSince users implement MCU-dependent parts andthen register them as Callback function, users don'tneed to implement the Function itself.Supports IINCHIP_XXX function for backwardcompatiblity.Register Function IINCHIP_XXX can be used.Supports some getREG() &setREG() functions.It is not recommended to use WIZCHIP_XXXX.Supports getREG() & setREG() functions or macros forall registers.Extra Functions NoneOptional and omissible Supports User-friendly namedfunctions. All extra functions can be implemented byusing setREG() & getREG().Socket APIs Other BSD Drivers W5500 DriverReturn Value voidSuccess or FailTransmit/Receive SizeSuccess or FailTransmit/Receive SizeAll functions return.Error Code None SOCK_BUSY : 0 SOCKERR_SOCKNUM SOCKERR_SOCKOPT SOCKERR_SOCKINIT SOCKERR_SOCKCLOSED SOCKERR_SOCKMODE SOCKERR_SOCKFLAG SOCKERR_SOCKSTATUS SOCKERR_ARG SOCKERR_PORTZERO SOCKERR_IPINVALID SOCKERR_TIMEOUT SOCKERR_DATALEN SOCKERR_BUFFER SOCKFATAL_PACKLENIO Mode Block & Non-Block Fixed Block or Non-Block configurableBlock Function sendrecvsendtorecvfromsendrecvsendtorecvfromconnectNon-Block Function connectrecvfrom Should read data in received packetunit.Can read data received packet separately.Socket APIsqFunction NamerSame as the function name of previous driverssFunction Return valuerPrevious Drivers: Void or Success/Fail and Transmit/Receive SizesW5500 Driver: All functions return Success and Fail. In Fail case, operations are subdivided.sSuccess: SOCK_OK, Socket Number, Transmit and Receive SizeqFail: SOCK_BUSY, SOCKERR_XXX, SOCKFATAL_XXX ( 0 or Negative value) qSOCK_BUSY : 01.SOCKERR_SOCKNUM2.SOCKERR_SOCKOPT3.SOCKERR_SOCKINIT4.SOCKERR_SOCKCLOSED5.SOCKERR_SOCKMODE6.SOCKERR_SOCKFLAG7.SOCKERR_SOCKSTATUS8.SOCKERR_ARG9.SOCKERR_PORTZERO10.SOCKERR_IPINVALID11.SOCKERR_TIMEOUT12.SOCKERR_DATALEN13.SOCKERR_BUFFER14.SOCKFATAL_PACKLEN15.Block / Non-Block IO moderPrevious Drivers : Block function and Non-Block function were mixed.sBlock Function : send(), recv(), sento(), recvfrom()qNon-block Function : connect()qBlocking can be avoided by using getSn_SR(), getSn_TX_FSR(), and getSn_RX_RSR() qproperly.W5500 DriversBlock / Non-Block IO mode can be selected by user. (Default: Block mode)qsocket() with new flag SF_IO_NONBLOCK or setsockopt() with SO_SET_IOMODE Can be qconfigured.Block and Non-block Configurable Functionqconnect(), send(), recv(), sendto(), recvfrom()qgetSn_SR(), getSn_TX_FSR() and getSn_RX_RSR() functions can be used like …qlike previous drivers. They are not related to IO mode2. ioLibraryDownload< ioLibrary with example project : latest version >Application Version Note Download LinkCookie board Loopback test 1.0.2-Click<Revision History>v102qsocket.c(Refer to 2014-03-18)rTCPReSend() : Remove this function and related codes because TCP send mechanism was 1.changed.TCPReSendNB() : Remove this function and related codes because TCP send mechanism was 2.changed.TCPSendCHK() : Modify return value.3.TCPSend() : Change return value to len.4.loopback.c(Refer to 2014-03-18)rExisting mechanism resend packet if don't send all received packet, but change not to resend.1.v100qFirst releaser< ioLibrary : latest version >Description Version Note Download LinkDriver Source code ioLibrary source code 1.0.2-Click< ioLibrary : old version >Description Version Note Download LinkDriver Source code ioLibrary source code 1.0.0-ClickDriver documents Socket APIs Help(chm, html)(To use html, open the index.html)1.0.0-ClickThis ioLibrary has basic I/O functions, socket register access functions, common register access functions, utilities and functions for setting up a platform and network This code has been evaluated on the CooCox Cookie Board with ARM Cortex-M0 MCU.Please refer to this link for more details.How to use on cookie board.qThe figure below shows the folder structure of this ioLibrary.3. BSD Type driver for W5200 UserDriver Source code : w5500_cortexm3_firmware_for_legacy.zipqThis driver has the same BSD as the API for W5200 users. We have been evaluating this code on the ARM-CortexM3(STM32F103 series) chipset.This type of driver is the final version. We will not update it later. Please use thenew (well coded ) driver code for new projects.。

W5500网络扩展板教程

W5500网络扩展板教程

以太网在各个领域和行业有着非常广泛和深入的应用,这主要源于以太网的高度灵活性和较易实现的特点。

因为以太网具有组网简单,成本低廉,兼容性优秀,连接可靠,以及拓扑调整方便的优点,在作为智能家居,物联网或者无线传感网络的网关方面有其他的网络技术所不具备的优势,从而得到大力的发展和应用。

本文将详细介绍如何使嵌入式系统接入到以太网,如何采用硬件协议栈的方式使您的方案或应用快速高效的连接到互联网,如何实现TCP/IP的通信,以及如何实现上层应用层协议等等。

第1章以太网模型以太网的实现采用层次结构的概念,每一层都有自己的功能,就像建筑物一样,每一层都靠下一层支持,每一层也都为上一层功能的实现打好基础。

实际上,用户接触到的只是最上面的一层,根本感觉不到底层的存在。

要理解以太网,必须从最下层开始,自下而上理解每一层的功能。

1.1五层结构以太网模型有不同的分层方式,ISO(国际标准组织)提出OSI七层网络模型,自上而下分别为:应用层、表示层、会话层、传输层、网络层、数据链路层、物理层。

OSI七层网络模型主要是为了解决异种网络互联时所遇到的兼容性问题。

它的最大优点是将服务、接口和协议这三个概念明确地区分开来,也使网络的不同功能模块承担起不同的职责。

由于互联网网络体系结构以TCP/IP协议为核心,因而基于TCP/IP的参考模型将以太网可以分成四层,自上而下分别为:应用层、传输层、网络互联层、网络接口层。

根据我自己的理解,把以太网分成五层比较容易解释。

这五层结构不仅符合OSI结构强调的不同层次承担不同职责的特点,同时也符合TCP/IP协议参考模型协议之间相互支撑、相互调用的逻辑关系。

图1-1-1以太网五层模型如上图所示,最底下的一层叫做“物理层”,也叫“PHY层”,最上面的一层叫做“应用层”,中间的三层(自下而上)分别是“链路层”,也叫“MAC层”、“网络层”和“传输层”。

越下面的层,越靠近硬件;越上面的层,越靠近用户。

W5500模块用户手册

W5500模块用户手册

User ManualYIXIN_W5500模块用户手册全硬件TCP/IP协议以太网模块目录一、YIXIN_W5500以太网模块简介 (1)二、YIXIN_W5500模块排针功能表 (1)三、W5500芯片资源介绍 (2)四、电脑调试软件安装 (3)五、调式方法 (5)1.YIXIN_W5500模块接线方法 (5)2.W5500客户端模式测试 (5)3.W5500服务端模式测试 (12)4.W5500 UDP模式测试 (15)5.使用手机调试W5500模块 (19)一、YIXIN_W5500以太网模块简介YIXIN_W5500以太网模块是一款基于WIZnet W5500芯片的以太网模块,是一款性能出色、性价比高的以太网模块。

模块集成硬件化TCP/IP协议;内部具有32K字节存储器作为TX/RX缓存;支持10/100Mbps的网络传输速率;支持8个独立端口同时运行;同时模块还支持3.3V或者5V电源供电,当5V供电时还可以输出3.3V的电压,方便用户在不同的单片机系统中使用;模块与单片机系统的通讯方式是简单、方便的SPI总线通信。

W5500的具体性能参数请下文的“W5500芯片资料介绍”。

YIXIN_W5500以太网模块的实物图如图1.1所示:图1.1 YIXIN_W5500模块实物图二、YIXIN_W5500模块排针功能表表2.1 YIXIN_W5500模块排针功能说明注1:W5500的工作电压是3.3V,但I/O口可以承受5V电压。

注2:YIXIN_W5500模块有两种供电方式,即为3.3V供电或者5V供电,当使用5V供电时,“3.3V”引脚将会有3.3V的电压输出。

三、W5500芯片资源介绍W5500芯片是一款采用全硬件TCP/IP协议栈的嵌入式以太网控制器,它能使嵌入式系统通过SPI(串行外设接口)接口轻松地连接到网络。

W5500具有完整的TCP/IP协议栈和10/100Mbps以太网网络层(MAC)和物理层(PHY),因此W5500特别适合那些需要使用单片机来实现互联网功能的客户。

(二)原创调试W5500芯片--W5500的初始化过程

(二)原创调试W5500芯片--W5500的初始化过程

(⼆)原创调试W5500芯⽚--W5500的初始化过程⼀、SPI的配置过程1.使能SPI时钟1/**2 * @brief 使能SPI时钟3 * @retval None4*/5static void SPI_RCC_Configuration(void)6 {7 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_SPI1,ENABLE);8 }2.配置指定SPI的引脚1/**2 * @brief 配置指定SPI的引脚3 * @retval None4*/5static void SPI_GPIO_Configuration(void)6 {7 GPIO_InitTypeDef GPIO_InitStruct;8//PA4->CS,PA5->SCK,PA6->MISO,PA7->MOSI9 GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6|GPIO_Pin_7;10 GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;11 GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;12 GPIO_Init(GPIOA, &GPIO_InitStruct);13//初始化⽚选输出引脚14 GPIO_InitStruct.GPIO_Pin = GPIO_Pin_4;15 GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;16 GPIO_Init(GPIOA, &GPIO_InitStruct);17 GPIO_SetBits(GPIOA,GPIO_Pin_4);18 }3.根据外部SPI设备配置SPI相关参数1/**2 * @brief 根据外部SPI设备配置SPI相关参数3 * @retval None4*/5void SPI_Configuration(void)6 {7 SPI_InitTypeDef SPI_InitStruct;89 SPI_RCC_Configuration();1011 SPI_InitStruct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;12 SPI_InitStruct.SPI_Direction= SPI_Direction_2Lines_FullDuplex;13 SPI_InitStruct.SPI_Mode = SPI_Mode_Master;14 SPI_InitStruct.SPI_DataSize = SPI_DataSize_8b;15 SPI_InitStruct.SPI_CPOL = SPI_CPOL_Low;16 SPI_InitStruct.SPI_CPHA = SPI_CPHA_1Edge;17 SPI_InitStruct.SPI_NSS = SPI_NSS_Soft;18 SPI_InitStruct.SPI_FirstBit = SPI_FirstBit_MSB;19 SPI_InitStruct.SPI_CRCPolynomial = 7;20 SPI_Init(SPI1,&SPI_InitStruct);2122 SPI_GPIO_Configuration();2324 SPI_SSOutputCmd(SPI1, ENABLE);25 SPI_Cmd(SPI1, ENABLE);26 }⼆、W5500初始化过程注册SPI函数、初始化Socket Buffer、PHY状态检查、初始化Network等⼯作1void wizchip_user_init(void)2 {3 uint8_t tmp;4 uint8_t memsize[2][8] = {{2,2,2,2,2,2,2,2},{2,2,2,2,2,2,2,2}};56// First of all, Should register SPI callback functions implemented by user for accessing WIZCHIP7/* Critical section callback */8 reg_wizchip_cris_cbfunc(SPI_CrisEnter, SPI_CrisExit); //注册临界区函数9/* Chip selection call back */10#if _WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_SPI_VDM_11 reg_wizchip_cs_cbfunc(SPI_CS_Select, SPI_CS_Deselect);//注册SPI⽚选信号函数12#elif _WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_SPI_FDM_13 reg_wizchip_cs_cbfunc(SPI_CS_Select, SPI_CS_Deselect); // CS must be tried with LOW.14#else15#if (_WIZCHIP_IO_MODE_ & _WIZCHIP_IO_MODE_SIP_) != _WIZCHIP_IO_MODE_SIP_16#error "Unknown _WIZCHIP_IO_MODE_"17#else18 reg_wizchip_cs_cbfunc(wizchip_select, wizchip_deselect);19#endif20#endif21/* SPI Read & Write callback function */22 reg_wizchip_spi_cbfunc(SPI_ReadByte, SPI_WriteByte); //注册读写函数2324/* WIZCHIP SOCKET Buffer initialize */25if(ctlwizchip(CW_INIT_WIZCHIP,(void*)memsize) == -1){26 printf("WIZCHIP Initialized fail.\r\n");27while(1);28 }2930/* PHY link status check */31do{32if(ctlwizchip(CW_GET_PHYLINK, (void*)&tmp) == -1){33 printf("Unknown PHY Link stauts.\r\n");34 }35 }while(tmp == PHY_LINK_OFF);3637/* Network initialization */38 network_init();39 }⽹络初始化1/**2 * @brief Intialize the network information to be used in WIZCHIP3 * @retval None4*/5void network_init(void)6 {7 uint8_t tmpstr[6];8 ctlnetwork(CN_SET_NETINFO, (void*)&gWIZNETINFO);9 ctlnetwork(CN_GET_NETINFO, (void*)&gWIZNETINFO);1011// Display Network Information12 ctlwizchip(CW_GET_ID,(void*)tmpstr);13 printf("\r\n=== %s NET CONF ===\r\n",(char*)tmpstr);14 printf("MAC: %02X:%02X:%02X:%02X:%02X:%02X\r\n",gWIZNETINFO.mac[0],gWIZNETINFO.mac[1],gWIZNETINFO.mac[2],15 gWIZNETINFO.mac[3],gWIZNETINFO.mac[4],gWIZNETINFO.mac[5]);16 printf("SIP: %d.%d.%d.%d\r\n", gWIZNETINFO.ip[0],gWIZNETINFO.ip[1],gWIZNETINFO.ip[2],gWIZNETINFO.ip[3]);17 printf("GAR: %d.%d.%d.%d\r\n", gWIZNETINFO.gw[0],gWIZNETINFO.gw[1],gWIZNETINFO.gw[2],gWIZNETINFO.gw[3]);18 printf("SUB: %d.%d.%d.%d\r\n", gWIZNETINFO.sn[0],gWIZNETINFO.sn[1],gWIZNETINFO.sn[2],gWIZNETINFO.sn[3]);19 printf("DNS: %d.%d.%d.%d\r\n", gWIZNETINFO.dns[0],gWIZNETINFO.dns[1],gWIZNETINFO.dns[2],gWIZNETINFO.dns[3]);20 printf("======================\r\n");21 }三、下⾯着重介绍⼏个重要的函数:3.1 函数原型:ctlwizchip(ctlwizchip_type cwtype,void* arg) 参数1:cwtype 参数2:arg 功能:控制WIZCHIP芯⽚,重置WIZCHIP和内部PHY,配置PHY模式,监视PHY(链接,速度,半/全/⾃动),控制中断和屏蔽等。

W5500问题集锦(二)

W5500问题集锦(二)

W5500问题集锦(二)W5500自去年9月推出,已经有一年的时间。

一年间,不乏很多客户纷纷将目光投向了W5500这颗性价比很高的全新硬件TCP/IP以太网芯片,无论是在工控、安防、交通,还是在智能医疗、智能家居等众多领域中,得到了广泛应用及认可。

同时,也收到了很多客户在使用过程中的问题反馈,比如W5500中断问题、切换端口问题,及W5500做服务器,多端口连接等常见问题。

这些,我们都一一帮助大家分析,一同解决!那么,为了提高技术支持效率,也特此将这些问题再次整理给大家,以供分享!期待能有所帮助!1.W5500作为服务器时,如何获取来自连接方的IP地址及端口问题描述:w5500作为服务器时,如何获取来自连接方的IP地址及端口?我怎么没有找到寄存器呢读DIPR 和SIPR都不对,是不是没有查询方法呀?UDP和TCP模式我都试过了,整了一天也没找出明堂来,如果实在不行,只能依靠,谁来连接W5500,谁就在DATA区自报家门了,但这样做感觉有点不是很爽,按说是可以获取到来自连接方的IP地址及端口的比如W5500接在网络上,要对它进行搜索和设置,那么就要UDP广播包,目前可以收到广播包,但量回应的包,去对方收不到,只能怀疑是目标地址和端口没有更新在dipr寄存器了,请支招儿,谢谢!!答1:TCP Server模式下,在连接建立后,由硬件更新目标IP和端口值。

答2:收到信息的前面6个字节即为对方IP地址和端口号。

答3:TCP Server 模式下,可以读取Sn_DIPR和Sn_DPORT来确定连接方的IP及端口。

这个是可以,你可以打印这个地址里的信息来查看。

W5500 As TCP Server原帖来自:9MCU2.W5500一个独立端口作为Server模式可以支持多少个客户端连接问题描述1:W5500一个独立端口端口作为TCP Server模式打开一个端口,此端口已经映射到外网,现在可能有多个客户端连接过来,可以支持多少个客户端连接?经测试,只能支持一个连接,连接上一个客户端后,后连的客户端根本连接不上;而采用ENC28J60采用uip协议时,利用TCP方式监听端口,是可以支持客户端多连接的。

W5500-EVB 用户手册

W5500-EVB 用户手册

W5500-EVB 用户手册V1.01© Copyright 2013 WIZnet Co., Inc. All rights reserved更多内容请参考:/文档历史信息时间描述V1.0 2013-10-08 与W5500-EVB发布V1.01 2014-01-14 调整格式;目录1简介 (1)2特点 (1)3规格 (1)4方框图 (2)5硬件布局 (2)6插针引脚分布 (4)7开发调试工具 (5)7.1编译工具 (5)7.2烧录工具 (6)7.3USB转UART接口IC驱动 (6)8程序下载 (7)8.1硬件连接 (7)8.2程序编译 (7)8.3程序下载 (8)9固件演示 (12)9.1默认配置 (12)9.2打开Http Server (14)9.3Http Server修改参数 (15)10参考电路图 (18)插图清单图1 方框图 (2)图2底板布局(正面) (2)图3 底板布局(反面) (3)图4 底板布局(正面) (3)图5 ST 烧录工具下载 (6)图6 硬件连接 (7)图7 程序编译 (8)图8 查看端口号 (8)图9 程序下载(步骤1) (9)图10 程序下载,按键顺序 (9)图11程序下载(步骤2) (10)图12 程序下载(步骤3) (10)图13 程序下载(步骤4):选择固件程序 (11)图14 硬件连接 (12)图15 固件程序默认配置 (13)图16 查看端口号 (14)图17 串口输出默认配置 (14)图18 Http Server配置页面:默认配置 (15)图19 Http Server 配置页面:修改配置 (15)图20 Http Server 重启 (16)图21 Http Server配置后页面 (16)图22 串口输出修改结果 (17)图23 核心板 (18)图24 底板 (19)表格清单表1 规格 (1)表2插针引脚分布 (4)表3 W5500-EVB Http Server 默认配置 (12)1简介W5500 Evaluation Board 简称W5500-EVB,是为了方便广大用户更好的了解、使用W5500这款网络芯片所开发的评估板。

通讯接口应用笔记3:使用W5500实现ModbusTCP服务器

通讯接口应用笔记3:使用W5500实现ModbusTCP服务器

通讯接⼝应⽤笔记3:使⽤W5500实现ModbusTCP服务器 前⾯我们设计实现了W5500的驱动程序,也讲解了驱动的使⽤⽅式。

在最近⼀次的项⽬应⽤中,正好有⼀个使⽤W5500实现TCP通讯的需求,所以我们就使⽤该驱动程序轻松实现。

这⼀篇中我们就来说⼀说基于我们W5500通讯驱动程序实现TCP通讯的过程。

1、应⽤需求 在本次应⽤中,要求实现⼀个基于W5500的Modbus TCP服务器。

这个需求的描述虽然只有⼀句话,但是这个需求的内容可不简单。

我们⾸先来分析⼀下这个需求的具体内容。

为了实现基于W5500的Modbus TCP服务器,我们必先须基于W5500实现⼀个TCP服务器。

W5500本⾝是带硬件协议栈的,但却并不带TCP服务器。

不过在我们前⾯的关于外设驱动库的系列⽂章中已经封装了W5500的驱动,其中就带有⼀个TCP服务器,我们可以直接采⽤就可以了。

其次我们要在TCP服务器的基础上实现Modbus TCP协议。

关于Modbus协议栈,我们以前的⽂章就讲述过Modbus通讯协议栈的开发问题。

⽽且我们已经将我们开发的Modbus通讯协议栈开源。

其中已经封装了Modbus TCP服务器对象,所以我们直接采⽤这⼀Modbus通讯协议栈就可以了。

有了驱动和协议栈,我们还需要考虑应⽤层⾯的具体问题,⽽且也只需要考虑应⽤层⾯的具体问题。

这⾥就看出我们前⾯封装外设驱动和Modbus通讯协议栈的价值所在了。

关于应⽤层⾯的问题我们主要需要重点考虑⼏个问题: 第⼀,数据的存储类型及地址范围。

我们知道Modbus协议常见的数据类型有4种。

我们需要考虑在系统中需要使⽤到的类型及地址,这将决定Modbus协议数据处理回调函数的实现。

第⼆,⽹络配置问题,我们需要通过⽹络访问这台下位机就需要要为其配置⽹络。

这存在静态配置,动态配置和系统⾃动分配的问题。

作为服务器,我们⼀般不会希望让系统⾃动分配。

所以我们需要考虑的是如何⽅便使⽤者为其分配地址的问题。

(参考资料)W5500驱动函数库

(参考资料)W5500驱动函数库

传输数据)
#define S_INIT 0x01//端口完成初始化
#define S_CONN
0x02//端口完成连接,可以正常传输数据
/***************----- 端口收发数据的状态 -----***************/
unsigned char S0_Data;
//端口 0 接收和发送数据的状态,1:端口接收到数据,2:端口发送
设置物理地址phyaddr字节unsignedchar数组自己定义用于唯一标识网络设备的物理地址值该地址值需要到ieee申请按照oui的规定前3个字节为厂商代码后三个字节为产品序号如果自己定义物理地址注意第一个字节必须为偶数writew5500nbytesharphyaddr6
W5500 驱动函数库 /****************************************************************************** ****
unsigned char S0_Port[2]; //端口 0 的端口号 unsigned char S0_DIP[4]; //端口 0 目的 IP 地址 unsigned char S0_DPort[2]; //端口 0 目的端口号
unsigned char UDP_DIPR[4]; //UDP(广播)模式,目的主机 IP 地址 unsigned char UDP_DPORT[2]; //UDP(广播)模式,目的主机端口号
数据完成
#define S_RECEIVE 0x01 //端口接收到一个数据包
#define S_TRANSMITOK 0x02 //端口发送一个数据包完成
/***************----- 端口数据缓冲区 -----***************/ unsigned char idata Rx_Buffer[30]; //端口接收数据缓冲区 unsigned char idata Tx_Buffer[30];//端口发送数据缓冲区

W5500设计手册

W5500设计手册
unsigned short Read_SOCK_Data_Buffer(SOCKET s, unsigned char *dat_ptr) 该函数是读取 SOCKET 接收数据缓存区中的数据。 s 是 SOCKET 号,取值范围 0~7。dat_ptr 是数据指针,用于缓存从 W5500 的 SOCKET 接 收缓冲区读取过来的数据。 函数返回的是读取的数据字节长度。
可以使用 CPU 的 IO 接口来控制 W5500 的 PMODE0\PMODE1\PMODE2 引脚电平,选择 所需要的以太网工作模式。
在要求通信可靠性较高且对通信速率没有很高要求的情况下,可适当降低通信速率,选 择 10M 的通信模式。
2. 软件设置 在启动软件设置之前,设置 PHYCFGR 的 OPMD 位为 1(W5500 上电复位后,PHYCFGR 的 OPMD 位默认为 0,即启动硬件设置)。 设置 PHYCFGR 的 OPMDC 位。OPMDC 位于 PHYCFGR 的 3、4、5 三个位,配置如下:
定义一个数组 array[],做如下的操作,设置上面的三个参数。 /* 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 W5500 IP as: 192.168.0.20 */ array[0]=192; array[1]=168; array[2]=0; array[3]=20; Write_Bytes(SIPR, 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 地址要向 IEEE 申请取得,也可以自己定义。如果自己定义,MAC 地址的第一个字 节必须是偶数。

W5500KeepAlive功能调试经验

W5500KeepAlive功能调试经验

W5500 KeepAlive功能调试经验2017年2月21日17:39W5500在实际项目应用时遇到client可能会异常中断和板卡的连接。

软件程序控制断开连接,实际上由于种种原因未断开,使得板卡进入某种临界状态,且无法恢复。

根本原因是驱动库的接收函数为阻塞型,在没有报文接收时会阻塞在该函数内部,当外部client进行某种异常断开后,socket的状态得不到及时更新,认为当前依然在established状态,依旧阻塞。

而client恢复后无法再次连接该端口,造成死锁。

解决办法是在程序内增加keepalive帧,异常阻塞超过一定时间后让W5500自动关闭该socket,跳出该阻塞W5500 使能KeepAlive功能分两种方式:1、自动发送2、手动发送使用这种方式前都需要设置一个timeout的时间参数,setRCR()和setRTR()setRTR()为设置超时时间,单位为5s,一般默认即可setRCR()为设置超时次数,在检测到网络上无消息传送时发送keepalive报文,若无响应超过该次数则关闭socket,进而更新socket的状态也可以直接调用ctlnetwork(CN_SET_TIMEOUT, (void *)&gWIZNetTimeout);这个函数,其中第二个参数为配置值,用户需指定。

其中自动模式要注意:一、初始化时对应Socket 用setSn_KPALVTR(sn, 0x01);第二个参数为非0即可无需再额外写代码。

此处W5500芯片有自动处理机制,若在设定时间内有数据收发,则默认不发送keepalive帧。

若设置的超时时间为5s,重试次数为2次,只要在connect成功后我们保持10S以上不发数据就可以通过wireshark检测到keepalive帧二、手动模式要设置两处:1、setSn_KPALVTR(sn, 0x00); 在初始化代码中放置,第二个参数必须为02、IINCHIP_WRITE(Sn_CR(sn),Sn_CR_SEND_KEEP);在主循环或定时任务中分区 问题分析及总结 的第 1 页。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

/***************----- 端口的运行模式 -----***************/ unsigned char S0_Mode =3; // 端 口 0 的 运 行 模 式 ,0:TCP 服 务 器 模 式 ,1:TCP 客 户 端 模 式,2:UDP(广播)模式
#define TCP_SERVER #define TCP_CLIENT #define UDP_MODE
unsigned char S0_Port[2]; //端口 0 的端口号 unsigned char S0_DIP[4]; //端口 0 目的 IP 地址 unsigned char S0_DPort[2]; //端口 0 目的端口号
unsigned char UDP_DIPR[4]; //UDP(广播)模式,目的主机 IP 地址 unsigned char UDP_DPORT[2]; //UDnd_Short
* 描述 : SPI 发送 2 个字节数据(16 位)
* 输入 : dat:待发送的 16 位数据
* 输出 : 无
* 返回值 : 无
* 说明 : 无
*******************************************************************************
unsigned char i,rByte=0;
W5500_SCLK=0; for(i=0;i<8;i++) {
W5500_SCLK=1; rByte<<=1; rByte|=W5500_MISO; W5500_SCLK=0; } return rByte; }
/****************************************************************************** * * 函数名 : SPI_SendByte * 描述 : SPI 发送一个字节数据 * 输入 : dt:待发送的数据 * 输出 : 无 * 返回值 : 无 * 说明 : 无 ******************************************************************************* / void SPI_Send_Byte(unsigned char dt) {
unsigned short i;
W5500_SCS=0;//置 W5500 的 SCS 为低电平
SPI_Send_Short(reg);//通过 SPI 写 16 位寄存器地址 SPI_Send_Byte(VDM|RWB_WRITE|COMMON_R);//通过 SPI 写控制字节,N 个字节数据长度, 写数据,选择通用寄存器
unsigned char i;
for(i=0;i<8;i++) {
W5500_SCLK=0; if((dt<<i)&0x80)
W5500_MOSI=1; else
W5500_MOSI=0; W5500_SCLK=1; } W5500_SCLK=0; }
/******************************************************************************
W5500_SCS=0;//置 W5500 的 SCS 为低电平
SPI_Send_Short(reg);//通过 SPI 写 16 位寄存器地址 SPI_Send_Byte(FDM2|RWB_WRITE|COMMON_R);//通过 SPI 写控制字节,2 个字节数据长 度,写数据,选择通用寄存器 SPI_Send_Short(dat);//写 16 位数据
for(i=0;i<size;i++)//循环将缓冲区的 size 个字节数据写入 W5500 {
SPI_Send_Byte(*dat_ptr++);//写一个字节数据 }
W5500_SCS=1; //置 W5500 的 SCS 为高电平 }
/****************************************************************************** * * 函数名 : Write_W5500_SOCK_1Byte * 描述 : 通过 SPI 向指定端口寄存器写 1 个字节数据 * 输入 : s:端口号,reg:16 位寄存器地址,dat:待写入的数据 * 输出 : 无 * 返回值 : 无 * 说明 : 无 ******************************************************************************* / void Write_W5500_SOCK_1Byte(SOCKET s, unsigned short reg, unsigned char dat) {
数据完成
#define S_RECEIVE 0x01 //端口接收到一个数据包
#define S_TRANSMITOK 0x02 //端口发送一个数据包完成
/***************----- 端口数据缓冲区 -----***************/ unsigned char idata Rx_Buffer[30]; //端口接收数据缓冲区 unsigned char idata Tx_Buffer[30];//端口发送数据缓冲区
/
void SPI_Send_Short(unsigned short dt)
{
SPI_Send_Byte((unsigned char)(dt/256)); //写数据高位
SPI_Send_Byte(dt);
//写数据低位
}
/****************************************************************************** * * 函数名 : Write_W5500_1Byte * 描述 : 通过 SPI 向指定地址寄存器写 1 个字节数据 * 输入 : reg:16 位寄存器地址,dat:待写入的数据 * 输出 : 无 * 返回值 : 无 * 说明 : 无 ******************************************************************************* / void Write_W5500_1Byte(unsigned short reg, unsigned char dat) {
unsigned char W5500_Interrupt; //W5500 中断标志(0:无中断,1:有中断)
/****************************************************************************** * * 函数名 : SPI_ReadByte * 描述 : 读取一个字节 SPI 返回的数据 * 输入 : 无 * 输出 : 无 * 返回值 : 读取到的寄存器数据 * 说明 : 无 ******************************************************************************* / unsigned char SPI_Read_Byte(void) {
W5500_SCS=1; //置 W5500 的 SCS 为高电平 }
/****************************************************************************** * * 函数名 : Write_W5500_nByte * 描述 : 通过 SPI 向指定地址寄存器写 n 个字节数据 * 输入 : reg:16 位寄存器地址,*dat_ptr:待写入数据缓冲区指针,size:待写入的数据长度 * 输出 : 无 * 返回值 : 无 * 说明 : 无 ******************************************************************************* / void Write_W5500_nByte(unsigned short reg, unsigned char *dat_ptr, unsigned short size) {
传输数据)
#define S_INIT 0x01//端口完成初始化
#define S_CONN
0x02//端口完成连接,可以正常传输数据
/***************----- 端口收发数据的状态 -----***************/
unsigned char S0_Data;
//端口 0 接收和发送数据的状态,1:端口接收到数据,2:端口发送
W5500_SCS=0;//置 W5500 的 SCS 为低电平
SPI_Send_Short(reg);//通过 SPI 写 16 位寄存器地址 SPI_Send_Byte(FDM1|RWB_WRITE|COMMON_R);//通过 SPI 写控制字节,1 个字节数据长 度,写数据,选择通用寄存器 SPI_Send_Byte(dat);//写 1 个字节数据
W5500 驱动函数库 /****************************************************************************** ****
* 文件名 :W5500.c * 描述 :W5500 驱动函数库 ******************************************************************************* ***/
0x00//TCP 服务器模式 0x01//TCP 客户端模式 0x02//UDP(广播)模式
相关文档
最新文档