【JokerのZYNQ7020】AXI_UARTLITE。
软件环境:vivado 2017.4硬件平台:XC7Z020本月的这一篇呢,主要说的是axi_uartlite这个模块,利用这个模块,我们可以将pl部分的pin复用为uart的rx和tx,交给ps来操作,相当于无形之中给ps扩展了许多uart接口,所以特别适用于板子需要跟许多外部串口设备通讯,而ps只有两个uart能同时使用,无法满足需求的情况。这篇里会先说SDK裸机程序怎么跑,后面会说linux
软件环境: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发送出,实现简单的收发回环。
更多推荐
所有评论(0)