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