Using LPUART2 on FRDM-947 - need to do anything special?

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

Using LPUART2 on FRDM-947 - need to do anything special?

1,013 Views
mkraft
Contributor II

I want to use LPUART2 on the FRDM-947 to take in DMX512 on Core1. It appears I can only use framing error to catch the long break of this protocol. My issue is actually getting this to work at all. 

I get an initial framing error, though it is occurring once right after interrupt enabled and before I start to transmit DMX to the FRDM board.

Here is code snippet to set pins and initialize the uart:

port_pin_config_t pin_cfg = {0};

 

/*

* RX-only DMX lines. Pull-up keeps the pin at a defined MARK

* level when no cable is connected.

*

* P4_3 Alt2 = FC2_RXD_SDA_MOSI_DATA (Flexcomm2 RXD)

* P1_16 Alt2 = FC5_RXD_SDA_MOSI_DATA (Flexcomm5 RXD)

*

* Verify Alt function codes against the MCXN947 RM pin-mux table

* or use the MCUXpresso Pins Config Tool.

*/

pin_cfg.pullSelect = kPORT_PullUp;

pin_cfg.pullValueSelect = kPORT_HighPullResistor;

pin_cfg.inputBuffer = kPORT_InputBufferEnable;

pin_cfg.invertInput = kPORT_InputNormal;

pin_cfg.slewRate = kPORT_SlowSlewRate;

pin_cfg.passiveFilterEnable = kPORT_PassiveFilterDisable;

pin_cfg.openDrainEnable = kPORT_OpenDrainDisable;

 

/* CH0 — P4_3 */

CLOCK_EnableClock(kCLOCK_Port4);

pin_cfg.mux = kPORT_MuxAlt2;

PORT_SetPinConfig(PORT4, 3U, &pin_cfg);

 

/* CH1 — P1_16 */

CLOCK_EnableClock(kCLOCK_Port1);

pin_cfg.mux = kPORT_MuxAlt2;

PORT_SetPinConfig(PORT1, 16U, &pin_cfg);

lpuart_config_t cfg;

uint32_t lpclk;

 

/* Attach FRO12M clock then gate the peripheral */

if (ch == DMX_CH0)

{

CLOCK_AttachClk(kFRO12M_to_FLEXCOMM2);

lpclk = CLOCK_GetLPFlexCommClkFreq(2);

}

else

{

CLOCK_AttachClk(kFRO12M_to_FLEXCOMM5);

lpclk = CLOCK_GetLPFlexCommClkFreq(5);

}

CLOCK_EnableClock(s_lpuart_clock[ch]);

 

 

LPUART_GetDefaultConfig(&cfg);

cfg.baudRate_Bps = DMX_BAUD_RATE;

cfg.parityMode = kLPUART_ParityDisabled;

cfg.dataBitsCount = kLPUART_EightDataBits;

cfg.stopBitCount = kLPUART_TwoStopBit;

cfg.enableRx = true;

cfg.enableTx = false;

cfg.rxFifoWatermark = 0;

 

LPUART_Init(s_lpuart_base[ch], &cfg, lpclk);

 

LPUART_EnableInterrupts(s_lpuart_base[ch],

kLPUART_RxDataRegFullInterruptEnable |

kLPUART_FramingErrorInterruptEnable |

kLPUART_RxOverrunInterruptEnable);

 

NVIC_SetPriority(s_lpuart_irq[ch],

0);

EnableIRQ(s_lpuart_irq[ch]);

Labels (1)
0 Kudos
Reply
1 Reply

960 Views
mkraft
Contributor II

Problem solved.

Flexcomm2 on pins 4_3 and P4_2 for rxd and txd are signals FC2_P3 and FC2_P2 respectively.

Per the reference manual, this is only available when the Flexcomm2 mode is LPUART+LPI2C.

a call to

LP_FLEXCOMM_Init(LPUART_GetInstance(s_lpuart_base[ch]), LP_FLEXCOMM_PERIPH_LPI2CAndLPUART);

must be made after the driver call to LPUART_Init as this function will set the Flexcomm mode to just LPUART.

 

LPFLEXCOMM_INIT_NOT_USED_IN_DRIVER can be defined so that this change doesn't occur as well.

 

0 Kudos
Reply
%3CLINGO-SUB%20id%3D%22lingo-sub-2358078%22%20slang%3D%22en-US%22%20mode%3D%22CREATE%22%3EUsing%20LPUART2%20on%20FRDM-947%20-%20need%20to%20do%20anything%20special%3F%3C%2FLINGO-SUB%3E%3CLINGO-BODY%20id%3D%22lingo-body-2358078%22%20slang%3D%22en-US%22%20mode%3D%22CREATE%22%3E%3CP%3EI%20want%20to%20use%20LPUART2%20on%20the%20FRDM-947%20to%20take%20in%20DMX512%20on%20Core1.%20It%20appears%20I%20can%20only%20use%20framing%20error%20to%20catch%20the%20long%20break%20of%20this%20protocol.%20My%20issue%20is%20actually%20getting%20this%20to%20work%20at%20all.%26nbsp%3B%3C%2FP%3E%3CP%3EI%20get%20an%20initial%20framing%20error%2C%20though%20it%20is%20occurring%20once%20right%20after%20interrupt%20enabled%20and%20before%20I%20start%20to%20transmit%20DMX%20to%20the%20FRDM%20board.%3C%2FP%3E%3CP%3EHere%20is%20code%20snippet%20to%20set%20pins%20and%20initialize%20the%20uart%3A%3C%2FP%3E%3CDIV%3E%3CDIV%3E%3CP%3E%3CSPAN%3Eport_pin_config_t%3C%2FSPAN%3E%3CSPAN%3E%20pin_cfg%20%3D%20%7B0%7D%3B%3C%2FSPAN%3E%3C%2FP%3E%3CBR%20%2F%3E%3CP%3E%3CSPAN%3E%2F*%3C%2FSPAN%3E%3C%2FP%3E%3CP%3E%3CSPAN%3E*%20RX-only%20DMX%20lines.%20Pull-up%20keeps%20the%20pin%20at%20a%20defined%20MARK%3C%2FSPAN%3E%3C%2FP%3E%3CP%3E%3CSPAN%3E*%20level%20when%20no%20cable%20is%20connected.%3C%2FSPAN%3E%3C%2FP%3E%3CP%3E%3CSPAN%3E*%3C%2FSPAN%3E%3C%2FP%3E%3CP%3E%3CSPAN%3E*%20P4_3%20Alt2%20%3D%20FC2_RXD_SDA_MOSI_DATA%20(Flexcomm2%20RXD)%3C%2FSPAN%3E%3C%2FP%3E%3CP%3E%3CSPAN%3E*%20P1_16%20Alt2%20%3D%20FC5_RXD_SDA_MOSI_DATA%20(Flexcomm5%20RXD)%3C%2FSPAN%3E%3C%2FP%3E%3CP%3E%3CSPAN%3E*%3C%2FSPAN%3E%3C%2FP%3E%3CP%3E%3CSPAN%3E*%20Verify%20%3C%2FSPAN%3E%3CSPAN%3EAlt%3C%2FSPAN%3E%3CSPAN%3E%20function%20codes%20against%20the%20MCXN947%20RM%20pin-mux%20table%3C%2FSPAN%3E%3C%2FP%3E%3CP%3E%3CSPAN%3E*%20or%20use%20the%20MCUXpresso%20Pins%20%3C%2FSPAN%3E%3CSPAN%3EConfig%3C%2FSPAN%3E%3CSPAN%3E%20Tool.%3C%2FSPAN%3E%3C%2FP%3E%3CP%3E%3CSPAN%3E*%2F%3C%2FSPAN%3E%3C%2FP%3E%3CP%3E%3CSPAN%3Epin_cfg.%3C%2FSPAN%3E%3CSPAN%3EpullSelect%3C%2FSPAN%3E%3CSPAN%3E%20%3D%20%3C%2FSPAN%3E%3CSPAN%3EkPORT_PullUp%3C%2FSPAN%3E%3CSPAN%3E%3B%3C%2FSPAN%3E%3C%2FP%3E%3CP%3E%3CSPAN%3Epin_cfg.%3C%2FSPAN%3E%3CSPAN%3EpullValueSelect%3C%2FSPAN%3E%3CSPAN%3E%20%3D%20%3C%2FSPAN%3E%3CSPAN%3EkPORT_HighPullResistor%3C%2FSPAN%3E%3CSPAN%3E%3B%3C%2FSPAN%3E%3C%2FP%3E%3CP%3E%3CSPAN%3Epin_cfg.%3C%2FSPAN%3E%3CSPAN%3EinputBuffer%3C%2FSPAN%3E%3CSPAN%3E%20%3D%20%3C%2FSPAN%3E%3CSPAN%3EkPORT_InputBufferEnable%3C%2FSPAN%3E%3CSPAN%3E%3B%3C%2FSPAN%3E%3C%2FP%3E%3CP%3E%3CSPAN%3Epin_cfg.%3C%2FSPAN%3E%3CSPAN%3EinvertInput%3C%2FSPAN%3E%3CSPAN%3E%20%3D%20%3C%2FSPAN%3E%3CSPAN%3EkPORT_InputNormal%3C%2FSPAN%3E%3CSPAN%3E%3B%3C%2FSPAN%3E%3C%2FP%3E%3CP%3E%3CSPAN%3Epin_cfg.%3C%2FSPAN%3E%3CSPAN%3EslewRate%3C%2FSPAN%3E%3CSPAN%3E%20%3D%20%3C%2FSPAN%3E%3CSPAN%3EkPORT_SlowSlewRate%3C%2FSPAN%3E%3CSPAN%3E%3B%3C%2FSPAN%3E%3C%2FP%3E%3CP%3E%3CSPAN%3Epin_cfg.%3C%2FSPAN%3E%3CSPAN%3EpassiveFilterEnable%3C%2FSPAN%3E%3CSPAN%3E%20%3D%20%3C%2FSPAN%3E%3CSPAN%3EkPORT_PassiveFilterDisable%3C%2FSPAN%3E%3CSPAN%3E%3B%3C%2FSPAN%3E%3C%2FP%3E%3CP%3E%3CSPAN%3Epin_cfg.%3C%2FSPAN%3E%3CSPAN%3EopenDrainEnable%3C%2FSPAN%3E%3CSPAN%3E%20%3D%20%3C%2FSPAN%3E%3CSPAN%3EkPORT_OpenDrainDisable%3C%2FSPAN%3E%3CSPAN%3E%3B%3C%2FSPAN%3E%3C%2FP%3E%3CBR%20%2F%3E%3CP%3E%3CSPAN%3E%2F*%20CH0%20%E2%80%94%20P4_3%20*%2F%3C%2FSPAN%3E%3C%2FP%3E%3CP%3E%3CSPAN%3ECLOCK_EnableClock(%3C%2FSPAN%3E%3CSPAN%3EkCLOCK_Port4%3C%2FSPAN%3E%3CSPAN%3E)%3B%3C%2FSPAN%3E%3C%2FP%3E%3CP%3E%3CSPAN%3Epin_cfg.%3C%2FSPAN%3E%3CSPAN%3Emux%3C%2FSPAN%3E%3CSPAN%3E%20%3D%20%3C%2FSPAN%3E%3CSPAN%3EkPORT_MuxAlt2%3C%2FSPAN%3E%3CSPAN%3E%3B%3C%2FSPAN%3E%3C%2FP%3E%3CP%3E%3CSPAN%3EPORT_SetPinConfig(PORT4%2C%203U%2C%20%26amp%3Bpin_cfg)%3B%3C%2FSPAN%3E%3C%2FP%3E%3CBR%20%2F%3E%3CP%3E%3CSPAN%3E%2F*%20CH1%20%E2%80%94%20P1_16%20*%2F%3C%2FSPAN%3E%3C%2FP%3E%3CP%3E%3CSPAN%3ECLOCK_EnableClock(%3C%2FSPAN%3E%3CSPAN%3EkCLOCK_Port1%3C%2FSPAN%3E%3CSPAN%3E)%3B%3C%2FSPAN%3E%3C%2FP%3E%3CP%3E%3CSPAN%3Epin_cfg.%3C%2FSPAN%3E%3CSPAN%3Emux%3C%2FSPAN%3E%3CSPAN%3E%20%3D%20%3C%2FSPAN%3E%3CSPAN%3EkPORT_MuxAlt2%3C%2FSPAN%3E%3CSPAN%3E%3B%3C%2FSPAN%3E%3C%2FP%3E%3CP%3E%3CSPAN%3EPORT_SetPinConfig(PORT1%2C%2016U%2C%20%26amp%3Bpin_cfg)%3B%3C%2FSPAN%3E%3C%2FP%3E%3C%2FDIV%3E%3C%2FDIV%3E%3CDIV%3E%3CP%3E%3CSPAN%3Elpuart_config_t%3C%2FSPAN%3E%3CSPAN%3E%20cfg%3B%3C%2FSPAN%3E%3C%2FP%3E%3CP%3E%3CSPAN%3Euint32_t%3C%2FSPAN%3E%3CSPAN%3E%20lpclk%3B%3C%2FSPAN%3E%3C%2FP%3E%3CBR%20%2F%3E%3CP%3E%3CSPAN%3E%2F*%20Attach%20FRO12M%20clock%20then%20gate%20the%20peripheral%20*%2F%3C%2FSPAN%3E%3C%2FP%3E%3CP%3E%3CSPAN%3Eif%3C%2FSPAN%3E%3CSPAN%3E%20(ch%20%3D%3D%20DMX_CH0)%3C%2FSPAN%3E%3C%2FP%3E%3CP%3E%3CSPAN%3E%7B%3C%2FSPAN%3E%3C%2FP%3E%3CP%3E%3CSPAN%3ECLOCK_AttachClk(%3C%2FSPAN%3E%3CSPAN%3EkFRO12M_to_FLEXCOMM2%3C%2FSPAN%3E%3CSPAN%3E)%3B%3C%2FSPAN%3E%3C%2FP%3E%3CP%3E%3CSPAN%3Elpclk%20%3D%20CLOCK_GetLPFlexCommClkFreq(2)%3B%3C%2FSPAN%3E%3C%2FP%3E%3CP%3E%3CSPAN%3E%7D%3C%2FSPAN%3E%3C%2FP%3E%3CP%3E%3CSPAN%3Eelse%3C%2FSPAN%3E%3C%2FP%3E%3CP%3E%3CSPAN%3E%7B%3C%2FSPAN%3E%3C%2FP%3E%3CP%3E%3CSPAN%3ECLOCK_AttachClk(%3C%2FSPAN%3E%3CSPAN%3EkFRO12M_to_FLEXCOMM5%3C%2FSPAN%3E%3CSPAN%3E)%3B%3C%2FSPAN%3E%3C%2FP%3E%3CP%3E%3CSPAN%3Elpclk%20%3D%20CLOCK_GetLPFlexCommClkFreq(5)%3B%3C%2FSPAN%3E%3C%2FP%3E%3CP%3E%3CSPAN%3E%7D%3C%2FSPAN%3E%3C%2FP%3E%3CP%3E%3CSPAN%3ECLOCK_EnableClock(s_lpuart_clock%5Bch%5D)%3B%3C%2FSPAN%3E%3C%2FP%3E%3CBR%20%2F%3E%3CBR%20%2F%3E%3CP%3E%3CSPAN%3ELPUART_GetDefaultConfig(%26amp%3Bcfg)%3B%3C%2FSPAN%3E%3C%2FP%3E%3CP%3E%3CSPAN%3Ecfg.%3C%2FSPAN%3E%3CSPAN%3EbaudRate_Bps%3C%2FSPAN%3E%3CSPAN%3E%20%3D%20DMX_BAUD_RATE%3B%3C%2FSPAN%3E%3C%2FP%3E%3CP%3E%3CSPAN%3Ecfg.%3C%2FSPAN%3E%3CSPAN%3EparityMode%3C%2FSPAN%3E%3CSPAN%3E%20%3D%20%3C%2FSPAN%3E%3CSPAN%3EkLPUART_ParityDisabled%3C%2FSPAN%3E%3CSPAN%3E%3B%3C%2FSPAN%3E%3C%2FP%3E%3CP%3E%3CSPAN%3Ecfg.%3C%2FSPAN%3E%3CSPAN%3EdataBitsCount%3C%2FSPAN%3E%3CSPAN%3E%20%3D%20%3C%2FSPAN%3E%3CSPAN%3EkLPUART_EightDataBits%3C%2FSPAN%3E%3CSPAN%3E%3B%3C%2FSPAN%3E%3C%2FP%3E%3CP%3E%3CSPAN%3Ecfg.%3C%2FSPAN%3E%3CSPAN%3EstopBitCount%3C%2FSPAN%3E%3CSPAN%3E%20%3D%20%3C%2FSPAN%3E%3CSPAN%3EkLPUART_TwoStopBit%3C%2FSPAN%3E%3CSPAN%3E%3B%3C%2FSPAN%3E%3C%2FP%3E%3CP%3E%3CSPAN%3Ecfg.%3C%2FSPAN%3E%3CSPAN%3EenableRx%3C%2FSPAN%3E%3CSPAN%3E%20%3D%20true%3B%3C%2FSPAN%3E%3C%2FP%3E%3CP%3E%3CSPAN%3Ecfg.%3C%2FSPAN%3E%3CSPAN%3EenableTx%3C%2FSPAN%3E%3CSPAN%3E%20%3D%20false%3B%3C%2FSPAN%3E%3C%2FP%3E%3CP%3E%3CSPAN%3Ecfg.%3C%2FSPAN%3E%3CSPAN%3ErxFifoWatermark%3C%2FSPAN%3E%3CSPAN%3E%20%3D%200%3B%3C%2FSPAN%3E%3C%2FP%3E%3CBR%20%2F%3E%3CP%3E%3CSPAN%3ELPUART_Init(s_lpuart_base%5Bch%5D%2C%20%26amp%3Bcfg%2C%20lpclk)%3B%3C%2FSPAN%3E%3C%2FP%3E%3CBR%20%2F%3E%3CDIV%3E%3CP%3E%3CSPAN%3ELPUART_EnableInterrupts(s_lpuart_base%5Bch%5D%2C%3C%2FSPAN%3E%3C%2FP%3E%3CP%3E%3CSPAN%3EkLPUART_RxDataRegFullInterruptEnable%3C%2FSPAN%3E%3CSPAN%3E%20%7C%3C%2FSPAN%3E%3C%2FP%3E%3CP%3E%3CSPAN%3EkLPUART_FramingErrorInterruptEnable%3C%2FSPAN%3E%3CSPAN%3E%20%7C%3C%2FSPAN%3E%3C%2FP%3E%3CP%3E%3CSPAN%3EkLPUART_RxOverrunInterruptEnable%3C%2FSPAN%3E%3CSPAN%3E)%3B%3C%2FSPAN%3E%3C%2FP%3E%3CBR%20%2F%3E%3CP%3E%3CSPAN%3ENVIC_SetPriority(s_lpuart_irq%5Bch%5D%2C%3C%2FSPAN%3E%3C%2FP%3E%3CP%3E%3CSPAN%3E0)%3B%3C%2FSPAN%3E%3C%2FP%3E%3CP%3E%3CSPAN%3EEnableIRQ(s_lpuart_irq%5Bch%5D)%3B%3C%2FSPAN%3E%3C%2FP%3E%3C%2FDIV%3E%3C%2FDIV%3E%3C%2FLINGO-BODY%3E%3CLINGO-LABS%20id%3D%22lingo-labs-2358078%22%20slang%3D%22en-US%22%20mode%3D%22CREATE%22%3E%3CLINGO-LABEL%3EMCXN%3C%2FLINGO-LABEL%3E%3C%2FLINGO-LABS%3E%3CLINGO-SUB%20id%3D%22lingo-sub-2358708%22%20slang%3D%22en-US%22%20mode%3D%22CREATE%22%20translate%3D%22no%22%3ERe%3A%20Using%20LPUART2%20on%20FRDM-947%20-%20need%20to%20do%20anything%20special%3F%3C%2FLINGO-SUB%3E%3CLINGO-BODY%20id%3D%22lingo-body-2358708%22%20slang%3D%22en-US%22%20mode%3D%22CREATE%22%3E%3CP%3EProblem%20solved.%3C%2FP%3E%3CP%3EFlexcomm2%20on%20pins%204_3%20and%20P4_2%20for%20rxd%20and%20txd%20are%20signals%20FC2_P3%20and%20FC2_P2%20respectively.%3C%2FP%3E%3CP%3EPer%20the%20reference%20manual%2C%20this%20is%20only%20available%20when%20the%20Flexcomm2%20mode%20is%20LPUART%2BLPI2C.%3C%2FP%3E%3CP%3Ea%20call%20to%3C%2FP%3E%3CDIV%3E%3CDIV%3E%3CP%3E%3CSPAN%3ELP_FLEXCOMM_Init(LPUART_GetInstance(s_lpuart_base%5Bch%5D)%2C%20%3C%2FSPAN%3E%3CSPAN%3ELP_FLEXCOMM_PERIPH_LPI2CAndLPUART%3C%2FSPAN%3E%3CSPAN%3E)%3B%3C%2FSPAN%3E%3C%2FP%3E%3CP%3Emust%20be%20made%20after%20the%20driver%20call%20to%20%3CSPAN%3ELPUART_Init%20as%20this%20function%20will%20set%20the%20Flexcomm%20mode%20to%20just%20LPUART.%3C%2FSPAN%3E%3C%2FP%3E%3CBR%20%2F%3E%3CP%3E%3CSPAN%3E%3CSPAN%3ELPFLEXCOMM_INIT_NOT_USED_IN_DRIVER%20can%20be%20defined%20so%20that%20this%20change%20doesn't%20occur%20as%20well.%3C%2FSPAN%3E%3C%2FSPAN%3E%3C%2FP%3E%3CBR%20%2F%3E%3C%2FDIV%3E%3C%2FDIV%3E%3C%2FLINGO-BODY%3E