STM32F103驱动W5500网络程序word版本.docx
- 文档编号:9699251
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:46
- 大小:28.71KB
STM32F103驱动W5500网络程序word版本.docx
《STM32F103驱动W5500网络程序word版本.docx》由会员分享,可在线阅读,更多相关《STM32F103驱动W5500网络程序word版本.docx(46页珍藏版)》请在冰豆网上搜索。
STM32F103驱动W5500网络程序word版本
#include"W5500.h"
/***************-----网络参数变量定义-----***************/
unsignedcharGateway_IP[4];//网关IP地址
unsignedcharSub_Mask[4];//子网掩码
unsignedcharPhy_Addr[6];//物理地址(MAC)
unsignedcharIP_Addr[4];//本机IP地址
unsignedcharS0_Port[2];//端口0的端口号(5000)
unsignedcharS0_DIP[4];//端口0目的IP地址
unsignedcharS0_DPort[2];//端口0目的端口号(6000)
unsignedcharUDP_DIPR[4];//UDP(广播)模式,目的主机IP地址
unsignedcharUDP_DPORT[2];//UDP(广播)模式,目的主机端口号
/***************-----端口的运行模式-----***************/
unsignedcharS0_Mode=3;//端口0的运行模式,0:
TCP服务器模式,1:
TCP客户端模式,2:
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时钟使能
RCC->APB2ENR|=1<<12;//SPI1时钟使能
RCC->APB2ENR|=1<<0;
GPIOA->CRL&=0XFFF0FFFF;
GPIOA->CRL|=0X00030000;//PA4通用挽推输出,输出速度50MHz
GPIOA->ODR|=1<<4;//PA4上拉,设置片选引脚
//这里只针对SPI口初始化
GPIOA->CRL&=0X000FFFFF;
GPIOA->CRL|=0XBBB00000;//PA5.6.7复用功能挽推输出,输出速度50MHz
GPIOA->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为0CPOL=0
SPI1->CR1&=~(1<<0);//数据采样从第一个时间边沿开始,CPHA=0
SPI1->CR1|=1<<8;
SPI1->CR1|=1<<2;//SPI主机
SPI1->CR1|=0<<3;//Fsck=Fcpu/2
SPI1->CR1&=~(1<<7);//MSBfirst先发送高位
SPI1->CRCPR=0X07;
SPI1->CR1|=1<<6;//SPI设备使能
}
/*******************************************************************************
*函数名:
W5500_GPIO_Configuration
*描述:
W5500GPIO初始化配置
*输入:
无
*输出:
无
*返回值:
无
*说明:
无
*******************************************************************************/
voidW5500_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:
待写入的数据
*输出:
无
*返回值:
无
*说明:
无
*******************************************************************************/
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个字节数据
*输入:
reg:
16位寄存器地址,dat:
16位待写入的数据(2个字节)
*输出:
无
*返回值:
无
*说明:
无
*******************************************************************************/
voidWrite_W5500_2Byte(u16reg,u16dat)
{
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:
待写入的数据长度
*输出:
无
*返回值:
无
*说明:
无
*******************************************************************************/
voidWrite_W5500_nByte(u16reg,u8*dat_ptr,u16size)
{
u16i;
W5500_CS_Low();//置W5500的SCS为低电平
SPI1_Send_Short(reg);//通过SPI1写16位寄存器地址
SPI1_ReadWriteByte(VDM|RWB_WRITE|COMMON_R);//通过SPI1写控制字节,N个字节数据长度,写数据,选择通用寄存器
for(i=0;i { SPI1_ReadWriteByte(*dat_ptr++);//写一个字节数据 } W5500_CS_High();//置W5500的SCS为高电平 } /******************************************************************************* *函数名: Write_W5500_SOCK_1Byte *描述: 通过SPI1向指定端口寄存器写1个字节数据 *输入: s: 端口号,reg: 16位寄存器地址,dat: 待写入的数据 *输出: 无 *返回值: 无 *说明: 无 *******************************************************************************/ voidWrite_W5500_SOCK_1Byte(SOCKETs,u16reg,u8dat) { 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个字节) *输出: 无 *返回值: 无 *说明: 无 *******************************************************************************/ voidWrite_W5500_SOCK_2Byte(SOCKETs,u16reg,u16dat) { 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个字节缓冲区指针 *输出: 无 *返回值: 无 *说明: 无 *******************************************************************************/ voidWrite_W5500_SOCK_4Byte(SOCKETs,u16reg,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个字节数据 *说明: 无 *******************************************************************************/ u8Read_W5500_1Byte(u16reg) { u8i; 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为高电平 returni;//返回读取到的寄存器数据 } /******************************************************************************* *函数名: Read_W5500_SOCK_1Byte *描述: 读W5500指定端口寄存器的1个字节数据 *输入: s: 端口号,reg: 16位寄存器地址 *输出: 无 *返回值: 读取到寄存器的1个字节数据 *说明: 无 *******************************************************************************/ u8Read_W5500_SOCK_1Byte(SOCKETs,u16reg) { u8i; 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为高电平 returni;//返回读取到的寄存器数据 } /******************************************************************************* *函数名: Read_W5500_SOCK_2Byte *描述: 读W5500指定端口寄存器的2个字节数据 *输入: s: 端口号,reg: 16位寄存器地址 *输出: 无 *返回值: 读取到寄存器的2个字节数据(16位) *说明: 无 *******************************************************************************/ u16Read_W5500_SOCK_2Byte(SOCKETs,u16reg) { u16i; 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为高电平 returni;//返回读取到的寄存器数据 } /******************************************************************************* *函数名: Read_SOCK_Data_Buffer *描述: 从W5500接收数据缓冲区中读取数据 *输入: s: 端口号,*dat_ptr: 数据保存缓冲区指针 *输出: 无 *返回值: 读取到的数据长度,rx_size个字节 *说明: 无 *******************************************************************************/ u16Read_SOCK_Data_Buffer(SOCKETs,u8*dat_ptr) { u16rx_size; u16offset,offset1; u16i; 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);//计算实际的物理地址 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) { for(i=0;i { //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 { //SPI1_Send_Byte(0x00);//发送一个哑数据 j=SPI1_ReadWriteByte(0X00);//读取1个字节数据 *dat_ptr=j;//将读取到的数据保存到数据保存缓冲区 dat_ptr++;//数据保存缓冲区指针地址自增1 } W5500_CS_High();//置W5500的SCS为高电平 W5500_CS_L
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- STM32F103 驱动 W5500 网络 程序 word 版本