利用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,实现通讯。分串口定时发送,返回的数据可以定长中断接收,通讯速度有保障。调试通过。串口服务器三维图:

相关推荐
christine-rr4 小时前
linux常用命令(4)——压缩命令
linux·服务器·redis
東雪蓮☆4 小时前
深入理解 LVS-DR 模式与 Keepalived 高可用集群
linux·运维·服务器·lvs
qq_264220894 小时前
LVS负载均衡群集和LVS+Keepalived群集
运维·负载均衡·lvs
乌萨奇也要立志学C++5 小时前
【Linux】进程概念(二):进程查看与 fork 初探
linux·运维·服务器
雨落Liy5 小时前
Nginx 从入门到进阶:反向代理、负载均衡与高性能实战指南
运维·nginx·负载均衡
Yyyy4825 小时前
Nginx负载均衡集群实验步骤
运维·nginx·负载均衡
晶振厂家-晶发电子5 小时前
晶振在5G时代的角色:高精度时钟的核心支撑
单片机·嵌入式硬件·5g·晶振·电子元器件·晶振知识
F137298015575 小时前
WD5030A 芯片,12V降5V,输出电流12A,电路设计
stm32·单片机·嵌入式硬件·汽车·51单片机
小莞尔6 小时前
【51单片机】【protues仿真】基于51单片机的篮球计时计分器系统
c语言·stm32·单片机·嵌入式硬件·51单片机
三佛科技-187366133976 小时前
分享机械键盘MCU解决方案
单片机·嵌入式硬件·计算机外设