TECHNICAL GUIDE
WK2124串口扩展芯片解析_SSOP20封装四通道UART扩展与SPI主接口详解 | 上海耀罡电子
一颗芯片把一路 SPI 变四路独立 UART,参数看懂了才知道能用在哪儿。本文按原厂数据手册逐项拆解 WK2124,并补上 datasheet 不会告诉你的实战经验。
先说清楚它解决什么问题
串口荒是嵌入式项目的真实瓶颈
在嵌入式系统里,主控 MCU 的 UART 通道数往往是最先见底的资源。一颗引脚数受成本的 MCU 通常只集成 2 到 3 个 UART,而实际项目里要接的东西却经常远不止这些:
主控自带的 UART
├─ 调试打印口(必须留,出问题要能看日志)
├─ GPS / 北斗定位模块
├─ RFID 读卡器(门禁、溯源)
├─ RS485 从站(Modbus 传感器)
├─ 电子秤模块(串口通讯格式)
└─ 热敏打印机 / 钱箱 / 扫码枪
三个常见解法各有代价:
| 方案 | 代价 |
|---|---|
| 换更高引脚数 / 更多 UART 的 MCU | BOM 成本上升,且要重新画板、改驱动 |
| 用 FPGA 逻辑扩展 | 成本与开发周期最高,小批量不划算 |
| 用串口扩展芯片 | 增加一颗芯片与少量布���,主控几乎不用改 |
第三种是本文要展开的路线。
WK2124 的定位
WK2124 是成都为开微电子(Weikai)的 SPI 接口四通道通用异步收发器,订货型号 WK2124-ISSG。
它做的是一次"协议翻译 + 通道扩展":主控通过 SPI 与它通信,它把这一条 SPI 总线上的数据,分派到 4 路互相独立的全双工 UART 子通道上,每路都能单独配波特率、数据位、校验和停止位。
注意这里有个关键区别:WK2124 的主接口是 SPI,不是 UART。这意味着它不能像传统 16C550 那样直接挂在主控的 UART 上,而是需要主控具备 SPI 总线。这一点在选型时经常被忽略——很多工程师看名字里有"串口"就以为能直接接 UART,结果买到手发现接不上。
核心架构:一个主控口如何变四路
内部五大模块
WK2124 的内部结构可以拆成五块:
| 模块 | 职责 |
|---|---|
| SPI 主接口 | 与主控 MCU 通信,传输寄存器配置与数据 |
| 寄存器组 | 全局控制寄存器 + 每通道独立的配置与状态寄存器 |
| 四通道 UART 引擎 | 每通道独立的波特率发生器与帧格式控制器 |
| 双 FIFO 缓存 | 每通道各配 256 字节 Rx 与 256 字节 Tx FIFO |
| 中断控制器 | 接收 FIFO 超时、Line-Break 等异常事件统一上报 |
数据是怎么流动的
一次典型的收数据流程是这样的:
外部设备 ──UART──> 子通道 Rx FIFO(256 字节)
│
达到触发点 / 接收超时
↓
INT 引脚拉低
│
主控响应中断,读 IIR 判断来源通道
│
主控通过 SPI 读 RHR 寄存器取走数据
关键在于 FIFO 的存在:如果每来一个字节就要中断一次,1KB 数据会产生上百次中断,主控 CPU 会被拖垮。有了 256 字节 FIFO 并可编程设置触发点,主控可以攒够一批再取,这就是串口扩展芯片真正的价值所在——不只是"多几个口",而是"多几个口还不占 CPU"。
子通道的独立性到什么程度
WK2124 的四路子通道是真正独立的,不是「一个波特率分四路用」那种伪独立:
通道 0:9600bps,8N1 ──┐
通道 1:115200bps,8E1 ─┤
通道 2:19200bps,7N1 ─┼─ 互不影响,同时工作
通道 3:57600bps,8N1 ─┘
每个子通道可以独立设置:波特率、数据长度、停止位、奇偶校验模式,可以单独软件开关,可以对单个子通道做软件复位。
另外每路都支持 IrDA 红外通信模式(符合 SIR 标准,115.2K bit/s),这个功能常被忽略,但在做红外遥控、读卡器模块时非常实用。
256 级 FIFO:为什么这是关键差异
数字对比
| 对比项 | 传统 16C550 系列 | WK2124 |
|---|---|---|
| Rx FIFO | 16 字节 | 256 字节 |
| Tx FIFO | 16 字节 | 256 字节 |
| FIFO 深度倍数 | 基准 | 16 倍 |
| 1KB 数据的中断次数 | 约 60+ 次 | 约 4~8 次 |
| 中断负载 | 基准 | 降低约 90% |
触发点可编程是第二个关键
光有深 FIFO 还不够——触发点设在哪里,直接决定了实时性表现。
WK2124 的 FIFO 中断触发点可以按用户需求编程设置,这带来两种典型策略的选择:
| 策略 | 触发点 | 优点 | 代价 |
|---|---|---|---|
| 低延迟优先 | 设小(收到即中断) | 响应快,适合交互式指令 | 中断次数多,占 CPU |
| 高吞吐优先 | 设大(攒满再中断) | CPU 占用低,适合大数据流 | 有延迟,且末尾数据要等超时或发送端停发 |
末尾数据延迟这个坑必须知道
这是实测中最容易踩的一个坑:把触发点设到最大(比如 200 字节),然后主控等中断读数据。
结果是:最后那几十字节迟迟不来。
因为接收方不知道发送方已经发完了,FIFO 一直不满,触发条件不成立。
解决方案有两个,建议同时使用:
第一,用接收超时中断。WK2124 支持子串口接收 FIFO 超时中断——当一段时间内没有新数据到达,芯片主动上报,这解决了「不知道何时收完」的问题。
第二,在协议层面自带结束标志。我们的称重模块程序就是按这个思路设计的:数据帧以固定协议尾(0x0D 0x0A)结束,主控据此判断一帧是否完整,不依赖 FIFO 触发点。
这是我们在实际项目里验证过的做法:协议层的结束标志 + 芯片层的超时中断,两道保险。
主接口与电气特性逐项拆解
SPI 主接口
WK2124 的主接口规格:
| 项目 | 规格 |
|---|---|
| 接口类型 | SPI(仅从模式) |
| 最高速率 | 10M bit/s |
| SPI 模式 | Mode 0(CPOL=0, CPHA=0) |
| 连续收发 | 支持最长 256 字节连续收发 |
| 片选 | CS 由主控 GPIO 控制 |
| I²C | 不支持 |
为什么 SPI 速率给到 10M bit/s
主接口速率决定了数据搬运的效率上限。四路串口同时跑高波特率时,如果 SPI 太慢,主控就成了瓶颈。
举个具体场景:四路都是 921600bps,每路每秒 92KB,四路合计 368KB/s。10M bit/s 的 SPI 意味着每秒可搬运 1.25MB,留出了三倍以上的余量——这个余量是给协议开销、中断响应和其他任务留的。
这也解释了为什么 WK2124 不支持 I²C:100kHz 的 I²C 在四路高速串口面前根本不够用。选型时如果你的主控只有 I²C 没有 SPI,那 WK2124 就不是合适的选项,应该考虑 WK2132 或其他支持 I²C 的型号。
电气特性
| 项目 | 规格 |
|---|---|
| 工艺 | 工业级高速 CMOS |
| 工作电压 | 2.5V ~ 5.0V 宽压 |
| 子串口速率 @5V | 2Mbps |
| 子串口速率 @3.3V | 1.5Mbps |
| 子串口速率 @2.5V | 1Mbps |
| 工作温度 | -45℃ ~ +85℃ |
| 封装 | SSOP20 绿色环保无铅封装 |
| 低功耗 | 可配置自动休眠 / 自动唤醒(μs 级唤醒) |
| IrDA 红外 | 符合 SIR 标准,115.2K bit/s |
2.5V~5.0V 宽压的实际价值
这个宽压范围在工业产品里非常实用,因为它意味着同一颗料能覆盖不同供电的子板:
2.5V 侧——配合 1Mbps 速率,适合电池供电或低压数字电路密集的模块;3.3V 侧——1.5Mbps,覆盖绝大多数现代 MCU 系统;5V 侧——2Mbps,适合对接 5V 供电的老式 RS232 收发芯片、或工业现场的 24V 系统经稳压后的 5V 供电部分。
另外要注意主控与扩展芯片的电压匹配:如果主控是 3.3V 而外接的 RS232 芯片需要 5V 侧供电,电平转换仍然是必须的——WK2124 的宽压指的是它自己能工作在 5V,不代表它的 IO 能直接承受 5V 输入而不损坏。这一点在设计时务必查数据手册的 IO 电平参数。
中断系统与驱动实现要点
中断源与可编程性
WK2124 的中断设计围绕 FIFO 与异常两类事件展开:
| 中断类型 | 触发条件 | 典型用途 |
|---|---|---|
| 接收 FIFO 超时 | 一段时间内无新数据 | 判断一帧已收完(最实用) |
| Rx FIFO 达触发点 | FIFO 数据量达到设定值 | 批量搬运,摊薄中断开销 |
| Tx FIFO 可写 | 发送缓存有空位 | 连续发送不中断主控 |
| Line-Break 错误 | 检测到线路断开信号 | 感知对端掉线 |
| 溢出错误 | FIFO 写满仍有数据到达 | 发现主控处理不过来 |
| 奇偶校验错 / 数据帧错误 | 接收校验失败 | 发现链路质量问题 |
中断屏蔽与来源识别
每类中断都可以单独屏蔽,同时提供中断源识别寄存器,主控进入中断服务程序后先读这个寄存器判断是哪一路、哪一类事件。
这个设计在多通道共享一条中断线时特别重要:四个子通道的硬件事件全部汇总到一个 INT 引脚,如果不做来源识别,主控就得挨个轮询所有寄存器去猜,既慢又容易误判。
驱动实现框架
下面是一个基于 SPI 的精简驱动框架,展示寄存器访问与初始化的基本结构。具体的寄存器地址与位定义请以原厂数据手册为准,不同版本的手册命名可能略有差异:
c
#include "spi.h"
#include "gpio.h"
#define WK2124_SPI_PORT hspi1
#define WK2124_CS_PORT GPIOA
#define WK2124_CS_PIN GPIO_PIN_4
#define WK_CS_LOW() HAL_GPIO_WritePin(WK2124_CS_PORT, WK2124_CS_PIN, GPIO_PIN_RESET)
#define WK_CS_HIGH() HAL_GPIO_WritePin(WK2124_CS_PORT, WK2124_CS_PIN, GPIO_PIN_SET)
/* 写寄存器:先发地址字节,再发数据字节 */
static void wk_write_reg(uint8_t addr, uint8_t val)
{
WK_CS_LOW();
HAL_SPI_Transmit(&WK2124_SPI_PORT, &addr, 1, HAL_MAX_DELAY);
HAL_SPI_Transmit(&WK2124_SPI_PORT, &val, 1, HAL_MAX_DELAY);
WK_CS_HIGH();
}
/* 读寄存器 */
static uint8_t wk_read_reg(uint8_t addr)
{
uint8_t tx = addr | 0x80; /* 读标志位,具体以手册为准 */
uint8_t rx = 0;
WK_CS_LOW();
HAL_SPI_Transmit(&WK2124_SPI_PORT, &tx, 1, HAL_MAX_DELAY);
HAL_SPI_Receive(&WK2124_SPI_PORT, &rx, 1, HAL_MAX_DELAY);
WK_CS_HIGH();
return rx;
}
/* 读取指定通道的接收数据,返回实际读取字节数 */
static uint16_t wk_read_rx(uint8_t ch, uint8_t *buf, uint16_t max)
{
uint8_t lvl = wk_read_reg(WK_RXLVL_REG(ch)); /* 当前 FIFO 数据量 */
uint16_t n = (lvl > max) ? max : lvl;
for (uint16_t i = 0; i < n; i++) {
buf[i] = wk_read_reg(WK_RHR_REG(ch)); /* 接收保持寄存器 */
}
return n;
}
/* 初始化:使能 FIFO、设置通道 0 为 8N1、开启接收中断 */
static void wk2124_init(void)
{
wk_write_reg(WK_FCR_REG, 0x07); /* 全局 FIFO 控制:使能并清空 */
wk_write_reg(WK_LCR_REG(0), 0x03); /* 通道 0:8 位数据、1 位停止、无校验 */
wk_write_reg(WK_IER_REG(0), 0x01); /* 开启接收就绪中断 */
}
四个实现层面的建议
一、寄存器访问务必做 SPI 事务边界管理。CS 拉低到拉高之间是一个完整的寄存器访问,中间的地址与数据字节不能被其他线程插入。在 RTOS 环境里建议用互斥锁保护,或者在驱动层做 SPI 总线互斥。
二、一次读多个字节优于反复单字节读。WK2124 支持最长 256 字节连续收发,把 FIFO 里的数据一次性读出来,比循环调用单字节读快得多。
三、ISR 里只做最少的事。在中断服务程序里读中断源寄存器、判断通道、把数据放进软件缓冲,然后立刻返回。实际的协议解析放到任务上下文里做——这既是实时性的要求,也避免了在 ISR 里做耗时操作导致的响应延迟。
四、波特率按实际电压设定。同一颗芯片在 5V 下能跑 2Mbps,但在 2.5V 下只能跑 1Mbps。配置时不要照搬 5V 下的参数到低压供电的产品里,否则会出现偶发的数据错误——这种问题现场极难定位,因为高压时完全正常。
实战设计:六个必须注意的细节
六个要点
| # | 要点 | 说明 |
|---|---|---|
| 1 | 电源去耦 | VCC 引脚就近放 0.1μF 陶瓷电容,并联 10μF 钽电容抑制高频噪声 |
| 2 | SPI 布线 | SCLK / MOSI / MISO 尽量等长、远离干扰源,CS 单独走线 |
| 3 | 中断触发策略 | 下降沿触发,ISR 内先读中断源寄存器确认通道 |
| 4 | FIFO 触发点 | 按场景权衡实时性与吞吐,不要一味设大 |
| 5 | 浪涌防护 | 接 RS485 总线等易受浪涌的接口时,TXD/RXD 加 TVS 二极管 |
| 6 | 周期性状态检查 | 轮询各通道状态寄存器,发现溢出或帧错误后复位该通道 |
第 6 点为什么不能省
FIFO 溢出是一个沉默的故障:数据丢了,但协议层面可能完全看不出来——因为丢的是中间的一段,如果协议有校验和,可能报"数据错";如果没有校验和,可能直接被当成有效数据用了。
在称重、计费这类场景下这是致命的。我们建议在主循环里周期性读取各通道的状态寄存器,一旦发现溢出或帧错误标志置位,立刻软复位该子通道并向应用层上报异常。
这属于「平时不花成本、出问题能救场」的设计,投入很小,收益很实在。
时钟与波特率精度
串口能不能跑准,取决于波特率发生器的分频是否整除。
原厂资料明确建议配合 14.7456MHz 晶振使用,因为它能整除绝大多数标准波特率而不产生累积误差。
典型的换算是:14.7456MHz 经 16 倍分频得 921.6kHz,再经 8 分频得 115.2kbps。所有分频都是整数,最终波特率精确无误。
对比一下用 12MHz 晶振的情况:12MHz 要得到 115200 需要经过 10.4166… 的分频,只能取整,误差约 0.16%。多数场景这个误差还能接受,但在长距离传输或对误码率敏感时就会出问题。
工程建议:如果产品要跑标准波特率,优先选 14.7456MHz;如果只需要 9600 / 19200 / 38400 这几个常见值,12MHz 或 11.0592MHz 都可以,但要核算实际分频误差。
WK2124 与 WK 系列其他型号怎么选
WK 系列型号定位对照
| 型号 | 主接口 | 通道 | 封装 | 485 自动收发 | 定位 |
|---|---|---|---|---|---|
| WK2124-ISSG | SPI | 4 | SSOP20 | 无 | 商用多串口设备 |
| WK2168-IQPG | UART / SPI / I²C / 并口 | 4 | LQFP48 | 支持 | 工业多 485 组网 |
| WK2132-ISSG | 多总线 | 2 | SSOP16 | 无 | 空间受限的嵌入式终端 |
| WK2114-ISPG | UART | 4 | SOP20 | 无 | 红外模式 / 宽压设计 |
| WK2212-IQNG | 多总线 | 2 | QFN32 | 支持 | 带 2 路 485 与 GPIO |
| WK2204-IQNG | 多总线 | 4 | QFN24(4×4mm) | 支持 | 业内最小封装,高密度板级设计 |
三个关键分水岭
分水岭一:主接口是 SPI 还是 UART。WK2124 与 WK2168 都能扩四路,但主接口完全不同:WK2124 走 SPI,WK2168 走 UART/SPI/I²C/并口。如果主控没有 SPI 或者已经有 SPI 被别的器件占着,WK2124 就不适用,得选 WK2168。
分水岭二:要不要 485 自动收发。WK2168 主接口内置 485 自动收发控制,不需要外挂收发芯片,也不占用主控 GPIO 来手动控制 DE/RE 方向。在多台设备挂同一条 485 总线的场景下,这个特性直接决定了布线与软件复杂度。WK2124 不带 485,主接口是 SPI 本身,要走 485 得另加收发器。
分水岭三:封装尺寸。SSOP20 与 LQFP48 差得很远。POS 机、税控设备这类紧凑机箱选 SSOP20 更从容;工业网关这类要放 485 收发器、走线复杂的场合,LQFP48 引脚更多更好布。
按应用场景直接对照
| 你的场景 | 推荐型号 | 理由 |
|---|---|---|
| POS 机 / 税控设备,接打印机、扫码枪、钱箱 | WK2124-ISSG | SSOP20 省空间,SPI 速率足够,无需 485 |
| 电子秤整机,接称重模块与打印机 | WK2124-ISSG | 子通道波特率独立,符合秤机多设备场景 |
| 工业网关,多路 485 组网 | WK2168-IQPG | 485 自动收发 + 硬件流控,省 GPIO |
| 空间极度受限的小型终端 | WK2132 / WK2204 | SSOP16 或 4×4mm QFN |
研发打样的现实建议
我们作为原厂授权代理,WK2124 与 WK2124-ISSG 这类模块板在淘宝店铺有现货零售,一支起订,适合研发打样阶段先买回来验证。
打样阶段建议关注三件事:一是主控有没有空闲的 SPI 总线;二是实际外接设备的电平是 3.3V 还是 5V(决定要不要加电平转换);三是四路设备的波特率是否真的各不相同(如果都相同,用 WK2124 就够;如果需要 485 组网,直接上 WK2168 一步到位)。
量产阶段再转代理渠道拿批量价,型号不用改,因为零售与代理渠道是同源的原厂正品。
常见问题
WK2124 的主接口是 SPI 还是 UART?
**是 SPI,不是 UART。**WK2124 是 SPI 接口的四通道通用异步收发器,主控通过 SPI 与它通信,它把数据分派到 4 路独立的 UART 子通道上。这一点最容易误解——很多工程师看名字里有"串口"就以为能直接接主控 UART,实际上主控必须有空闲的 SPI 总线。
WK2124 支持 I²C 吗?
**不支持。**WK2124 主接口只支持 SPI 从模式,最高 10M bit/s,支持 Mode 0 与最长 256 字节连续收发。原厂不提供 I²C 版本,这是因为 100kHz 的 I²C 带宽不足以支撑四路高速串口。如果主控只有 I²C,需要考虑 WK 系列的其他型号。
WK2124 的 FIFO 有多大?中断会不会很频繁?
**每通道配 256 字节的 Rx 与 Tx FIFO,收发各一份,总计 512 字节。**对比传统 16C550 系列的 16 字节,深度是 16 倍。接收 1KB 数据时,传统方案约需 60+ 次中断,WK2124 通常只需 4~8 次。而且 FIFO 中断触发点可以按用户需求编程设置,可以按实时性与吞吐的权衡来调。
工作电压范围是多少?5V 系统能直接用吗?
**2.5V ~ 5.0V 宽压**,对应速率分别是 2.5V 下 1Mbps、3.3V 下 1.5Mbps、5V 下 2Mbps。工作温度 -45℃ ~ +85℃,工业级。但要注意:**芯片自身能工作在 5V,不代表它的 IO 引脚能直接承受 5V 输入而不损坏**,如果主控是 3.3V 而外接 5V 器件,电平转换芯片仍然是必须的,具体请查数据手册的 IO 电平参数。
WK2124 支持硬件流控吗?
**不支持 RTS/CTS 硬件流控。**WK2124 的子通道没有独立的 RTS/CTS 引脚。数据流控依靠 FIFO 与中断机制实现——这在多数场景下是够用的,因为 256 字节的 FIFO 深度本身就吸收了流量波动。如果确实需要硬件流控,WK2168-IQPG 支持硬件流控与 485 自动收发,是更合适的选择。
WK2124 和 WK2168 都是四路扩展,怎么选?
看三个分水岭:**主接口**(WK2124 仅 SPI,WK2168 支持 UART/SPI/I²C/并口)、**485 自动收发**(仅 WK2168 有)、**封装**(SSOP20 vs LQFP48)。接打印机扫码枪这类板内短距设备选 WK2124;要多路 485 组网或现场线缆长选 WK2168。更详细的逐项对照可参考《WK2124与WK2168串口扩展芯片怎么选》一文。
FIFO 触发点设多大合适?
按场景权衡。**交互式指令场景设小**(收到即中断),响应快;**大数据流场景设大**(攒满再中断),CPU 占用低。但要注意末尾数据延迟问题:触发点设太大时,最后那几十字节会因为 FIFO 始终不满而迟迟不来。**解决办法是同时使用接收超时中断,并在协议层面自带结束标志**——这两道保险我们已经在称重模块程序里实践过。