Lin Bus Code Example 1 For Arduino DUE
Lin Bus Code Example 1 For Arduino DUE
/**
* \brief Configure USART to work in LIN mode and act as a LIN master.
*
* \note By default, the transmitter and receiver aren't enabled.
*
* \param p_usart Pointer to a USART instance.
* \param ul_baudrate Baudrate to be used.
* \param ul_mck USART module input clock frequency.
*
* \retval 0 on success.
* \retval 1 on failure.
*/
uint32_t usart_init_lin_master(Usart *p_usart,uint32_t ul_baudrate,
uint32_t ul_mck)
{
/* Reset the USART and shut down TX and RX. */
usart_reset(p_usart);
usart_enable_rx(p_usart);
usart_enable_tx(p_usart);
return 0;
}
/**
* \brief Configure USART to work in LIN mode and act as a LIN slave.
*
* \note By default, the transmitter and receiver aren't enabled.
*
* \param p_usart Pointer to a USART instance.
* \param ul_baudrate Baudrate to be used.
* \param ul_mck USART module input clock frequency.
*
* \retval 0 on success.
* \retval 1 on failure.
*/
uint32_t usart_init_lin_slave(Usart *p_usart, uint32_t ul_baudrate,
uint32_t ul_mck)
{
/* Reset the USART and shut down TX and RX. */
usart_reset(p_usart);
usart_enable_rx(p_usart);
usart_enable_tx(p_usart);
return 0;
}
/**
* \brief Abort the current LIN transmission.
*
* \param p_usart Pointer to a USART instance.
*/
void usart_lin_abort_tx(Usart *p_usart)
{
p_usart->US_CR = US_CR_LINABT;
}
/**
* \brief Send a wakeup signal on the LIN bus.
*
* \param p_usart Pointer to a USART instance.
*/
void usart_lin_send_wakeup_signal(Usart *p_usart)
{
p_usart->US_CR = US_CR_LINWKUP;
}
/**
* \brief Configure the LIN node action, which should be one of PUBLISH,
* SUBSCRIBE or IGNORE.
*
* \param p_usart Pointer to a USART instance.
* \param uc_action 0 for PUBLISH, 1 for SUBSCRIBE, 2 for IGNORE.
*/
void usart_lin_set_node_action(Usart *p_usart, uint8_t uc_action)
{
p_usart->US_LINMR = (p_usart->US_LINMR & ~US_LINMR_NACT_Msk) |
(uc_action << US_LINMR_NACT_Pos);
}
/**
* \brief Disable the parity check during the LIN communication.
*
* \param p_usart Pointer to a USART instance.
*/
void usart_lin_disable_parity(Usart *p_usart)
{
p_usart->US_LINMR |= US_LINMR_PARDIS;
}
/**
* \brief Enable the parity check during the LIN communication.
*
* \param p_usart Pointer to a USART instance.
*/
void usart_lin_enable_parity(Usart *p_usart)
{
p_usart->US_LINMR &= ~US_LINMR_PARDIS;
}
/**
* \brief Disable the checksum during the LIN communication.
*
* \param p_usart Pointer to a USART instance.
*/
void usart_lin_disable_checksum(Usart *p_usart)
{
p_usart->US_LINMR |= US_LINMR_CHKDIS;
}
/**
* \brief Enable the checksum during the LIN communication.
*
* \param p_usart Pointer to a USART instance.
*/
void usart_lin_enable_checksum(Usart *p_usart)
{
p_usart->US_LINMR &= ~US_LINMR_CHKDIS;
}
/**
* \brief Configure the checksum type during the LIN communication.
*
* \param p_usart Pointer to a USART instance.
* \param uc_type 0 for LIN 2.0 Enhanced checksum or 1 for LIN 1.3 Classic
* checksum.
*/
void usart_lin_set_checksum_type(Usart *p_usart, uint8_t uc_type)
{
p_usart->US_LINMR = (p_usart->US_LINMR & ~US_LINMR_CHKTYP) |
(uc_type << 4);
}
/**
* \brief Configure the data length mode during the LIN communication.
*
* \param p_usart Pointer to a USART instance.
* \param uc_mode Indicate the data length type: 0 if the data length is
* defined by the DLC of LIN mode register or 1 if the data length is defined
* by the bit 5 and 6 of the identifier.
*/
void usart_lin_set_data_len_mode(Usart *p_usart, uint8_t uc_mode)
{
p_usart->US_LINMR = (p_usart->US_LINMR & ~US_LINMR_DLM) |
(uc_mode << 5);
}
/**
* \brief Disable the frame slot mode during the LIN communication.
*
* \param p_usart Pointer to a USART instance.
*/
void usart_lin_disable_frame_slot(Usart *p_usart)
{
p_usart->US_LINMR |= US_LINMR_FSDIS;
}
/**
* \brief Enable the frame slot mode during the LIN communication.
*
* \param p_usart Pointer to a USART instance.
*/
void usart_lin_enable_frame_slot(Usart *p_usart)
{
p_usart->US_LINMR &= ~US_LINMR_FSDIS;
}
/**
* \brief Configure the wakeup signal type during the LIN communication.
*
* \param p_usart Pointer to a USART instance.
* \param uc_type Indicate the checksum type: 0 if the wakeup signal is a
* LIN 2.0 wakeup signal; 1 if the wakeup signal is a LIN 1.3 wakeup signal.
*/
void usart_lin_set_wakeup_signal_type(Usart *p_usart, uint8_t uc_type)
{
p_usart->US_LINMR = (p_usart->US_LINMR & ~US_LINMR_WKUPTYP) |
(uc_type << 7);
}
/**
* \brief Configure the response data length if the data length is defined by
* the DLC field during the LIN communication.
*
* \param p_usart Pointer to a USART instance.
* \param uc_len Indicate the response data length.
*/
void usart_lin_set_response_data_len(Usart *p_usart, uint8_t uc_len)
{
p_usart->US_LINMR = (p_usart->US_LINMR & ~US_LINMR_DLC_Msk) |
((uc_len - 1) << US_LINMR_DLC_Pos);
}
/**
* \brief The LIN mode register is not written by the PDC.
*
* \param p_usart Pointer to a USART instance.
*/
void usart_lin_disable_pdc_mode(Usart *p_usart)
{
p_usart->US_LINMR &= ~US_LINMR_PDCM;
}
/**
* \brief The LIN mode register (except this flag) is written by the PDC.
*
* \param p_usart Pointer to a USART instance.
*/
void usart_lin_enable_pdc_mode(Usart *p_usart)
{
p_usart->US_LINMR |= US_LINMR_PDCM;
}
/**
* \brief Configure the LIN identifier when USART works in LIN master mode.
*
* \param p_usart Pointer to a USART instance.
* \param uc_id The identifier to be transmitted.
*/
void usart_lin_set_tx_identifier(Usart *p_usart, uint8_t uc_id)
{
p_usart->US_LINIR = (p_usart->US_LINIR & ~US_LINIR_IDCHR_Msk) |
US_LINIR_IDCHR(uc_id);
}
/**
* \brief Read the identifier when USART works in LIN mode.
*
* \param p_usart Pointer to a USART instance.
*
* \return The last identifier received in LIN slave mode or the last
* identifier transmitted in LIN master mode.
*/
uint8_t usart_lin_read_identifier(Usart *p_usart)
{
return (p_usart->US_LINIR & US_LINIR_IDCHR_Msk);
}
/**
* \brief Get data length.
*
* \param p_usart Pointer to a USART instance.
*
* \return Data length.
*/
uint8_t usart_lin_get_data_length(Usart *usart)
{
if (usart->US_LINMR & US_LINMR_DLM) {
uint8_t data_length = 1 << ((usart->US_LINIR >>
(US_LINIR_IDCHR_Pos + 4)) & 0x03);
return data_length;
} else {
return ((usart->US_LINMR & US_LINMR_DLC_Msk) >> US_LINMR_DLC_Pos) + 1;
}
}
#endif