通过STM32F103RC驱动W5500入网,需要先确定以下几点:
1、硬件电路连接情况,STM32F103RC的SPI对应的端口,SPI1和SPI2的硬件端口对应关系如下:
电路设计时,如要使用SPI接口,必须把对应的引脚接对。
2、要确保电脑和STM32驱动W5500的板子联网在同一局域网内。
3、在电脑的cmd命令窗口中,输入ipconfig查出自己电脑的IP。
4、在cmd命令串口中,随意ping一个IP,确保ping不通;待调试好的程序下载完成后,再ping这个IP,如果ping通了,说明STM32F103RC驱动W5500入网成功。
我使用的板子,使用的SPI2,端口对应关系如下:
硬件资源情况如上。
我使用的IDE是Keil5 。
w5500相关库函数是在网上找的,用了几个月,还没发现有什么大的问题。
软件部分需要做以下操作:
1、初始化SPI相关的GPIO。
2、改写w5500_conf.c文件中片选开关和SPI发送数据的方法。
3、w5500复位。
4、配置网关,子网掩码,MAC地址和IP地址。
做完这几步就可以ping通了。
测试代码主函数如下:
#ifndef __STM32F10X_H
#define __STM32F10X_H
#include "stm32f10x.h"
#endif
#ifndef __Z_UTIL_TIME_H
#define __Z_UTIL_TIME_H
#include "z_util_time.h"
#endif
#ifndef __Z_HARDWARE_LED_H
#define __Z_HARDWARE_LED_H
#include "z_hardware_led.h"
#endif
#ifndef __Z_HARDWARE_SPI_H
#define __Z_HARDWARE_SPI_H
#include "z_hardware_spi.h"
#endif
#include "w5500.h"
#include "socket.h"
#include "w5500_conf.h"
int main(void)
{
uint8 mac[6]={0, };
uint8 lip[4]={192,168,1,110};
uint8 sub[4]={255,255,255,0};
uint8 gw[4]={192,168,1,1};
init_led();
init_system_spi();
func_w5500_reset();
getMacByLockCode(mac);
setSHAR(mac);
setSUBR(sub);
setGAR(gw);
setSIPR(lip);
for(;;)
{
func_led1_on();
delay_ms(500);
func_led1_off();
delay_ms(500);
}
}
上述代码中,getMacByLockCode(mac);此方法用于生成MAC地址。
SPI操作相关的代码如下:
#ifndef __Z_HARDWARE_SPI_H
#define __Z_HARDWARE_SPI_H
#include "z_hardware_spi.h"
#endif
void init_system_spi(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
SPI_InitTypeDef SPI_InitStructure;
/* Enable SPI2 and GPIOB clocks */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
/* Configure SPI1 pins: SCK, MISO and MOSI -------------*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOB, &GPIO_InitStructure);
/* Set Chip Select pin */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_SetBits(GPIOB, GPIO_Pin_12);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_ResetBits(GPIOB, GPIO_Pin_11);//RST
/* Set SPI interface */
SPI_InitStructure.SPI_Direction=SPI_Direction_2Lines_FullDuplex;
SPI_InitStructure.SPI_Mode=SPI_Mode_Master;
SPI_InitStructure.SPI_DataSize=SPI_DataSize_8b;
SPI_InitStructure.SPI_CPOL=SPI_CPOL_Low;
SPI_InitStructure.SPI_CPHA=SPI_CPHA_1Edge;
SPI_InitStructure.SPI_NSS=SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_4;
SPI_InitStructure.SPI_FirstBit=SPI_FirstBit_MSB;
SPI_InitStructure.SPI_CRCPolynomial=7;
SPI_Init(SPI2,&SPI_InitStructure);
SPI_Cmd(SPI2,ENABLE);
SPI_I2S_ClearFlag(SPI2, SPI_I2S_FLAG_TXE);
SPI_I2S_ClearFlag(SPI2, SPI_I2S_FLAG_RXNE);
}
uint8_t func_spi_write_a_byte(uint8_t byte)
{
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);
SPI_I2S_SendData(SPI2, byte);
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);
return SPI_I2S_ReceiveData(SPI2);
}
void func_spi_cs_select(void)
{
GPIO_ResetBits(GPIOB, GPIO_Pin_12);
}
void func_spi_cs_deselect(void)
{
GPIO_SetBits(GPIOB, GPIO_Pin_12);
}
void func_w5500_reset(void)
{
GPIO_ResetBits(GPIOB, GPIO_Pin_11);
delay_us(2);
GPIO_SetBits(GPIOB, GPIO_Pin_11);
delay_ms(1600);
}
W5500改写SPI相关操作的代码片如下,此部分摘自w5500_conf.c文件:
void iinchip_csoff(void)
{
func_spi_cs_select();
}
void iinchip_cson(void)
{
func_spi_cs_deselect();
}
uint8 IINCHIP_SpiSendData(uint8 dat)
{
return(func_spi_write_a_byte(dat));
}
void IINCHIP_WRITE( uint32 addrbsb, uint8 data)
{
iinchip_csoff();
IINCHIP_SpiSendData( (addrbsb & 0x00FF0000)>>16);
IINCHIP_SpiSendData( (addrbsb & 0x0000FF00)>> 8);
IINCHIP_SpiSendData( (addrbsb & 0x000000F8) + 4);
IINCHIP_SpiSendData(data);
iinchip_cson();
}
uint8 IINCHIP_READ(uint32 addrbsb)
{
uint8 data = 0;
iinchip_csoff();
IINCHIP_SpiSendData( (addrbsb & 0x00FF0000)>>16);
IINCHIP_SpiSendData( (addrbsb & 0x0000FF00)>> 8);
IINCHIP_SpiSendData( (addrbsb & 0x000000F8)) ;
data = IINCHIP_SpiSendData(0x00);
iinchip_cson();
return data;
}
代码编译后下载到板子中,ping的效果如下:
代码下载地址:00_W5500_ping测试工程代码。 |