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

相关推荐
KYGALYX17 小时前
在Linux中备份msyql数据库和表的详细操作
linux·运维·数据库
余—笙17 小时前
Linux(docker)安装搭建CuteHttpFileServer/chfs文件共享服务器
linux·服务器·docker
lang2015092817 小时前
Linux高效备份:tar与gzip完全指南
linux·运维·服务器
wanhengidc18 小时前
云手机的基本原理
运维·服务器·游戏·智能手机·云计算
篙芷18 小时前
两台服务器 NFS 共享目录实战
运维·服务器
Hard but lovely19 小时前
linux: centos 软件包管理 yum源
linux·运维·centos
悲伤小伞19 小时前
Linux_Socket_UDP
linux·服务器·网络·c++·网络协议·udp
电院工程师19 小时前
SIMON64/128算法Verilog流水线实现(附Python实现)
python·嵌入式硬件·算法·密码学
2301_8160738319 小时前
Chrony服务器
运维·服务器
Shang1809893572619 小时前
T41LQ 一款高性能、低功耗的系统级芯片(SoC) 适用于各种AIoT应用智能安防、智能家居方案优选T41L
人工智能·驱动开发·嵌入式硬件·fpga开发·信息与通信·信号处理·t41lq