STM32F103RC驱动W5500入网,并可ping通

通过STM32F103RC驱动W5500入网,需要先确定以下几点:

1、硬件电路连接情况,STM32F103RC的SPI对应的端口,SPI1和SPI2的硬件端口对应关系如下:

STM32F103RC驱动W5500入网,并可ping通_第1张图片

电路设计时,如要使用SPI接口,必须把对应的引脚接对。

2、要确保电脑和STM32驱动W5500的板子联网在同一局域网内。

3、在电脑的cmd命令窗口中,输入ipconfig查出自己电脑的IP。

4、在cmd命令串口中,随意ping一个IP,确保ping不通;待调试好的程序下载完成后,再ping这个IP,如果ping通了,说明STM32F103RC驱动W5500入网成功。

我使用的板子,使用的SPI2,端口对应关系如下:

STM32F103RC驱动W5500入网,并可ping通_第2张图片

硬件资源情况如上。

我使用的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的效果如下:

STM32F103RC驱动W5500入网,并可ping通_第3张图片

 

代码下载地址:00_W5500_ping测试工程代码。

你可能感兴趣的:(C,W5500,STM32,STM32F1,W5500,ping,入网)