软件环境:vivado 2017.4        硬件平台:XC7Z020


本月的这一篇呢,主要说的是axi_uartlite这个模块,利用这个模块,我们可以将pl部分的pin复用为uart的rx和tx,交给ps来操作,相当于无形之中给ps扩展了许多uart接口,所以特别适用于板子需要跟许多外部串口设备通讯,而ps只有两个uart能同时使用,无法满足需求的情况。这篇里会先说SDK裸机程序怎么跑,后面会说linux下怎么利用这个模块与外部串口设备通讯。

由于主要是想说axi_uartlite扩串口怎么用,所以只做了最简工程。

 vivado这边需要注意的只有一点,就是实际pl扩出来的串口的波特率,是在axi_uartlite中需要提前设置好的,这边设置9600,那就只能用9600,设置115200那就只能115200,比特流生成好后就没法变了,要变的话就要重新配置然后重新生成比特流。

比特流生成好后,SDK这边的程序很简单。

#include "xparameters.h"
#include "xil_printf.h"
#include "xuartlite.h"
#include "string.h"
#include "sleep.h"

u8 uartlite_buf[512]={0};

int main()
{
	XUartLite  PL_Uartlite;
	XUartLite_Config *XUARTConfigPtr;
	int Uartlite_Init_Status;
	u32 uartlite_recv_cnt = 0;

	XUARTConfigPtr = XUartLite_LookupConfig(XPAR_UARTLITE_0_DEVICE_ID);
	if (XUARTConfigPtr == NULL){
		xil_printf("XUartlite_LookupConfig failed\n\r");
		return XST_FAILURE;
	}
	else{
		xil_printf("XUartlite_LookupConfig succeed\n\r");
	}

	Uartlite_Init_Status = XUartLite_Initialize(&PL_Uartlite, XPAR_UARTLITE_0_DEVICE_ID);
	if (Uartlite_Init_Status != XST_SUCCESS){
		xil_printf("Uartlite Initialize failed\n\r");
		return XST_FAILURE;
	}
	else{
		xil_printf("Uartlite Initialize succeed\n\r");
	}

	while (1){
		uartlite_recv_cnt = XUartLite_Recv(&PL_Uartlite, uartlite_buf, 512);

		if (uartlite_recv_cnt > 0){
			XUartLite_Send(&PL_Uartlite, uartlite_buf, uartlite_recv_cnt);
			memset(uartlite_buf, 0, 512);
			uartlite_recv_cnt = 0;
		}
	}

	return 0;
}

 axi_uartlite设备ID在xparameters.h中,调用axi_uartlite模块前,需包含xuartlite.h。

程序中,依靠XUartLite_Recv完成接收,将实际接收到的字节数由uartlite_recv_cnt获取,收到数据后由XUartLite_Send发送出,实现简单的收发回环。

Logo

更多推荐