代碼親測有用,注釋詳細,可放心食用
0.png (44.53 KB, 下載次數(shù): 94)
下載附件
2019-7-27 00:55 上傳
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公共寄存器寫一個字節(jié)數(shù)據(jù)
- *@param : offest: 是基于公共寄存器基地址的偏移量
- *@param : data : 將要向寄存器寫入的數(shù)據(jù)
- *@retval : none
- *****************************************************************************/
- void W5500_Write1Byte_common(uint16_t offest,uint8_t data)
- {
- W5500_CS_Low(); /*CS片選置底,開始SPI通訊*/
- SPI1_Send_Short(offest); /*發(fā)送16位地址*/
- SPI1_Send_Byte((uint8_t) (COMMON_R|RWB_WRITE|VDM)); /*發(fā)送控制字節(jié)*/
- SPI1_Send_Byte(data); /*發(fā)送8位數(shù)據(jù)*/
- W5500_CS_High(); /*片選拉高,關閉SPI通訊*/
- }
- /*****************************************************************************
- *@brief : 向W5500公共寄存器寫兩個字節(jié)數(shù)據(jù)
- *@param : offest: 是基于公共寄存器基地址的偏移量
- *@param : data : 將要向寄存器寫入的數(shù)據(jù)
- *@retval : none
- *****************************************************************************/
- void W5500_Write2Byte_common(uint16_t offest,uint16_t data)
- {
- W5500_CS_Low(); /*CS片選置底,開始SPI通訊*/
- SPI1_Send_Short(offest); /*發(fā)送16位地址*/
- SPI1_Send_Byte((uint8_t) (COMMON_R|RWB_WRITE|VDM)); /*發(fā)送控制字節(jié)*/
- SPI1_Send_Byte((uint8_t)(data/256)); /*發(fā)送高8位數(shù)據(jù)*/
- SPI1_Send_Byte((uint8_t)(data%256)); /*發(fā)送低8位數(shù)據(jù)*/
- W5500_CS_High(); /*片選拉高,關閉SPI通訊*/
- }
- /*****************************************************************************
- *@brief : 向W5500公共寄存器寫N個字節(jié)數(shù)據(jù)
- *@param : offest: 是基于公共寄存器基地址的偏移量
- *@param : addr : 將要向寄存器寫入的數(shù)據(jù)的地址
- *@param : size : 將要向寄存器寫入的數(shù)據(jù)字節(jié)數(shù)
- *@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); /*發(fā)送16位地址*/
- SPI1_Send_Byte((uint8_t) (COMMON_R|RWB_WRITE|VDM)); /*發(fā)送控制字節(jié)*/
- for(i=0;i<size;i++) /*發(fā)送數(shù)據(jù)*/
- {
- SPI1_Send_Byte(*addr++);
- }
- W5500_CS_High(); /*片選拉高,關閉SPI通訊*/
- }
- /*****************************************************************************
- *@brief : 讀W5500 common寄存器 1個字節(jié)數(shù)據(jù)
- *@param : offest: 是基于公共寄存器基地址的偏移量
- *@retval : 一個字節(jié)的數(shù)據(jù)
- *****************************************************************************/
- uint8_t W5500_Read1Byte_common(uint16_t offest)
- {
- uint8_t i;
- W5500_CS_Low(); /*CS片選置底,開始SPI通訊*/
- SPI1_Send_Short(offest); /*發(fā)送16位地址*/
- SPI1_Send_Byte(COMMON_R|RWB_READ|VDM); /*發(fā)送控制字節(jié)*/
- i=SPI1_Read_Byte(); /*接收數(shù)據(jù)*/
- W5500_CS_High(); /*片選拉高,關閉SPI通訊*/
-
- return i;
- }
- /*****************************************************************************
- *@brief : 讀W5500 common寄存器 2個字節(jié)數(shù)據(jù)
- *@param : offest: 是基于公共寄存器基地址的偏移量
- *@retval : 一個字節(jié)的數(shù)據(jù)
- *****************************************************************************/
- uint16_t W5500_Read2Byte_common(uint16_t offest)
- {
- uint16_t i;
- W5500_CS_Low(); /*CS片選置底,開始SPI通訊*/
- SPI1_Send_Short(offest); /*發(fā)送16位地址*/
- SPI1_Send_Byte(COMMON_R|RWB_READ|VDM); /*發(fā)送控制字節(jié)*/
- i=SPI1_Read_Byte(); /*接收數(shù)據(jù)*/
- i*=256;
- i|=SPI1_Read_Byte();
- W5500_CS_High(); /*片選拉高,關閉SPI通訊*/
-
- return i;
- }
- /*****************************************************************************
- *@brief : 向W5500 socket_n 寄存器寫1個字節(jié)數(shù)據(jù)
- *@param : n : 選擇socket_n寄存器,取值范圍0—7
- *@param : offest: 是基于socket_n寄存器基地址的偏移量
- *@param : data : 將要向寄存器寫入的數(shù)據(jù)
- *@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); /*發(fā)送16位地址*/
- SPI1_Send_Byte((uint8_t) (n*0x20+0x08|RWB_WRITE|VDM));/*發(fā)送控制字節(jié)*/
- SPI1_Send_Byte(data); /*發(fā)送8位數(shù)據(jù)*/
- W5500_CS_High(); /*片選拉高,關閉SPI通訊*/
- }
- /*****************************************************************************
- *@brief : 向W5500 socket_n 寄存器寫2個字節(jié)數(shù)據(jù)
- *@param : n : 選擇socket_n寄存器,取值范圍0—7
- *@param : offest: 是基于socket_n寄存器基地址的偏移量
- *@param : data : 將要向寄存器寫入的數(shù)據(jù)
- *@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); /*發(fā)送16位地址*/
- SPI1_Send_Byte((uint8_t) (n*0x20+0x08|RWB_WRITE|VDM));/*發(fā)送控制字節(jié)*/
- SPI1_Send_Byte((uint8_t)(data/256)); /*發(fā)送高8位數(shù)據(jù)*/
- SPI1_Send_Byte((uint8_t)(data%256)); /*發(fā)送低8位數(shù)據(jù)*/
- W5500_CS_High(); /*片選拉高,關閉SPI通訊*/
- }
- /*****************************************************************************
- *@brief : 向W5500 socket_n 寄存器寫N個字節(jié)數(shù)據(jù)
- *@param : n : 選擇socket_n寄存器,取值范圍0—7
- *@param : offest: 是基于socket_n寄存器基地址的偏移量
- *@param : addr : 寫入數(shù)據(jù)的地址
- *@param : size : 寫入的數(shù)據(jù)字節(jié)數(shù)
- *@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); /*發(fā)送16位地址*/
- SPI1_Send_Byte((uint8_t) (n*0x20+0x08|RWB_WRITE|VDM));/*發(fā)送控制字節(jié)*/
- for(i=0;i<size;i++) /*發(fā)送數(shù)據(jù)*/
- {
- SPI1_Send_Byte(*addr);
- addr++;
- }
- W5500_CS_High(); /*片選拉高,關閉SPI通訊*/
- }
- /*****************************************************************************
- *@brief : 讀socket_n寄存器 1個字節(jié)數(shù)據(jù)
- *@param : n : 選擇socket,取值0-7
- *@param : offest: 是基于公共寄存器基地址的偏移量
- *@retval : 一個字節(jié)的數(shù)據(jù)
- *****************************************************************************/
- uint8_t W5500_Read1Byte_socket_n(uint8_t n,uint16_t offest)
- {
- uint8_t i;
- W5500_CS_Low(); /*CS片選置底,開始SPI通訊*/
- SPI1_Send_Short(offest); /*發(fā)送16位地址*/
- SPI1_Send_Byte((n*0x20+0x08)|RWB_READ|VDM); /*發(fā)送控制字節(jié)*/
- i=SPI1_Read_Byte(); /*接收數(shù)據(jù)*/
- W5500_CS_High(); /*片選拉高,關閉SPI通訊*/
- return i;
- }
- /*****************************************************************************
- *@brief : 讀socket_n寄存器 2個字節(jié)數(shù)據(jù)
- *@param : n : 選擇socket,取值0-7
- *@param : offest: 是基于公共寄存器基地址的偏移量
- *@retval : 兩個字節(jié)的數(shù)據(jù)
- *****************************************************************************/
- uint16_t W5500_Read2Byte_socket_n(uint8_t n,uint16_t offest)
- {
- uint16_t i;
- W5500_CS_Low(); /*CS片選置底,開始SPI通訊*/
- SPI1_Send_Short(offest); /*發(fā)送16位地址*/
- SPI1_Send_Byte((n*0x20+0x08)|RWB_READ|VDM); /*發(fā)送控制字節(jié)*/
- i=SPI1_Read_Byte(); /*接收數(shù)據(jù)*/
- i*=256;
- i|=SPI1_Read_Byte();
- W5500_CS_High(); /*片選拉高,關閉SPI通訊*/
-
- return i;
- }
- /*****************************************************************************
- *@brief : 讀socket_n寄存器 n個字節(jié)數(shù)據(jù)
- *@param : n : 選擇socket,取值0-7
- *@param : offest: 是基于公共寄存器基地址的偏移量
- *@param : addr : 讀取到的數(shù)據(jù)保存的地址
- *@param : size : 讀取的字節(jié)數(shù)
- *@retval : 一個字節(jié)的數(shù)據(jù)
- *****************************************************************************/
- 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); /*發(fā)送16位地址*/
- SPI1_Send_Byte((n*0x20+0x08)|RWB_READ|VDM); /*發(fā)送控制字節(jié)*/
- for(i=0;i<size;i++) /*接收數(shù)據(jù)*/
- {
- *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代碼及英文數(shù)據(jù)手冊.7z
(1.46 MB, 下載次數(shù): 221)
2019-7-27 00:57 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|