目录
4、与ali-iotkit-v3.0.1 阿里云IOT软件包 MQTT主题订阅发布
4.2 配置Ali-iotkit 连接阿里云IOT平台的三元组参数,开启Samples示例代码,其他参数默认即可
4.4 物模型示例代码 linkkit_example_solo.c
开发环境:使用 RT-Thread 实时操作系统 。
开发软件:使用 RT-Thread Studio (目前最新版本1.1.3)。
开发硬件:使用正点原子的 STM32L475 潘多拉开发板 。
1、介绍
1.1 WIZnet
WIZnet 软件包是 RT-Thread 基于 WIZnet 官网 ioLibrary_Driver 代码库的移植实现,目前只支持 W5500 设备。该软件包在原代码库功能的基础上,对接 RT-Thread SAL 套接字抽象层,实现对标准 BSD Socket APIs 的支持,完美的兼容多种软件包和网络功能实现,提高 WIZnet 设备兼容性。
1.2 W5500
W5500是WIZnet推出的高性能以太网接口芯片系列之一,内部集成全硬件TCP/IP协议栈+MAC+PHY。全硬件协议栈技术采用硬件逻辑门电路实现复杂的TCP/IP协议簇,其应用具有简单快速、可靠性高、安全性好等显著优势;内部集成MAC和PHY工艺,使得单片机接入以太网方案的硬件设计更为简捷和高效。
W5500 芯片是一款集成全硬件 TCP/IP 协议栈的嵌入式以太网控制器,同时也是一颗工业级以太网控制芯片。是韩国WIZnet(微知纳特)发布全硬件TCP/IP协议栈以太网接口芯片。
W5500 支持高速标准4线SPI接口与主机进行通信,该 SPI 速率理论上可以达到 80MHz。其内部还集成了以太网数据链路层(MAC)和10BaseT/100BaseTX 以太网物理层(PHY),支持自动协商(10/100-Based全双工/半双工)、掉电模式和网络唤醒功能。与传统软件协议栈不同,W5500内嵌的8个独立硬件 Socket 可以进行8路独立通信,该8路Socket的通信效率互不影响,可以通过 W5500 片上32K 字节的收/发缓存灵活定义各个Socket的大小。
(注:参考资料 WIZnet W5500-参考设计大全)
特点
-
- 全硬件TCP/IP协议栈:TCP,UDP,ICMP,IPv4,ARP,IGMP,PPPoE
- 8个独立的硬件Socket,各路通信互不影响
- 32K字节收发缓存
- 集成802.3以太网MAC
- 集成10Base-T / 100Base-T以太网PHY
- 主机接口:SPI高速串行外设接口(最高80Mhz )
- 支持嵌入式操作系统:Linux & RTOS
- 支持掉电模式 & UDP网络唤醒
- 工作电压3.3V,I/O 5V耐压
- 支持自动协商(全/半双工,10M/100M)
- 工作温度40℃左右
- 48Pin LQFP无铅封装(7x7mm, 0.5mm针间距)
2、RT-Thread Studio 配置及相关代码
2.1 添加WIZnet软件包
在RT-Thread 软件包中搜索W5500软件包后添加到项目中
添加后的结果如下图所示
2.2 配置 WIZnet 软件包
spi20 设备引脚说明如下所示
PB12 | SPI2_CS |
PB13 | SPI2_SCK |
PB14 | SPI2_MISO |
PB15 | SPI2_MOSI |
Reset复位引脚是26(对应PB10),IRQ中断引脚 27 (对应PB11),引脚号参考见下图
硬件连接图如下所示:
2.3 配置 spi20
在drv_spi.c源文件中添加 HAL_SPI_MspInit 函数(SPI2引脚配置)
void HAL_SPI_MspInit(SPI_HandleTypeDef *spiHandle)
{
GPIO_InitTypeDef GPIO_InitStruct;
RT_ASSERT(spiHandle != RT_NULL);
#ifdef BSP_USING_SPI1
if (spiHandle->Instance == SPI1)
{
/* SPI1 clock enable */
__HAL_RCC_SPI1_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
/**SPI1 GPIO Configuration
PA5 ------> SPI1_SCK
PA6 ------> SPI1_MISO
PA7 ------> SPI1_MOSI
*/
GPIO_InitStruct.Pin = GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF5_SPI1;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
else
#endif
#ifdef BSP_USING_SPI2
if (spiHandle->Instance == SPI2)
{
/* SPI2 clock enable */
__HAL_RCC_SPI2_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
/**SPI2 GPIO Configuration
PB13 ------> SPI2_SCK
PB14 ------> SPI2_MISO
PB15 ------> SPI2_MOSI
*/
GPIO_InitStruct.Pin = GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF5_SPI2;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}
else
#endif
#ifdef BSP_USING_SPI3
if (spiHandle->Instance == SPI3)
{
/* SPI3 clock enable */
__HAL_RCC_SPI3_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
/**SPI3 GPIO Configuration
PB3 (JTDO-TRACESWO) ------> SPI3_SCK
PB4 (NJTRST) ------> SPI3_MISO
PB5 ------> SPI3_MOSI
*/
GPIO_InitStruct.Pin = GPIO_PIN_3 /* | GPIO_PIN_4 */ | GPIO_PIN_5;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF6_SPI3;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}
else
#endif
{
RT_ASSERT(0);
}
}
自动初始化 rt_hw_spi_flash_init 函数,将spi20 挂载到spi2总线上
static int rt_hw_spi_flash_init(void)
{
__HAL_RCC_GPIOB_CLK_ENABLE();
rt_hw_spi_device_attach("spi2", "spi20", GPIOB, GPIO_PIN_12);
return RT_EOK;
}
/* 导 出 到 自 动 初 始 化 */
INIT_COMPONENT_EXPORT(rt_hw_spi_flash_init);
3、验证效果
串口调试助手显示效果如下
ifconfig : 查看当前网络的 ip address 、 gw address (网关地址)、net mask (子网掩码)、 dns server (dns服务器)
ping 172.30.1.103 成功ping通,表示局域网内可以相互访问了
(注:因为路由器没有连到公网,所以没有ping www.baidu.com)
4、与ali-iotkit-v3.0.1 阿里云IOT软件包 MQTT主题订阅发布
4.1 添加 ali-iotkit-v3.0.1 软件包
4.2 配置Ali-iotkit 连接阿里云IOT平台的三元组参数,开启Samples示例代码,其他参数默认即可
4.3 MQTT示例代码 mqtt-example.c
在串口调试助手输入 ali_mqtt_sample(加回车换行即ENTER键)就可以连接阿里云IOT云平台进行MQTT通信。
4.4 物模型示例代码 linkkit_example_solo.c
在串口调试助手输入 ali_linkkit_solo_sample(加回车换行即ENTER键)就可以连接阿里云IOT云平台进行物模型通信。