# LIN-communication between two STM32F4 with a standard LIN-transceiver (Hello World)

I have the following circuit connecting two stm32F4 via the SN65HVDA195-Q1 LIN-transciever.

simulate this circuit – Schematic created using CircuitLab

In the stm32F4 UART-library I found the following LIN implementation:

===============================================================================
LIN mode functions
===============================================================================

This subsection provides a set of functions allowing to manage the USART LIN
Mode communication.

In LIN mode, 8-bit data format with 1 stop bit is required in accordance with
the LIN standard.

Only this LIN Feature is supported by the USART IP:
- LIN Master Synchronous Break send capability and LIN slave break detection
capability :  13-bit break generation and 10/11 bit break detection

USART LIN Master transmitter communication is possible through the following procedure:
1. Program the Baud rate, Word length = 8bits, Stop bits = 1bit, Parity,
Mode transmitter or Mode receiver and hardware flow control values using
the USART_Init() function.
2. Enable the USART using the USART_Cmd() function.
3. Enable the LIN mode using the USART_LINCmd() function.
4. Send the break character using USART_SendBreak() function.

USART LIN Master receiver communication is possible through the following procedure:
1. Program the Baud rate, Word length = 8bits, Stop bits = 1bit, Parity,
Mode transmitter or Mode receiver and hardware flow control values using
the USART_Init() function.
2. Enable the USART using the USART_Cmd() function.
3. Configures the break detection length using the USART_LINBreakDetectLengthConfig()
function.
4. Enable the LIN mode using the USART_LINCmd() function.

@note In LIN mode, the following bits must be kept cleared:
- CLKEN in the USART_CR2 register,
- STOP[1:0], SCEN, HDSEL and IREN in the USART_CR3 register.

@endverbatim
* @{
*/

/**
* @brief  Sets the USART LIN Break detection length.
* @param  USARTx: where x can be 1, 2, 3, 4, 5 or 6 to select the USART or
*         UART peripheral.
* @param  USART_LINBreakDetectLength: specifies the LIN break detection length.
*          This parameter can be one of the following values:
*            @arg USART_LINBreakDetectLength_10b: 10-bit break detection
*            @arg USART_LINBreakDetectLength_11b: 11-bit break detection
* @retval None
*/
void USART_LINBreakDetectLengthConfig(USART_TypeDef* USARTx, uint16_t USART_LINBreakDetectLength)
{
/* Check the parameters */
assert_param(IS_USART_ALL_PERIPH(USARTx));
assert_param(IS_USART_LIN_BREAK_DETECT_LENGTH(USART_LINBreakDetectLength));

USARTx->CR2 &= (uint16_t)~((uint16_t)USART_CR2_LBDL);
USARTx->CR2 |= USART_LINBreakDetectLength;
}

/**
* @brief  Enables or disables the USART's LIN mode.
* @param  USARTx: where x can be 1, 2, 3, 4, 5 or 6 to select the USART or
*         UART peripheral.
* @param  NewState: new state of the USART LIN mode.
*          This parameter can be: ENABLE or DISABLE.
* @retval None
*/
void USART_LINCmd(USART_TypeDef* USARTx, FunctionalState NewState)
{
/* Check the parameters */
assert_param(IS_USART_ALL_PERIPH(USARTx));
assert_param(IS_FUNCTIONAL_STATE(NewState));

if (NewState != DISABLE)
{
/* Enable the LIN mode by setting the LINEN bit in the CR2 register */
USARTx->CR2 |= USART_CR2_LINEN;
}
else
{
/* Disable the LIN mode by clearing the LINEN bit in the CR2 register */
USARTx->CR2 &= (uint16_t)~((uint16_t)USART_CR2_LINEN);
}
}

/**
* @brief  Transmits break characters.
* @param  USARTx: where x can be 1, 2, 3, 4, 5 or 6 to select the USART or
*         UART peripheral.
* @retval None
*/
void USART_SendBreak(USART_TypeDef* USARTx)
{
/* Check the parameters */
assert_param(IS_USART_ALL_PERIPH(USARTx));

/* Send break characters */
USARTx->CR1 |= USART_CR1_SBK;
}

/**
* @}
*/

/** @defgroup USART_Group5 Halfduplex mode function
*  @brief   Half-duplex mode function
*
@verbatim


So far I did not find a small example like "Hello World" of how to use this LIN implementation. In the end I would like to transfer sensor values but an example transmission of some hardcoded nubers should help me.

Edit: To make it more concrete an initialization of the masters and the slaves as well as the sending of the int number "1337" would solve my problem.

• I think it is possible to answer the question in a few lines. I also tried to change the question to one possible answer. – kimliv Apr 1 '14 at 11:54
• here a link to an example for master and slave : mikrocontroller.bplaced.net/wordpress/?page_id=3778 – user40304 Apr 13 '14 at 8:02