I am working on a project where i use four UART for an application, all four uart lines sends and receives approx. 20 bytes of characters and expects 20 bytes o character in every 16 milliseconds. And the data transfer will be continuous.
NOTE : All four UARTs, are on PL side and controlled by PS of my zynq SoC..
NODE B : Zybo
NODE A : Subsystem
The UART communication is between NODE A and NODE B. NODE A sends data to NODE B, in turn NODE B should receive the data and reply with an acknowledgement. In this case NODE B is my Zybo Node A is another subsystem.
So the data transmission is initiated by NODE A and the control is with NODE A. NODE A will Enable the data transmission for all four UARTs.
Now the problem which i am facing is, when NODE A enables the transmission for any two of the UART lines the data transmission is smooth, the problem arises only when i enable the other two. Which means the zybo is not capable of attending to those interrupts which is simultaneously coming from NODE A through four UART lines.
My data contains Start byte and Stop byte, Both Start and stop byte are same character. I will attach a my Interrupt handler for reference.
**************NOTE**************
UART IP on PL side : UART16550
Type of UART : Interrupt driven.
Software used : Vivado 2018.3 and SDK
Bare metal software.
UART interrupt priority : equal priority for all four UARTs.
**********************************
I am not very sure about how to use four UARTs efficiently with my Zybo .
Please help me with the problem, any inputs from your side will be appreciated.
static void RW1RecvHandler(void *CallBackRef, unsigned int EventData)
{
int i, ch, RecvCount, index;
RecvCount = EventData;
// repeat this loop for all chars received, i.e., for all ReceivedCount
i = 0;
while (i < RecvCount) {
ch = RW1_RecieveBuffer[i++]; // get the received char from the buffer
if(RW1_Start_byte_flag == 1)
{
// Stop Byte Check for RW1
if (ch == 0xc0)
{
// Ignore one of the two successive start byte characters
if (RW1_ReceivedCount > 1)
{
RW1_Start_byte_flag = 0;
RW1_Buffer[RW1_ReceivedCount++] = ch;
RW1_Frame_complete_flag = 1;
Question
Ajeeth_kumar
Hi,
I am working on a project where i use four UART for an application, all four uart lines sends and receives approx. 20 bytes of characters and expects 20 bytes o character in every 16 milliseconds. And the data transfer will be continuous.
NOTE : All four UARTs, are on PL side and controlled by PS of my zynq SoC..
NODE B : Zybo
NODE A : Subsystem
The UART communication is between NODE A and NODE B. NODE A sends data to NODE B, in turn NODE B should receive the data and reply with an acknowledgement. In this case NODE B is my Zybo Node A is another subsystem.
So the data transmission is initiated by NODE A and the control is with NODE A. NODE A will Enable the data transmission for all four UARTs.
Now the problem which i am facing is, when NODE A enables the transmission for any two of the UART lines the data transmission is smooth, the problem arises only when i enable the other two. Which means the zybo is not capable of attending to those interrupts which is simultaneously coming from NODE A through four UART lines.
My data contains Start byte and Stop byte, Both Start and stop byte are same character. I will attach a my Interrupt handler for reference.
**************NOTE**************
UART IP on PL side : UART16550
Type of UART : Interrupt driven.
Software used : Vivado 2018.3 and SDK
Bare metal software.
UART interrupt priority : equal priority for all four UARTs.
**********************************
I am not very sure about how to use four UARTs efficiently with my Zybo .
Please help me with the problem, any inputs from your side will be appreciated.
The following is my UART interrupt handler.
***************************************************************************
static void RW1RecvHandler(void *CallBackRef, unsigned int EventData)
{
int i, ch, RecvCount, index;
RecvCount = EventData;
// repeat this loop for all chars received, i.e., for all ReceivedCount
i = 0;
while (i < RecvCount) {
ch = RW1_RecieveBuffer[i++]; // get the received char from the buffer
if(RW1_Start_byte_flag == 1)
{
// Stop Byte Check for RW1
if (ch == 0xc0)
{
// Ignore one of the two successive start byte characters
if (RW1_ReceivedCount > 1)
{
RW1_Start_byte_flag = 0;
RW1_Buffer[RW1_ReceivedCount++] = ch;
RW1_Frame_complete_flag = 1;
}
}
else
{
if ((index = RW1_ReceivedCount) < TEST_BUFFER_SIZE) {
RW1_Buffer[index] = ch;
RW1_ReceivedCount++;
}
else
RW1_Start_byte_flag = 0;
}
}
// Start Byte Check for RW1
else if (ch == 0xc0)
{
RW1_Start_byte_flag = 1;
RW1_ReceivedCount = 0;
RW1_Buffer[RW1_ReceivedCount++] = ch;
// Note the cpu time when first character is received
XTime_GetTime(&t_start_RW1);
RW1_Frame_complete_flag = 0;
}
}
if(RW1_Frame_complete_flag == 0)
{
// set up the buffer for next char in interrupt mode
XUartNs550_Recv(&RW1, RW1_RecieveBuffer, 1);
}
}
Thanks & Regards
Ajeeth Kumar
Link to comment
Share on other sites
6 answers to this question
Recommended Posts
Archived
This topic is now archived and is closed to further replies.