ZYNQ axi uart16550 IP核扩展485接口使用

本文详细介绍了如何在ZYNQ平台上使用AXI UART 16550 IP核扩展485接口,包括工程搭建、中断配置、GPIO控制以及SDK测试。在Linux环境下,通过设备树添加16550驱动,实现485串口通信的配置和功能验证。

我的另外一篇博客:ZYNQ axi_uartlitle IP核扩展232或者422

ZYNQ axi_uartlitle IP核扩展232或者422_wangjie36的博客-优快云博客

一,axi uart16550简介

用于通用接收/发送异步传输信息的串口安装在一个称作“UART”的芯片旁边。PC机早期使用UART的型号是8250和16450,这两种型号都不能满足需要。目前普通的PC机使用的是16550的UART,最新型的UART是16650和16750,通常这样的芯片不安装在系统板上。UART16550除了拥有AXI UART Lite的全部功能外,还提供1.5bit和2bit停止位,在可配置波特率的基础上还可以使用外部时钟供给串口接收模块,经测试发现,其波特率可以达到linux中tty设备定义的最大波特率,也就是4.5Mbps。功能丰富的UART IP在资源的利用上显然要比UART Lite要高,UART16550是UART Lite资源的3倍左右。

<think>我们正在讨论的是AXI UART 16550 IP的配置方法。根据之前的引用和用户的问题,用户希望了解如何配置这个IP。用户之前的问题是关于Bram控制器的ID宽度修改,但当前问题已经转向了AXI UART 16550。因此,我们需要专注于UART IP的配置。 根据引用[2]和引用[3]提供的信息,配置AXI UART 16550 IP主要包括以下步骤: 1. 设置线控制寄存器(Line Control Register)的DLAB位为1,以便访问分频锁存器(Divisor Latch)。 2. 设置分频锁存器(确定波特率)。 3. 配置线控制寄存器(数据位、停止位、校验位等)。 此外,引用[3]提到了在ZYNQ使用Tcl命令配置IP的两个参数:C_S_AXI_ACLK_FREQ_HZ(AXI时钟频率)和C_HAS_EXTERNAL_XIN(是否使用外部时钟)。 因此,配置方法可以分为两个部分:硬件配置(在Vivado中设置IP参数)和软件配置(通过寄存器编程设置通信格式和波特率)。 下面我们将详细说明配置步骤: </think>### ⚙️ AXI UART 16550 IP配置方法详解 #### 📌 **硬件配置(Vivado环境)** 1. **基础参数配置**: ```tcl # 设置AXI时钟频率(需与实际时钟一致) set_property CONFIG.C_S_AXI_ACLK_FREQ_HZ {100000000} [get_bd_cells axi_uart16550_0] # 禁用外部时钟输入(使用内部时钟) set_property CONFIG.C_HAS_EXTERNAL_XIN {0} [get_bd_cells axi_uart16550_0] # 启用中断功能(可选) set_property CONFIG.C_HAS_INTERRUPT {1} [get_bd_cells axi_uart16550_0] ``` 2. **波特率分频器配置**: 波特率计算公式: $$ \text{分频值} = \frac{\text{时钟频率}}{16 \times \text{目标波特率}} $$ 例如100MHz时钟下实现115200波特率: $$ \text{DIV} = \frac{100,000,000}{16 \times 115,200} \approx 54 $$ #### 🔧 **软件配置(寄存器编程)** 1. **波特率设置流程**: ```c // 步骤1:解锁分频寄存器(设置DLAB=1) XUartNs550_SetLineControlReg(BASE_ADDR, UART_LCR_DLAB); // 步骤2:写入分频值(低8位) XUartNs550_WriteReg(BASE_ADDR, UART_RX_FIFO, DIV & 0xFF); // 步骤3:写入分频值(高8位) XUartNs550_WriteReg(BASE_ADDR, UART_IER, (DIV >> 8) & 0xFF); // 步骤4:锁定数据寄存器(设置DLAB=0) XUartNs550_SetLineControlReg(BASE_ADDR, config_val); ``` 2. **通信格式配置**: ```c // 配置示例:8数据位,1停止位,无校验 uint8_t config_val = UART_LCR_WLS_8 | UART_LCR_STOP_1 | UART_LCR_PARITY_NONE; XUartNs550_SetLineControlReg(BASE_ADDR, config_val); ``` #### 📊 关键寄存器说明 | 寄存器 | 地址偏移 | 功能描述 | |----------------|---------|----------------------------| | **RBR/THR** | 0x00 | 接收/发送数据寄存器 | | **IER** | 0x01 | 中断使能寄存器 | | **IIR/FCR** | 0x02 | 中断识别/先进先出控制寄存器 | | **LCR** | 0x03 | 线控制寄存器(配置心参数) | | **MCR** | 0x04 | 调制解调器控制寄存器 | | **LSR** | 0x05 | 线状态寄存器(传输状态) | | **MSR** | 0x06 | 调制解调器状态寄存器 | | **SCR** | 0x07 | 临时数据存储寄存器 | #### 🌟 **RS485扩展配置(引用[3])** 1. 使能RS485模式: ```tcl set_property CONFIG.C_IS_A_16550 {0} [get_bd_cells axi_uart16550_0] ``` 2. 连接控制信号: ```mermaid graph LR IP[UART IP] -->|RTSn| DE[/DE引脚/] IP -->|DTRn| RE[/RE引脚/] DE --> 驱动器[RS485驱动器] RE --> 驱动器 ``` #### ️ 调试注意事项 1. **波特率验证**: ```c // 检查分频值是否写入成功 XUartNs550_SetLineControlReg(BASE_ADDR, UART_LCR_DLAB); uint16_t div_check = (XUartNs550_ReadReg(BASE_ADDR, UART_IER) << 8) | XUartNs550_ReadReg(BASE_ADDR, UART_RX_FIFO); ``` 2. **FIFO深度配置**: ```tcl # 设置接收FIFO触发阈值 set_property CONFIG.C_RX_FIFO_TRIGGER {8} [get_bd_cells axi_uart16550_0] ``` --- ### ❓ 相关问题 1. 如何计算不同时钟频率下的波特率分频值? 2. 怎样通过中断方式实现UART数据收发? 3. RS485模式与标准UART模式有何硬件连接差异? 4. 如何诊断线控制寄存器(LCR)配置错误导致的通信故障? 5. FIFO深度设置对UART通信性能有哪些影响?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

寒听雪落

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值