CH9121串口转以太网模块STM32驱动

本文介绍了如何在STM32平台上驱动CH9121串口转以太网模块,该模块集成了TCP/IP协议栈,支持TCP CLIENT、TCP SERVER和UDP模式,具有串口波特率自适应和网络参数配置功能,适用于多种应用场景。
摘要由CSDN通过智能技术生成

CH9121串口转以太网模块STM32驱动

0. 简介

CH9121 集成TCP/IP 协议栈,可实现网络数据包和串口数据的双向透明传输,具有TCPCLIENT、TCP SERVER、UDP 3 种工作模式,串口波特率最高可支持到921600bps,可通过上位机软件轻松配置,方便快捷。
下图为CH9121 应用框图:
应用框图

1. 特性:

内部自带以太网介质传输层(MAC)和物理层(PHY)。
实现串口数据和网络数据的双向透明传输。
支持10/100M,全双工/半双工自适应以太网接口,兼容IEEE 802.3 协议。
支持MDI/MDIX 线路自动转换。
工作模式支持TCP CLIENT、TCP SERVER 和UDP 模式。
串口波特率支持300bps ~ 921600bps。
串口TTL 电平,兼容3.3V 和5V。
串口支持全双工和半双工串口通讯,支持RS485 收发自动切换。
工作模式、端口、IP 等网络参数,串口波特率等参数可通过上位机配置。
支持虚拟串口。

2. 应用场合

应用场合

3. 示例平台

STM32F407

4. 代码

bsp_ch9121.h

// 定义了与网络CH9121通信的基本数据结构,和配置结构,参数等
#ifndef __BSP_CH9121_H__
#define __BSP_CH9121_H__

#include <bsp.h>

// 本程序中默认模块做为客户端
#define M_UARTX				UART4

#define WRITE_CMD           {
     Usartx_SendByte(M_UARTX, 0x57);Usartx_SendByte(M_UARTX, 0xab);}


// 定义接收和发送缓冲区,用动态申请大小,打包长度小于1024byte
extern uint8_t net_tx_buf[1024];
extern uint8_t net_rx_buf[1024];
extern uint8_t overflow_flag;
// 网络连接状态类型
typedef enum _ConnectStatus
{
   
	disconnect = 0,
	connect_ok
} ConnectStatus;

// 校验方式数据类型
typedef enum _Serial_Check
{
   
	Even_Check = 0,
	Odd_Check,
	Mark,
	Space,
	None
} Serial_Check;

// 工作模式类型
typedef enum _Net_Mode
{
   
	TCP_Server_mode = 0,
	TCP_Client_mode,
	UDP_Server_mode,
	UDP_Client_mode
} Net_Mode;

// 服务器/客户端通信相关的类型
typedef struct _Net_CommunitionType
{
   
	uint16_t port_num;			// 端口号
	uint8_t ip_address[4];			// IP地址
	uint8_t subnet_mask[4];			// 子网掩码
	uint8_t gateway[4];			// 默认网关
        uint16_t tcp_retry_count;		// TCP重试次数
	uint8_t mac_address[4];			// MAC地址
	ConnectStatus status;			// 连接状态
    Net_Mode net_mode;
} Net_CommunitionType;
extern Net_CommunitionType net_communition_Client;
extern Net_CommunitionType net_communition_DstServer;
extern Net_CommunitionType net_communition_Server1;

// 串口相关数据类型
typedef struct _Serial
{
   
	uint32_t bound;		    // 波特率
	Serial_Check serial_check;  // 校验类型
	uint8_t data_bit;	    // 数据位数
	uint8_t stop_bit;	    // 停止位
	uint32_t timeout;	    // 超时时间
} Serial;
extern Serial serial;


// 写命令码,格式(0x57 0xab + 命令码 + 数据)
#define RESET_CHIP			0x02		// 复位命令,芯片重新运行 
#define UPDATE_CONFIG			0x0d		// 更新配置参数至 EEPROM 
#define CMD_EXECUTION			0x0e		// 命令执行
#define SET_CHIP_MODE			0x10		// 设置模式
#define SET_CHIP_IP			0x11		// 设置芯片 IP 地址
#define SET_CHIP_SUBNET_MASK	        0x12		// 设置芯片掩码 
#define SET_CHIP_GATEWAY		0x13		// 设置芯片网关 
#define SET_LOCAL_PORT			0x14		// 设置芯片本地端口 
#define SET_DESTINATION_IP		0x15		// 设置芯片目的 IP 地址
#define SET_DESTINATION_PORT	        0x16		// 设置芯片目的端口
#define SET_SERIAL_BOUND		0x21		// 设置串口波特率 
#define SET_SERIAL_DATA_FORMAT	        0x22		// 设置串口校验位数据位停止位
#define EXIT_SERIAL_CONFIG		0x5e		// 退出串口配置模式

// 读命令码,格式(0x57 0xab + 命令码)
#define READ_CHIP_MODE			0x60		// 读取芯片工作模式,返回 1 字节 
#define READ_CHIP_IP			0x61		// 读取芯片 IP 地址,返回 4 字节 
#define READ_CHIP_SUBNET_MASK	        0x62		// 读取芯片掩码,返回 4 字节 
#define READ_CHIP_GATEWAY		0X63		// 读取芯片网关,返回 4 字节 
#define READ_SOURCE_PORT	        0x64		// 读取芯片源端口号,返回 2 字节
#define READ_DESTINATION_IP 	        0x65		// 读取芯片目的 IP 地址,返回 4 字节
#define READ_DESTINATION_PORT	        0x66		// 读取芯片目的端口号,返回 2 字节 
#define READ_RETRY_TIMES		0x67		// 读取 TCP 重试次数,返回 1 字节 
#define READ_SERIAL_BOUND		0x71		// 读取串口波特率,返回 4 字节 
#define READ_SERIAL_DATA_FORMAT         0x72		// 读取串口校验位数据位停止位,返回 3 字节
#define READ_SERIAL_OVERTIME	        0x73		// 读取串口超时时间,返回 1 字节 
#define READ_MAC_ADDRESS		0x81		// 读取 MAC 地址,返回 6 字节 
#define READ_TCP_STATUS			0x03		// 读取 TCP 连接状态(TCP CLIENT 模式下),返回 1 字节,1:连接,0:断开。 


// 公有函数区域
void init_ch9121(void);
void send_netdata(uint8_t * t_buf);
uint8_t read_WorkMode(void);
uint16_t read_source_port(void);
void read_chip_ip(uint8_t 
  • 4
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
对于以太网来说,刚开始没有经验的网友可能有很多疑惑: 1. 需要什么样的网线:这个经过测试,什么网线都可以,可以是直连,也可以是交叉,现在的网卡比较智能,两种连接方式都可以正常通信。 2. 以太网初始化问题:以太网卡的初始化跟接不接网线没有关系,必须要保证ENC28J60能够正常的初始化完成,这一点是必须的,很多时候会卡在这里,大家好好检查一下SPI总线的设置,它采用的模式与普通的SD卡或FLASH的SPI模式是不同的,好像的模块0. 3. ping不通的问题:一点要保证开发板的网段和PC是在一个网段内,唯一不同的是IP地址的最后一字节不能想同。 4. 开发板可以与PC直接相连,也可以通过路由相连,这个都可以不影响的,当然最好与路由连接,这里就不影响PC上网查资料了。 STM32+ENC28J60+Uip成功代码概述: 想必很多网友都想做以太网收发数据,但网络上能够成功的代码确实比较少,这里是我花了不少数据移植并测试成功的《串口以太网代码,硬件比较简单这里只给以太网模块原理图大家参考,其他的看程序就可以了,ENC28J60与STM32连接就SPI总线,非常简单。 应用说明: 以太网模块耗电比大,有时候通过USB供电不一定能够满足要求,导致初始化ENC28J60总是失败,为保证模块能够正常工作,建议大家尽量采用外部电源供电。 同样的程序,在不同板子行ping的时间可能是不一样的,原因就是板子的设置问题,我试过几个板子了,好的那个总能在1ms全部ping通,而差的在2ms,3ms,5ms等时间跳动。。。。。 本程序架构是本人一贯提倡的《时间片轮询》,网友可以作为时间片轮询的参考。。。。。 需要注意的是本程序既可以实现服务器,也可以实现客户端,这个只需要通过PC网络调试助手选择就可以了,程序不需要更改。。 附件内容截图:
您可以按照以下步骤将STM32通过CH9121接入到阿里云: 1. 配置CH9121:首先,您需要配置CH9121模块以使其与STM32通信。您可以根据CH9121的文档设置串口通信参数,并确保CH9121STM32之间的串口连接正确。 2. 创建阿里云账号:如果您还没有阿里云账号,您需要先创建一个账号并登录到阿里云控制台。 3. 创建物联网平台实例:在阿里云控制台中,找到物联网平台,创建一个新的物联网平台实例。 4. 创建产品和设备:在物联网平台中,创建一个新的产品,并为该产品创建一个设备。确保为设备分配一个唯一的设备标识符。 5. 配置设备证书:生成设备证书和密钥,并将其下载到本地。 6. 编写STM32代码:使用STM32的开发环境,编写代码以通过CH9121与阿里云进行通信。您可以使用阿里云提供的MQTT协议库或者其他适合您的库来实现通信。 7. 配置连接参数:在STM32代码中,配置与阿里云的连接参数,包括物联网平台的域名、设备标识符、设备证书等信息。 8. 连接到阿里云:使用STM32代码将设备连接到阿里云。确保您的代码能够正确建立MQTT连接,并能够发布和订阅消息。 9. 测试连接:在阿里云控制台的物联网平台中,查看设备状态以确认STM32已成功连接到阿里云。您还可以通过发布和订阅消息来进行进一步的测试。 这些步骤只是一个基本的指导,具体的实现可能会因您使用的开发环境、硬件和网络环境而有所不同。您可以参考阿里云的官方文档和示例代码,以获得更详细的指导和帮助。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值