I tried to test LIN message format over USART on board SAMC21N. AtmelStart was used to make project.
- This is test code :
#include <atmel_start.h>
//usart baud
#define CONF_SERCOM_2_USART_BAUD 9600
//usart descriptor
struct io_descriptor *io_usart;
//message
uint8_t msg[3]={0x00, 0x55, 0x12};
void USART_as_LIN_mode()
{
/*LIN master format (CTRLA.FORM = 0x02)*/
hri_sercomspi_write_CTRLA_FORM_bf(SERCOM2, 0x02);
//SERCOM2->USART.CTRLA.bit.FORM=0x02;
/* Asynchronous Mode (CTRLA.CMODE = 0)*/
hri_sercomusart_write_CTRLA_CMODE_bit(SERCOM2,0);
//SERCOM2->USART.CTRLA.bit.CMODE=0x0;
/*16x sample rate using fractional baud rate generation (CTRLA.SAMPR = 1)*/
hri_sercomusart_write_CTRLA_SAMPR_bf(SERCOM2, 1);
//SERCOM2->USART.CTRLA.bit.SAMPR=0x01;
/*Software controls transmission of the LIN header(CTRLB.LINCMD = 0x01)*/
hri_sercomusart_write_CTRLB_LINCMD_bf(SERCOM2, 0x01);
//SERCOM2->USART.CTRLB.bit.LINCMD=0x01;
/*Hardware controls transmission of the LIN header(CTRLB.LINCMD = 0x01)*/
//hri_sercomusart_write_CTRLB_LINCMD_bf(SERCOM2, 0x02);
//SERCOM2->USART.CTRLB.bit.LINCMD=0x02;
/*Delay between break and sync transmission is 1 bit time, delay between sync and ID transmission is 1 bit time.*/
//hri_sercomusart_write_CTRLC_HDRDLY_bf(SERCOM2,0x0);
//SERCOM->USART.CTRLC.bit.HDRDLY=0x00;
/*Length of the break field set as 13 bits (CTRLC.BRKLEN=0x0).*/
//hri_sercomusart_write_CTRLC_BRKLEN_bf(SERCOM2, 0x0);
//SERCOM2->USART.CTRLC.bit.BRKLEN=0x0;
}
void USART_init(void)
{
usart_async_get_io_descriptor(&USART_1, &io_usart);
usart_async_enable(&USART_1);
}
int main(void)
{
/* Initializes MCU, drivers and middleware */
atmel_start_init();
/*Initializes LIN mode*/
USART_as_LIN_mode();
/*Initializes USART*/
USART_init();
/**/
io_write(io_usart, msg, 3); // uint8_t msg[3]={0x00, 0x55, 0x12};
/*This function writes up to \p length of bytes to a given I/O descriptor.
* It returns the number of bytes actually write.
*
* \param[in] descr An I/O descriptor to write
* \param[in] buf The buffer pointer to story the write data
* \param[in] length The number of bytes to write
*
* \return The number of bytes written*/
while (1) {
}
}
- Part of datasheet about LIN over USART :
I tried software transmission control(CTRLB.LINCMD=0x01).
- What I got on logic analyzer:
It looks like regular USART. For example: Break is not 13 bits long.