STM32F103驱动W5500网络程序word版本文档格式.docx
《STM32F103驱动W5500网络程序word版本文档格式.docx》由会员分享,可在线阅读,更多相关《STM32F103驱动W5500网络程序word版本文档格式.docx(46页珍藏版)》请在冰点文库上搜索。
UDP(广播)模式
#defineTCP_SERVER0x00//TCP服务器模式
#defineTCP_CLIENT0x01//TCP客户端模式
#defineUDP_MODE0x02//UDP(广播)模式
/***************-----端口的运行状态-----***************/
unsignedcharS0_State=0;
//端口0状态记录,1:
端口完成初始化,2端口完成连接(可以正常传输数据)
#defineS_INIT0x01//端口完成初始化
#defineS_CONN0x02//端口完成连接,可以正常传输数据
/***************-----端口收发数据的状态-----***************/
unsignedcharS0_Data;
//端口0接收和发送数据的状态,1:
端口接收到数据,2:
端口发送数据完成
#defineS_RECEIVE0x01//端口接收到一个数据包
#defineS_TRANSMITOK0x02//端口发送一个数据包完成
/***************-----端口数据缓冲区-----***************/
unsignedcharRx_Buffer[2048];
//端口接收数据缓冲区
unsignedcharTx_Buffer[2048];
//端口发送数据缓冲区
unsignedcharW5500_Interrupt;
//W5500中断标志(0:
无中断,1:
有中断)
/*外部中断4服务程序*/
voidEXTI4_IRQHandler(void)
{
if(W5500_INT==0)
{
W5500_Interrupt=1;
EXTI->
PR=1<
<
4;
//清除LINE4上的中断标志位
}
}
voidSPI1_Init(void)
{
RCC->
APB2ENR|=1<
2;
//PORTA时钟使能
12;
//SPI1时钟使能
0;
GPIOA->
CRL&
=0XFFF0FFFF;
CRL|=0X00030000;
//PA4通用挽推输出,输出速度50MHz
ODR|=1<
//PA4上拉,设置片选引脚
//这里只针对SPI口初始化
=0X000FFFFF;
CRL|=0XBBB00000;
//PA5.6.7复用功能挽推输出,输出速度50MHz
ODR|=0X7<
5;
//PA5.6.7上拉
SPI1->
CR1&
=~(1<
10);
//全双工模式
CR1=1<
9;
//外部管理NSS引脚
11);
//8bit数据格式
1);
//CPOL=0时空闲模式下SCK为0CPOL=0
0);
//数据采样从第一个时间边沿开始,CPHA=0
CR1|=1<
8;
//SPI主机
CR1|=0<
3;
//Fsck=Fcpu/2
7);
//MSBfirst先发送高位
CRCPR=0X07;
6;
//SPI设备使能
/*******************************************************************************
*函数名:
W5500_GPIO_Configuration
*描述:
W5500GPIO初始化配置
*输入:
无
*输出:
*返回值:
*说明:
*******************************************************************************/
voidW5500_GPIO_Configuration(void)
//PORTC时钟使能
GPIOC->
=0XFF00FFFF;
CRL|=0X00380000;
ODR|=3<
//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:
待写入的数据
voidWrite_W5500_1Byte(u16reg,u8dat)
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个字节数据
16位待写入的数据(2个字节)
voidWrite_W5500_2Byte(u16reg,u16dat)
SPI1_ReadWriteByte(FDM2|RWB_WRITE|COMMON_R);
//通过SPI1写控制字节,2个字节数据长度,写数据,选择通用寄存器
SPI1_Send_Short(dat);
//写16位数据
Write_W5500_nByte
通过SPI1向指定地址寄存器写n个字节数据
16位寄存器地址,*dat_ptr:
待写入数据缓冲区指针,size:
待写入的数据长度
voidWrite_W5500_nByte(u16reg,u8*dat_ptr,u16size)
u16i;
//置W5500的SCS为低电平
SPI1_ReadWriteByte(VDM|RWB_WRITE|COMMON_R);
//通过SPI1写控制字节,N个字节数据长度,写数据,选择通用寄存器
for(i=0;
i<
size;
i++)//循环将缓冲区的size个字节数据写入W5500
SPI1_ReadWriteByte(*dat_ptr++);
//写一个字节数据
}
Write_W5500_SOCK_1Byte
通过SPI1向指定端口寄存器写1个字节数据
s:
端口号,reg:
voidWrite_W5500_SOCK_1Byte(SOCKETs,u16reg,u8dat)
SPI1_ReadWriteByte(FDM1|RWB_WRITE|(s*0x20+0x08));
//通过SPI1写控制字节,1个字节数据长度,写数据,选择端口s的寄存器
Write_W5500_SOCK_2Byte
通过SPI1向指定端口寄存器写2个字节数据
voidWrite_W5500_SOCK_2Byte(SOCKETs,u16reg,u16dat)
SPI1_ReadWriteByte(FDM2|RWB_WRITE|(s*0x20+0x08));
//通过SPI1写控制字节,2个字节数据长度,写数据,选择端口s的寄存器
Write_W5500_SOCK_4Byte
通过SPI1向指定端口寄存器写4个字节数据
待写入的4个字节缓冲区指针
voidWrite_W5500_SOCK_4Byte(SOCKETs,u16reg,u8*dat_ptr)
SPI1_ReadWriteByte(FDM4|RWB_WRITE|(s*0x20+0x08));
//通过SPI1写控制字节,4个字节数据长度,写数据,选择端口s的寄存器
SPI1_ReadWriteByte(*dat_ptr++);
//写第1个字节数据
//写第2个字节数据
//写第3个字节数据
//写第4个字节数据
Read_W5500_1Byte
读W5500指定地址寄存器的1个字节数据
16位寄存器地址
读取到寄存器的1个字节数据
u8Read_W5500_1Byte(u16reg)
u8i;
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的SCS为高电平
returni;
//返回读取到的寄存器数据
Read_W5500_SOCK_1Byte
读W5500指定端口寄存器的1个字节数据
u8Read_W5500_SOCK_1Byte(SOCKETs,u16reg)
i=SPI1_ReadWriteByte(FDM1|RWB_READ|(s*0x20+0x08));
//通过SPI1写控制字节,1个字节数据长度,读数据,选择端口s的寄存器
//i=SPI_I2S_ReceiveData(SPI1);
i=SPI1_ReadWriteByte(0X00);
Read_W5500_SOCK_2Byte
读W5500指定端口寄存器的2个字节数据
读取到寄存器的2个字节数据(16位)
u16Read_W5500_SOCK_2Byte(SOCKETs,u16reg)
i=SPI1_ReadWriteByte(FDM2|RWB_READ|(s*0x20+0x08));
//通过SPI1写控制字节,2个字节数据长度,读数据,选择端口s的寄存器
//读取高位数据
i*=256;
i+=SPI1_ReadWriteByte(0x00);
//读取低位数据
Read_SOCK_Data_Buffer
从W5500接收数据缓冲区中读取数据
端口号,*dat_ptr:
数据保存缓冲区指针
读取到的数据长度,rx_size个字节
u16Read_SOCK_Data_Buffer(SOCKETs,u8*dat_ptr)
u16rx_size;
u16offset,offset1;
u8j;
rx_size=Read_W5500_SOCK_2Byte(s,Sn_RX_RSR);
if(rx_size==0)return0;
//没接收到数据则返回
if(rx_size>
1460)rx_size=1460;
offset=Read_W5500_SOCK_2Byte(s,Sn_RX_RD);
offset1=offset;
offset&
=(S_RX_SIZE-1);
//计算实际的物理地址
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;
rx_size;
i++)//循环读取rx_size个字节数据
{
//SPI1_Send_Byte(0x00);
j=SPI1_ReadWriteByte(0X00);
*dat_ptr=j;
//将读取到的数据保存到数据保存缓冲区
dat_ptr++;
//数据保存缓冲区指针地址自增1
}
else//如果最大地址超过W5500接收缓冲区寄存器的最大地址
offset=S_RX_SIZE-offset;
offset;
i++)//循环读取出前offset个字节数据
W5500_CS_High();
W5500_CS_L