STM32F1(HAL 库)通过串口驱动CH392T 以太网通信 UDP客户端


前言

调试


一、UDP、套接字(Socket)和CH392T

在这里插入图片描述

1.以太网和Socket通信基础了解

以太网通信

  • 以太网是一种局域网(LAN)技术,基于IEEE 802.3标准,用于在物理层和数据链路层传输数据帧。
  • 核心功能:
    • 物理介质传输(如双绞线、光纤);
    • MAC地址寻址;
    • 冲突检测与避免(CSMA/CD)。
  • 协议层次:OSI模型的物理层和数据链路层。

Socket通信:

  • Socket是网络通信的编程接口,基于IP地址和端口号标识通信端点,支持TCP/UDP协议。

  • 核心功能:

    • 建立/管理网络连接。
    • 数据的分片、传输与重组。
    • 提供面向连接(TCP)或无连接(UDP)的通信模式。
  • 协议层次:OSI模型的传输层与应用层之间的接口。

特性以太网通信Socket通信
协议层次物理层 + 数据链路层传输层 + 应用层接口
寻址方式MAC地址
(如00:1A:2B:3C:4D)
IP地址 + 端口号
(如192.168.0.1:8080)
传输可靠性无可靠性保证(依赖上层协议)TCP可靠(确认重传),UDP不可靠
数据单元数据帧(Frame)数据包(Packet)或数据报(Datagram)
数据单元数据帧(Frame)数据包(Packet)或数据报(Datagram)

2.两者交互方式

Socket依赖以太网:Socket通信通过TCP/IP协议栈运行,底层依赖以太网传输数据帧

数据封装流程:应用数据 → TCP/UDP报文 → IP包 → 以太网帧 → 物理信号

以太网通信:

  • 物理连接:通过交换机、路由器等设备建立物理链路。
  • 数据帧传输:
    • 发送方:将数据封装为以太网帧(含源/目的MAC地址)。
    • 接收方:通过MAC地址匹配接收帧,进行校验和解析。
  • 冲突处理:使用CSMA/CD机制检测冲突并重传。
  • 广播/单播:支持广播(如ARP请求)和单播通信。

Socket通信:

  • 连接建立(以TCP为例):

    • 服务器:创建Socket → 绑定IP/端口 → 监听(listen())。
    • 客户端:创建Socket → 发起连接(connect())。
    • 三次握手:SYN → SYN-ACK → ACK。
  • 数据传输:

    • 发送:调用send()将数据通过TCP/UDP封装为报文。
    • 接收:调用recv()解析报文并提取应用层数据。
  • 连接终止(TCP):

    • 四次挥手:FIN → ACK → FIN → ACK。
  • 交互模式:

    • TCP:流式传输,保证顺序和可靠性。
    • UDP:报文传输,低延迟但可能丢包。

3.TCP和UDP的认识

1.基本概念

TCP(Transmission Control Protocol,传输控制协议)

  • 定义:一种面向连接的、可靠的传输层协议,确保数据按序、完整地传输。

  • 核心特点:
    通过三次握手建立连接,四次挥手断开连接。
    支持数据确认、重传、流量控制和拥塞控制。

UDP(User Datagram Protocol,用户数据报协议)

  • 定义:一种无连接的、不可靠的传输层协议,提供尽力而为的数据传输。
  • 核心特点:
    无需建立连接,直接发送数据报。
    不保证数据顺序、完整性或可达性。

2. 首部结构与开销

  • TCP首部(20字节 + 可选字段):
    包含序列号、确认号、窗口大小、校验和等字段。
    示例字段:源端口、目的端口、序列号、ACK号、标志位(SYN/ACK/FIN)。

  • UDP首部(8字节):
    仅包含源端口、目的端口、长度和校验和。
    示例字段:源端口、目的端口、长度、校验和。

4.CH392

在这里插入图片描述
CH392 支持两种通讯接口:SPI 接口或者异步串口,这里选取异步串口通讯接口控制 CH392 芯片进行以太网通讯

二、驱动代码

1.main函数

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
	/*测试 发送buf*/
	uint8_t temp_buf[256];
	uint16_t j;
		for(j = 0; j<256;j++)
		{
			temp_buf[j] = j;
		}
	
	uint8_t i;

	BSP_Init();	//外设初始化
		
    CH392SetUartBaudRate(921600);	  	//设置CH392SetUart波特率921600
	xWriteCH392Cmd(CMD00_RESET_ALL);	//执行硬件复位,等待50ms
	delay_ms(200);
	i = CH392CMDGetVer();							//获取芯片和固件版本号
	InitCH392InfParam(); 							//初始化CH392Inf参数 
	i = CH392Init();     							//初始化CH392
	mStopIfError(i);									//检查是否成功

  while (1)
  {
		if (CH392CMDGetPHYStatus() == PHY_DISCONN) /* 获取 PHY 的连接状态 */
		{
				delay_ms(200); /* If no, wait for 200MS and query again */
		}
		else
		{
//				printf("CH392 Connect Ethernet\r\n"); /*When the CH392 is connected to the Ethernet, an interruption occurs */
				break;
		}
  }
  InitSocketParam(); 	/* 初始化套接字相关变量 */
	
  CH392SocketInitOpen();/*配置CH392的socket参数,初始化并打开CH392的socket*/
	
  while (1)
	{
		if (Query392Interrupt() == GPIO_PIN_RESET)		//INT
		{
			CH392GlobalInterrupt();
		}			
		/*发送数据*/
		CH392CMDSendData(0, temp_buf, 256);

	}
}

2.发送命令函数

为了区分命令码和数据,CH392 要求单片机先通过串口发送两个同步码字节(57H 和 ABH),然后再发送命令码,接着是发送数据或者接收数据

/********************************************************************************
 * Function Name  : xWriteCH392Cmd
 * Description    : 发送命令
 * Input          : cmd
 * Output         : None
 * Return         : None
 *******************************************************************************/
void xWriteCH392Cmd(uint8_t cmd)
{
    CMD_START_HANDEL;                
    USART3_SendByte(SER_SYNC_CODE1); 
    USART3_SendByte(SER_SYNC_CODE2);	
    USART3_SendByte(cmd);
}

/* Command header */
#define SER_SYNC_CODE1 		0x57 /* Serial port command synchronization code 1 */
#define SER_SYNC_CODE2 		0xAB /* Serial port command synchronization code 2 */

三、参数配置和数据抓取

1.设置波特率

该命令用于设置 CH392 的串口通讯波特率。在 CH392 工作于串口通讯方式时,复位后默认的通讯波特率默认是 9600bps。如果单片机支持较高的通讯速度,可以通过该命令动态调整串口通讯波特率。该命令需要输入三个数据,分别是波特率系数 0、波特率系数 1、波特率系数 2,下表是与波特率的对应关系, 计算公式:
BaudRate = (波特率系数 2 <<16) + (波特率系数 1 << 8) + 波特率系数 0。
在这里插入图片描述

/*******************************************************************************
 * Function Name  : CH392SetUartBaudRate
 * Description    : Set 392 Uart BaudRate
 * Input          : BaudRate
 * Output         : None
 * Return         : s
 *******************************************************************************/
uint8_t CH392SetUartBaudRate(uint32_t baudrate)
{
    uint8_t s = CH392_ERR_UNKNOW;
#if (CH392_OP_INTERFACE_MODE == CH392_UART_MODE)
    CH392CMDSetUartBaudRate(baudrate); /* Set BaudRate */
		MX_UART3_Init(baudrate);					//设置MCU波特率

    s = xReadCH392Data(); /* If the setting is successful  CH392 return CMD_ERR_SUCCES */
//    if (s == CMD_ERR_SUCCESS)
//        printf("Set Success\r\n");
	
#endif
    return s;
}

返回的 1 个字节数据是, 输出操作状态
在这里插入图片描述

2.执行硬件复位

在这里插入图片描述
采用硬件电路复位,需要写0x05,该命令使 CH392 执行硬件复位。通常情况下,硬件复位在 50mS 时间之内完成。

3.读取版本号

/********************************************************************************
 * Function Name  : CH392CMDGetVer
 * Description    : Obtain the chip and firmware version number	
 * Input          : None
 * Output         : None
 * Return         : Version number
 *******************************************************************************/
uint8_t CH392CMDGetVer(void)
{
    uint8_t i;
    xWriteCH392Cmd(CMD01_GET_IC_VER);		//获取芯片和固件版本号
    i = xReadCH392Data();         			//返回0x18
    xEndCH392Cmd();
    return i;
}

返回的 1 个字节数据是版本号,得到的版本号为0x18。
在这里插入图片描述

4.写入、读取(0x43)IP、网关等信息

代码如下(示例):

/* CH392 Related definition */
const uint8_t CH392IPAddr[4] = {192, 168, 0, 101}; /* CH392 IP  */
const uint8_t CH392GWIPAddr[4] = {192, 168, 0, 1}; /* CH392 gateway */
const uint8_t CH392IPMask[4] = {255, 255, 255, 0}; /* CH392 mask */

/* Socket Related definition*/
const uint8_t Socket0DesIP[4] = {192, 168, 0, 122}; /* Socket 0 des IP */
const uint16_t Socket0SourPort = 1000;              /* Socket 0 sour port 本地端口*/
const uint16_t Socket0DesPort = 1000;               /* Socket 0 des port 目的端口*/

配置CH392的IP、网关 子网掩码
在这里插入图片描述

xWriteCH392Cmd(CMD014_GET_IP_INF); 读取

在这里插入图片描述
GET_IP_INF(0x43)该命令 用于获取 IP、GatewayIP、MASK、DNS 等信息
收到此命令后,CH392 会依次输出 20 个字节的数据,分别为:4 字节 IP 地址、4 字节网关 IP、4 字节子网掩码、4 字节 DNS1(主 DNS)、4 字节 DNS2(次 DNS)。
与写入的数据一直

5.获取 PHY 的连接状态

在这里插入图片描述
连接状态代码为 01H 时表示 PHY 连接断开;
连接状态代码为 02H 时表示 PHY 连接为 10M 全双工;
连接状态代码为 04H 时表示 PHY 连接为 10M 半双工;

6.轮询中断状态

在这里插入图片描述
返回数据为0x00, 说明没有产生任务中断

7.插拔网线查询

拔插网线,查0x19命令会返回0x04
在这里插入图片描述

8. 写数据

在这里插入图片描述

9. CMD查看端口

#查看端口是否被占用
netstat -aon|findstr “1000”

在这里插入图片描述

10.以太网的状态

在这里插入图片描述
电脑适配器所显示的ip是电脑网卡自身的ip,点击属性
在这里插入图片描述
查看自己主机的IP,修改IP
在这里插入图片描述

11.CH392与电脑进行连接

这里测试192, 168, 0, 101存在,IP后面改为了192, 168, 0, 254
当ping程序中所写的IP,即const uint8_t CH392IPAddr[4] = {192, 168, 0, 254}; /* CH392 IP */
验证,插上ping通,拔下ping不通

在这里插入图片描述


总结

关于使用网络助手使用见下一篇笔记

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值