在线时间4752 小时
UID3441752
注册时间2017-11-21
NXP金币82814
TA的每日心情 | 开心 2025-7-11 08:53 |
---|
签到天数: 301 天 连续签到: 2 天 [LV.8]以坛为家I
管理员
  
- 积分
- 39287
- 最后登录
- 2025-7-22
|
LPC54608 LIN从站基本用法共享 1摘要
这篇文章主要是关于LPC54608 LIN从站的基本用法,它类似于关于LPC54608 LIN主站的基本用法。
恩智浦LPC54608 UART模块已经具有LIN主站和从站功能,因此本文将提供与LIN分析器相关的简单从站代码和测试结果。使用LIN分析器作为LIN主设备,使用LPC54608作为LIN从设备,主设备将特定的ID帧(发布帧和订阅帧)发送到LIN从设备,并等待LIN从设备侧的反馈。
2 LPC54608 LIN从站示例
现在,将LPCXpresso54608板用作LIN从站,将PCAN-USB Pro FD LIN分析仪用作LIN主站,提供有关LIN从站的硬件连接和简单的软件代码。
2.1硬件要求
硬件:LPCXpresso54608,TRK-KEA8,PCAN-USB Pro FD(LIN分析仪),12V直流电源
LIN总线电压为12V,但是LPCXpresso54608板上没有板载LIN收发器芯片,因此我们需要找到包含LIN收发器芯片的外部板,这里我们将使用TRK-KEA8,该板已经有MC33662LEF LIN收发器,或LPC54608 LIN主帖子中提到的板KIT33662LEFEVB。 TRK-KEA8的MC33662LEF LIN收发器电路如下:
图2-1。 LIN收发器原理图
2.1.1 LPCXpresso54608和TRK-KEA8连接
LPCXpresso54608 UART端口需要连接到LIN收发器:
2.1.2 TRK-KEA8和LIN主分析仪工具连接
LIN分析器LIN总线连接到TRK-KEA8 LIN总线。
LIN分析仪GND连接到TRK-KEA8 GND。
TRK-KEA8 P1端口使用12V供电,LIN主分析仪的Vbat引脚也需要连接到12V。
TRK-KEA8 J13_2需要连接到3.3V直流电源,但是由于TRK-KEA8是5V和12V,因此需要寻找另一个3.3V电源来连接J13_2,这里使用FRDM-KL43作为3.3V电源。只要确保LIN收发器可以输入3.3V并将3.3V信号输出到UART端口即可。
2.1.3物理连接
2.2软件流程和代码
这部分是关于LIN发布者数据和LIN主从之间的订户ID数据。该代码是根据SDK LPCXpresso54608 usart中断项目进行修改的。
2.2.1软件流程图
2.2.2软件代码
根据SDK_2.3.0_LPCXpresso54608 usart中断修改代码,修改后的代码如下:
- void DEMO_USART_IRQHandler(void)
- {
-
- if(DEMO_USART->STAT & USART_INTENSET_DELTARXBRKEN_MASK) // detect LIN break
- {
- DEMO_USART->STAT |= USART_INTENSET_DELTARXBRKEN_MASK;// clear the bit
- Lin_BKflag = 1;
- cnt = 0;
- state = RECV_SYN;
- DisableLinBreak;
-
- }
- if((kUSART_RxFifoNotEmptyFlag | kUSART_RxError) & USART_GetStatusFlags(DEMO_USART))
- {
- USART_ClearStatusFlags(DEMO_USART,kUSART_TxError | kUSART_RxError);
- rxbuff[cnt] = USART_ReadByte(DEMO_USART);;
-
- switch(state)
- {
- case RECV_SYN:
- if(0x55 == rxbuff[cnt])
- {
- state = RECV_PID;
- }
- else
- {
- state = IDLE;
- DisableLinBreak;
- }
- break;
- case RECV_PID:
- if(0xAD == rxbuff[cnt])
- {
- state = RECV_DATA;
- }
- else if(0XEC == rxbuff[cnt])
- {
- state = SEND_DATA;
- }
- else
- {
- state = IDLE;
- DisableLinBreak;
- }
- break;
- case RECV_DATA:
- recdatacnt++;
- if(recdatacnt >= 4) // 3 Bytes data + 1 Bytes checksum
- {
- recdatacnt=0;
- state = RECV_SYN;
- EnableLinBreak;
- }
- break;
- default:break;
-
- }
-
- cnt++;
- }
-
-
- /* Add for ARM errata 838869, affects Cortex-M4, Cortex-M4F Store immediate overlapping
- exception return operation might vector to incorrect interrupt */
- #if defined __CORTEX_M && (__CORTEX_M == 4U)
- __DSB();
- #endif
- }
- /*!
- * @brief Main function
- */
- int main(void)
- {
- usart_config_t config;
- /* attach 12 MHz clock to FLEXCOMM0 (debug console) */
- CLOCK_AttachClk(BOARD_DEBUG_UART_CLK_ATTACH);
- BOARD_InitPins();
- BOARD_BootClockFROHF48M();
- BOARD_InitDebugConsole();
- /*
- * config.baudRate_Bps = 19200U;
- * config.parityMode = kUSART_ParityDisabled;
- * config.stopBitCount = kUSART_OneStopBit;
- * config.loopback = false;
- * config.enableTxFifo = false;
- * config.enableRxFifo = false;
- */
- USART_GetDefaultConfig(&config);
- config.baudRate_Bps = BOARD_DEBUG_UART_BAUDRATE;
- config.enableTx = true;
- config.enableRx = true;
- USART_Init(DEMO_USART, &config, DEMO_USART_CLK_FREQ);
- /* Enable RX interrupt. */
- DEMO_USART->INTENSET |= USART_INTENSET_DELTARXBRKEN_MASK; //USART_INTENSET_STARTEN_MASK |
- USART_EnableInterrupts(DEMO_USART, kUSART_RxLevelInterruptEnable | kUSART_RxErrorInterruptEnable);
- EnableIRQ(DEMO_USART_IRQn);
- while (1)
- {
-
- if(state == SEND_DATA)
- {
- while (kUSART_TxFifoNotFullFlag & USART_GetStatusFlags(DEMO_USART))
- {
- USART_WriteByte(DEMO_USART, 0X01);
- break; //just send one byte, otherwise, will send 16 bytes
- }
- while (kUSART_TxFifoNotFullFlag & USART_GetStatusFlags(DEMO_USART))
- {
- USART_WriteByte(DEMO_USART, 0X02);
- break; //just send one byte, otherwise, will send 16 bytes
- }
- while (kUSART_TxFifoNotFullFlag & USART_GetStatusFlags(DEMO_USART))
- {
- USART_WriteByte(DEMO_USART, 0X10);// 0X10 correct 0Xaa wrong
- break; //just send one byte, otherwise, will send 16 bytes
- }
-
- recdatacnt=0;
- state = RECV_SYN;
- EnableLinBreak;
- }
- }
- }
复制代码 3 LPC54608 LIN从站测试结果
主要定义两个框架:
现在,LIN主机将上述两个帧发送到从机LIN,给出测试结果和来自LIN总线的波形。
3.1 LIN主站配置
Uart波特率是:19200bps
3.2发送0X2C,0X2D帧
从上面的测试结果中,我们可以发现0X2D发送成功,0X2C可以从LIN保存端接收数据,接收到的数据为0X01,0X02,校验和为0x10。
3.2.1 0X2D帧LIN总线波形和调试结果
从LIN从站的调试结果中,我们可以发现LIN从站可以从LIN主站接收正确的数据,并且经过检查后,校验和也正确。
3.2.2 0X2C帧LIN总线波
从LIN主机工具界面,我们可以找到从机是否给出了错误的校验和0XAA,主机也可以发现校验和是错误的。
这是错误校验和的LIN总线波形。
从以上测试结果中,我们可以找到LPC54608 LIN从机,可以接收正确的LIN总线数据,并将正确的LIN数据发送回主机。
|
|