/**********************************************************************************
* 文件名 :W5500.c
* 描述 :W5500 驱动函数库
* 库版本 :ST_v3.5
**********************************************************************************/
#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的端口号
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(广播)模式,目的主机端口号
/***************----- 端口的运行模式 -----***************/
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[30]; //端口接收数据缓冲区
unsigned char Tx_Buffer[30]; //端口发送数据缓冲区
unsigned char W5500_Interrupt; //W5500中断标志(0:无中断,1:有中断)
/*******************************************************************************
* 函数名 : SPI_ReadByte
* 描述 : 读取一个字节SPI返回的数据
* 输入 : 无
* 输出 : 无
* 返回值 : 读取到的寄存器数据
* 说明 : 无
*******************************************************************************/
unsigned char SPI_Read_Byte(void)
{
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 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;
}
/*******************************************************************************
* 函数名 : SPI_Send_Short
* 描述 : SPI发送2个字节数据(16位)
* 输入 : dat:待发送的16位数据
* 输出 : 无
* 返回值 : 无
* 说明 : 无
*******************************************************************************/
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)
{
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_SCS=1; //置W5500的SCS为高电平
}
/*******************************************************************************
* 函数名 : Write_W5500_2Byte
* 描述 : 通过SPI向指定地址寄存器写2个字节数据
* 输入 : reg:16位寄存器地址,dat:16位待写入的数据(2个字节)
* 输出 : 无
* 返回值 : 无
* 说明 : 无
*******************************************************************************/
void Write_W5500_2Byte(unsigned short reg, unsigned short dat)
{
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位数据
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)
{
unsigned short i;
W5500_SCS=0;//置W5500的SCS为低电平
SPI_Send_Short(reg);//通过SPI写16位寄存器地址
SPI_Send_Byte(VDM|RWB_WRITE|COMMON_R);//通过SPI写控制字节,N个字节数据长度,写数据,选择通用寄存器
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)
{
W5500_SCS=0;//置W5500的SCS为低电平
SPI_Send_Short(reg);//通过SPI写16位寄存器地址
SPI_Send_Byte(FDM1|RWB_WRITE|(s*0x20+0x08));//通过SPI写控制字节,1个字节数据长度,写数据,选择端口s的寄存器
SPI_Send_Byte(dat);//写1个字节数据
W5500_SCS=1; //置W5500的SCS为高电平
}
/*******************************************************************************
* 函数名 : Write_W5500_SOCK_2Byte
* 描述 : 通过SPI向指定端口寄存器写2个字节数据
* 输入 : s:端口号,reg:16位寄存器地址,dat:16位待写入的数据(2个字节)
* 输出 : 无
* 返回值 : 无
* 说明 : 无
*******************************************************************************/
void Write_W5500_SOCK_2Byte(SOCKET s, unsigned short reg, unsigned short dat)
{
W5500_SCS=0;//置W5500的SCS为低电平
SPI_Send_Short(reg);//通过SPI写16位寄存器地址
SPI_Send_Byte(FDM2|RWB_WRITE|(s*0x20+0x08));//通过SPI写控制字节,2个字节数据长度,写数据,选择端口s的寄存器
SPI_Send_Short(dat);//写16位数据
W5500_SCS=1; //置W5500的SCS为高电平
}
/*******************************************************************************
* 函数名 : Write_W5500_SOCK_4Byte
* 描述 : 通过SPI向指定端口寄存器写4个字节数据
* 输入 : s:端口号,reg:16位寄存器地址,*dat_ptr:待写入的4个字节缓冲区指针
* 输出 : 无
* 返回值 : 无
* 说明 : 无
*******************************************************************************/
void Write_W5500_SOCK_4Byte(SOCKET s, unsigned short reg, unsigned char *dat_ptr)
{
W5500_SCS=0;//置W5500的SCS为低电平
SPI_Send_Short(reg);//通过SPI写16位寄存器地址
SPI_Send_Byte(FDM4|RWB_WRITE|(s*0x20+0x08));//通过SPI写控制字节,4个字节数据长度,写数据,选择端口s的寄存器
SPI_Send_Byte(*dat_ptr++);//写第1个字节数据
SPI_Send_Byte(*dat_ptr++);//写第2个字节数据
SPI_Send_Byte(*dat_ptr++);//写第3个字节数据
SPI_Send_Byte(*dat_ptr++);//写第4个字节数据
W5500_SCS=1; //置W5500的SCS为高电平
}
/*******************************************************************************
* 函数名 : Read_W5500_1Byte
* 描述 : 读W5500指定地址寄存器的1个字节数据
* 输入 : reg:16位寄�
51单片机控制w5500实现udp单播通信
5星 · 超过95%的资源 需积分: 5 194 浏览量
2022-09-23
17:12:06
上传
评论
收藏 87KB ZIP 举报
m晴朗
- 粉丝: 6949
- 资源: 110
评论5