lpuart

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

lpuart

3,944 Views
syedhashmiraza
Contributor III

Hello, iam using MCXA153 board , how can i read 20byte of data and how much byte i read in this?

/*

* Copyright (c) 2015, Freescale Semiconductor, Inc.

* Copyright 2016-2019 NXP

* All rights reserved.

*

* SPDX-License-Identifier: BSD-3-Clause

*/

 

#include "pin_mux.h"

#include "board.h"

#include "fsl_lpuart.h"

 

#include "fsl_clock.h"

#include "fsl_reset.h"

#include <stdbool.h>

#include <stdio.h>

/*******************************************************************************

* Definitions

******************************************************************************/

#define DEMO_LPUART LPUART0

#define DEMO_LPUART_CLK_FREQ (BOARD_DEBUG_UART_CLK_FREQ)

#define DEMO_LPUART_IRQn LPUART0_IRQn

#define DEMO_LPUART_IRQHandler LPUART0_IRQHandler

 

/*! @brief Ring buffer size (Unit: Byte). */

#define DEMO_RING_BUFFER_SIZE 16

 

/*! @brief Ring buffer to save received data. */

 

/*******************************************************************************

* Prototypes

******************************************************************************/

 

/*******************************************************************************

* Variables

******************************************************************************/

 

uint8_t g_tipString[] =

"Lpuart functional API interrupt example\r\nBoard receives characters then sends them out\r\nNow please input:\r\n";

 

/*

Ring buffer for data input and output, in this example, input data are saved

to ring buffer in IRQ handler. The main function polls the ring buffer status,

if there are new data, then send them out.

Ring buffer full: (((rxIndex + 1) % DEMO_RING_BUFFER_SIZE) == txIndex)

Ring buffer empty: (rxIndex == txIndex)

*/

uint8_t demoRingBuffer[DEMO_RING_BUFFER_SIZE];

volatile uint16_t txIndex; /* Index of the data to send out. */

volatile uint16_t rxIndex; /* Index of the memory to save new arrived data. */

 

/*******************************************************************************

* Code

******************************************************************************/

 

void DEMO_LPUART_IRQHandler(void)

{

uint8_t data;

uint16_t tmprxIndex = rxIndex;

uint16_t tmptxIndex = txIndex;

 

/* If new data arrived. */

if ((kLPUART_RxDataRegFullFlag)&LPUART_GetStatusFlags(DEMO_LPUART))

{

data = LPUART_ReadByte(DEMO_LPUART);

 

/* If ring buffer is not full, add data to ring buffer. */

if (((tmprxIndex + 1) % DEMO_RING_BUFFER_SIZE) != tmptxIndex)

{

demoRingBuffer[rxIndex] = data;

 

rxIndex++;

rxIndex %= DEMO_RING_BUFFER_SIZE;

printf("Received: %x\n", data);

 

}

}

SDK_ISR_EXIT_BARRIER;

}

 

/*!

* @brief Main function

*/

int main(void)

{

lpuart_config_t config;

uint16_t tmprxIndex = rxIndex;

uint16_t tmptxIndex = txIndex;

 

BOARD_InitPins();

BOARD_InitBootClocks();

BOARD_InitDebugConsole();

 

/*

* config.baudRate_Bps = 115200U;

* config.parityMode = kLPUART_ParityDisabled;

* config.stopBitCount = kLPUART_OneStopBit;

* config.txFifoWatermark = 0;

* config.rxFifoWatermark = 0;

* config.enableTx = false;

* config.enableRx = false;

*/

LPUART_GetDefaultConfig(&config);

config.baudRate_Bps = BOARD_DEBUG_UART_BAUDRATE;

config.enableTx = true;

config.enableRx = true;

 

LPUART_Init(DEMO_LPUART, &config, DEMO_LPUART_CLK_FREQ);

 

/* Send g_tipString out. */

LPUART_WriteBlocking(DEMO_LPUART, g_tipString, sizeof(g_tipString) / sizeof(g_tipString[0]));

 

/* Enable RX interrupt. */

LPUART_EnableInterrupts(DEMO_LPUART, kLPUART_RxDataRegFullInterruptEnable);

EnableIRQ(DEMO_LPUART_IRQn);

 

while (1)

{

/* Send data only when LPUART TX register is empty and ring buffer has data to send out. */

while (kLPUART_TxDataRegEmptyFlag & LPUART_GetStatusFlags(DEMO_LPUART))

{

tmprxIndex = rxIndex;

tmptxIndex = txIndex;

if (tmprxIndex != tmptxIndex)

{

LPUART_WriteByte(DEMO_LPUART, demoRingBuffer[txIndex]);

txIndex++;

txIndex %= DEMO_RING_BUFFER_SIZE;

}

}

}

}

 

 

Labels (1)
Tags (1)
0 Kudos
Reply
17 Replies

3,779 Views
Alice_Yang
NXP TechSupport
NXP TechSupport

Hello @syedhashmiraza 

Please use the accurate demo "Lpuart_interrupt" without any modification. If there is still a problem, please record a video demonstrating all your steps. Thanks.

 

BR

Alice

0 Kudos
Reply

3,689 Views
syedhashmiraza
Contributor III

hello, when iam using printf they recieved only 5 byte my question is using printf i want to read 20 byte

Tags (1)
0 Kudos
Reply

3,672 Views
Alice_Yang
NXP TechSupport
NXP TechSupport

Hello @syedhashmiraza 

 

Share your project, thank you.

 

BR

Alice

0 Kudos
Reply

3,610 Views
syedhashmiraza
Contributor III

hello , i take 115200 baud rate in this  buad rate printing only 4 byte when i change my baud rate to 300 its printing 20 byte value but my question is  i want to read and print 20 byte value using 115200 baud rate  and this is my code 

 

#include "pin_mux.h"

#include "board.h"

#include "fsl_lpuart.h"

 

#include "fsl_clock.h"

#include "fsl_reset.h"

#include <stdbool.h>

#include <stdio.h>

/*******************************************************************************

* Definitions

******************************************************************************/

#define DEMO_LPUART LPUART0

#define DEMO_LPUART_CLK_FREQ (BOARD_DEBUG_UART_CLK_FREQ)

#define DEMO_LPUART_IRQn LPUART0_IRQn

#define DEMO_LPUART_IRQHandler LPUART0_IRQHandler

 

/*! @brief Ring buffer size (Unit: Byte). */

#define DEMO_RING_BUFFER_SIZE 16

 

/*! @brief Ring buffer to save received data. */

 

/*******************************************************************************

* Prototypes

******************************************************************************/

 

/*******************************************************************************

* Variables

******************************************************************************/

 

uint8_t g_tipString[] =

"Lpuart functional API interrupt example\r\nBoard receives characters then sends them out\r\nNow please input:\r\n";

 

/*

Ring buffer for data input and output, in this example, input data are saved

to ring buffer in IRQ handler. The main function polls the ring buffer status,

if there are new data, then send them out.

Ring buffer full: (((rxIndex + 1) % DEMO_RING_BUFFER_SIZE) == txIndex)

Ring buffer empty: (rxIndex == txIndex)

*/

uint8_t demoRingBuffer[DEMO_RING_BUFFER_SIZE];

volatile uint16_t txIndex; /* Index of the data to send out. */

volatile uint16_t rxIndex; /* Index of the memory to save new arrived data. */

 

/*******************************************************************************

* Code

******************************************************************************/

 

void DEMO_LPUART_IRQHandler(void)

{

uint8_t data;

uint16_t tmprxIndex = rxIndex;

uint16_t tmptxIndex = txIndex;

 

/* If new data arrived. */

if ((kLPUART_RxDataRegFullFlag)&LPUART_GetStatusFlags(DEMO_LPUART))

{

data = LPUART_ReadByte(DEMO_LPUART);

 

/* If ring buffer is not full, add data to ring buffer. */

if (((tmprxIndex + 1) % DEMO_RING_BUFFER_SIZE) != tmptxIndex)

{

demoRingBuffer[rxIndex] = data;

 

rxIndex++;

rxIndex %= DEMO_RING_BUFFER_SIZE;

printf("Received: %x\n", data);

 

}

}

SDK_ISR_EXIT_BARRIER;

}

 

/*!

* @brief Main function

*/

int main(void)

{

lpuart_config_t config;

uint16_t tmprxIndex = rxIndex;

uint16_t tmptxIndex = txIndex;

 

BOARD_InitPins();

BOARD_InitBootClocks();

BOARD_InitDebugConsole();

 

/*

* config.baudRate_Bps = 115200U;

* config.parityMode = kLPUART_ParityDisabled;

* config.stopBitCount = kLPUART_OneStopBit;

* config.txFifoWatermark = 0;

* config.rxFifoWatermark = 0;

* config.enableTx = false;

* config.enableRx = false;

*/

LPUART_GetDefaultConfig(&config);

config.baudRate_Bps = BOARD_DEBUG_UART_BAUDRATE;

config.enableTx = true;

config.enableRx = true;

 

LPUART_Init(DEMO_LPUART, &config, DEMO_LPUART_CLK_FREQ);

 

/* Send g_tipString out. */

LPUART_WriteBlocking(DEMO_LPUART, g_tipString, sizeof(g_tipString) / sizeof(g_tipString[0]));

 

/* Enable RX interrupt. */

LPUART_EnableInterrupts(DEMO_LPUART, kLPUART_RxDataRegFullInterruptEnable);

EnableIRQ(DEMO_LPUART_IRQn);

 

while (1)

{

/* Send data only when LPUART TX register is empty and ring buffer has data to send out. */

while (kLPUART_TxDataRegEmptyFlag & LPUART_GetStatusFlags(DEMO_LPUART))

{

tmprxIndex = rxIndex;

tmptxIndex = txIndex;

if (tmprxIndex != tmptxIndex)

{

LPUART_WriteByte(DEMO_LPUART, demoRingBuffer[txIndex]);

txIndex++;

txIndex %= DEMO_RING_BUFFER_SIZE;

}

}

}

}

Tags (1)
0 Kudos
Reply

3,476 Views
Alice_Yang
NXP TechSupport
NXP TechSupport

Hello @syedhashmiraza 

I still recommend that you use the UART SDK demo. If you still prefer to use your own code, please attach the entire project, which should be directly run on the MCUXpresso IDE. I will help you check it. Thank you.

 

BR

Alice

0 Kudos
Reply

3,567 Views
syedhashmiraza
Contributor III

hello iam working on mcxa153 mcu  and in this iam reciving  only 4 byte but i want to read 15 byte of data this is my code   

 

int stateWaitATR(int step, void* data) {
switch(step) {
case STEP_NULL:
ATR.len = 0;
ATR.protocol = ATR_PROTOCOL_T0;
ATR.negotiate = true;
/* Start timer for at most 40k card clock cycles (official timeout according to ISO7816) */
// Timing_StartCardClk(40000);
 
return STEP_WAIT_START;
case STEP_WAIT_START: { /* Wait for TS or timeout */
uint8_t TS;
  if (ISO7816_Read(&TS))
{
// printf("%x ",TS);
if (TS == 0x3B) {
printf("%x ",TS);
/* Wait for approximately 33 characters */
// Timing_StartETU(12 * 33);
 
return STEP_RECEIVE_ATR;
} else if (TS == 0x03){ /* With msb first + bytes invered: 0x03 -> 0x3F */
// todo: msb first, bytes inverted -> change usart config
//CARD_INFO("Received TS=0x3F not supported");
 
StateMachine_PushState(STATE_ERRORSTALL, NULL);
} else {
//CARD_ERR("Received TS value not supported");
StateMachine_PushState(STATE_ERRORSTALL, NULL);
}
} else if (Timing_IsTriggered()) {
StateMachine_PopState();
return -1;
}
break;
}
case STEP_RECEIVE_ATR: { /* Wait for ATR receive, either 32 bytes or respectively many etu + guard time */
uint8_t T;
while ((ATR.len < 32) && ISO7816_Read(&T)) {
ATR.buf[ATR.len] = T;
ATR.len++;
 
/* Reset timer to give card more time */
// Timing_StartETU(12 * 33);
// printf("%x ",T);
for(int i=0;i<ATR.len;i++)
{
printf("%x ",ATR.buf[i]);
}
}
 
if ((ATR.len == 32) || Timing_IsTriggered()) { /* ATR max length reached or last char too long ago */
return STEP_DECODE_ATR;
}
 
break;
}
}
 
 
 
bool ISO7816_Read(uint8_t* b) {
 
 
   if ((  kLPUART_RxDataRegFullFlag  ) & LPUART_GetStatusFlags(LPUART2))
// if (status == kStatus_Success)
      {
 
    *b =LPUART_ReadByte(LPUART2);
 
         return true;
      }
   else
   {
    return false;
   }
}
Tags (1)
0 Kudos
Reply

3,655 Views
syedhashmiraza
Contributor III

hello iam working on mcxa153 mcu  and in this iam reciving  only 4 byte but i want to read 15 byte of data this is my code   

 

int stateWaitATR(int step, void* data) {
switch(step) {
case STEP_NULL:
ATR.len = 0;
ATR.protocol = ATR_PROTOCOL_T0;
ATR.negotiate = true;
/* Start timer for at most 40k card clock cycles (official timeout according to ISO7816) */
// Timing_StartCardClk(40000);
 
return STEP_WAIT_START;
case STEP_WAIT_START: { /* Wait for TS or timeout */
uint8_t TS;
  if (ISO7816_Read(&TS))
{
// printf("%x ",TS);
if (TS == 0x3B) {
printf("%x ",TS);
/* Wait for approximately 33 characters */
// Timing_StartETU(12 * 33);
 
return STEP_RECEIVE_ATR;
} else if (TS == 0x03){ /* With msb first + bytes invered: 0x03 -> 0x3F */
// todo: msb first, bytes inverted -> change usart config
//CARD_INFO("Received TS=0x3F not supported");
 
StateMachine_PushState(STATE_ERRORSTALL, NULL);
} else {
//CARD_ERR("Received TS value not supported");
StateMachine_PushState(STATE_ERRORSTALL, NULL);
}
} else if (Timing_IsTriggered()) {
StateMachine_PopState();
return -1;
}
break;
}
case STEP_RECEIVE_ATR: { /* Wait for ATR receive, either 32 bytes or respectively many etu + guard time */
uint8_t T;
while ((ATR.len < 32) && ISO7816_Read(&T)) {
ATR.buf[ATR.len] = T;
ATR.len++;
 
/* Reset timer to give card more time */
// Timing_StartETU(12 * 33);
// printf("%x ",T);
for(int i=0;i<ATR.len;i++)
{
printf("%x ",ATR.buf[i]);
}
}
 
if ((ATR.len == 32) || Timing_IsTriggered()) { /* ATR max length reached or last char too long ago */
return STEP_DECODE_ATR;
}
 
break;
}
}
 
 
 
bool ISO7816_Read(uint8_t* b) {
 
 
   if ((  kLPUART_RxDataRegFullFlag  ) & LPUART_GetStatusFlags(LPUART2))
// if (status == kStatus_Success)
      {
 
    *b =LPUART_ReadByte(LPUART2);
 
         return true;
      }
   else
   {
    return false;
   }
}

 

Tags (1)
0 Kudos
Reply

3,620 Views
Alice_Yang
NXP TechSupport
NXP TechSupport

Hello @syedhashmiraza 

Sorry, I can not run your code on my side successfully, because it lacks the definition of some functions. And again, the SDK demo of " Lpuart_interrupt " can completely achieve the function of reading 15 bytes. Could you please test it first? You can find this demo under path:

"SDK_2_16_100_FRDM-MCXA153.zip\boards\frdmmcxa153\driver_examples\lpuart\interrupt"

 

Best Regards,

Alice

 

0 Kudos
Reply

3,921 Views
Alice_Yang
NXP TechSupport
NXP TechSupport

Hello @syedhashmiraza 

Recommend you first refer to the lpuart demos under SDK. Then based on the demo to development.  You can receive as many as you want. Just call receive API more times. 

 

BR

Alice

0 Kudos
Reply

3,901 Views
syedhashmiraza
Contributor III

hello i tried this one but still iam reciving 5 bytes my question is i ant to read more than 20 bytes off data

Tags (1)
0 Kudos
Reply

3,880 Views
Alice_Yang
NXP TechSupport
NXP TechSupport

Hello @syedhashmiraza 

I have tested this demo on my side, it can received any number of bytes.

In this example, one lpuart instance connect to PC, the board will send back all characters that PC send to the board. So you just need send 20 bytes on PC, then it can received them and send back to PC. I tested with 20 bytes, result as below:

Alice_Yang_0-1734937037579.png

 

 

BR

Alice

 

0 Kudos
Reply

3,855 Views
syedhashmiraza
Contributor III

hello can you send  a code?

0 Kudos
Reply

3,826 Views
Alice_Yang
NXP TechSupport
NXP TechSupport

Hello @syedhashmiraza 

Sorry could you please describe your requirements detail. 

Do you want me send characters not number to test? If yes, I tested on my side. It also can work well. As below.

Alice_Yang_0-1735182168490.png

 

BR

Alice

0 Kudos
Reply

3,728 Views
syedhashmiraza
Contributor III

hello, when iam using printf they recieved only 5 byte my question is using printf i want to read 20 byte

Tags (1)
0 Kudos
Reply

3,814 Views
syedhashmiraza
Contributor III

hello, i want to read 20 byte hex value and print that value using printf

Tags (1)
0 Kudos
Reply

3,808 Views
Alice_Yang
NXP TechSupport
NXP TechSupport

Hello @syedhashmiraza 

The Lpuart_interrupt demo can exactly meet your requirements.

 

BR

Alice

0 Kudos
Reply

3,803 Views
syedhashmiraza
Contributor III

yes, but when i print i recivecd only 5 bytes 

 

/*

* Copyright (c) 2015, Freescale Semiconductor, Inc.

* Copyright 2016-2019 NXP

* All rights reserved.

*

* SPDX-License-Identifier: BSD-3-Clause

*/

 

#include "pin_mux.h"

#include "board.h"

#include "fsl_lpuart.h"

 

#include "fsl_clock.h"

#include "fsl_reset.h"

#include <stdbool.h>

#include <stdio.h>

/*******************************************************************************

* Definitions

******************************************************************************/

#define DEMO_LPUART LPUART0

#define DEMO_LPUART_CLK_FREQ (BOARD_DEBUG_UART_CLK_FREQ)

#define DEMO_LPUART_IRQn LPUART0_IRQn

#define DEMO_LPUART_IRQHandler LPUART0_IRQHandler

 

/*! @brief Ring buffer size (Unit: Byte). */

#define DEMO_RING_BUFFER_SIZE 16

 

/*! @brief Ring buffer to save received data. */

 

/*******************************************************************************

* Prototypes

******************************************************************************/

 

/*******************************************************************************

* Variables

******************************************************************************/

 

uint8_t g_tipString[] =

"Lpuart functional API interrupt example\r\nBoard receives characters then sends them out\r\nNow please input:\r\n";

 

/*

Ring buffer for data input and output, in this example, input data are saved

to ring buffer in IRQ handler. The main function polls the ring buffer status,

if there are new data, then send them out.

Ring buffer full: (((rxIndex + 1) % DEMO_RING_BUFFER_SIZE) == txIndex)

Ring buffer empty: (rxIndex == txIndex)

*/

uint8_t demoRingBuffer[DEMO_RING_BUFFER_SIZE];

volatile uint16_t txIndex; /* Index of the data to send out. */

volatile uint16_t rxIndex; /* Index of the memory to save new arrived data. */

 

/*******************************************************************************

* Code

******************************************************************************/

 

void DEMO_LPUART_IRQHandler(void)

{

uint8_t data;

uint16_t tmprxIndex = rxIndex;

uint16_t tmptxIndex = txIndex;

 

/* If new data arrived. */

if ((kLPUART_RxDataRegFullFlag)&LPUART_GetStatusFlags(DEMO_LPUART))

{

data = LPUART_ReadByte(DEMO_LPUART);

 

/* If ring buffer is not full, add data to ring buffer. */

if (((tmprxIndex + 1) % DEMO_RING_BUFFER_SIZE) != tmptxIndex)

{

demoRingBuffer[rxIndex] = data;

 

rxIndex++;

rxIndex %= DEMO_RING_BUFFER_SIZE;

printf("Received: %x\n", data);

 

}

}

SDK_ISR_EXIT_BARRIER;

}

 

/*!

* @brief Main function

*/

int main(void)

{

lpuart_config_t config;

uint16_t tmprxIndex = rxIndex;

uint16_t tmptxIndex = txIndex;

 

BOARD_InitPins();

BOARD_InitBootClocks();

BOARD_InitDebugConsole();

 

/*

* config.baudRate_Bps = 115200U;

* config.parityMode = kLPUART_ParityDisabled;

* config.stopBitCount = kLPUART_OneStopBit;

* config.txFifoWatermark = 0;

* config.rxFifoWatermark = 0;

* config.enableTx = false;

* config.enableRx = false;

*/

LPUART_GetDefaultConfig(&config);

config.baudRate_Bps = BOARD_DEBUG_UART_BAUDRATE;

config.enableTx = true;

config.enableRx = true;

 

LPUART_Init(DEMO_LPUART, &config, DEMO_LPUART_CLK_FREQ);

 

/* Send g_tipString out. */

LPUART_WriteBlocking(DEMO_LPUART, g_tipString, sizeof(g_tipString) / sizeof(g_tipString[0]));

 

/* Enable RX interrupt. */

LPUART_EnableInterrupts(DEMO_LPUART, kLPUART_RxDataRegFullInterruptEnable);

EnableIRQ(DEMO_LPUART_IRQn);

 

while (1)

{

/* Send data only when LPUART TX register is empty and ring buffer has data to send out. */

while (kLPUART_TxDataRegEmptyFlag & LPUART_GetStatusFlags(DEMO_LPUART))

{

tmprxIndex = rxIndex;

tmptxIndex = txIndex;

if (tmprxIndex != tmptxIndex)

{

LPUART_WriteByte(DEMO_LPUART, demoRingBuffer[txIndex]);

txIndex++;

txIndex %= DEMO_RING_BUFFER_SIZE;

}

}

}

}

Tags (1)
0 Kudos
Reply