STM32 的 TCP/IP 通信协议

✅作者简介:热爱科研的嵌入式开发者,修心和技术同步精进

❤欢迎关注我的知乎:对error视而不见

代码获取、问题探讨及文章转载可私信。

☁ 愿你的生命中有够多的云翳,来造就一个美丽的黄昏。

🍎获取更多嵌入式资料可点击链接进群领取,谢谢支持!👇

点击领取更多详细资料

一、引言

在现代嵌入式系统中,网络通信变得越来越重要。STM32 作为一款广泛应用的微控制器,具备强大的处理能力和丰富的外设资源,能够实现 TCP/IP 通信协议,从而使设备可以连接到网络,与其他设备进行数据交互。本文将详细介绍 STM32 实现 TCP/IP 通信协议的相关知识,包括 TCP/IP 协议概述、STM32 网络硬件连接、软件实现以及代码示例。

二、TCP/IP 协议概述

2.1 协议层次结构

TCP/IP 协议是一个协议族,采用分层结构,主要分为四层:

  • 网络接口层:负责将数据帧发送到物理网络,并从物理网络接收数据帧。它与硬件设备密切相关,如以太网控制器、Wi-Fi 模块等。
  • 网络层:主要功能是进行数据包的路由和转发,其中最重要的协议是 IP(Internet Protocol)协议,它为每个网络设备分配唯一的 IP 地址。
  • 传输层:提供端到端的通信服务,主要有 TCP(Transmission Control Protocol)和 UDP(User Datagram Protocol)两种协议。TCP 是面向连接的、可靠的传输协议,UDP 是无连接的、不可靠的传输协议。
  • 应用层:为用户提供各种应用程序接口,如 HTTP、FTP、SMTP 等。

2.2 TCP 与 UDP 的区别

  • 连接性:TCP 是面向连接的,在通信之前需要建立连接,通信结束后需要断开连接;UDP 是无连接的,不需要建立和断开连接。
  • 可靠性:TCP 提供可靠的数据传输,通过确认机制、重传机制等保证数据的完整性;UDP 不保证数据的可靠传输,可能会出现数据丢失的情况。
  • 传输效率:由于 TCP 需要建立连接和进行可靠性处理,其传输效率相对较低;UDP 无需这些处理,传输效率较高。

三、STM32 网络硬件连接

要实现 STM32 的 TCP/IP 通信,通常需要外接网络接口芯片,如 ENC28J60、W5500 等。这里以 W5500 为例,介绍硬件连接方法。

3.1 W5500 简介

W5500 是一款全硬件 TCP/IP 嵌入式以太网控制器,内部集成了 TCP/IP 协议栈,支持多种网络协议,如 TCP、UDP、ICMP 等。

3.2 硬件连接

STM32 引脚W5500 引脚说明
SPI_MOSIMOSI主输出从输入引脚,用于数据传输
SPI_MISOMISO主输入从输出引脚,用于数据接收
SPI_SCLKSCK时钟引脚,提供时钟信号
任意 GPIOCS片选引脚,低电平有效
任意 GPIORST复位引脚,低电平复位
任意 GPIOINT中断引脚,用于通知 STM32 有事件发生

四、软件实现

4.1 初始化 SPI 和 W5500

首先需要对 STM32 的 SPI 接口进行初始化,然后对 W5500 进行初始化配置,包括设置 IP 地址、子网掩码、网关等。

#include "stm32f4xx_hal.h"
#include "w5500.h"

SPI_HandleTypeDef hspi1;

void MX_SPI1_Init(void)
{
  hspi1.Instance = SPI1;
  hspi1.Init.Mode = SPI_MODE_MASTER;
  hspi1.Init.Direction = SPI_DIRECTION_2LINES;
  hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
  hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
  hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
  hspi1.Init.NSS = SPI_NSS_SOFT;
  hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_32;
  hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
  hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
  hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
  hspi1.Init.CRCPolynomial = 7;
  if (HAL_SPI_Init(&hspi1) != HAL_OK)
  {
    Error_Handler();
  }
}

void W5500_Init(void)
{
  // 复位 W5500
  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);
  HAL_Delay(100);
  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET);
  HAL_Delay(100);

  // 设置 W5500 的 IP 地址、子网掩码、网关等
  uint8_t ip[4] = {192, 168, 1, 100};
  uint8_t subnet[4] = {255, 255, 255, 0};
  uint8_t gateway[4] = {192, 168, 1, 1};
  setSHAR(myMac);
  setSIPR(ip);
  setSUBR(subnet);
  setGAR(gateway);
}

4.2 TCP 服务器实现

以下是一个简单的 TCP 服务器示例代码,用于监听指定端口并接收客户端发送的数据:

#define PORT 8080

void TCP_Server(void)
{
  uint8_t socket_num = 0;
  uint8_t buf[1024];
  uint16_t len;

  // 打开套接字
  socket(socket_num, Sn_MR_TCP, PORT, 0);

  // 监听端口
  listen(socket_num);

  while (1)
  {
    if (getSn_SR(socket_num) == SOCK_ESTABLISHED)
    {
      // 接收数据
      len = recv(socket_num, buf, sizeof(buf));
      if (len > 0)
      {
        // 处理接收到的数据
        // 这里可以添加具体的处理逻辑
        // 例如将数据原样返回给客户端
        send(socket_num, buf, len);
      }
    }
    else if (getSn_SR(socket_num) == SOCK_CLOSED)
    {
      // 重新监听端口
      listen(socket_num);
    }
  }
}

4.3 UDP 客户端实现

以下是一个简单的 UDP 客户端示例代码,用于向指定的服务器发送数据:

#define SERVER_IP {192, 168, 1, 200}
#define SERVER_PORT 8080
#define CLIENT_PORT 8081

void UDP_Client(void)
{
  uint8_t socket_num = 1;
  uint8_t buf[] = "Hello, UDP Server!";
  uint8_t server_ip[4] = SERVER_IP;

  // 打开套接字
  socket(socket_num, Sn_MR_UDP, CLIENT_PORT, 0);

  // 发送数据
  sendto(socket_num, buf, sizeof(buf), server_ip, SERVER_PORT);

  // 关闭套接字
  close(socket_num);
}

4.4 主函数

在主函数中,进行系统初始化,然后调用相应的 TCP 服务器或 UDP 客户端函数。

int main(void)
{
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_SPI1_Init();

  W5500_Init();

  // 选择使用 TCP 服务器还是 UDP 客户端
  // TCP_Server();
  UDP_Client();

  while (1)
  {
    // 主循环
  }
}

五、注意事项

  1. 网络配置:确保 STM32 和其他网络设备的 IP 地址、子网掩码、网关等配置正确,否则可能无法正常通信。
  2. 数据处理:在处理接收到的数据时,需要考虑数据的长度、格式等因素,避免出现数据溢出或解析错误的情况。
  3. 错误处理:在网络通信过程中,可能会出现各种错误,如连接失败、数据丢失等,需要进行相应的错误处理,以提高系统的稳定性。

六、总结

通过 STM32 和外接网络接口芯片,可以实现 TCP/IP 通信协议,使设备能够连接到网络进行数据交互。本文介绍了 TCP/IP 协议的基本概念、STM32 网络硬件连接方法以及软件实现代码示例。在实际应用中,可以根据具体需求对代码进行进一步的优化和扩展,以满足不同的应用场景。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值