查看: 4266|回复: 0

[分享] LPC54608 LIN从站基本用法共享

[复制链接]
  • TA的每日心情
    开心
    2025-7-11 08:53
  • 签到天数: 301 天

    连续签到: 2 天

    [LV.8]以坛为家I

    3875

    主题

    7479

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    39287
    最后登录
    2025-7-22
    发表于 2020-12-31 11:03:55 | 显示全部楼层 |阅读模式
    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收发器电路如下:
    21.png
    图2-1。 LIN收发器原理图


    2.1.1 LPCXpresso54608和TRK-KEA8连接

         LPCXpresso54608 UART端口需要连接到LIN收发器:
    22.png
    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物理连接
    20.png
    2.2软件流程和代码
           这部分是关于LIN发布者数据和LIN主从之间的订户ID数据。该代码是根据SDK LPCXpresso54608 usart中断项目进行修改的。

    2.2.1软件流程图
    23.png
    2.2.2软件代码

       根据SDK_2.3.0_LPCXpresso54608 usart中断修改代码,修改后的代码如下:
    1. void DEMO_USART_IRQHandler(void)
    2. {
    3.    
    4.   if(DEMO_USART->STAT & USART_INTENSET_DELTARXBRKEN_MASK) // detect LIN break
    5.      {
    6.        DEMO_USART->STAT |= USART_INTENSET_DELTARXBRKEN_MASK;// clear the bit
    7.        Lin_BKflag = 1;
    8.        cnt = 0;
    9.        state = RECV_SYN;
    10.        DisableLinBreak;
    11.       
    12.      }
    13.     if((kUSART_RxFifoNotEmptyFlag | kUSART_RxError) & USART_GetStatusFlags(DEMO_USART))
    14.      {
    15.        USART_ClearStatusFlags(DEMO_USART,kUSART_TxError | kUSART_RxError);
    16.           rxbuff[cnt] = USART_ReadByte(DEMO_USART);;
    17.          
    18.          switch(state)
    19.          {
    20.             case RECV_SYN:
    21.                           if(0x55 == rxbuff[cnt])
    22.                           {
    23.                               state = RECV_PID;
    24.                           }
    25.                           else
    26.                           {
    27.                               state = IDLE;
    28.                               DisableLinBreak;
    29.                           }
    30.                           break;
    31.             case RECV_PID:
    32.                           if(0xAD == rxbuff[cnt])
    33.                           {
    34.                               state = RECV_DATA;
    35.                           }
    36.                           else if(0XEC == rxbuff[cnt])
    37.                           {
    38.                               state = SEND_DATA;
    39.                           }
    40.                           else
    41.                           {
    42.                               state = IDLE;
    43.                               DisableLinBreak;
    44.                           }
    45.                           break;
    46.             case RECV_DATA:
    47.                           recdatacnt++;
    48.                           if(recdatacnt >= 4) // 3 Bytes data + 1 Bytes checksum
    49.                           {
    50.                               recdatacnt=0;
    51.                               state = RECV_SYN;
    52.                               EnableLinBreak;
    53.                           }
    54.                           break;
    55.          default:break;
    56.                           
    57.          }
    58.          
    59.          cnt++;
    60.      }
    61.   

    62.     /* Add for ARM errata 838869, affects Cortex-M4, Cortex-M4F Store immediate overlapping
    63.       exception return operation might vector to incorrect interrupt */
    64. #if defined __CORTEX_M && (__CORTEX_M == 4U)
    65.     __DSB();
    66. #endif
    67. }

    68. /*!
    69. * @brief Main function
    70. */
    71. int main(void)
    72. {
    73.     usart_config_t config;

    74.     /* attach 12 MHz clock to FLEXCOMM0 (debug console) */
    75.     CLOCK_AttachClk(BOARD_DEBUG_UART_CLK_ATTACH);

    76.     BOARD_InitPins();
    77.     BOARD_BootClockFROHF48M();
    78.     BOARD_InitDebugConsole();

    79.     /*
    80.      * config.baudRate_Bps = 19200U;
    81.      * config.parityMode = kUSART_ParityDisabled;
    82.      * config.stopBitCount = kUSART_OneStopBit;
    83.      * config.loopback = false;
    84.      * config.enableTxFifo = false;
    85.      * config.enableRxFifo = false;
    86.      */
    87.     USART_GetDefaultConfig(&config);
    88.     config.baudRate_Bps = BOARD_DEBUG_UART_BAUDRATE;
    89.     config.enableTx = true;
    90.     config.enableRx = true;

    91.     USART_Init(DEMO_USART, &config, DEMO_USART_CLK_FREQ);

    92.     /* Enable RX interrupt. */
    93.     DEMO_USART->INTENSET |= USART_INTENSET_DELTARXBRKEN_MASK; //USART_INTENSET_STARTEN_MASK |
    94.     USART_EnableInterrupts(DEMO_USART, kUSART_RxLevelInterruptEnable | kUSART_RxErrorInterruptEnable);
    95.     EnableIRQ(DEMO_USART_IRQn);


    96.     while (1)
    97.     {
    98.   
    99.        if(state == SEND_DATA)
    100.        {

    101.         while (kUSART_TxFifoNotFullFlag & USART_GetStatusFlags(DEMO_USART))
    102.         {
    103.             USART_WriteByte(DEMO_USART, 0X01);
    104.             break;  //just send one byte, otherwise, will send 16 bytes
    105.         }
    106.         while (kUSART_TxFifoNotFullFlag & USART_GetStatusFlags(DEMO_USART))
    107.         {
    108.             USART_WriteByte(DEMO_USART, 0X02);
    109.             break;  //just send one byte, otherwise, will send 16 bytes
    110.         }
    111.         while (kUSART_TxFifoNotFullFlag & USART_GetStatusFlags(DEMO_USART))
    112.         {
    113.             USART_WriteByte(DEMO_USART, 0X10);// 0X10 correct 0Xaa wrong
    114.             break;  //just send one byte, otherwise, will send 16 bytes            
    115.         }
    116.    
    117.           recdatacnt=0;
    118.           state = RECV_SYN;
    119.           EnableLinBreak;
    120.        }     
    121.     }
    122. }
    复制代码
    3 LPC54608 LIN从站测试结果


    主要定义两个框架:
    24.png
    现在,LIN主机将上述两个帧发送到从机LIN,给出测试结果和来自LIN总线的波形。

    3.1 LIN主站配置

    Uart波特率是:19200bps
    25.png
    3.2发送0X2C,0X2D帧
    26.png

    从上面的测试结果中,我们可以发现0X2D发送成功,0X2C可以从LIN保存端接收数据,接收到的数据为0X01,0X02,校验和为0x10。
    3.2.1 0X2D帧LIN总线波形和调试结果
    27.png
    28.png


    从LIN从站的调试结果中,我们可以发现LIN从站可以从LIN主站接收正确的数据,并且经过检查后,校验和也正确。


    3.2.2 0X2C帧LIN总线波
    29.png
    30.png


    从LIN主机工具界面,我们可以找到从机是否给出了错误的校验和0XAA,主机也可以发现校验和是错误的。


    这是错误校验和的LIN总线波形。
    31.png



    从以上测试结果中,我们可以找到LPC54608 LIN从机,可以接收正确的LIN总线数据,并将正确的LIN数据发送回主机。

    qiandao qiandao
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-22 19:10 , Processed in 0.082953 second(s), 19 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表