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层”、“网络层”和“传输层”。

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

  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(广播)模式
相关文档
最新文档