STM32驱动W5500连接腾讯云

STM32驱动W5500连接腾讯云

1.W5500简介

   W5500 是一款全硬件 TCP/IP 嵌入式以太网控制器,为嵌入式系统提供了更加简易的互联网连接方案。 W5500 集成了 TCP/IP 协议栈, 10/100M 以太网数据链路层(MAC)及物理层(PHY) ,使得用户使用单芯片就能够在他们的应用中拓展网络连接。
   久经市场考验的 WIZnet 全硬件 TCP/IP 协议栈支TCP,UDP,IPv4,ICMP,ARP,IGMP 以及 PPPoE 协议。 W5500 内嵌 32K 字节片上缓存以供以太网包处理。如果你使用 W5500,你只需要一些简单的 Socket 编程就能实现以太网应用。这将会比其他嵌入式以太网方案更加快捷、简便。用户可以同时使用 8 个硬件 Socket 独立通讯。
   W5500 提供了 SPI(外设串行接口)从而能够更加容易与外设 MCU 整合。而且,W5500 的使用了新的高效 SPI 协议支持 80MHz 速率,从而能够更好的实现高速网络通讯。为了减少系统能耗, W5500 提供了网络唤醒模式(WOL)及掉电模式供客户选择使用。

2.W5500底层驱动编写与移植

W5500底层底层驱动移植参考示例:https://blog.csdn.net/weixin_44453694/article/details/123066305
STM32连接腾讯云参考示例:https://blog.csdn.net/weixin_44453694/article/details/116802776

#include "stm32f10x.h"
#include "usart.h"
#include "timer.h"
#include "aliyun_mqtt.h"

/*w5500相关头文件*/
#include "w5500api.h"
#include "dhcp.h"
#include "dns.h"
#define SERVER_IP "LA57WTHWL6.iotcloud.tencentdevices.com"//服务器IP
#define SERVER_PORT 1883 //端口号
//客户端ID:{产品ID}{设备名}
#define ClientID "LA57WTHWL6Smart_home"
//用户名和密码可使用密码生成工具完成
#define Username "LA57WTHWL2Smart_home;120310126;HK8V9;1635948714"
#define Password "2a915cae4489b591ce556e71f4e9f1ka21c354a37d12fee7c46f56abee1f048a;hmacsha256"//密文 

//订阅题:$thing/down/property/{ProductID}/{DeviceName} ---{ProductID}产品ID,{DeviceName}设备名
#define SET_TOPIC  "$thing/down/property/Lb57WTHWL3/Smart_home"//订阅
//发布主题:$thing/up/property/{ProductID}/{DeviceName}
#define POST_TOPIC "$thing/up/property/Lb57WTHWL3/Smart_home"//发布

char mqtt_message[200];//上报数据缓存区
u8 rx_buff[200];
void init_Net(void)
{
	u8 try_times=0;
	init_W5500();/*W5500初始化*/
	init_dhcp_client();//动态分配IP
	while(check_DHCP_state(SOCK_DHCP)!=DHCP_RET_UPDATE)
  {
			try_times++;
			if(try_times==255)//超时 重启芯片
      {							
				Reset_W5500();
				init_dhcp_client();
				try_times=0;
			}
			delay_ms(10);
		}
    while(!set_Network());
  /*判断数据是否写入成功*/
  u8 ipaddr[4];//ip地址
  u8 subnet[4];//子网掩码
  u8 gateway[4];//网关
	getSIPR (ipaddr);			
	printf(" W5500 IP地址   : %d.%d.%d.%d\r\n", ipaddr[0],ipaddr[1],ipaddr[2],ipaddr[3]);
	getSUBR(subnet);
	printf(" W5500 子网掩码 : %d.%d.%d.%d\r\n", subnet[0],subnet[1],subnet[2],subnet[3]);
	getGAR(gateway);
	printf(" W5500 网关     : %d.%d.%d.%d\r\n", gateway[0],gateway[1],gateway[2],gateway[3]);  
}
/*连接服务器*/
uint8 TCP_Connect(SOCKET Socket,uint8 *sip,uint16 sport,uint16 lport)
{
  static uint8 CONNECT_FLAG = 0;
  switch(getSn_SR(Socket))
  {
    case SOCK_INIT:
			 CONNECT_FLAG=connect(Socket,sip,sport);/*连接服务器*/
       break;
    case SOCK_CLOSE_WAIT:
      disconnect(Socket);
      close(Socket);
      break;
    case SOCK_CLOSED:
			 CONNECT_FLAG=0;
			 socket(Socket,Sn_MR_TCP,lport,Sn_MR_ND);
			 break;
  }
  return CONNECT_FLAG;
}
int main()
{
  u16 i=0;
  u8 stat=0;
  u16 time=0,cnt=0;
  float temp=10;
  u16 rlen;
  USART1_Init(115200);
  printf("W5500 SPI模拟时序寄存器版,连接腾讯云VER1.0 \r\n");
  init_Net();/*W5500硬件初始化,动态分配IP*/
  printf("W5500 硬件初始化成功\r\n");
  while(!do_dns((u8 *)SERVER_IP)){}/*域名解析*/
  while(1)
  {
    stat=TCP_Connect(MQTT_SOCK,NET_CONFIG.rip,1883,5500);/*连接服务器*/
    printf("stat=%d\r\n",stat);
    if(stat)break;
    delay_ms(1000);
  } 
  printf("腾讯物联网平台连接中....\n");
  while(1)
  {
    if(getSn_SR(MQTT_SOCK)==SOCK_ESTABLISHED)
    {
       if(getSn_IR(MQTT_SOCK)&Sn_IR_CON)
       {
         setSn_IR(MQTT_SOCK,Sn_IR_CON);
       }
       MQTT_Init();
       if(MQTT_Connect(ClientID,Username,Password)==0)
       {
          printf("腾讯云平台连接成功\r\n");
         break;
       }
    }
  }
  stat=MQTT_SubscribeTopic(SET_TOPIC,0,1);
  if(stat)printf("订阅失败\r\n"); 
  while(1)
  {
    /*接收数据*/
    rlen=getSn_RX_RSR(MQTT_SOCK);
    if(rlen>0)
    {
      rlen=recv(MQTT_SOCK,rx_buff,rlen);
      printf("len=%d\r\n",rlen);
      for(i=0;i<rlen;i++)
      {
        printf("%c",rx_buff[i]);
      }
    }
    delay_ms(1);
    time++;
    cnt++;
    if(time>=5000)
    {
      time=0;
      MQTT_SentHeart();//发送心跳包
    }
    if(cnt>=2000)
    {
      temp+=1.5;
      if(temp>=85)temp=-15;
      cnt=0;
      sprintf(mqtt_message,"{\"method\":\"report\",\"clientToken\":\"123\",\"params\":{\"LED1\":1,\"temp\":%.2f,\"L\":356}}",temp);//温度
      MQTT_PublishData(POST_TOPIC,mqtt_message,0);
    }    
  }
}

3.运行效果

在这里插入图片描述

在这里插入图片描述在这里插入图片描述
在这里插入图片描述
参考示例:https://download.csdn.net/download/weixin_44453694/81893703

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 要通过STM32控制W5500断开连接,可以按照以下步骤进行操作: 1. 确保STM32W5500之间的连接正确并且通信正常。这包括将STM32的SPI接口连接W5500的相应引脚,并正确配置SPI控制器的参数。 2. 在STM32上初始化W5500控制寄存器。这可以通过设置W5500的寄存器来实现,具体方式可以参考W5500的数据手册。需要设置的寄存器包括控制模式寄存器(Mode register)和配置寄存器(Configuration register)等。 3. 断开网络连接。可以通过写入W5500的控制寄存器来断开网络连接。具体操作是将控制模式寄存器中的适当位(如断开连接位)置为1,这将导致W5500断开与网络的连接。 4. 监测连接状态。在断开连接之后,可以通过检查W5500的状态寄存器来确认连接是否已断开。通过读取相应的状态位(如连接状态位),可以确认W5500已断开与网络的连接。 5. 执行后续操作。一旦确认W5500已断开连接,你可以根据需要进行后续操作。这可能包括重新建立网络连接或采取其他必要的措施。 需要注意的是,以上操作只是简要的概述,并且具体的步骤和代码会根据具体的STM32型号和使用的软件库而有所不同。因此,在实际使用中,建议参考相应的硬件和软件文档,并遵循相关的指导和示例。 ### 回答2: 要控制STM32断开与W5500连接,可以采取以下步骤: 1. 首先,需要将W5500的CS引脚拉高,使其脱离SPI总线的控制。可以通过将对应的GPIO引脚设置为高电平来实现。 2. 然后,向W5500的S0_CR寄存器写入相应的指令,断开与对应Socket的连接。例如,设置S0_CR寄存器的DISCON位为1,表示断开连接。 3. 接下来,需要等待一段时间,确保W5500已经完全断开连接。可以使用STM32的延时函数或者定时器来实现。 4. 最后,可以对W5500进行清理操作,如关闭Socket、释放资源等。可以通过设置S0_CR寄存器的CLOSE位为1来关闭Socket。 总结起来,控制STM32断开与W5500连接的步骤是:拉高W5500的CS引脚,向S0_CR寄存器写入断开连接的指令,延时等待,关闭Socket并进行其他清理操作。 ### 回答3: 要控制STM32断开与W5500连接,可以通过以下步骤实现: 1. 配置W5500的控制寄存器:首先,要对W5500进行初始化设置。可以通过读写W5500的控制寄存器来配置其工作模式和连接设置。具体的设置包括选择断开连接模式、设置断开连接超时时间等。 2. 断开连接命令:通过写入相应的数据到W5500的控制寄存器,发送断开连接命令。这样,W5500就会根据设置的断开连接模式,主动关闭与远程设备的连接。 3. 监测连接状态:在发送断开连接命令后,可以通过读取W5500连接状态寄存器,来监测连接是否已经成功断开。连接状态寄存器会标志连接已断开的状态。 4. 处理连接断开事件:一旦连接状态寄存器标志连接已断开,可以在STM32的程序中针对连接断开事件进行处理。可以执行相应的逻辑,比如重新建立连接或进行其他操作。 需要注意的是,具体实现的代码可能会因为不同的STM32型号和开发环境而有所差异。以上只是一个大致的流程,具体的实现细节还需要根据具体的使用场景和开发环境来确定。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT_阿水

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值