How to config k64 uart_interrupt?

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

How to config k64 uart_interrupt?

823 Views
zhailing
Contributor II

HI

   Now I want to send and recieve vary date in uart4.

for example:

 I recieve 8 byte date through uart4; I want to send demoRingBuffer[0] only one time.

how to chang it?

My configrations:

while (1)
{
/* Send data only when UART TX register is empty and ring buffer has data to send out. */

uint8_t aa;

// PRINTF("\r\n start \r\n");
while ((kUART_TxDataRegEmptyFlag & UART_GetStatusFlags(DEMO_UART)) && (rxIndex != txIndex))
{

UART_WriteByte(DEMO_UART, demoRingBuffer[txIndex]);
txIndex++;

txIndex %= DEMO_RING_BUFFER_SIZE;

}
if(demoRingBuffer[0]==0x23&demoRingBuffer[1]==0x41&demoRingBuffer[2]==0x55&demoRingBuffer[3]==0x66
&demoRingBuffer[4]==0x77&demoRingBuffer[5]==0x88&demoRingBuffer[6]==0x99&demoRingBuffer[7]==0xaa)
{
aa=0x01;
}
else
{
aa=0x02;
}


if((aa==0x01))
{
UART_WriteByte(DEMO_UART, demoRingBuffer[0]);
}
else
{
UART_WriteByte(DEMO_UART, demoRingBuffer[1]);
}



}
}

void DEMO_UART_IRQHandler(void)
{
uint8_t data;

/* If new data arrived. */
if ((kUART_RxDataRegFullFlag | kUART_RxOverrunFlag) & UART_GetStatusFlags(DEMO_UART))
{
data = UART_ReadByte(DEMO_UART);

/* If ring buffer is not full, add data to ring buffer. */
if (((rxIndex + 1) % DEMO_RING_BUFFER_SIZE) != txIndex)
{
demoRingBuffer[rxIndex] = data;
rxIndex++;
rxIndex %= DEMO_RING_BUFFER_SIZE;
}
}

}

pastedImage_1.png

It always send 0x23; I want to send only one time.How to chang it?

Thanks and regards

zhai

0 Kudos
Reply
3 Replies

619 Views
xiangjun_rong
NXP TechSupport
NXP TechSupport

Hi, Zhao,

Regarding your code, that you want to output an array only once, you can change code cas follwoing:

while (1)
{
/* Send data only when UART TX register is empty and ring buffer has data to send out. */

uint8_t aa;

 

// PRINTF("\r\n start \r\n");
while ((kUART_TxDataRegEmptyFlag & UART_GetStatusFlags(DEMO_UART)) && (rxIndex != txIndex))
{

UART_WriteByte(DEMO_UART, demoRingBuffer[txIndex]);
txIndex++;
if(txIndex>=THRESHOLD) break; //Rong wrote, the line can jump out the loop while(1)
//txIndex %= DEMO_RING_BUFFER_SIZE;

}

BTW, it seems the code is incorrect:

if(demoRingBuffer[0]==0x23&demoRingBuffer[1]==0x41&demoRingBuffer[2]==0x55&demoRingBuffer[3]==0x66
&demoRingBuffer[4]==0x77&demoRingBuffer[5]==0x88&demoRingBuffer[6]==0x99&demoRingBuffer[7]==0xaa)

It should be:

if(demoRingBuffer[0]==0x23&&demoRingBuffer[1]==0x41&&demoRingBuffer[2]==0x55&&demoRingBuffer[3]==0x66
&&demoRingBuffer[4]==0x77&&demoRingBuffer[5]==0x88&&demoRingBuffer[6]==0x99&&demoRingBuffer[7]==0xaa)

Hope it can help you

BR

XiangJun Rong

0 Kudos
Reply

619 Views
zhailing
Contributor II

Hi

  I test your code,the rusult is the same to mine; I want to get 8 byte date from the uart rx ;

I will implent  other function through  the uart command and output command to upper machine.

Actualy I want to use the uart fifo function,But I don't have demo code.

Thanks 

zhai

0 Kudos
Reply

619 Views
zhailing
Contributor II

I want to finish the fuction like mcu51;

void Rcv_ISR () interrupt 4 using 1
{
INT8 data inchar;

if(RI)
{
inchar = SBUF;
if(inchar == '*')
{
RX_Index1 = 0;
}

if(RX_Index1 <= (RX_MAXBUF-1) )
{
RX_BUF1[RX_Index1] = inchar;
if(RX_BUF1[RX_Index1] == '$')
{
if(RX_BUF1[0] == '*')
{
if(RX_BUF1[2] == '2')
{
ACKflag = 1;
}
else
{
if(RX_FULL == 0)
{
RX_FULL = 1;
RX_Index2 = RX_Index1;
memcpy(RX_BUF2,RX_BUF1,RX_Index2+1);
}
else
{
//
}
}
RX_BUF1[0] = 0;
RX_BUF1[2] = 0;
RX_Index1 =0;
}
}
RX_Index1++;
}
else
{
RX_Index1 =0;
}
RI = 0;
}

if(TI)
{
if(TX_EN == 1)
{
if(TX_Tail == TX_Head)
{
if(TX_Full == 1)
{
SBUF = TX_BUF[TX_Tail];
TX_Tail = (TX_Tail+1)%TX_MAXBUF;
TX_Full = 0;
}
else
{
TX_Empty = 1;
}
}
else
{
SBUF = TX_BUF[TX_Tail];
TX_Tail = (TX_Tail+1)%TX_MAXBUF;
}
}
else
{
TX_Empty = 1;
TX_Full = 0;
}
TI = 0;
}

Thanks

0 Kudos
Reply