This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

TMS570LC4357 LIN slave mode

Other Parts Discussed in Thread: HALCOGEN

Hi,

I am trying to configure and use the LIN port in slave mode. But I don't receive any interrupt, even thought there is traffic on the bus as I check with oscilloscope.

I am using LIN1. In HALCogen I can not enable the break interrupt and TX interrupt in LIN Global tab. Also when I uncheck the Master Mode check box and generate the code, relevant bit is not changed in GCR1 So I changed the HL_lin.c instead. Here is my HL_lin.c with modifications:

void linInit(void)
{
/* USER CODE BEGIN (2) */
/* USER CODE END */
    /** @b initialize @b LIN */

    /** - Release from reset */
    linREG1->GCR0 = 1U;

    /** - Start LIN configuration 
	*     - Keep state machine in software reset
	*/
    linREG1->GCR1 = 0U;

	/**   - Enable LIN Mode */
    linREG1->GCR1 = 0x40U;
	
    /** - Setup control register 1
    *     - Enable transmitter
    *     - Enable receiver
    *     - Stop when debug mode is entered
    *     - Disable Loopback mode
    *     - Disable / Enable HGENCTRL (Mask filtering with ID-Byte)
    *     - Use enhance checksum
    *     - Enable multi buffer mode
    *     - Disable automatic baudrate adjustment
    *     - Disable sleep mode
	*     - Set LIN module as master
    *     - Enable/Disable parity
    *     - Disable data length control in ID4 and ID5
    */
    linREG1->GCR1 |= 0x03000C40U
                 | (uint32)((uint32)1U << 12U)
                 | (uint32)((uint32)0U << 2U);
					
    /** - Setup maximum baud rate prescaler */
    linREG1->MBRSR = (uint32)5155U;

    /** - Setup baud rate prescaler */
    linREG1->BRS = (uint32)357U;

    /** - Setup RX and TX reception masks */
    linREG1->MASK = ((uint32)((uint32)0xU << 16U) | (uint32)0x10U);

    /** - Setup compare
    *     - Sync delimiter
    *     - Sync break extension
    */
    linREG1->COMP = ((uint32)((uint32)(1U - 1U) << 8U) | ((uint32)13U - 13U));

    /** - Setup response length */
    linREG1->FORMAT = ((linREG1->FORMAT & 0xFFF8FFFFU) | (uint32)(((uint32)8U - 1U) << 16U));

    /** - Set LIN pins functional mode 
    *     - TX
    *     - RX
    *     - CLK
    */
    linREG1->PIO0 = ((uint32)4U | (uint32)2U | (uint32)0U);

    /** - Set LIN pins default output value
    *     - TX
    *     - RX
    *     - CLK
    */
    linREG1->PIO3 = ((uint32)0U | (uint32)0U | (uint32)0U);

    /** - Set LIN pins output direction
    *     - TX
    *     - RX
    *     - CLK
    */
    linREG1->PIO1 = ((uint32)0U | (uint32)0U | (uint32)0U);

    /** - Set LIN pins open drain enable
    *     - TX
    *     - RX
    *     - CLK
    */
    linREG1->PIO6 = ((uint32)0U | (uint32)0U | (uint32)0U);

    /** - Set LIN pins pullup/pulldown enable
    *     - TX
    *     - RX
    *     - CLK
    */
    linREG1->PIO7 = ((uint32)0U | (uint32)0U | (uint32)0U);

    /** - Set LIN pins pullup/pulldown select
    *     - TX
    *     - RX
    *     - CLK
    */
    linREG1->PIO8 = ((uint32)4U | (uint32)2U | (uint32)1U);

    /** - Set interrupt level 
    *     - Bit error level
    *     - Physical bus error level
    *     - Checksum error level
    *     - Inconsistent sync field error level
    *     - No response error level
    *     - Framing error level
    *     - Overrun error level
    *     - Parity error level
    *     - Identifier level
    *     - RX level
    *     - TX level
    *     - Timeout after 3 wakeup signals level
    *     - Timeout after wakeup signal level
    *     - Timeout level
    *     - Wakeup level
    *     - Break detect level
    */
    linREG1->SETINTLVL = ((uint32)0x00000000U
                       | (uint32)0x00000000U
                       | (uint32)0x00000000U
                       | (uint32)0x00000000U
                       | (uint32)0x00000000U
                       | (uint32)0x00000000U
                       | (uint32)0x00000000U
                       | (uint32)0x00000000U
                       | (uint32)0x00000000U
                       | (uint32)0x00000000U
                       | (uint32)0x00000000U
                       | (uint32)0x00000000U
                       | (uint32)0x00000000U
                       | (uint32)0x00000000U
                       | (uint32)0x00000000U
                       | (uint32)0x00000000U);

    /** - Set interrupt enable 
    *     - Enable/Disable bit error
    *     - Enable/Disable physical bus error level
    *     - Enable/Disable checksum error level
    *     - Enable/Disable inconsistent sync field error level
    *     - Enable/Disable no response error level
    *     - Enable/Disable framing error level
    *     - Enable/Disable overrun error level
    *     - Enable/Disable parity error level
    *     - Enable/Disable identifier level
    *     - Enable/Disable RX level
    *     - Enable/Disable TX level
    *     - Enable/Disable timeout after 3 wakeup signals level
    *     - Enable/Disable timeout after wakeup signal level
    *     - Enable/Disable timeout level
    *     - Enable/Disable wakeup level
    *     - Enable/Disable break detect level
    */
    linREG1->SETINT = ((uint32)0x80000000U
                    | (uint32)0x40000000U
                    | (uint32)0x20000000U
                    | (uint32)0x10000000U
                    | (uint32)0x08000000U
                    | (uint32)0x04000000U
                    | (uint32)0x02000000U
                    | (uint32)0x01000000U
                    | (uint32)0x00002000U
                    | (uint32)0x00000200U
                    | (uint32)0x00000100U
                    | (uint32)0x00000000U
                    | (uint32)0x00000000U
                    | (uint32)0x00000000U
                    | (uint32)0x00000002U
                    | (uint32)0x00000001U);

    /** - Finaly start LIN */
    linREG1->GCR1 |= 0x00000080U;
	
    /** @b initialize @b LIN */

    /** - Release from reset */
    linREG2->GCR0 = 1U;

    /** - Start LIN configuration 
	*     - Keep state machine in software reset
	*/
    linREG2->GCR1 = 0U;

	/**   - Enable LIN Mode */
    linREG2->GCR1 = 0x40U;
	
    /** - Setup control register 1
    *     - Enable transmitter
    *     - Enable receiver
    *     - Stop when debug mode is entered
    *     - Disable Loopback mode
    *     - Disable / Enable HGENCTRL (Mask filtering with ID-Byte)
    *     - Use enhance checksum
    *     - Enable multi buffer mode
    *     - Disable automatic baudrate adjustment
    *     - Disable sleep mode
	*     - Set LIN module as master
    *     - Enable/Disable parity
    *     - Disable data length control in ID4 and ID5
    */
    linREG2->GCR1 |= 0x03000C60U 
                 | (uint32)((uint32)1U << 12U)
                 | (uint32)((uint32)0U << 2U);
					
    /** - Setup maximum baud rate prescaler */
    linREG2->MBRSR = (uint32)5155U;

    /** - Setup baud rate prescaler */
    linREG2->BRS = (uint32)357U;

    /** - Setup RX and TX reception masks */
    linREG2->MASK = ((uint32)((uint32)0xFFU << 16U) | (uint32)0xFFU);

    /** - Setup compare
    *     - Sync delimiter
    *     - Sync break extension
    */
    linREG2->COMP = ((uint32)((uint32)(1U - 1U) << 8U) | ((uint32)13U - 13U));

    /** - Setup response length */
    linREG2->FORMAT = ((linREG2->FORMAT & 0xFFF8FFFFU) | (uint32)(((uint32)8U - 1U) << 16U));

    /** - Set LIN pins functional mode 
    *     - TX
    *     - RX
    *     - CLK
    */
    linREG2->PIO0 = ((uint32)4U | (uint32)2U | (uint32)0U);

    /** - Set LIN pins default output value
    *     - TX
    *     - RX
    *     - CLK
    */
    linREG2->PIO3 = ((uint32)0U | (uint32)0U | (uint32)0U);

    /** - Set LIN pins output direction
    *     - TX
    *     - RX
    *     - CLK
    */
    linREG2->PIO1 = ((uint32)0U | (uint32)0U | (uint32)0U);

    /** - Set LIN pins open drain enable
    *     - TX
    *     - RX
    *     - CLK
    */
    linREG2->PIO6 = ((uint32)0U | (uint32)0U | (uint32)0U);

    /** - Set LIN pins pullup/pulldown enable
    *     - TX
    *     - RX
    *     - CLK
    */
    linREG2->PIO7 = ((uint32)0U | (uint32)0U | (uint32)0U);

    /** - Set LIN pins pullup/pulldown select
    *     - TX
    *     - RX
    *     - CLK
    */
    linREG2->PIO8 = ((uint32)4U | (uint32)2U | (uint32)1U);

    /** - Set interrupt level 
    *     - Bit error level
    *     - Physical bus error level
    *     - Checksum error level
    *     - Inconsistent sync field error level
    *     - No response error level
    *     - Framing error level
    *     - Overrun error level
    *     - Parity error level
    *     - Identifier level
    *     - RX level
    *     - TX level
    *     - Timeout after 3 wakeup signals level
    *     - Timeout after wakeup signal level
    *     - Timeout level
    *     - Wakeup level
    *     - Break detect level
    */
    linREG2->SETINTLVL = ((uint32)0x00000000U
                       | (uint32)0x00000000U
                       | (uint32)0x00000000U
                       | (uint32)0x00000000U
                       | (uint32)0x00000000U
                       | (uint32)0x00000000U
                       | (uint32)0x00000000U
                       | (uint32)0x00000000U
                       | (uint32)0x00000000U
                       | (uint32)0x00000000U
                       | (uint32)0x00000000U
                       | (uint32)0x00000000U
                       | (uint32)0x00000000U
                       | (uint32)0x00000000U
                       | (uint32)0x00000000U
                       | (uint32)0x00000000U);

    /** - Set interrupt enable 
    *     - Enable/Disable bit error
    *     - Enable/Disable physical bus error level
    *     - Enable/Disable checksum error level
    *     - Enable/Disable inconsistent sync field error level
    *     - Enable/Disable no response error level
    *     - Enable/Disable framing error level
    *     - Enable/Disable overrun error level
    *     - Enable/Disable parity error level
    *     - Enable/Disable identifier level
    *     - Enable/Disable RX level
    *     - Enable/Disable TX level
    *     - Enable/Disable timeout after 3 wakeup signals level
    *     - Enable/Disable timeout after wakeup signal level
    *     - Enable/Disable timeout level
    *     - Enable/Disable wakeup level
    *     - Enable/Disable break detect level
    */
    linREG2->SETINT = ((uint32)0x00000000U
                    | (uint32)0x00000000U
                    | (uint32)0x00000000U
                    | (uint32)0x00000000U
                    | (uint32)0x00000000U
                    | (uint32)0x00000000U
                    | (uint32)0x00000000U
                    | (uint32)0x00000000U
                    | (uint32)0x00000000U
                    | (uint32)0x00000200U
                    | (uint32)0x00000000U
                    | (uint32)0x00000000U
                    | (uint32)0x00000000U
                    | (uint32)0x00000000U
                    | (uint32)0x00000000U
                    | (uint32)0x00000000U);

    /** - Finaly start LIN */
    linREG2->GCR1 |= 0x00000080U;
	

/* USER CODE BEGIN (3) */
/* USER CODE END */
}

Thanks,

Sa