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

相关推荐
xyx-3v19 分钟前
VS CodeC51 单片机开发环境搭建
单片机·嵌入式硬件
段帅龙呀26 分钟前
Redis构建缓存服务器
服务器·redis·缓存
乌鸦不像写字台1 小时前
【docker部署】在服务器上使用docker
服务器·docker·容器
iCxhust1 小时前
c# U盘映像生成工具
开发语言·单片机·c#
互联网搬砖老肖3 小时前
运维打铁: MongoDB 数据库集群搭建与管理
运维·数据库·mongodb
小宋同学在不断学习3 小时前
stm32--SPI原理应用W25Q64(二)
stm32·单片机·spi
Antonio9153 小时前
【音视频】HLS简介与服务器搭建
运维·服务器·音视频
lingzhilab3 小时前
零知开源——STM32F4结合BMP581气压传感器实现ST7789中文显示教程
stm32·单片机·嵌入式硬件
夜月yeyue3 小时前
设计模式分析
linux·c++·stm32·单片机·嵌入式硬件
kfepiza4 小时前
Debian的`/etc/network/interfaces`的`allow-hotplug`和`auto`对比讲解 笔记250704
linux·服务器·网络·笔记·debian