1. 项目概述
在嵌入式系统开发领域,PS(Processing System)和PL(Programmable Logic)的协同设计已经成为提升系统性能与灵活性的关键技术路径。DR1系列评估板作为一款高性能异构多核开发平台,其PS+PL架构为开发者提供了丰富的硬件加速和接口扩展能力。本案例手册重点讲解如何通过AXI4-Lite总线实现PS端对PL端AXI UARTLite IP核的控制,完成RS232、RS485和RS422三种工业常用串口协议的通信测试。
作为一名长期从事工业控制开发的工程师,我发现很多刚接触异构系统的开发者往往面临两个主要痛点:一是对AXI总线协议的理解不够深入,导致PS与PL交互设计效率低下;二是对工业串口通信的硬件实现细节把握不准,造成实际部署时的兼容性问题。本案例通过完整的工程实现和测试流程,将帮助开发者快速掌握以下核心技能:
- 在Vivado环境中配置AXI UARTLite IP核并与PS端建立总线连接
- 理解并实现AXI4-Lite协议在串口通信中的应用
- 工业串口通信的硬件连接规范与软件配置要点
- 动态设备树加载与PL镜像更新的实际操作流程
2. 硬件架构与设计原理
2.1 系统整体架构
本案例采用典型的PS+PL协同架构,其核心设计思想是将串口控制器这类对时序要求严格的模块实现在PL端,而由PS端的ARM处理器通过标准总线进行控制。这种架构既发挥了ARM处理器在协议处理上的优势,又利用了FPGA在接口扩展和实时性保障方面的特长。
系统硬件连接拓扑如下图所示(示意图):
code复制[PS端]
ARM Cortex-A系列处理器
├── AXI4-Lite主接口
│ └── AXI Interconnect
│ ├── AXI UARTLite 0 (RS232)
│ ├── AXI UARTLite 1 (RS422)
│ ├── AXI UARTLite 2 (RS485-A)
│ └── AXI UARTLite 3 (RS485-B)
└── GPIO扩展
├── RS422方向控制
└── RS485使能控制
[PL端]
AXI UARTLite IP核集群
├── 波特率发生器
├── 发送FIFO
├── 接收FIFO
└── 状态寄存器组
2.2 关键IP核配置详解
2.2.1 AXI UARTLite IP核
作为本案例的核心功能单元,AXI UARTLite IP核的配置需要特别关注以下参数:
-
波特率设置:
- 案例中统一采用115200bps标准速率
- 实际波特率误差计算公式:Error = |(实际波特率 - 目标波特率)/目标波特率| × 100%
- 在50MHz时钟下,分频系数为:50000000/(16×115200) ≈ 27.13 → 取整27
- 实际波特率:50000000/(16×27) = 115740.7bps
- 误差:(115740.7-115200)/115200×100% ≈ 0.47% (<3%符合标准)
-
FIFO深度配置:
- 发送FIFO:16字节(适合工业控制中的短指令传输)
- 接收FIFO:16字节(平衡资源占用与实时性需求)
-
中断模式选择:
- 启用接收超时中断(Timeout = 8个字符时间)
- 启用接收FIFO满中断
- 启用发送FIFO空中断
注意:工业现场环境中,建议根据实际通信负载调整FIFO深度。对于高频次小数据量传输,过大的FIFO反而会增加传输延迟。
2.2.2 AXI协议转换器
由于PS端采用标准的AXI4总线,而UARTLite IP核使用AXI4-Lite协议,需要协议转换器进行桥接。关键配置参数:
- 数据宽度:32位(匹配Cortex-A处理器位宽)
- 时钟域:PS端时钟(100MHz)到PL端时钟(50MHz)的跨时钟域处理
- 地址映射:每个UARTLite分配4KB地址空间
2.2.3 GPIO扩展配置
RS485/RS422需要方向控制信号,通过PS端GPIO扩展实现:
c复制// GPIO映射关系
#define RS422_DE_GPIO 420 // 发送使能
#define RS422_RE_n_GPIO 421 // 接收使能(低有效)
#define RS485_DE_GPIO 422 // 端口1使能
#define RS485_RE_n_GPIO 423 // 端口2使能
3. 工程实现与测试流程
3.1 开发环境搭建
3.1.1 工具链准备
- Vivado版本:2019.2(需与评估板支持包版本匹配)
- 交叉编译器:arm-linux-gnueabihf-gcc 8.3.0
- 调试工具:
- USB转串口调试器(CP2102/FT232芯片)
- 逻辑分析仪(可选,用于信号完整性检查)
3.1.2 工程目录结构
code复制axi_uart_rw/
├── constraints/
│ └── system.xdc # 管脚约束文件
├── src/
│ ├── bd/ # Block Design源文件
│ └── hdl/ # 用户自定义逻辑
├── sdk/ # PS端应用代码
│ ├── fsbl/ # First Stage Bootloader
│ └── uart_test/ # 测试应用程序
└── scripts/ # Tcl自动化脚本
3.2 设备树关键配置
动态设备树覆盖(Overlay)技术是本案例的亮点,允许在不重新编译内核的情况下更新PL配置:
dts复制// pl.dtbo片段
fragment@0 {
target-path = "/amba";
__overlay__ {
axi_uartlite_0: serial@43c00000 {
compatible = "xlnx,xps-uartlite-1.00.a";
reg = <0x43c00000 0x10000>;
interrupt-parent = <&intc>;
interrupts = <0 29 4>;
current-speed = <115200>;
device_type = "serial";
port-number = <0>;
};
// 其他UART节点类似...
};
};
加载命令序列:
bash复制# 挂载configfs
mount -t configfs none /sys/kernel/config
# 创建overlay目录
mkdir /sys/kernel/config/device-tree/overlays/uart
# 应用设备树变更
cat pl.dtbo > /sys/kernel/config/device-tree/overlays/uart/dtbo
3.3 串口测试实操指南
3.3.1 RS232全双工测试
硬件连接规范:
- 评估板TX(Pin3) ↔ 转换器RX
- 评估板RX(Pin2) ↔ 转换器TX
- GND直连(关键!)
软件配置要点:
bash复制# 设置串口参数(8N1模式)
stty -F /dev/ttySL0 115200 cs8 -cstopb -parenb -crtscts clocal raw -echo
# 测试数据回环
cat /dev/ttySL0 & # 后台接收
echo "Test123" > /dev/ttySL0
常见问题排查:
- 无数据接收 → 检查TX/RX线序是否交叉连接
- 乱码 → 确认两端波特率、数据位、停止位设置一致
- 数据截断 → 检查流控设置(本案例禁用硬件流控)
3.3.2 RS485半双工测试
硬件特性:
- 差分信号(A+/B-)抗干扰能力强
- 最大传输距离:1200米(@100kbps)
- 终端电阻匹配:120Ω(长距离时必须启用)
方向控制时序:
bash复制# 发送使能
echo 1 > /sys/class/gpio/gpio422/value
# 数据发送
echo "RS485_Test" > /dev/ttySL2
# 切换为接收模式
echo 0 > /sys/class/gpio/gpio422/value
重要提示:RS485总线必须采用菊花链拓扑,严禁星型连接。多个设备时,只需在总线两端安装终端电阻。
3.3.3 RS422全双工测试
与RS485的主要区别:
- 四线制(TX+/TX-/RX+/RX-)
- 支持全双工通信
- 点对点连接,不支持多节点
使能控制:
bash复制# 固定使能接收(RE_n=0)
echo 0 > /sys/class/gpio/gpio421/value
# 发送使能(DE=1)
echo 1 > /sys/class/gpio/gpio420/value
4. 工程优化与进阶技巧
4.1 性能优化方案
-
DMA传输模式:
对于高速率(>1Mbps)或大数据量传输,建议采用AXI DMA IP核替代UARTLite:c复制// DMA描述符配置示例 struct dma_descriptor { u32 next_desc; // 下一个描述符地址 u32 control; // 控制字 u32 src_addr; // 源地址(UART FIFO) u32 dest_addr; // 目的地址(内存) u32 length; // 传输长度 }; -
中断合并技术:
当使用多个UART通道时,可通过AXI Interrupt Controller合并中断源:verilog复制// 在Block Design中添加中断控制器 axi_intc_0: axi_intc { interrupt-parent = <&axi_intc_0>; interrupts = <0 1 2 3>; // 对应4个UART };
4.2 工业现场可靠性设计
-
信号隔离保护:
- 在RS485/422接口添加磁耦隔离(如ADM2483)
- TVS二极管防护(SM712系列)
- 自恢复保险丝(600mA)
-
软件看门狗:
c复制void uart_watchdog(void) { static int timeout = 0; while(1) { if(uart_rx_timeout()) { timeout++; if(timeout > 3) uart_reset(); } else { timeout = 0; } sleep(1); } } -
电缆选择指南:
传输距离 推荐电缆类型 最大速率 <15m CAT5e双绞线 10Mbps 15-100m 屏蔽双绞线 1Mbps >100m 专用RS485电缆 115kbps
4.3 调试技巧实录
-
逻辑分析仪抓包:
- 配置触发条件:起始位下降沿
- 采样率 ≥ 16×波特率(对于115200bps,至少1.84MHz)
- 解码设置:8位数据,无校验,1停止位
-
Linux调试工具:
bash复制# 查看中断统计 cat /proc/interrupts | grep uart # 监测串口状态 stty -F /dev/ttySL0 -a # 十六进制数据发送 echo -ne "\x48\x65\x6C\x6C\x6F" > /dev/ttySL0 -
常见故障代码表:
现象 可能原因 解决方案 发送数据无响应 DE/RE使能信号异常 检查GPIO输出电平 接收数据CRC错误 终端电阻缺失 在总线末端添加120Ω电阻 通信距离不达标 电缆质量差或波特率过高 降低波特率或更换电缆 随机数据错误 地环路干扰 单点接地,加隔离器件
在实际工业项目中,我们曾遇到RS485总线在雷雨季节频繁故障的情况。后来通过以下措施彻底解决:
- 将非屏蔽电缆更换为双层屏蔽电缆
- 在接口处增加气体放电管
- 软件上增加重传机制和CRC32校验
这些经验教训让我深刻认识到工业环境与实验室测试的巨大差异。