Jump to content
  • 0

AXI UARTLITE Data Output


gcp

Question

Dear FPGA experts,

May I ask some valuable comments and suggestions on the experts on this forum regarding of our encoutered problem. We interface our ublox M8U gps into a xilinx zedboard using the UART-Pmod connections. Created the hardware design and routed the Ublox gps signals into the PL side using the axi-uartlite IP. Then, in SDK, we used the axi-uartlite pre built code "uartlite_polled_example.c" and take some minor changes in order to get the data directly in the ublox gps module. Running the program and printing the Received buffer was successfull.But comparing the hex data received, between the sdk and the hex data recieved using the logic analyzer are different. We pressumed  that the data in the logic analyzer are correct since it was coincide with the message structuring of the ublox protocol specification manual. I also attached  the code used,  hardware design, logic analyzer result and the sample output data for you to validate my findings aboved.

My understanding with the logic analyzer result as againts in the sdk hex data is that " header tag + class id tag + length of data bytes" should be the same.

Hope to hear from you.

Thanks.

 

Best regards,

Glenn

 

Spoiler


/******************************************************************************
*
* Copyright (C) 2002 - 2015 Xilinx, Inc. All rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* Use of the Software is limited solely to applications:
* (a) running on a Xilinx device, or
* (b) that interact with a Xilinx device through a bus or interconnect.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*
* Except as contained in this notice, the name of the Xilinx shall not be used
* in advertising or otherwise to promote the sale, use or other dealings in
* this Software without prior written authorization from Xilinx.
*
******************************************************************************/
/******************************************************************************/
/**
*
* @file xuartlite_polled_example.c
*
* This file contains a design example using the UartLite driver (XUartLite) and
* hardware device using the polled mode.
*
* @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.00a jhl 02/13/02 First release
* 1.00a sv 06/13/05 Minor changes to comply to Doxygen and coding guidelines
* 2.00a ktn 10/20/09 Updated this example to wait for valid data in receive
* fifo instead of Tx fifo empty to update receive buffer
* and minor changes as per coding guidelines.
* 3.2 ms 01/23/17 Added xil_printf statement in main function to
* ensure that "Successfully ran" and "Failed" strings
* are available in all examples. This is a fix for
* CR-965028.
* </pre>
******************************************************************************/

/***************************** Include Files *********************************/

#include "xparameters.h"
#include "xstatus.h"
#include "xuartlite.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_DEVICE_ID XPAR_UARTLITE_0_DEVICE_ID

/*
* 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 since
* this is a single threaded non-interrupt driven example such that the
* entire buffer will fit into the transmit and receive FIFOs of the UartLite.
*/
#define TEST_BUFFER_SIZE 700

/**************************** Type Definitions *******************************/


/***************** Macros (Inline Functions) Definitions *********************/


/************************** Function Prototypes ******************************/

int UartLitePolledExample(u16 DeviceId);

/************************** Variable Definitions *****************************/

XUartLite UartLite; /* Instance of the UartLite Device */

/*
* 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 */
char RecvBuffer[TEST_BUFFER_SIZE]; /* Buffer for Receiving Data */


/*****************************************************************************/
/**
*
* Main function to call the Uartlite polled example.
*
* @param None.
*
* @return XST_SUCCESS if successful, otherwise XST_FAILURE.
*
* @note None.
*
******************************************************************************/
int main(void)
{
int Status;

/*
* Run the UartLite polled example, specify the Device ID that is
* generated in xparameters.h
*/
Status = UartLitePolledExample(UARTLITE_DEVICE_ID);
if (Status != XST_SUCCESS) {
xil_printf("Uartlite polled Example Failed\r\n");
return XST_FAILURE;
}

xil_printf("Successfully ran Uartlite polled Example\r\n");

/*for (int Index = 0; Index < TEST_BUFFER_SIZE; Index++) {

xil_printf("Buffer[%d] = %x\n",Index,RecvBuffer[Index]);

}
*/

 

/*int i=1;

while(1){

xil_printf("Buffer[%d] = %d\n",i,RecvBuffer);

i++;

}

*/

return XST_SUCCESS;

}


/****************************************************************************/
/**
* This function does a minimal test on the UartLite device and driver as a
* design example. The purpose of this function is to illustrate
* how to use the XUartLite component.
*
* This function sends data and expects to receive the data thru the UartLite
* such that a physical loopback must be done with the transmit and receive
* signals of the UartLite.
*
* This function polls the UartLite and does not require the use of interrupts.
*
* @param DeviceId is the Device ID of the UartLite and is the
* XPAR_<uartlite_instance>_DEVICE_ID value from xparameters.h.
*
* @return XST_SUCCESS if successful, XST_FAILURE if unsuccessful.
*
*
* @note
*
* This function calls the UartLite driver functions in a blocking mode such that
* if the transmit data does not loopback to the receive, this function may
* not return.
*
****************************************************************************/
int UartLitePolledExample(u16 DeviceId)
{
int Status;
unsigned int SentCount;
int ReceivedCount = 0;
int InitCount = 0;
int i;

int Index;

/*
* Initialize the UartLite driver so that it is ready to use.
*/
Status = XUartLite_Initialize(&UartLite, DeviceId);
if (Status != XST_SUCCESS) {
return XST_FAILURE;
}

/*
* Perform a self-test to ensure that the hardware was built correctly.
*/
Status = XUartLite_SelfTest(&UartLite);
if (Status != XST_SUCCESS) {
return XST_FAILURE;
}

/*
* 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;
// RecvBuffer[Index] = 0;
//}

/*
* Send the buffer through the UartLite waiting til the data can be sent
* (block), if the specified number of bytes was not sent successfully,
* then an error occurred.
*/
//SentCount = XUartLite_Send(&UartLite, SendBuffer, TEST_BUFFER_SIZE);
//if (SentCount != TEST_BUFFER_SIZE) {
// return XST_FAILURE;
//}

/*
* Receive the number of bytes which is transfered.
* Data may be received in fifo with some delay hence we continuously
* check the receive fifo for valid data and update the receive buffer
* accordingly.
*/
while(1) {


while ((ReceivedCount = XUartLite_Recv(&UartLite,RecvBuffer,TEST_BUFFER_SIZE)) > 0)

{

//InitCount = RecvBuffer[0];

//xil_printf("Init count is %x\n", InitCount);

for(i=0; i<TEST_BUFFER_SIZE; i++)
{
//xil_printf("buffer[%d] = %x" ,i,RecvBuffer);
xil_printf("%02x" ,RecvBuffer);


}

xil_printf("\n");

 

 

//xil_printf("data is %x \n",RecvBuffer[0]);


if(InitCount == 0xB5620107)
{
xil_printf("Good!!!!");

return XST_SUCCESS;
//break;
}
//InitCount += XUartLite_Recv(&UartLite,RecvBuffer,1);

//if(InitCount==1 & RecvBuffer[0]== 0xB5){

//ReceivedCount += XUartLite_Recv(&UartLite,
// RecvBuffer + ReceivedCount,
// TEST_BUFFER_SIZE - ReceivedCount);

}

}

 


//ReceivedCount = XUartLite_Recv(&UartLite, RecvBuffer ,TEST_BUFFER_SIZE);

//xil_printf("Received Count is %d\n",ReceivedCount );

//if (ReceivedCount == TEST_BUFFER_SIZE) {
// break;
//}
//}

/*
* 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;
//}
//}

//xil_printf("Received Count is %d\n", ReceivedCount);

//for (Index = 0; Index < TEST_BUFFER_SIZE; Index++) {
//xil_printf("Buffer[%d] = %x\n",Index,RecvBuffer[Index]);

//}
return XST_SUCCESS;
}

UART_LogicAnalyzer_Rxd.png

HardwareDesign.png

sampleOutput.png

 

 

Link to comment
Share on other sites

3 answers to this question

Recommended Posts

@gcp

If you are using SDK under Windows OS be aware the it uses little endian which means the bytes will be swapped. This might create some confusion.
Also you can use UART0 by connecting PmodRS232 directly to MIO-10, MIO-11 with only one configuration:
 MIO Configuration -> I/O Peripherals -> select UART0 MIO 10-11.
Then, if you want to use UART0 as STDIO, change the STDIO configuration of the BSP from UART1 to UART0:  
application’s bsp -> Board Support Package Settings -> standalone -> select value ps7_uart_0 for both stdin and stdout

On Zybo the PmodRS232 connection looks like shown on the picture.
Unfortunately, I don't have time for analysis.
Good luck!

.

Zybo_PmodRS232_2.jpg

Link to comment
Share on other sites

@notarobot

Thanks for your immediate response, really appreciated. I will look on to it. 

Can I request you a guide sample application project  implemented  based on your above setup for us to check on ours.

Thanks.

Best regards,

Glenn

 

Link to comment
Share on other sites

Glenn,

Several sample applications using PS implementation of UART are included with Vivado in data\embeddedsw\XilinxProcessorIPLib\drivers\uartps\

You will learn more from the samples provided by Xilinx. For example, you can see how to utilize interrupts. My application is specific to my project and limited in scope.

 

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...