一、开发环境
1.硬件:GD32f103vet6开发板,w5500模块,w5500连接在开发板的SPI1总线上。
2.软件:rt-thread操作系统,wiznet软件包,bsp采用的是stm32f103某型号(忘了)的bsp直接用在GD32开发板上,因为同型号的GD32和STM32芯片支持pin2pin。
3.引脚连接方式:PA4-->SPI1NSS, PA5-->SPI1SCK, PA6-->SPI1MISO, PA7-->SPI1MOSI, PE2-->W5500的中断脚。(用于w5500通讯的单片机引脚我只需要了这五个,因为我的开发板上w5500的复位引脚直接连接的GD32的nRST引脚,w5500的复位直接跟着系统一起复位了)。
4.整个系统的连接方式:开发板通过网线直接连接电脑。
5.rtthread系统下的引脚编号说明:0-15分别代表PA0-15、16-31分别代表PB0-15、32-47分别代表PC0-15、48-63分别代表PD0-15、64-79分别代表PE0-15。
二、软件包
WIZnet 软件包是 RT-Thread 基于 WIZnet 官网 ioLibrary_Driver 代码库的移植实现,目前只支持 W5500 设备。该软件包在原代码库功能的基础上,对接 RT-Thread SAL 套接字抽象层,实现对标准 BSD Socket APIs 的支持,完美的兼容多种软件包和网络功能实现,提高 WIZnet 设备兼容性。只需要开启wiznet软件包、netdev网卡层、SAL套接字层便可。
三、BSP配置步骤
1.cubemx中打开spi1设备:
SPI初始化代码生成的话成功可以在keil5中看到:
2.env环境下打开SPI1设备:
rt-thread\bsp\stm32\stm32f103vet6_micropython10\board路径下的Kconfig文件中关于SPI配置:
menu "On-chip Peripheral Drivers"
menuconfig BSP_USING_SPI
bool "Enable SPI Bus"
default n
select RT_USING_SPI
if BSP_USING_SPI
config BSP_USING_SPI1
bool "Enable SPI1 Bus"
default n
config BSP_SPI1_TX_USING_DMA
bool "Enable SPI1 TX DMA"
depends on BSP_USING_SPI1
default n
config BSP_SPI1_RX_USING_DMA
bool "Enable SPI1 RX DMA"
depends on BSP_USING_SPI1
select BSP_SPI1_TX_USING_DMA
default n
config BSP_USING_SPI2
bool "Enable SPI2 Bus"
default n
config BSP_SPI2_TX_USING_DMA
bool "Enable SPI2 TX DMA"
depends on BSP_USING_SPI2
default n
config BSP_SPI2_RX_USING_DMA
bool "Enable SPI2 RX DMA"
depends on BSP_USING_SPI2
select BSP_SPI2_TX_USING_DMA
default n
config BSP_USING_SPI3
bool "Enable SPI3 Bus"
default n
config BSP_SPI3_TX_USING_DMA
bool "Enable SPI3 TX DMA"
depends on BSP_USING_SPI3
default n
config BSP_SPI3_RX_USING_DMA
bool "Enable SPI3 RX DMA"
depends on BSP_USING_SPI3
select BSP_SPI3_TX_USING_DMA
default n
endif
3.env环境中,开启wiznet包:
关闭DHCP,因为是PC直连,没有办法自动分配IP,我们自己配置静态IP:
复位引脚跟芯片的复位引脚连接在一起了,不管,随便填个80;中断引脚我的是PE2(引脚编号为66)。这里如果你的w5500接在了SPI2上那么将“spi10”改为“spi20”:
4.开启sal和netdev:
env环境配置结束。退出env环境,用
scons --target=mdk5
编译工程。
5.keil5中的改动:
在wiz.c文件中加入如下代码,其中GET_PIN(A, 4)改为自己的SPI片选口:
#include <drv_gpio.h>
static int rt_hw_spi_flash_init(void)
{
struct rt_spi_device *spi_device = RT_NULL;
spi_device = (struct rt_spi_device *)rt_malloc(sizeof(struct rt_spi_device));
if(RT_NULL == spi_device)
{
LOG_E("Failed to malloc the spi device.");
return -RT_ENOMEM;
}
if (RT_EOK != rt_spi_bus_attach_device_cspin(spi_device, "spi10", "spi1",GET_PIN(A, 4), RT_NULL))
{
LOG_E("Failed to attach the spi device.");
return -RT_ERROR;
}
return RT_EOK;
}
/* 导 出 到 自 动 初 始 化 */
INIT_COMPONENT_EXPORT(rt_hw_spi_flash_init);
编译keil后报错:
做个小改动:
没毛病了:
烧录开发板后:
配置正常。
三、电脑和开发板相互ping
1.电脑和开发板的ip配置信息
开发板:
电脑:
2.电脑ping开发板
没毛病
3.开发板ping电脑
先关闭电脑防火墙:
开始ping:
没毛病,收工。
参考:https://blog.csdn.net/weixin_46158019/article/details/131588233