利用WK2168实现串口服务器

ESP32 SPI与WK2168实现串口服务器

概述

一些老设备通过RS485采集数据,如果在一个系统中采用几个RS485设备可能是一个不错的选择,但要是使用46个RS485数据采集设备为一个PLC提供外部数据,系统的性能就很难有保障了。通过一个串口服务器实现看来是一个好的选择。

系统组成

一个ESP32芯片作为主控制MCU,利用其两个串口,HSPI和VSPI,VSPI接以太网芯片,HSPI接WK2168串口模块。电路图:

代码

代码用Arduino编写:

cpp 复制代码
void setup() 
{
    commInit();       // com initialize
    gpioInit();       // GPIO initilization
    spiInit();        // inti hspi
    wk2168Init();     // initialize the wk2168 
}
  • 串口初始化
  • goio初始化
  • spi初始化
  • wk2168初识化

这里主要介绍wk2168初识化代码:

cpp 复制代码
void wk2168Init()
{
    wk2168_init();      // 硬件初始化
    // 这一部分是初始化外部中断
    //读取通用寄存器
    Serial.print("wk2168 general register value = 0x");
    Serial.println(wk2168_read_g_reg(WK2XXX_GENA_REG), HEX);
    /*初始化子串口*/
    wk2168_sub_uart_init(1);
    wk2168_sub_uart_init(2);
    wk2168_sub_uart_init(3);
    wk2168_sub_uart_init(4);
    /*设置子串口波特率*/
    wk2168_set_baudrate(1, B9600);
    wk2168_set_baudrate(2, B9600);
    wk2168_set_baudrate(3, B9600);
    wk2168_set_baudrate(4, B9600);
    /*使能RS485*/
    wk2168_set_rs485(1);
    wk2168_set_rs485(2);
    wk2168_set_rs485(3);
    wk2168_set_rs485(4);
}

介绍wk2168_sub_uart_init()初识化

cpp 复制代码
void wk2168_sub_uart_init(uint8_t port)
{
    uint8_t gena,grst,gier,sier,scr;
    gena = wk2168_read_g_reg(WK2XXX_GENA_REG);
    gena = gena | (1<<(port-1));
    wk2168_write_g_reg(WK2XXX_GENA_REG, gena);
    // 清零分串口
    grst = wk2168_read_g_reg(WK2XXX_GRST_REG);
    grst = grst | (1 << (port-1));
    wk2168_write_g_reg(WK2XXX_GRST_REG, grst);
    //使能串口总中断
    gier = wk2168_read_g_reg(WK2XXX_GIER_REG);
    gier = gier|(1<<(port-1));
    wk2168_write_g_reg(WK2XXX_GIER_REG, gier);
    //使能子串口接收触点中断和超时中断
    sier=wk2168_read_s_reg(port, WK2XXX_SIER_REG); 
    //sier |= WK2XXX_RFTRIG_IEN|WK2XXX_RXOUT_IEN;
    sier |= SIER_RFTRIG_IEN_BIT | SIER_RXOUT_IEN_BIT;
    wk2168_write_s_reg(port,WK2XXX_SIER_REG, sier);
    //初始化FIFO和设置固定中断触点
    wk2168_write_s_reg(port, WK2XXX_FCR_REG, 0XFF);
    //设置任意中断触点,如果下面的设置有效
    //那么上面FCR寄存器中断的固定中断触点将失效
    wk2168_write_s_reg(port, WK2XXX_SPAGE_REG, 1);
    //切换到page1, 页可以设置WK2XXX_SPAGE1
    wk2168_write_s_reg(port, WK2XXX_RFTL_REG, 40);//设置接收触点为40个字节
    wk2168_write_s_reg(port, WK2XXX_TFTL_REG, 0X10);//设置发送触点为16个字节
    wk2168_write_s_reg(port, WK2XXX_SPAGE_REG, 0);  //切换到page0
    //使能子串口的发送和接收使能
    scr=wk2168_read_s_reg(port, WK2XXX_SCR_REG);
    scr|=SCR_TXEN_BIT | SCR_RXEN_BIT;
    wk2168_write_s_reg(port, WK2XXX_SCR_REG, scr);
}

然后是设置串口波特率及设置RTS控制RS485芯片的DE/RE端。然后讲分串口1连接到ESP32的一个串口。COM2,实现通讯。分串口定时发送,返回的数据可以定长中断接收,通讯速度有保障。调试通过。串口服务器三维图:

相关推荐
Ruiery8 小时前
Linux 6.6内核 CPU 深度解析(七):调度器启动 — 从单核到多核,调度器分阶段点亮
linux·运维·服务器
50万马克的面包8 小时前
CSDN-栈队列数组-知识点整理
linux·运维·服务器
MicrosoftCloud9 小时前
用户权限 04|/etc/sudoers 安全配置:从最小授权到「别把 ALL 随便给人」
运维·安全·ubuntu·sudo·sudoers
꯭自꯭闭꯭10 小时前
达梦事物特性及MVCC
linux·运维·数据库
女神下凡10 小时前
芯参谋(38):NAND_MCP_电路设计指南
arm开发·单片机·嵌入式硬件·设计规范
91刘仁德11 小时前
HTTP协议详解:从URL到HTTP服务器的完整实战
服务器·网络·笔记·网络协议·http
嵌入式学习菌11 小时前
FreeRTOS 中断管理实战:BASEPRI 寄存器实验
单片机·嵌入式硬件
亚川楼宇自控系统数据中心厂家11 小时前
实验室智能化管理系统|人环物智一体化管控平台
运维
HRTOS12 小时前
HRTOS:一个名字背后的目标——不断逼近硬实时
经验分享·单片机·系统架构·51单片机
zmsup12 小时前
Agent 上下文调优:结合 OpsArk 运维智能体,设计模型每一步真正需要的信息
运维·agent·上下文压缩·运维智能体·上下文调优