代码亲测有用,注释详细,可放心食用
STM32单片机源程序如下:
- #include "bsp_w5500.h"
- #include "bsp_spi.h"
- #include "bsp_systick.h"
- #include "bsp_w5500_int.h"
- /***********************-CS引脚与RST引脚配置-****************************/
- static void W5500_GPIO_Config()
- {
- GPIO_InitTypeDef GPIO_InitStruct;
- RCC_APB2PeriphClockCmd(W5500_CS_CLK|W5500_RST_CLK,ENABLE);
- /*CS引脚配置*/
- GPIO_InitStruct.GPIO_Pin=W5500_CS_Pin;
- GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
- GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
- GPIO_Init(W5500_CS_Port,&GPIO_InitStruct);
- /*RST引脚配置*/
- GPIO_InitStruct.GPIO_Pin=W5500_RST_Pin;
- GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
- GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
- GPIO_Init(W5500_RST_Port,&GPIO_InitStruct);
- W5500_CS_High();
- }
- /*****************************************************************************
- *@brief : W5500硬件复位
- *@param :
- *@retval : none
- *****************************************************************************/
- static void W5500_HardWare_Reset(void)
- {
- W5500_RST_Low();
- delay_ms(5);
- W5500_RST_High();
- delay_ms(5);
- }
- /*****************************************************************************
- *@brief : 向W5500公共寄存器写一个字节数据
- *@param : offest: 是基于公共寄存器基地址的偏移量
- *@param : data : 将要向寄存器写入的数据
- *@retval : none
- *****************************************************************************/
- void W5500_Write1Byte_common(uint16_t offest,uint8_t data)
- {
- W5500_CS_Low(); /*CS片选置底,开始SPI通讯*/
- SPI1_Send_Short(offest); /*发送16位地址*/
- SPI1_Send_Byte((uint8_t) (COMMON_R|RWB_WRITE|VDM)); /*发送控制字节*/
- SPI1_Send_Byte(data); /*发送8位数据*/
- W5500_CS_High(); /*片选拉高,关闭SPI通讯*/
- }
- /*****************************************************************************
- *@brief : 向W5500公共寄存器写两个字节数据
- *@param : offest: 是基于公共寄存器基地址的偏移量
- *@param : data : 将要向寄存器写入的数据
- *@retval : none
- *****************************************************************************/
- void W5500_Write2Byte_common(uint16_t offest,uint16_t data)
- {
- W5500_CS_Low(); /*CS片选置底,开始SPI通讯*/
- SPI1_Send_Short(offest); /*发送16位地址*/
- SPI1_Send_Byte((uint8_t) (COMMON_R|RWB_WRITE|VDM)); /*发送控制字节*/
- SPI1_Send_Byte((uint8_t)(data/256)); /*发送高8位数据*/
- SPI1_Send_Byte((uint8_t)(data%256)); /*发送低8位数据*/
- W5500_CS_High(); /*片选拉高,关闭SPI通讯*/
- }
- /*****************************************************************************
- *@brief : 向W5500公共寄存器写N个字节数据
- *@param : offest: 是基于公共寄存器基地址的偏移量
- *@param : addr : 将要向寄存器写入的数据的地址
- *@param : size : 将要向寄存器写入的数据字节数
- *@retval : none
- *****************************************************************************/
- void W5500_WriteNByte_common(uint16_t offest,uint8_t *addr,uint8_t size)
- {
- uint8_t i;
- W5500_CS_Low(); /*CS片选置底,开始SPI通讯*/
- SPI1_Send_Short(offest); /*发送16位地址*/
- SPI1_Send_Byte((uint8_t) (COMMON_R|RWB_WRITE|VDM)); /*发送控制字节*/
- for(i=0;i<size;i++) /*发送数据*/
- {
- SPI1_Send_Byte(*addr++);
- }
- W5500_CS_High(); /*片选拉高,关闭SPI通讯*/
- }
- /*****************************************************************************
- *@brief : 读W5500 common寄存器 1个字节数据
- *@param : offest: 是基于公共寄存器基地址的偏移量
- *@retval : 一个字节的数据
- *****************************************************************************/
- uint8_t W5500_Read1Byte_common(uint16_t offest)
- {
- uint8_t i;
- W5500_CS_Low(); /*CS片选置底,开始SPI通讯*/
- SPI1_Send_Short(offest); /*发送16位地址*/
- SPI1_Send_Byte(COMMON_R|RWB_READ|VDM); /*发送控制字节*/
- i=SPI1_Read_Byte(); /*接收数据*/
- W5500_CS_High(); /*片选拉高,关闭SPI通讯*/
-
- return i;
- }
- /*****************************************************************************
- *@brief : 读W5500 common寄存器 2个字节数据
- *@param : offest: 是基于公共寄存器基地址的偏移量
- *@retval : 一个字节的数据
- *****************************************************************************/
- uint16_t W5500_Read2Byte_common(uint16_t offest)
- {
- uint16_t i;
- W5500_CS_Low(); /*CS片选置底,开始SPI通讯*/
- SPI1_Send_Short(offest); /*发送16位地址*/
- SPI1_Send_Byte(COMMON_R|RWB_READ|VDM); /*发送控制字节*/
- i=SPI1_Read_Byte(); /*接收数据*/
- i*=256;
- i|=SPI1_Read_Byte();
- W5500_CS_High(); /*片选拉高,关闭SPI通讯*/
-
- return i;
- }
- /*****************************************************************************
- *@brief : 向W5500 socket_n 寄存器写1个字节数据
- *@param : n : 选择socket_n寄存器,取值范围0—7
- *@param : offest: 是基于socket_n寄存器基地址的偏移量
- *@param : data : 将要向寄存器写入的数据
- *@retval : none
- *****************************************************************************/
- void W5500_Write1Byte_socket_n(uint8_t n,uint16_t offest,uint8_t data)
- {
- W5500_CS_Low(); /*CS片选置底,开始SPI通讯*/
- SPI1_Send_Short(offest); /*发送16位地址*/
- SPI1_Send_Byte((uint8_t) (n*0x20+0x08|RWB_WRITE|VDM));/*发送控制字节*/
- SPI1_Send_Byte(data); /*发送8位数据*/
- W5500_CS_High(); /*片选拉高,关闭SPI通讯*/
- }
- /*****************************************************************************
- *@brief : 向W5500 socket_n 寄存器写2个字节数据
- *@param : n : 选择socket_n寄存器,取值范围0—7
- *@param : offest: 是基于socket_n寄存器基地址的偏移量
- *@param : data : 将要向寄存器写入的数据
- *@retval : none
- *****************************************************************************/
- void W5500_Write2Byte_socket_n(uint8_t n,uint16_t offest,uint16_t data)
- {
- W5500_CS_Low(); /*CS片选置底,开始SPI通讯*/
- SPI1_Send_Short(offest); /*发送16位地址*/
- SPI1_Send_Byte((uint8_t) (n*0x20+0x08|RWB_WRITE|VDM));/*发送控制字节*/
- SPI1_Send_Byte((uint8_t)(data/256)); /*发送高8位数据*/
- SPI1_Send_Byte((uint8_t)(data%256)); /*发送低8位数据*/
- W5500_CS_High(); /*片选拉高,关闭SPI通讯*/
- }
- /*****************************************************************************
- *@brief : 向W5500 socket_n 寄存器写N个字节数据
- *@param : n : 选择socket_n寄存器,取值范围0—7
- *@param : offest: 是基于socket_n寄存器基地址的偏移量
- *@param : addr : 写入数据的地址
- *@param : size : 写入的数据字节数
- *@retval : none
- *****************************************************************************/
- void W5500_WriteNByte_socket_n(uint8_t n,uint16_t offest,uint8_t* addr,uint8_t size)
- {
- uint8_t i;
- W5500_CS_Low(); /*CS片选置底,开始SPI通讯*/
- SPI1_Send_Short(offest); /*发送16位地址*/
- SPI1_Send_Byte((uint8_t) (n*0x20+0x08|RWB_WRITE|VDM));/*发送控制字节*/
- for(i=0;i<size;i++) /*发送数据*/
- {
- SPI1_Send_Byte(*addr);
- addr++;
- }
- W5500_CS_High(); /*片选拉高,关闭SPI通讯*/
- }
- /*****************************************************************************
- *@brief : 读socket_n寄存器 1个字节数据
- *@param : n : 选择socket,取值0-7
- *@param : offest: 是基于公共寄存器基地址的偏移量
- *@retval : 一个字节的数据
- *****************************************************************************/
- uint8_t W5500_Read1Byte_socket_n(uint8_t n,uint16_t offest)
- {
- uint8_t i;
- W5500_CS_Low(); /*CS片选置底,开始SPI通讯*/
- SPI1_Send_Short(offest); /*发送16位地址*/
- SPI1_Send_Byte((n*0x20+0x08)|RWB_READ|VDM); /*发送控制字节*/
- i=SPI1_Read_Byte(); /*接收数据*/
- W5500_CS_High(); /*片选拉高,关闭SPI通讯*/
- return i;
- }
- /*****************************************************************************
- *@brief : 读socket_n寄存器 2个字节数据
- *@param : n : 选择socket,取值0-7
- *@param : offest: 是基于公共寄存器基地址的偏移量
- *@retval : 两个字节的数据
- *****************************************************************************/
- uint16_t W5500_Read2Byte_socket_n(uint8_t n,uint16_t offest)
- {
- uint16_t i;
- W5500_CS_Low(); /*CS片选置底,开始SPI通讯*/
- SPI1_Send_Short(offest); /*发送16位地址*/
- SPI1_Send_Byte((n*0x20+0x08)|RWB_READ|VDM); /*发送控制字节*/
- i=SPI1_Read_Byte(); /*接收数据*/
- i*=256;
- i|=SPI1_Read_Byte();
- W5500_CS_High(); /*片选拉高,关闭SPI通讯*/
-
- return i;
- }
- /*****************************************************************************
- *@brief : 读socket_n寄存器 n个字节数据
- *@param : n : 选择socket,取值0-7
- *@param : offest: 是基于公共寄存器基地址的偏移量
- *@param : addr : 读取到的数据保存的地址
- *@param : size : 读取的字节数
- *@retval : 一个字节的数据
- *****************************************************************************/
- void W5500_ReadNByte_socket_n(uint8_t n,uint16_t offest,uint8_t* addr,uint8_t size)
- {
- uint8_t i;
- W5500_CS_Low(); /*CS片选置底,开始SPI通讯*/
- SPI1_Send_Short(offest); /*发送16位地址*/
- SPI1_Send_Byte((n*0x20+0x08)|RWB_READ|VDM); /*发送控制字节*/
- for(i=0;i<size;i++) /*接收数据*/
- {
- *addr=SPI1_Read_Byte();
- addr++;
- }
- W5500_CS_High(); /*片选拉高,关闭SPI通讯*/
- }
- /*****************************************************************************
- *@brief : W5500软件复位
- *@param :
- *@retval : none
- *****************************************************************************/
- static void W5500_Soft_Reset()
- {
- W5500_Write1Byte_common(MR,RST);
- delay_ms(5);
- }
- void W5500_Init()
- {
- SPI_Config();
- W5500_GPIO_Config();
- W5500_INT_GPIO_Config();
- W5500_HardWare_Reset();
- W5500_Soft_Reset();
- }
复制代码
所有资料51hei提供下载:
W5500代码及英文数据手册.7z
(1.46 MB, 下载次数: 208)
|