LPC54608 LIN slave basic usage sharing

Document created by Kerry Zhou Employee on Sep 17, 2018Last modified by Kerry Zhou Employee on Sep 17, 2018
Version 2Show Document
  • View in full screen mode

1 Abstract

      This post is mainly about the LPC54608 LIN slave basic usage, it is similar to the post about the LPC54608 LIN master basic usage.     

      NXP LPC54608 UART module already have the LIN master and slave function, so this post will give a simple slave code and test result which is associated with the LIN analyzer. Use the LIN analyzer as the LIN master, LPC54608 as the LIN slave, master will send the specific ID frame (publish frame and the subscribe frame) to LIN slave, and wait the feedback from LIN slave side.

2 LPC54608 LIN slave example

     Now use the LPCXpresso54608 board as the LIN slave, the PCAN-USB Pro FD LIN analyzer as the LIN master, give the hardware connection and the simple software code about the LIN slave.

2.1 Hardware requirement

       HardwareLPCXpresso54608TRK-KEA8PCAN-USB Pro FD(LIN analyzer), 12V DC power supply

       LIN bus voltage is 12V, but the LPCXpresso54608 board don’t have the on-board LIN transceiver chip, so we need to find the external board which contains LIN transceiver chip, here we will use the TRK-KEA8, this board already have the MC33662LEF LIN transceiver, or the board KIT33662LEFEVB which is mentioned in the LPC54608 LIN master post.  The MC33662LEF LIN transceiver circuit from TRK-KEA8 just as follows:

Fig 2-1. LIN transceiver schematic

2.1.1 LPCXpresso54608 and TRK-KEA8 connections

     LPCXpresso54608 UART port need to connect to the LIN transceiver:

No.

LPCXpresso54608

TRK-KEA8

note

1

P4_RX

J10-5

UART0_RX

2

P4_TX

J10-6

UART0_TX

3

P4_GND

J14-1

GND

2.1.2 TRK-KEA8 and LIN master analyzer tool connections

       LIN analyzer LIN bus is connected to the TRK-KEA8 LIN bus.

       LIN analyzer GND is connected to the TRK-KEA8 GND.     

       TRK-KEA8 P1 port powered with 12V, LIN master analyzer Vbat pin also need to be connected to 12V.

       TRK-KEA8 J13_2 need to connect to 3.3V DC power, but because TRK-KEA8 is the 5V and 12V, so need to find another 3.3V supply to connect J13_2, here use the FRDM-KL43 as the 3.3V supply. Just make sure the LIN transceiver can input 3.3V and output the 3.3V signal to the UART port.   

2.1.3 Physical connections

2.2 Software flow and code

       This part is about the LIN publisher data and the subscriber ID data between the LIN master and slave. The code is modified based on the SDK  LPCXpresso54608 usart interrupt project.

 2.2.1 software flow chart

 

2.2.2 software code

   Code is modified based on SDK_2.3.0_LPCXpresso54608 usart interrupt, the modified code is as follows:

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 slave test result

  Master define two frames

Unconditional ID

Protected ID

Direction

Data

checksum

0X2C

0XEC

subscriber

0x01,0x02

0x10

0X2D

0XAD

Publisher

0x01,0x02,0x03

0x4c

  Now, LIN master send the above two frame to the slave LIN, give the test result and the wave from the LIN bus.

3.1 LIN master configuration

Uart baud rate is: 19200bps

3.2 send 0X2C,0X2D frames

From the above test result, we can find 0X2D send successfully, 0X2C can receive the data from the LIN save side, the received data is 0X01,0X02 and the checksum 0x10.

3.2.1 0X2D frame LIN bus wave and debug result

 

From the LIN slave debug result, we can find LIN slave can receive the correct data from the LIN master, and after check, the checksum also correct.

3.2.2 0X2C frame LIN bus wave

From the LIN Master tool interface, we can find if the slave give the wrong checksum 0XAA, the master will also can find the checksum is wrong.

This is the according LIN bus wave with wrong checksum.

From the above test result, we can find LPC54608 LIN slave, can receive the correct LIN bus data, and send back the correct LIN data to the master.

1 person found this helpful

Outcomes