...
UART控制器IP核设计是AMBA APB总线接口,而我们FBIO Wrapper是AMBA AXI总线接口, 不能直接连接在一起,需要一个AXI2ABP 的Bridge进行连接;如下图所示:
...
本实验以Plus1 7021 SOC实践平台配套的FPGA子板和IP验证子板完成相关实验,FPGA子板的开发工具采用XILINX的Vivado集成开发环境SOC实践平台配套的FPGA子板完成相关实验,实验采用loopback方式进行,即将UART控制器IP核设计的TX和RX对接即可;
FPGA子板的开发工具采用XILINX的Vivado集成开发环境(版本号为2018.3);为了方便将用户自己需要验证的IP方便连接到SOC系统中验证,本实验提供了相应的设计参考基础文件,如下
...
printf("UART IP test ready ");
while(1)
{
unsigned int i;
}
对比数码管控制IP实验,增加了uart_ctl()函数,用来完成UART的配置及初始化操作,如下讲解。
void uart_ctl()
{
uart_reg->LCR=0x20;
printf("@LCR[%x]\n", temp);
for (i = 0; i < 256; i++)
{
while(1)
{
if((uart_reg->LSR&0x20)==0x20)
{
uart_reg->SER=0x3f;
uart_reg->TX_FIFO=i;
printf("@tx_data [%d]\n", i);
uart_reg->SER=0x3e;
break;
}
}
}
}
}
对比数码管控制IP实验,增加了uart_ctl()函数,用来完成UART的配置及初始化操作,如下讲解。
void uart_ctl()
{
uart_reg->LCR=0x20;
printf("@LCR[%x]\n", temp);
uart_reg->SER=0x3e;
printf("@SER[%x]\n", temp);
...
设置UART 为8bit 数据位,1bit 停止位,无校验位;
uart_reg->SER=0x3e;
设置UART 中断为:允许接收数据完成后产生中断;禁止发送数据完成后产生中断;禁止接收数据出现停止位,校验位错时产生中断;禁止接收数据FIFO满时产生中断;禁止发送数据FIFO空时产生中断;
uart_reg->BUAD_CNT=0x1A9;
设置UART 波特率为9600;
下面介绍while(1)
if((uart_reg->LSR&0x20)==0x20):判断接收数据FIFO为空
uart_reg->SER=0x3e0x3f; 设置UART 中断为:允许接收数据完成后产生中断;禁止发送数据完成后产生中断;禁止接收数据出现停止位,校验位错时产生中断;禁止接收数据FIFO满时产生中断;禁止发送数据FIFO空时产生中断;禁止接收数据中断;
uart_reg->BUAD>TX_CNT=0x1A9;设置UART 波特率为9600FIFO=i; 将数据i送到TX FIFO;
uart_reg->SER=0x3e; 允许接收数据完成后产生中断
uart.c
#include "common_all.h"
...
rx_data=uart_reg->RX_FIFO;
uart_reg->TX_FIFO=printf("@rx_data [%d]\n", rx_data);
uart_reg->LSR=0x0;
}
此中断处理程序的作用:将RX FIFO从外设接收到的8bit数据取出,然后将此数据送到TX FIFO,回送给外设;然后清除本次中断的状态标识bit,这样就完成了1byte数据的串行接收和发送实验。FIFO收到的8bit数据取出;然后清除本次中断的状态标识bit,这样就完成了1byte数据的串行接收和发送实验。
uart.h
#ifndef __FPGAINT_H__
...
在Plus1 IDE环境中compile后,下载到平台,在terminal窗口看到如下信息
...
然后打开PC端的串口软件,进行如下操作:
step1;设置串口参数;
step2;发送数据区填上需要发送的字符;
step3; 选择自动发送;
发送数据区的内容经由PC端串口发到我们平台上的UART IP控制器;然后此控制器将接收到的内容回发给PC端串口;这样我们在PC端串口软件接收数据区就能观察到来自发送数据区的内容
...