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

一,AXI UART 16550简介

用于通用接收/发送异步传bai输信息的串口安装在一个称作“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倍左右。

二,vivado工程搭建,并导入SDK

1,添加PL到PS的中断

2,添加 AXI GPIO 模块,配置为输出,位宽为 1,用于第一路 RS485 的 DE 控制

 3,添加 UART16550 模块,用于第二路 RS485 的数据端口。(注意:AXI UART 16550是带流控等功能的,如果只需要想作为普通串口232使用,只要把收发脚拉出来即可,其他不用管)

4,点击自动连接

扫描二维码关注公众号,回复: 13238152 查看本文章

 5,删除 UART 引脚,然后展开 UART 接口;添加 constant 模块,并设置位宽为1,值为常量1。

6,连接 ctsn,rin 信号到xlconstant_0

7,再添加一个 constant 模块,值设置为 0。xlconstant_1将连接 freeze,dcdn,dsrn 信号。

 8, 将 sin 和 sout 导出引脚

 

 9,连接ip2intc_irpt添加到zynq中断。

 10,sin约束RX管脚,sout约束tx管脚。按同样的步骤搭建第二路485接口,然后并生成 bitstream,导出硬件平台信息到SDK。

三,导入SDK测试。

新建一个devicetree的BSP工程,console_device选择ps7_uart_1,在选择列表中出现了新增的UART16550的选项。

1,函数简介

(1),设置串口的输入时钟和波特率: XUartNs550_SetBaud(),

(2),发送一个字节:XUartNs550_SendByte(UINTPTR BaseAddress, u8 Data)

              接收一个字节:XUartNs550_RecvByte(UINTPTR BaseAddress)

(3)PL 端 GPIO 设置

2,在回环的函数中,首先是将 RS485_0 设置为输出,RS485_1 设置为输入,设置完后,在发
送数据之前等待 1ms 时间,是因为有切换延迟

 测试后,切换方向 RS485_0 设置为输入,RS485_1 设置为输出,再次进行数据发送

 3,485串口回还测试打印信息

四,linux下使用485相关配置

1,ubuntu中uboot编译:

 make ARCH=arm CROSS_COMPILE=arm-xilinx-linux-gnueabi- xilinx_zynq_defconfig
 make ARCH=arm CROSS_COMPILE=arm-xilinx-linux-gnueabi- menuconfig

2,AXI UART 16550驱动添加

-->Device Dirvers --> Character devices --> Serial drivers -->Xilinx uartlite serial port support

make ARCH=arm CROSS_COMPILE=arm-xilinx-linux-gnueabi- UIMAGE_LOADADDR=0x8000 uImage

3,添加16550串口设备树,设备树编译方法:

(1),进入SDK,点击File->New->Xilinx Board Support Package,在Board Support Package OS选项中多了一项device-tree。

  BSP设置完后点击Finish,软件会自动生成所有需要的设备树,包括用户PL中建立的IP核生成的设备树文件。其中zynq-7000.dtsi是zynq的PS部分所需要的设备树,pl.dtsi中则是PL部分用户添加的IP的设备树。

(2),打开devicetree_bsp中生成的pl.dtsi文件

/ {
 amba_pl: amba_pl {
        #address-cells = <1>;
        #size-cells = <1>;
        compatible = "simple-bus";
        ranges ;
        axi_uart16550_0: serial@43c00000 {
            clock-frequency = <2.5e+08>;
            clock-names = "ref_clk";
            clocks = "clkc 0";
            compatible = "xlnx,xps-uart16550-2.00.a", "ns16550a";
            current-speed = <115200>;
            device_type = "serial";
            interrupt-parent = <&intc>;
            interrupts = <0 29 4>;
            port-number = <1>;
            reg = <0x43c00000 0x10000>;
            reg-offset = <0x1000>;
            reg-shift = <2>;
            xlnx,external-xin-clk-hz = <0x17d7840>;
            xlnx,external-xin-clk-hz-d = <0x19>;
            xlnx,has-external-rclk = <0x0>;
            xlnx,has-external-xin = <0x0>;
            xlnx,is-a-16550 = <0x1>;
            xlnx,s-axi-aclk-freq-hz-d = "250.0";
            xlnx,use-modem-ports = <0x1>;
            xlnx,use-user-ports = <0x1>;
        };
};

(3),从devicetree_bsp中的system-top.dts文件,在aliases节点中可以看到用户添加的AXI外设。复制新增节点,不做别的操作。

/dts-v1/;
/include/ "zynq-7000.dtsi"
/include/ "pl.dtsi"
/include/ "pcw.dtsi"
/ {
 chosen {
        bootargs = "earlycon";
        stdout-path = "serial0:115200n8";
 };
 aliases {
        ethernet0 = &gem0;
        serial0 = &uart1;
        serial1 = &uart0;
        serial2 = &axi_uart16550_0;
        spi0 = &qspi;
 };
 memory {
        device_type = "memory";
        reg = <0x0 0x20000000>;
 };
};

(4),将新增的内容复制到zed的dts文件中,复制修改后zynq_ztrun.dts文件开始部分如下:

/dts-v1/;
/include/ "zynq-7000.dtsi"
/ {
 model = "MYIR Z-turn Development Board";
 compatible = "myir,zynq-zturn", "xlnx,zynq-7000";
 
 aliases {
        ethernet0 = &gem0;
        serial0 = &uart1;
        serial1 = &uart0;
        spi0 = &qspi;
        
        serial2 = &axi_uart16550_0;
 };
 
 memory {
        device_type = "memory";
        reg = <0x0 0x1c000000>; // Reserved 256MB for xylonfb driver
 };
 
 chosen {
        bootargs = "console=ttyPS0,115200 root=/dev/ram rw earlyprintk";
        linux,stdout-path = "/amba/serial@e0001000";
 };
};

 

4,设备树文件生成方式可以这样:将其添加到开发板的dts文件中,在执行编译生成设备树即可。

make ARCH=arm CROSS_COMPILE=arm-xilinx-linux-gnueabi- dtbs

5,将启动文件复制到SD卡,打开PC端的串口调试助手,查看/dev下的文件,可以看到系统中多了ttyS0~ttyS15,本次系统中可以使用的是ttyS2~ttyS11, 因为在aliases节点下ARM端的两个串口已经占用了serial0和serial1。

设置波特率为1500000,在终端中使用命令测试串口

> stty -F /dev/ttyS2 speed 1500000 cs8        #设置波特率
> echo heelo > /dev/ttyS2                #发送数据
> cat /dev/ttyS2                    #接收数据

猜你喜欢

转载自blog.csdn.net/wangjie36/article/details/108721886