AXI Uartlite學習(二)UART LOOP

硬件平臺:Zedboardhtml

軟件環境:Vivado 2015.2 app

參考例程:xuartlite_low_level_example.cless

//*****************************************************************ide

一、UART LOOP工程介紹

    本節要在PL中使用AXI Uartlite這個串口IP。這個工程須要物理上有一個UART LOOP,也就是說Uartlite的TX管腳發出去數據,還要有一個外設接收數據並回傳到RX管腳,造成一個迴路。然而Zedboard只在PS的管腳上拓展一個串口外設,PL管腳是沒有的。所以首先要作一個IP,實現串口數據環路。工程Block Design如圖1。函數

   Image 8.jpg

圖1 Block Designoop

二、uart_loop

    這個本身作的IP的功能就是接收Uartlite TX管腳發送的數,轉發到RX管腳。代碼以下:ui

`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer: 
// 
// Create Date: 2016/08/26 15:42:28
// Design Name: 
// Module Name: uart_loop
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//////////////////////////////////////////////////////////////////////////////////
 
 
module uart_loop #(
    parameter WIDTH_D = 8)
    (
    input wire CLK,     //110M
    input wire RX,
    output wire TX
    );
    //
    wire dv;
    wire [WIDTH_D-1:0] dout;
    wire rfd;
    UAR_115200 uar_inst(
        .CLK(CLK),
        .DI(RX),
        //
        .DV(dv),
        .DO(dout)
    );
    //
    UAT_115200 uat_inst(
        .CLK(CLK),
        .DIN(dout),
        .ND(dv&rfd),
        //
        .DOUT(TX),
        .RFD(rfd)
    );
    
endmodule
//***********************************************************************************

三、SDK源碼this

/******************************************************************************spa

*
* (c) Copyright 2002-2013 Xilinx, Inc. All rights reserved.
*
* This file contains confidential and proprietary information of Xilinx, Inc.
* and is protected under U.S. and international copyright and other
* intellectual property laws.
*
* DISCLAIMER
* This disclaimer is not a license and does not grant any rights to the
* materials distributed herewith. Except as otherwise provided in a valid
* license issued to you by Xilinx, and to the maximum extent permitted by
* applicable law: (1) THESE MATERIALS ARE MADE **AILABLE "AS IS" AND WITH ALL
* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS,
* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF
* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE;
* and (2) Xilinx shall not be liable (whether in contract or tort, including
* negligence, or under any other theory of liability) for any loss or damage
* of any kind or nature related to, arising under or in connection with these
* materials, including for any direct, or any indirect, special, incidental,
* or consequential loss or damage (including loss of data, profits, goodwill,
* or any type of loss or damage suffered as a result of any action brought by
* a third party) even if such damage or loss was reasonably foreseeable or
* Xilinx had been advised of the possibility of the same.
*
* CRITICAL APPLICATIONS
* Xilinx products are not designed or intended to be fail-safe, or for use in
* any application requiring fail-safe performance, such as life-support or
* safety devices or systems, Class III medical devices, nuclear facilities,
* applications related to the deployment of airbags, or any other applications
* that could lead to death, personal injury, or severe property or
* environmental damage (individually and collectively, "Critical
* Applications"). Customer assumes the sole risk and liability of any use of
* Xilinx products in Critical Applications, subject only to applicable laws
* and regulations governing limitations on product liability.
*
* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE
* AT ALL TIMES.
*
******************************************************************************/
/*****************************************************************************/
/**
*
* @file xuartlite_low_level_example.c
*
* This file contains a design example using the low-level driver functions
* and macros of the UartLite driver (XUartLite).
*
* @note
*
* The user must provide a physical loopback such that data which is
* transmitted will be received.
*
* MODIFICATION HISTORY:
* <pre>
* Ver   Who  Date Changes
* ----- ---- -------- ---------------------------------------------------------
* 1.00b rpm  04/25/02 First release
* 1.00b sv   06/13/05 Minor changes to comply to Doxygen and coding guidelines
* 2.00a ktn  10/20/09 Updated to use HAL processor APIs and minor changes
*      for coding guidelines.
* </pre>
******************************************************************************/
 
/***************************** Include Files *********************************/
 
 
#include "xparameters.h"
#include "xstatus.h"
#include "xuartlite_l.h"
#include "xil_printf.h"
/************************** Constant Definitions *****************************/
 
 
/*
 * The following constants map to the XPAR parameters created in the
 * xparameters.h file. They are defined here such that a user can easily
 * change all the needed parameters in one place.
 */
#define UARTLITE_BASEADDR   XPAR_UARTLITE_0_BASEADDR
 
/*
 * The following constant controls the length of the buffers to be sent
 * and received with the UartLite, this constant must be 16 bytes or less so the
 * entire buffer will fit into the transmit and receive FIFOs of the UartLite.
 */
#define TEST_BUFFER_SIZE 16
 
 
/**************************** Type Definitions *******************************/
 
 
/***************** Macros (Inline Functions) Definitions *********************/
 
 
/************************** Function Prototypes ******************************/
 
int UartLiteLowLevelExample(u32 UartliteBaseAddress);
void Wait(int num);
 
/************************** Variable Definitions *****************************/
 
/*
 * The following buffers are used in this example to send and receive data
 * with the UartLite.
 */
u8 SendBuffer[TEST_BUFFER_SIZE]; /* Buffer for Transmitting Data */
u8 RecvBuffer[TEST_BUFFER_SIZE]; /* Buffer for Receiving Data */
 
 
/*****************************************************************************/
/**
*
* Main function to call the example.
*
* @param None.
*
* @return XST_SUCCESS if successful, XST_FAILURE if unsuccessful.
*
* @note None.
*
******************************************************************************/
int main(void)
{
int Status;
xil_printf("hello world\r\n");
 
 
 
XUartLite_SetControlReg(UARTLITE_BASEADDR, 0x3);
 
 
 
/*
* Run the UartLite Low level example, specify the BaseAddress that is
* generated in xparameters.h.
*/
 
 
Status = UartLiteLowLevelExample(UARTLITE_BASEADDR);
if (Status != XST_SUCCESS) {
return XST_FAILURE;
}
 
 
return XST_SUCCESS;
}
 
 
/*****************************************************************************/
/**
*
* This function does a minimal test on the UartLite device using the low-level
* driver macros and functions. This function sends data and expects to receive
* the data through the UartLite. A physical loopback must be done by the user
* with the transmit and receive signals of the UartLite.
*
* @param UartliteBaseAddress is the base address of the UartLite device
* and is the XPAR_<UARTLITE_instance>_BASEADDR value from
* xparameters.h.
*
* @return XST_SUCCESS if successful, XST_FAILURE if unsuccessful.
*
* @note None.
*
******************************************************************************/
int UartLiteLowLevelExample(u32 UartliteBaseAddress)
{
int Index;
 
/*
* Initialize the send buffer bytes with a pattern to send and the
* the receive buffer bytes to zero.
*/
for (Index = 0; Index < TEST_BUFFER_SIZE; Index++) {
//SendBuffer[Index] = Index + 'B';
SendBuffer[Index] = Index+1;
RecvBuffer[Index] = 0;
}
 
 
/*
* Send the entire transmit buffer.
*/
for (Index = 0; Index < TEST_BUFFER_SIZE; Index++) {
XUartLite_SendByte(UartliteBaseAddress, SendBuffer[Index]);
// Wait(10000);
 
}
 
/*
* Receive the entire buffer's worth. Note that the RecvByte function
* blocks waiting for a character.
*/
for (Index = 0; Index < TEST_BUFFER_SIZE; Index++) {
RecvBuffer[Index] = XUartLite_RecvByte(UartliteBaseAddress);
xil_printf("RecvBuffer[%d] is %d\r\n",Index,RecvBuffer[Index]);
}
 
/*
* Check the receive buffer data against the send buffer and verify the
* data was correctly received.
*/
for (Index = 0; Index < TEST_BUFFER_SIZE; Index++) {
 
if (SendBuffer[Index] != RecvBuffer[Index]) {
return XST_FAILURE;
}
}
 
 
return XST_SUCCESS;
}
 
void Wait(int num)
{
int i;
for(i=0;i<num;i++)
{}
 
}
 

四、實驗現象及分析orm

    咱們發送的是1~16共16個數,從圖2中SDK Console窗口看的打印信息,只有1,3,5,7,9,11,13,15,圖3爲HW Debug中觀察PS發送給PL的數據,可見的確是發送了16個數據,分析多是uart_loop模塊收發串口數據耽誤了時間,增長一個延時函數,PS向PL發送一個數據後,延時一段時間,問題獲得解決,如圖4。

   Image 10.jpg

圖2 SDK Console窗口打印信息

Image 11.jpg

圖3 HW Debug窗口

Image 9.jpg

圖4 添加延時函數後SDK Console窗口打印信息

轉載鏈接:http://www.eefocus.com/mastershifu2015/blog/16-08/389822_f4618.html