SAM4SD32 (SAM4S-EK2)
Loading...
Searching...
No Matches
Universal Synchronous Asynchronous Receiver

Transmitter (USART). More...

Data Structures

struct  sam_usart_opt_t
 micro definition for LIN mode of SAMV71 More...
struct  usart_iso7816_opt_t
struct  usart_spi_opt_t

Macros

#define SPI_CPHA   (1 << 0)
 Clock phase.
#define SPI_CPOL   (1 << 1)
 Clock polarity.
#define SPI_MODE_0   0
 SPI mode definition.
#define SPI_MODE_1   (SPI_CPHA)
#define SPI_MODE_2   (SPI_CPOL)
#define SPI_MODE_3   (SPI_CPOL | SPI_CPHA)

Functions

void usart_disable_interrupt (Usart *p_usart, uint32_t ul_sources)
 Disable USART interrupts.
void usart_disable_rx (Usart *p_usart)
 Disable USART receiver.
void usart_disable_tx (Usart *p_usart)
 Disable USART transmitter.
void usart_disable_writeprotect (Usart *p_usart)
 Disable write protect of USART registers.
void usart_drive_DTR_pin_high (Usart *p_usart)
 Drive the pin DTR to 1.
void usart_drive_DTR_pin_low (Usart *p_usart)
 Drive the pin DTR to 0.
void usart_drive_RTS_pin_high (Usart *p_usart)
 Drive the pin RTS to 1.
void usart_drive_RTS_pin_low (Usart *p_usart)
 Drive the pin RTS to 0.
void usart_enable_interrupt (Usart *p_usart, uint32_t ul_sources)
 Enable USART interrupts.
void usart_enable_rx (Usart *p_usart)
 Enable USART receiver.
void usart_enable_tx (Usart *p_usart)
 Enable USART transmitter.
void usart_enable_writeprotect (Usart *p_usart)
 Enable write protect of USART registers.
uint8_t usart_get_error_number (Usart *p_usart)
 Get the total number of errors that occur during an ISO7816 transfer.
uint32_t usart_get_interrupt_mask (Usart *p_usart)
 Read USART interrupt mask.
Pdc * usart_get_pdc_base (Usart *p_usart)
 Get USART PDC base address.
uint32_t usart_get_status (Usart *p_usart)
 Get current status.
uint32_t usart_get_writeprotect_status (Usart *p_usart)
 Get write protect status.
uint32_t usart_getchar (Usart *p_usart, uint32_t *c)
 Read from USART Receive Holding Register.
uint32_t usart_init_hw_handshaking (Usart *p_usart, const sam_usart_opt_t *p_usart_opt, uint32_t ul_mck)
 Configure USART to work in hardware handshaking mode.
uint32_t usart_init_irda (Usart *p_usart, const sam_usart_opt_t *p_usart_opt, uint32_t ul_mck)
 Configure USART to work in IrDA mode.
uint32_t usart_init_iso7816 (Usart *p_usart, const usart_iso7816_opt_t *p_usart_opt, uint32_t ul_mck)
 Configure USART to work in ISO7816 mode.
uint32_t usart_init_modem (Usart *p_usart, const sam_usart_opt_t *p_usart_opt, uint32_t ul_mck)
 Configure USART to work in modem mode.
uint32_t usart_init_rs232 (Usart *p_usart, const sam_usart_opt_t *p_usart_opt, uint32_t ul_mck)
 Configure USART to work in RS232 mode.
uint32_t usart_init_rs485 (Usart *p_usart, const sam_usart_opt_t *p_usart_opt, uint32_t ul_mck)
 Configure USART to work in RS485 mode.
uint32_t usart_init_spi_master (Usart *p_usart, const usart_spi_opt_t *p_usart_opt, uint32_t ul_mck)
 Configure USART to work in SPI mode and act as a master.
uint32_t usart_init_spi_slave (Usart *p_usart, const usart_spi_opt_t *p_usart_opt)
 Configure USART to work in SPI mode and act as a slave.
uint32_t usart_init_sync_master (Usart *p_usart, const sam_usart_opt_t *p_usart_opt, uint32_t ul_mck)
 Configure USART to work in SYNC mode and act as a master.
uint32_t usart_init_sync_slave (Usart *p_usart, const sam_usart_opt_t *p_usart_opt)
 Configure USART to work in SYNC mode and act as a slave.
uint32_t usart_is_rx_buf_end (Usart *p_usart)
 Check if one receive buffer is filled.
uint32_t usart_is_rx_buf_full (Usart *p_usart)
 Check if both receive buffers are full.
uint32_t usart_is_rx_ready (Usart *p_usart)
 Check if the received data are ready.
uint32_t usart_is_tx_buf_empty (Usart *p_usart)
 Check if both transmit buffers are empty.
uint32_t usart_is_tx_buf_end (Usart *p_usart)
 Check if one transmit buffer is empty.
uint32_t usart_is_tx_empty (Usart *p_usart)
 Check if Transmit Holding Register is empty.
uint32_t usart_is_tx_ready (Usart *p_usart)
 Check if Transmit is Ready.
void usart_man_disable_drift_compensation (Usart *p_usart)
 Disable drift compensation.
void usart_man_enable_drift_compensation (Usart *p_usart)
 Enable drift compensation.
void usart_man_set_rx_polarity (Usart *p_usart, uint8_t uc_polarity)
 Configure the receiver Manchester polarity when the Manchester encode/decode is enabled.
void usart_man_set_rx_pre_len (Usart *p_usart, uint8_t uc_len)
 Configure the detected receiver preamble length when the Manchester encode/decode is enabled.
void usart_man_set_rx_pre_pattern (Usart *p_usart, uint8_t uc_pattern)
 Configure the detected receiver preamble pattern when the Manchester encode/decode is enabled, which should be 0 ~ 3.
void usart_man_set_tx_polarity (Usart *p_usart, uint8_t uc_polarity)
 Configure the transmitter Manchester polarity when the Manchester encode/decode is enabled.
void usart_man_set_tx_pre_len (Usart *p_usart, uint8_t uc_len)
 Configure the transmitter preamble length when the Manchester encode/decode is enabled.
void usart_man_set_tx_pre_pattern (Usart *p_usart, uint8_t uc_pattern)
 Configure the transmitter preamble pattern when the Manchester encode/decode is enabled, which should be 0 ~ 3.
uint32_t usart_putchar (Usart *p_usart, uint32_t c)
 Write to USART Transmit Holding Register.
uint32_t usart_read (Usart *p_usart, uint32_t *c)
 Read from USART Receive Holding Register.
void usart_reset (Usart *p_usart)
 Reset the USART and disable TX and RX.
void usart_reset_iterations (Usart *p_usart)
 Reset the ITERATION in US_CSR when the ISO7816 mode is enabled.
void usart_reset_nack (Usart *p_usart)
 Reset NACK in US_CSR.
void usart_reset_rx (Usart *p_usart)
 Immediately stop and disable USART receiver.
void usart_reset_status (Usart *p_usart)
 Reset status bits (PARE, OVER, MANERR, UNRE and PXBRK in US_CSR).
void usart_reset_tx (Usart *p_usart)
 Immediately stop and disable USART transmitter.
void usart_restart_rx_timeout (Usart *p_usart)
 Restart the receive timeout.
uint32_t usart_send_address (Usart *p_usart, uint32_t ul_addr)
 In Multidrop mode only, the next character written to the US_THR is sent with the address bit set.
uint32_t usart_set_async_baudrate (Usart *p_usart, uint32_t baudrate, uint32_t ul_mck)
 Calculate a clock divider(CD) and a fractional part (FP) for the USART asynchronous modes to generate a baudrate as close as possible to the baudrate set point.
void usart_set_rx_timeout (Usart *p_usart, uint32_t timeout)
 Configure the receive timeout register.
void usart_set_tx_timeguard (Usart *p_usart, uint32_t timeguard)
 Configure the transmit timeguard register.
void usart_spi_force_chip_select (Usart *p_usart)
 Drive the slave select line NSS (RTS pin) to 0 in SPI master mode.
void usart_spi_release_chip_select (Usart *p_usart)
 Drive the slave select line NSS (RTS pin) to 1 in SPI master mode.
void usart_start_rx_timeout (Usart *p_usart)
 Start waiting for a character before clocking the timeout count.
void usart_start_tx_break (Usart *p_usart)
 Start transmission of a break.
void usart_stop_tx_break (Usart *p_usart)
 Stop transmission of a break.
uint32_t usart_write (Usart *p_usart, uint32_t c)
 Write to USART Transmit Holding Register.
void usart_write_line (Usart *p_usart, const char *string)
 Write one-line string through USART.

Detailed Description

Transmitter (USART).

See Quick start guide for the SAM USART module.

This is a low-level driver implementation for the SAM Universal Synchronous/Asynchronous Receiver/Transmitter.

Macro Definition Documentation

◆ SPI_CPHA

#define SPI_CPHA   (1 << 0)

Clock phase.

Definition at line 64 of file usart.h.

◆ SPI_CPOL

#define SPI_CPOL   (1 << 1)

Clock polarity.

Definition at line 67 of file usart.h.

◆ SPI_MODE_0

#define SPI_MODE_0   0

SPI mode definition.

Definition at line 70 of file usart.h.

Referenced by usart_init_spi_master(), and usart_init_spi_slave().

◆ SPI_MODE_1

#define SPI_MODE_1   (SPI_CPHA)

Definition at line 71 of file usart.h.

Referenced by usart_init_spi_master(), and usart_init_spi_slave().

◆ SPI_MODE_2

#define SPI_MODE_2   (SPI_CPOL)

Definition at line 72 of file usart.h.

Referenced by usart_init_spi_master(), and usart_init_spi_slave().

◆ SPI_MODE_3

#define SPI_MODE_3   (SPI_CPOL | SPI_CPHA)

Definition at line 73 of file usart.h.

Referenced by usart_init_spi_master(), and usart_init_spi_slave().

Function Documentation

◆ usart_disable_interrupt()

void usart_disable_interrupt ( Usart * p_usart,
uint32_t ul_sources )

Disable USART interrupts.

Parameters
p_usartPointer to a USART peripheral.
ul_sourcesInterrupt sources bit map.

Definition at line 1480 of file usart.c.

1481{
1482 p_usart->US_IDR = ul_sources;
1483}
__O uint32_t US_IDR
(Usart Offset: 0x000C) Interrupt Disable Register

References Usart::US_IDR.

◆ usart_disable_rx()

void usart_disable_rx ( Usart * p_usart)

Disable USART receiver.

Parameters
p_usartPointer to a USART instance.

Definition at line 1436 of file usart.c.

1437{
1438 p_usart->US_CR = US_CR_RXDIS;
1439}
#define US_CR_RXDIS
(US_CR) Receiver Disable
__O uint32_t US_CR
(Usart Offset: 0x0000) Control Register

References Usart::US_CR, and US_CR_RXDIS.

◆ usart_disable_tx()

void usart_disable_tx ( Usart * p_usart)

Disable USART transmitter.

Parameters
p_usartPointer to a USART instance.

Definition at line 1394 of file usart.c.

1395{
1396 p_usart->US_CR = US_CR_TXDIS;
1397}
#define US_CR_TXDIS
(US_CR) Transmitter Disable

References Usart::US_CR, and US_CR_TXDIS.

◆ usart_disable_writeprotect()

void usart_disable_writeprotect ( Usart * p_usart)

Disable write protect of USART registers.

Parameters
p_usartPointer to a USART instance.

Definition at line 1907 of file usart.c.

1908{
1909 p_usart->US_WPMR = US_WPMR_WPKEY_PASSWD;
1910}
#define US_WPMR_WPKEY_PASSWD
Definition usart.c:68
__IO uint32_t US_WPMR
(Usart Offset: 0x00E4) Write Protect Mode Register

References Usart::US_WPMR, and US_WPMR_WPKEY_PASSWD.

Referenced by usart_reset().

◆ usart_drive_DTR_pin_high()

void usart_drive_DTR_pin_high ( Usart * p_usart)

Drive the pin DTR to 1.

Parameters
p_usartPointer to a USART instance.

Definition at line 1602 of file usart.c.

1603{
1604 p_usart->US_CR = US_CR_DTRDIS;
1605}
#define US_CR_DTRDIS
(US_CR) Data Terminal Ready Disable

References Usart::US_CR, and US_CR_DTRDIS.

Referenced by usart_reset().

◆ usart_drive_DTR_pin_low()

void usart_drive_DTR_pin_low ( Usart * p_usart)

Drive the pin DTR to 0.

Parameters
p_usartPointer to a USART instance.

Definition at line 1592 of file usart.c.

1593{
1594 p_usart->US_CR = US_CR_DTREN;
1595}
#define US_CR_DTREN
(US_CR) Data Terminal Ready Enable

References Usart::US_CR, and US_CR_DTREN.

◆ usart_drive_RTS_pin_high()

void usart_drive_RTS_pin_high ( Usart * p_usart)

Drive the pin RTS to 1.

Parameters
p_usartPointer to a USART instance.

Definition at line 1624 of file usart.c.

1625{
1626 p_usart->US_CR = US_CR_RTSDIS;
1627}
#define US_CR_RTSDIS
(US_CR) Request to Send Disable

References Usart::US_CR, and US_CR_RTSDIS.

Referenced by usart_reset().

◆ usart_drive_RTS_pin_low()

void usart_drive_RTS_pin_low ( Usart * p_usart)

Drive the pin RTS to 0.

Parameters
p_usartPointer to a USART instance.

Definition at line 1614 of file usart.c.

1615{
1616 p_usart->US_CR = US_CR_RTSEN;
1617}
#define US_CR_RTSEN
(US_CR) Request to Send Enable

References Usart::US_CR, and US_CR_RTSEN.

◆ usart_enable_interrupt()

void usart_enable_interrupt ( Usart * p_usart,
uint32_t ul_sources )

Enable USART interrupts.

Parameters
p_usartPointer to a USART peripheral.
ul_sourcesInterrupt sources bit map.

Definition at line 1469 of file usart.c.

1470{
1471 p_usart->US_IER = ul_sources;
1472}
__O uint32_t US_IER
(Usart Offset: 0x0008) Interrupt Enable Register

References Usart::US_IER.

◆ usart_enable_rx()

void usart_enable_rx ( Usart * p_usart)

Enable USART receiver.

Parameters
p_usartPointer to a USART instance.

Definition at line 1426 of file usart.c.

1427{
1428 p_usart->US_CR = US_CR_RXEN;
1429}
#define US_CR_RXEN
(US_CR) Receiver Enable

References Usart::US_CR, and US_CR_RXEN.

Referenced by usart_serial_init().

◆ usart_enable_tx()

void usart_enable_tx ( Usart * p_usart)

Enable USART transmitter.

Parameters
p_usartPointer to a USART instance.

Definition at line 1384 of file usart.c.

1385{
1386 p_usart->US_CR = US_CR_TXEN;
1387}
#define US_CR_TXEN
(US_CR) Transmitter Enable

References Usart::US_CR, and US_CR_TXEN.

Referenced by usart_serial_init().

◆ usart_enable_writeprotect()

void usart_enable_writeprotect ( Usart * p_usart)

Enable write protect of USART registers.

Parameters
p_usartPointer to a USART instance.

Definition at line 1897 of file usart.c.

1898{
1900}
#define US_WPMR_WPEN
(US_WPMR) Write Protect Enable

References Usart::US_WPMR, US_WPMR_WPEN, and US_WPMR_WPKEY_PASSWD.

◆ usart_get_error_number()

uint8_t usart_get_error_number ( Usart * p_usart)

Get the total number of errors that occur during an ISO7816 transfer.

Parameters
p_usartPointer to a USART instance.
Returns
The number of errors that occurred.

Definition at line 699 of file usart.c.

700{
701 return (p_usart->US_NER & US_NER_NB_ERRORS_Msk);
702}
#define US_NER_NB_ERRORS_Msk
(US_NER) Number of Errors
__I uint32_t US_NER
(Usart Offset: 0x0044) Number of Errors Register

References Usart::US_NER, and US_NER_NB_ERRORS_Msk.

◆ usart_get_interrupt_mask()

uint32_t usart_get_interrupt_mask ( Usart * p_usart)

Read USART interrupt mask.

Parameters
p_usartPointer to a USART peripheral.
Returns
The interrupt mask value.

Definition at line 1492 of file usart.c.

1493{
1494 return p_usart->US_IMR;
1495}
__I uint32_t US_IMR
(Usart Offset: 0x0010) Interrupt Mask Register

References Usart::US_IMR.

◆ usart_get_pdc_base()

Pdc * usart_get_pdc_base ( Usart * p_usart)

Get USART PDC base address.

Parameters
p_usartPointer to a UART instance.
Returns
USART PDC registers base for PDC driver to access.

Definition at line 1827 of file usart.c.

1828{
1829 Pdc *p_pdc_base;
1830
1831 p_pdc_base = (Pdc *)NULL;
1832
1833#ifdef PDC_USART
1834 if (p_usart == USART) {
1835 p_pdc_base = PDC_USART;
1836 return p_pdc_base;
1837 }
1838#endif
1839#ifdef PDC_USART0
1840 if (p_usart == USART0) {
1841 p_pdc_base = PDC_USART0;
1842 return p_pdc_base;
1843 }
1844#endif
1845#ifdef PDC_USART1
1846 else if (p_usart == USART1) {
1847 p_pdc_base = PDC_USART1;
1848 return p_pdc_base;
1849 }
1850#endif
1851#ifdef PDC_USART2
1852 else if (p_usart == USART2) {
1853 p_pdc_base = PDC_USART2;
1854 return p_pdc_base;
1855 }
1856#endif
1857#ifdef PDC_USART3
1858 else if (p_usart == USART3) {
1859 p_pdc_base = PDC_USART3;
1860 return p_pdc_base;
1861 }
1862#endif
1863#ifdef PDC_USART4
1864 else if (p_usart == USART4) {
1865 p_pdc_base = PDC_USART4;
1866 return p_pdc_base;
1867 }
1868#endif
1869#ifdef PDC_USART5
1870 else if (p_usart == USART5) {
1871 p_pdc_base = PDC_USART5;
1872 return p_pdc_base;
1873 }
1874#endif
1875#ifdef PDC_USART6
1876 else if (p_usart == USART6) {
1877 p_pdc_base = PDC_USART6;
1878 return p_pdc_base;
1879 }
1880#endif
1881#ifdef PDC_USART7
1882 else if (p_usart == USART7) {
1883 p_pdc_base = PDC_USART7;
1884 return p_pdc_base;
1885 }
1886#endif
1887
1888 return p_pdc_base;
1889}
#define PDC_USART1
(PDC_USART1) Base Address
Definition sam4sd32c.h:428
#define PDC_USART0
(PDC_USART0) Base Address
Definition sam4sd32c.h:426
#define USART1
(USART1 ) Base Address
Definition sam4sd32c.h:427
#define USART0
(USART0 ) Base Address
Definition sam4sd32c.h:425

References PDC_USART0, PDC_USART1, USART0, and USART1.

◆ usart_get_status()

uint32_t usart_get_status ( Usart * p_usart)

Get current status.

Parameters
p_usartPointer to a USART instance.
Returns
The current USART status.

Definition at line 1504 of file usart.c.

1505{
1506 return p_usart->US_CSR;
1507}
__I uint32_t US_CSR
(Usart Offset: 0x0014) Channel Status Register

References Usart::US_CSR.

◆ usart_get_writeprotect_status()

uint32_t usart_get_writeprotect_status ( Usart * p_usart)

Get write protect status.

Parameters
p_usartPointer to a USART instance.
Returns
0 if no write protect violation occurred, or 16-bit write protect violation source.

Definition at line 1920 of file usart.c.

1921{
1922 uint32_t reg_value;
1923
1924 reg_value = p_usart->US_WPSR;
1925 if (reg_value & US_WPSR_WPVS) {
1926 return (reg_value & US_WPSR_WPVSRC_Msk) >> US_WPSR_WPVSRC_Pos;
1927 } else {
1928 return 0;
1929 }
1930}
#define US_WPSR_WPVSRC_Msk
(US_WPSR) Write Protect Violation Source
#define US_WPSR_WPVSRC_Pos
#define US_WPSR_WPVS
(US_WPSR) Write Protect Violation Status
__I uint32_t US_WPSR
(Usart Offset: 0x00E8) Write Protect Status Register

References Usart::US_WPSR, US_WPSR_WPVS, US_WPSR_WPVSRC_Msk, and US_WPSR_WPVSRC_Pos.

◆ usart_getchar()

uint32_t usart_getchar ( Usart * p_usart,
uint32_t * c )

Read from USART Receive Holding Register.

Before reading user should check if rx is ready.

Parameters
p_usartPointer to a USART instance.
cPointer where the one-byte received data will be stored.
Return values
0Data has been received.
1on failure.

Definition at line 1781 of file usart.c.

1782{
1783 /* Wait until it's not empty or timeout has reached. */
1784 while (!(p_usart->US_CSR & US_CSR_RXRDY)) {
1785 }
1786
1787 /* Read character */
1788 *c = p_usart->US_RHR & US_RHR_RXCHR_Msk;
1789
1790 return 0;
1791}
#define US_CSR_RXRDY
(US_CSR) Receiver Ready
#define US_RHR_RXCHR_Msk
(US_RHR) Received Character
__I uint32_t US_RHR
(Usart Offset: 0x0018) Receiver Holding Register

References Usart::US_CSR, US_CSR_RXRDY, Usart::US_RHR, and US_RHR_RXCHR_Msk.

◆ usart_init_hw_handshaking()

uint32_t usart_init_hw_handshaking ( Usart * p_usart,
const sam_usart_opt_t * p_usart_opt,
uint32_t ul_mck )

Configure USART to work in hardware handshaking mode.

Note
By default, the transmitter and receiver aren't enabled.
Parameters
p_usartPointer to a USART instance.
p_usart_optPointer to sam_usart_opt_t instance.
ul_mckUSART module input clock frequency.
Return values
0on success.
1on failure.

Definition at line 313 of file usart.c.

315{
316 /* Initialize the USART as standard RS232. */
317 if (usart_init_rs232(p_usart, p_usart_opt, ul_mck)) {
318 return 1;
319 }
320
321 /* Set hardware handshaking mode. */
322 p_usart->US_MR = (p_usart->US_MR & ~US_MR_USART_MODE_Msk) |
324
325 return 0;
326}
#define US_MR_USART_MODE_Msk
(US_MR) USART Mode of Operation
#define US_MR_USART_MODE_HW_HANDSHAKING
(US_MR) Hardware Handshaking
uint32_t usart_init_rs232(Usart *p_usart, const sam_usart_opt_t *p_usart_opt, uint32_t ul_mck)
Configure USART to work in RS232 mode.
Definition usart.c:274
__IO uint32_t US_MR
(Usart Offset: 0x0004) Mode Register

References Usart::US_MR, US_MR_USART_MODE_HW_HANDSHAKING, US_MR_USART_MODE_Msk, and usart_init_rs232().

◆ usart_init_irda()

uint32_t usart_init_irda ( Usart * p_usart,
const sam_usart_opt_t * p_usart_opt,
uint32_t ul_mck )

Configure USART to work in IrDA mode.

Note
By default, the transmitter and receiver aren't enabled.
Parameters
p_usartPointer to a USART instance.
p_usart_optPointer to sam_usart_opt_t instance.
ul_mckUSART module input clock frequency.
Return values
0on success.
1on failure.

Definition at line 490 of file usart.c.

492{
493 /* Initialize the USART as standard RS232. */
494 if (usart_init_rs232(p_usart, p_usart_opt, ul_mck)) {
495 return 1;
496 }
497
498 /* Set IrDA filter. */
499 p_usart->US_IF = p_usart_opt->irda_filter;
500
501 /* Set IrDA mode. */
502 p_usart->US_MR = (p_usart->US_MR & ~US_MR_USART_MODE_Msk) |
504
505 return 0;
506}
#define US_MR_USART_MODE_IRDA
(US_MR) IrDA
__IO uint32_t US_IF
(Usart Offset: 0x004C) IrDA Filter Register
uint32_t irda_filter
Definition usart.h:118

References sam_usart_opt_t::irda_filter, Usart::US_IF, Usart::US_MR, US_MR_USART_MODE_IRDA, US_MR_USART_MODE_Msk, and usart_init_rs232().

◆ usart_init_iso7816()

uint32_t usart_init_iso7816 ( Usart * p_usart,
const usart_iso7816_opt_t * p_usart_opt,
uint32_t ul_mck )

Configure USART to work in ISO7816 mode.

Note
By default, the transmitter and receiver aren't enabled.
Parameters
p_usartPointer to a USART instance.
p_usart_optPointer to sam_usart_opt_t instance.
ul_mckUSART module input clock frequency.
Return values
0on success.
1on failure.

Definition at line 557 of file usart.c.

559{
560 static uint32_t ul_reg_val;
561
562 /* Reset the USART and shut down TX and RX. */
563 usart_reset(p_usart);
564
565 ul_reg_val = 0;
566
567 /* Check whether the input values are legal. */
568 if (!p_usart_opt || ((p_usart_opt->parity_type != US_MR_PAR_EVEN) &&
569 (p_usart_opt->parity_type != US_MR_PAR_ODD))) {
570 return 1;
571 }
572
573 if (p_usart_opt->protocol_type == ISO7816_T_0) {
575 (p_usart_opt->max_iterations << US_MR_MAX_ITERATION_Pos);
576
577 if (p_usart_opt->bit_order) {
578 ul_reg_val |= US_MR_MSBF;
579 }
580 } else if (p_usart_opt->protocol_type == ISO7816_T_1) {
581 /*
582 * Only LSBF is used in the T=1 protocol, and max_iterations field
583 * is only used in T=0 mode.
584 */
585 if (p_usart_opt->bit_order || p_usart_opt->max_iterations) {
586 return 1;
587 }
588
589 /* Set USART mode to ISO7816, T=1, and always uses 1 stop bit. */
591 } else {
592 return 1;
593 }
594
595 /* Set up the baudrate. */
596 if (usart_set_iso7816_clock(p_usart, p_usart_opt->iso7816_hz, ul_mck)) {
597 return 1;
598 }
599
600 /* Set FIDI register: bit rate = iso7816_hz / fidi_ratio. */
601 p_usart->US_FIDI = p_usart_opt->fidi_ratio;
602
603 /* Set ISO7816 parity type in the MODE register. */
604 ul_reg_val |= p_usart_opt->parity_type;
605
606 if (p_usart_opt->inhibit_nack) {
607 ul_reg_val |= US_MR_INACK;
608 }
609 if (p_usart_opt->dis_suc_nack) {
610 ul_reg_val |= US_MR_DSNACK;
611 }
612
613 p_usart->US_MR |= ul_reg_val;
614
615 return 0;
616}
#define US_MR_MAX_ITERATION_Pos
#define US_MR_DSNACK
(US_MR) Disable Successive NACK
#define US_MR_PAR_ODD
(US_MR) Odd parity
#define US_MR_MSBF
(US_MR) Bit Order
#define US_MR_USART_MODE_IS07816_T_1
(US_MR) IS07816 Protocol: T = 1
#define US_MR_NBSTOP_1_BIT
(US_MR) 1 stop bit
#define US_MR_USART_MODE_IS07816_T_0
(US_MR) IS07816 Protocol: T = 0
#define US_MR_NBSTOP_2_BIT
(US_MR) 2 stop bits
#define US_MR_INACK
(US_MR) Inhibit Non Acknowledge
#define US_MR_PAR_EVEN
(US_MR) Even parity
#define ISO7816_T_0
Definition usart.c:91
#define ISO7816_T_1
Definition usart.c:92
void usart_reset(Usart *p_usart)
Reset the USART and disable TX and RX.
Definition usart.c:240
static uint32_t usart_set_iso7816_clock(Usart *p_usart, uint32_t clock, uint32_t ul_mck)
Calculate a clock divider (CD) for the USART ISO7816 mode to generate an ISO7816 clock as close as po...
Definition usart.c:524
__IO uint32_t US_FIDI
(Usart Offset: 0x0040) FI DI Ratio Register
uint32_t max_iterations
Definition usart.h:159
uint32_t protocol_type
Definition usart.h:173
uint32_t bit_order
Definition usart.h:166
uint32_t iso7816_hz
Definition usart.h:124
uint32_t inhibit_nack
Definition usart.h:146
uint32_t parity_type
Definition usart.h:136
uint32_t fidi_ratio
Definition usart.h:130
uint32_t dis_suc_nack
Definition usart.h:156

References usart_iso7816_opt_t::bit_order, usart_iso7816_opt_t::dis_suc_nack, usart_iso7816_opt_t::fidi_ratio, usart_iso7816_opt_t::inhibit_nack, usart_iso7816_opt_t::iso7816_hz, ISO7816_T_0, ISO7816_T_1, usart_iso7816_opt_t::max_iterations, usart_iso7816_opt_t::parity_type, usart_iso7816_opt_t::protocol_type, Usart::US_FIDI, Usart::US_MR, US_MR_DSNACK, US_MR_INACK, US_MR_MAX_ITERATION_Pos, US_MR_MSBF, US_MR_NBSTOP_1_BIT, US_MR_NBSTOP_2_BIT, US_MR_PAR_EVEN, US_MR_PAR_ODD, US_MR_USART_MODE_IS07816_T_0, US_MR_USART_MODE_IS07816_T_1, usart_reset(), and usart_set_iso7816_clock().

◆ usart_init_modem()

uint32_t usart_init_modem ( Usart * p_usart,
const sam_usart_opt_t * p_usart_opt,
uint32_t ul_mck )

Configure USART to work in modem mode.

Note
By default, the transmitter and receiver aren't enabled.
Parameters
p_usartPointer to a USART instance.
p_usart_optPointer to sam_usart_opt_t instance.
ul_mckUSART module input clock frequency.
Return values
0on success.
1on failure.

Definition at line 342 of file usart.c.

344{
345 /*
346 * SAM3S, SAM4S and SAM4E series support MODEM mode only on USART1,
347 * SAM3U and SAM4L series support MODEM mode only on USART0.
348 */
349#if (SAM3S || SAM4S || SAM4E)
350#ifdef USART1
351 if (p_usart != USART1) {
352 return 1;
353 }
354#endif
355#elif (SAM3U || SAM4L)
356 if (p_usart != USART0) {
357 return 1;
358 }
359#endif
360
361 /* Initialize the USART as standard RS232. */
362 if (usart_init_rs232(p_usart, p_usart_opt, ul_mck)) {
363 return 1;
364 }
365
366 /* Set MODEM mode. */
367 p_usart->US_MR = (p_usart->US_MR & ~US_MR_USART_MODE_Msk) |
369
370 return 0;
371}
#define US_MR_USART_MODE_MODEM
(US_MR) Modem

References Usart::US_MR, US_MR_USART_MODE_MODEM, US_MR_USART_MODE_Msk, USART0, USART1, and usart_init_rs232().

◆ usart_init_rs232()

uint32_t usart_init_rs232 ( Usart * p_usart,
const sam_usart_opt_t * p_usart_opt,
uint32_t ul_mck )

Configure USART to work in RS232 mode.

Note
By default, the transmitter and receiver aren't enabled.
Parameters
p_usartPointer to a USART instance.
p_usart_optPointer to sam_usart_opt_t instance.
ul_mckUSART module input clock frequency.
Return values
0on success.
1on failure.

Definition at line 274 of file usart.c.

276{
277 static uint32_t ul_reg_val;
278
279 /* Reset the USART and shut down TX and RX. */
280 usart_reset(p_usart);
281
282 ul_reg_val = 0;
283 /* Check whether the input values are legal. */
284 if (!p_usart_opt || usart_set_async_baudrate(p_usart,
285 p_usart_opt->baudrate, ul_mck)) {
286 return 1;
287 }
288
289 /* Configure the USART option. */
290 ul_reg_val |= p_usart_opt->char_length | p_usart_opt->parity_type |
291 p_usart_opt->channel_mode | p_usart_opt->stop_bits;
292
293 /* Configure the USART mode as normal mode. */
294 ul_reg_val |= US_MR_USART_MODE_NORMAL;
295
296 p_usart->US_MR |= ul_reg_val;
297
298 return 0;
299}
#define US_MR_USART_MODE_NORMAL
(US_MR) Normal mode
uint32_t usart_set_async_baudrate(Usart *p_usart, uint32_t baudrate, uint32_t ul_mck)
Calculate a clock divider(CD) and a fractional part (FP) for the USART asynchronous modes to generate...
Definition usart.c:111
uint32_t baudrate
Definition usart.h:87
uint32_t char_length
Definition usart.h:94
uint32_t channel_mode
Definition usart.h:115
uint32_t stop_bits
Definition usart.h:108
uint32_t parity_type
Definition usart.h:101

References sam_usart_opt_t::baudrate, sam_usart_opt_t::channel_mode, sam_usart_opt_t::char_length, sam_usart_opt_t::parity_type, sam_usart_opt_t::stop_bits, Usart::US_MR, US_MR_USART_MODE_NORMAL, usart_reset(), and usart_set_async_baudrate().

Referenced by usart_init_hw_handshaking(), usart_init_irda(), usart_init_modem(), usart_init_rs485(), and usart_serial_init().

◆ usart_init_rs485()

uint32_t usart_init_rs485 ( Usart * p_usart,
const sam_usart_opt_t * p_usart_opt,
uint32_t ul_mck )

Configure USART to work in RS485 mode.

Note
By default, the transmitter and receiver aren't enabled.
Parameters
p_usartPointer to a USART instance.
p_usart_optPointer to sam_usart_opt_t instance.
ul_mckUSART module input clock frequency.
Return values
0on success.
1on failure.

Definition at line 462 of file usart.c.

464{
465 /* Initialize the USART as standard RS232. */
466 if (usart_init_rs232(p_usart, p_usart_opt, ul_mck)) {
467 return 1;
468 }
469
470 /* Set RS485 mode. */
471 p_usart->US_MR = (p_usart->US_MR & ~US_MR_USART_MODE_Msk) |
473
474 return 0;
475}
#define US_MR_USART_MODE_RS485
(US_MR) RS485

References Usart::US_MR, US_MR_USART_MODE_Msk, US_MR_USART_MODE_RS485, and usart_init_rs232().

◆ usart_init_spi_master()

uint32_t usart_init_spi_master ( Usart * p_usart,
const usart_spi_opt_t * p_usart_opt,
uint32_t ul_mck )

Configure USART to work in SPI mode and act as a master.

Note
By default, the transmitter and receiver aren't enabled.
Parameters
p_usartPointer to a USART instance.
p_usart_optPointer to sam_usart_opt_t instance.
ul_mckUSART module input clock frequency.
Return values
0on success.
1on failure.

Definition at line 718 of file usart.c.

720{
721 static uint32_t ul_reg_val;
722
723 /* Reset the USART and shut down TX and RX. */
724 usart_reset(p_usart);
725
726 ul_reg_val = 0;
727 /* Check whether the input values are legal. */
728 if (!p_usart_opt || (p_usart_opt->spi_mode > SPI_MODE_3) ||
729 usart_set_spi_master_baudrate(p_usart, p_usart_opt->baudrate,
730 ul_mck)) {
731 return 1;
732 }
733
734 /* Configure the character length bit in MR register. */
735 ul_reg_val |= p_usart_opt->char_length;
736
737 /* Set SPI master mode and channel mode. */
739 p_usart_opt->channel_mode;
740
741 switch (p_usart_opt->spi_mode) {
742 case SPI_MODE_0:
743 ul_reg_val |= US_MR_CPHA;
744 ul_reg_val &= ~US_MR_CPOL;
745 break;
746
747 case SPI_MODE_1:
748 ul_reg_val &= ~US_MR_CPHA;
749 ul_reg_val &= ~US_MR_CPOL;
750 break;
751
752 case SPI_MODE_2:
753 ul_reg_val |= US_MR_CPHA;
754 ul_reg_val |= US_MR_CPOL;
755 break;
756
757 case SPI_MODE_3:
758 ul_reg_val &= ~US_MR_CPHA;
759 ul_reg_val |= US_MR_CPOL;
760 break;
761
762 default:
763 break;
764 }
765
766 p_usart->US_MR |= ul_reg_val;
767
768 return 0;
769}
#define US_MR_CLKO
(US_MR) Clock Output Select
#define US_MR_USART_MODE_SPI_MASTER
(US_MR) SPI Master
#define US_MR_CPOL
(US_MR) SPI Clock Polarity
#define US_MR_CPHA
(US_MR) SPI Clock Phase
#define SPI_MODE_0
SPI mode definition.
Definition usart.h:70
#define SPI_MODE_3
Definition usart.h:73
#define SPI_MODE_2
Definition usart.h:72
#define SPI_MODE_1
Definition usart.h:71
static uint32_t usart_set_spi_master_baudrate(Usart *p_usart, uint32_t baudrate, uint32_t ul_mck)
Calculate a clock divider (CD) for the USART SPI master mode to generate a baud rate as close as poss...
Definition usart.c:206
uint32_t channel_mode
Definition usart.h:199
uint32_t spi_mode
Definition usart.h:192
uint32_t char_length
Definition usart.h:186
uint32_t baudrate
Definition usart.h:179

References usart_spi_opt_t::baudrate, usart_spi_opt_t::channel_mode, usart_spi_opt_t::char_length, usart_spi_opt_t::spi_mode, SPI_MODE_0, SPI_MODE_1, SPI_MODE_2, SPI_MODE_3, Usart::US_MR, US_MR_CLKO, US_MR_CPHA, US_MR_CPOL, US_MR_USART_MODE_SPI_MASTER, usart_reset(), and usart_set_spi_master_baudrate().

◆ usart_init_spi_slave()

uint32_t usart_init_spi_slave ( Usart * p_usart,
const usart_spi_opt_t * p_usart_opt )

Configure USART to work in SPI mode and act as a slave.

Note
By default, the transmitter and receiver aren't enabled.
Parameters
p_usartPointer to a USART instance.
p_usart_optPointer to sam_usart_opt_t instance.
Return values
0on success.
1on failure.

Definition at line 782 of file usart.c.

784{
785 static uint32_t ul_reg_val;
786
787 /* Reset the USART and shut down TX and RX. */
788 usart_reset(p_usart);
789
790 ul_reg_val = 0;
792
793 /* Check whether the input values are legal. */
794 if (!p_usart_opt || p_usart_opt->spi_mode > SPI_MODE_3) {
795 return 1;
796 }
797
798 /* Configure the character length bit in MR register. */
799 ul_reg_val |= p_usart_opt->char_length;
800
801 /* Set SPI slave mode and channel mode. */
802 ul_reg_val |= US_MR_USART_MODE_SPI_SLAVE | p_usart_opt->channel_mode;
803
804 switch (p_usart_opt->spi_mode) {
805 case SPI_MODE_0:
806 ul_reg_val |= US_MR_CPHA;
807 ul_reg_val &= ~US_MR_CPOL;
808 break;
809
810 case SPI_MODE_1:
811 ul_reg_val &= ~US_MR_CPHA;
812 ul_reg_val &= ~US_MR_CPOL;
813 break;
814
815 case SPI_MODE_2:
816 ul_reg_val |= US_MR_CPHA;
817 ul_reg_val |= US_MR_CPOL;
818 break;
819
820 case SPI_MODE_3:
821 ul_reg_val |= US_MR_CPOL;
822 ul_reg_val &= ~US_MR_CPHA;
823 break;
824
825 default:
826 break;
827 }
828
829 p_usart->US_MR |= ul_reg_val;
830
831 return 0;
832}
#define US_MR_USART_MODE_SPI_SLAVE
(US_MR) SPI Slave
static void usart_set_spi_slave_baudrate(Usart *p_usart)
Select the SCK pin as the source of baudrate for the USART SPI slave mode.
Definition usart.c:229

References usart_spi_opt_t::channel_mode, usart_spi_opt_t::char_length, usart_spi_opt_t::spi_mode, SPI_MODE_0, SPI_MODE_1, SPI_MODE_2, SPI_MODE_3, Usart::US_MR, US_MR_CPHA, US_MR_CPOL, US_MR_USART_MODE_SPI_SLAVE, usart_reset(), and usart_set_spi_slave_baudrate().

◆ usart_init_sync_master()

uint32_t usart_init_sync_master ( Usart * p_usart,
const sam_usart_opt_t * p_usart_opt,
uint32_t ul_mck )

Configure USART to work in SYNC mode and act as a master.

Note
By default, the transmitter and receiver aren't enabled.
Parameters
p_usartPointer to a USART instance.
p_usart_optPointer to sam_usart_opt_t instance.
ul_mckUSART module input clock frequency.
Return values
0on success.
1on failure.

Definition at line 386 of file usart.c.

388{
389 static uint32_t ul_reg_val;
390
391 /* Reset the USART and shut down TX and RX. */
392 usart_reset(p_usart);
393
394 ul_reg_val = 0;
395 /* Check whether the input values are legal. */
396 if (!p_usart_opt || usart_set_sync_master_baudrate(p_usart,
397 p_usart_opt->baudrate, ul_mck)) {
398 return 1;
399 }
400
401 /* Configure the USART option. */
402 ul_reg_val |= p_usart_opt->char_length | p_usart_opt->parity_type |
403 p_usart_opt->channel_mode | p_usart_opt->stop_bits;
404
405 /* Set normal mode and output clock as synchronous master. */
406 ul_reg_val |= US_MR_USART_MODE_NORMAL | US_MR_CLKO;
407 p_usart->US_MR |= ul_reg_val;
408
409 return 0;
410}
static uint32_t usart_set_sync_master_baudrate(Usart *p_usart, uint32_t baudrate, uint32_t ul_mck)
Calculate a clock divider for the USART synchronous master modes to generate a baudrate as close as p...
Definition usart.c:159

References sam_usart_opt_t::baudrate, sam_usart_opt_t::channel_mode, sam_usart_opt_t::char_length, sam_usart_opt_t::parity_type, sam_usart_opt_t::stop_bits, Usart::US_MR, US_MR_CLKO, US_MR_USART_MODE_NORMAL, usart_reset(), and usart_set_sync_master_baudrate().

◆ usart_init_sync_slave()

uint32_t usart_init_sync_slave ( Usart * p_usart,
const sam_usart_opt_t * p_usart_opt )

Configure USART to work in SYNC mode and act as a slave.

Note
By default, the transmitter and receiver aren't enabled.
Parameters
p_usartPointer to a USART instance.
p_usart_optPointer to sam_usart_opt_t instance.
Return values
0on success.
1on failure.

Definition at line 423 of file usart.c.

425{
426 static uint32_t ul_reg_val;
427
428 /* Reset the USART and shut down TX and RX. */
429 usart_reset(p_usart);
430
431 ul_reg_val = 0;
433
434 /* Check whether the input values are legal. */
435 if (!p_usart_opt) {
436 return 1;
437 }
438
439 /* Configure the USART option. */
440 ul_reg_val |= p_usart_opt->char_length | p_usart_opt->parity_type |
441 p_usart_opt->channel_mode | p_usart_opt->stop_bits;
442
443 /* Set normal mode. */
444 ul_reg_val |= US_MR_USART_MODE_NORMAL;
445 p_usart->US_MR |= ul_reg_val;
446
447 return 0;
448}
static void usart_set_sync_slave_baudrate(Usart *p_usart)
Select the SCK pin as the source of baud rate for the USART synchronous slave modes.
Definition usart.c:185

References sam_usart_opt_t::channel_mode, sam_usart_opt_t::char_length, sam_usart_opt_t::parity_type, sam_usart_opt_t::stop_bits, Usart::US_MR, US_MR_USART_MODE_NORMAL, usart_reset(), and usart_set_sync_slave_baudrate().

◆ usart_is_rx_buf_end()

uint32_t usart_is_rx_buf_end ( Usart * p_usart)

Check if one receive buffer is filled.

Parameters
p_usartPointer to a USART instance.
Return values
1Receive is complete.
0Receive is still pending.

Definition at line 660 of file usart.c.

661{
662 return (p_usart->US_CSR & US_CSR_ENDRX) > 0;
663}
#define US_CSR_ENDRX
(US_CSR) End of Receiver Transfer

References Usart::US_CSR, and US_CSR_ENDRX.

◆ usart_is_rx_buf_full()

uint32_t usart_is_rx_buf_full ( Usart * p_usart)

Check if both receive buffers are full.

Parameters
p_usartPointer to a USART instance.
Return values
1Receive buffers are full.
0Receive buffers are not full.

Definition at line 646 of file usart.c.

647{
648 return (p_usart->US_CSR & US_CSR_RXBUFF) > 0;
649}
#define US_CSR_RXBUFF
(US_CSR) Reception Buffer Full

References Usart::US_CSR, and US_CSR_RXBUFF.

◆ usart_is_rx_ready()

uint32_t usart_is_rx_ready ( Usart * p_usart)

Check if the received data are ready.

Check if Data have been received and loaded into USART_RHR.

Parameters
p_usartPointer to a USART instance.
Return values
1Some data has been received.
0No data has been received.

Definition at line 1688 of file usart.c.

1689{
1690 return (p_usart->US_CSR & US_CSR_RXRDY) > 0;
1691}

References Usart::US_CSR, and US_CSR_RXRDY.

Referenced by usart_serial_is_rx_ready().

◆ usart_is_tx_buf_empty()

uint32_t usart_is_tx_buf_empty ( Usart * p_usart)

Check if both transmit buffers are empty.

Parameters
p_usartPointer to a USART instance.
Return values
1Transmit buffers are empty.
0Transmit buffers are not empty.

Definition at line 686 of file usart.c.

687{
688 return (p_usart->US_CSR & US_CSR_TXBUFE) > 0;
689}
#define US_CSR_TXBUFE
(US_CSR) Transmission Buffer Empty

References Usart::US_CSR, and US_CSR_TXBUFE.

◆ usart_is_tx_buf_end()

uint32_t usart_is_tx_buf_end ( Usart * p_usart)

Check if one transmit buffer is empty.

Parameters
p_usartPointer to a USART instance.
Return values
1Transmit is complete.
0Transmit is still pending.

Definition at line 673 of file usart.c.

674{
675 return (p_usart->US_CSR & US_CSR_ENDTX) > 0;
676}
#define US_CSR_ENDTX
(US_CSR) End of Transmitter Transfer

References Usart::US_CSR, and US_CSR_ENDTX.

◆ usart_is_tx_empty()

uint32_t usart_is_tx_empty ( Usart * p_usart)

Check if Transmit Holding Register is empty.

Check if the last data written in USART_THR have been loaded in TSR and the last data loaded in TSR have been transmitted.

Parameters
p_usartPointer to a USART instance.
Return values
1Transmitter is empty.
0Transmitter is not empty.

Definition at line 1674 of file usart.c.

1675{
1676 return (p_usart->US_CSR & US_CSR_TXEMPTY) > 0;
1677}
#define US_CSR_TXEMPTY
(US_CSR) Transmitter Empty

References Usart::US_CSR, and US_CSR_TXEMPTY.

◆ usart_is_tx_ready()

uint32_t usart_is_tx_ready ( Usart * p_usart)

Check if Transmit is Ready.

Check if data have been loaded in USART_THR and are waiting to be loaded into the Transmit Shift Register (TSR).

Parameters
p_usartPointer to a USART instance.
Return values
1No data is in the Transmit Holding Register.
0There is data in the Transmit Holding Register.

Definition at line 1659 of file usart.c.

1660{
1661 return (p_usart->US_CSR & US_CSR_TXRDY) > 0;
1662}
#define US_CSR_TXRDY
(US_CSR) Transmitter Ready

References Usart::US_CSR, and US_CSR_TXRDY.

◆ usart_man_disable_drift_compensation()

void usart_man_disable_drift_compensation ( Usart * p_usart)

Disable drift compensation.

Parameters
p_usartPointer to a USART instance.

Definition at line 2037 of file usart.c.

2038{
2039 p_usart->US_MAN &= ~US_MAN_DRIFT;
2040}
#define US_MAN_DRIFT
(US_MAN) Drift Compensation
__IO uint32_t US_MAN
(Usart Offset: 0x0050) Manchester Encoder Decoder Register

References Usart::US_MAN, and US_MAN_DRIFT.

◆ usart_man_enable_drift_compensation()

void usart_man_enable_drift_compensation ( Usart * p_usart)

Enable drift compensation.

Note
The 16X clock mode must be enabled.
Parameters
p_usartPointer to a USART instance.

Definition at line 2027 of file usart.c.

2028{
2029 p_usart->US_MAN |= US_MAN_DRIFT;
2030}

References Usart::US_MAN, and US_MAN_DRIFT.

◆ usart_man_set_rx_polarity()

void usart_man_set_rx_polarity ( Usart * p_usart,
uint8_t uc_polarity )

Configure the receiver Manchester polarity when the Manchester encode/decode is enabled.

Parameters
p_usartPointer to a USART instance.
uc_polarityIndicate the receiver Manchester polarity, which should be 0 or 1.

Definition at line 2014 of file usart.c.

2015{
2016 p_usart->US_MAN = (p_usart->US_MAN & ~US_MAN_RX_MPOL) |
2017 (uc_polarity << 28);
2018}
#define US_MAN_RX_MPOL
(US_MAN) Receiver Manchester Polarity

References Usart::US_MAN, and US_MAN_RX_MPOL.

◆ usart_man_set_rx_pre_len()

void usart_man_set_rx_pre_len ( Usart * p_usart,
uint8_t uc_len )

Configure the detected receiver preamble length when the Manchester encode/decode is enabled.

Parameters
p_usartPointer to a USART instance.
uc_lenThe detected receiver preamble length, which should be 0 ~ 15.

Definition at line 1984 of file usart.c.

1985{
1986 p_usart->US_MAN = (p_usart->US_MAN & ~US_MAN_RX_PL_Msk) |
1987 US_MAN_RX_PL(uc_len);
1988}
#define US_MAN_RX_PL_Msk
(US_MAN) Receiver Preamble Length
#define US_MAN_RX_PL(value)

References Usart::US_MAN, US_MAN_RX_PL, and US_MAN_RX_PL_Msk.

◆ usart_man_set_rx_pre_pattern()

void usart_man_set_rx_pre_pattern ( Usart * p_usart,
uint8_t uc_pattern )

Configure the detected receiver preamble pattern when the Manchester encode/decode is enabled, which should be 0 ~ 3.

Parameters
p_usartPointer to a USART instance.
uc_pattern0 if the preamble is composed of '1's; 1 if the preamble is composed of '0's; 2 if the preamble is composed of '01's; 3 if the preamble is composed of '10's.

Definition at line 2000 of file usart.c.

2001{
2002 p_usart->US_MAN = (p_usart->US_MAN & ~US_MAN_RX_PP_Msk) |
2003 (uc_pattern << US_MAN_RX_PP_Pos);
2004}
#define US_MAN_RX_PP_Pos
#define US_MAN_RX_PP_Msk
(US_MAN) Receiver Preamble Pattern detected

References Usart::US_MAN, US_MAN_RX_PP_Msk, and US_MAN_RX_PP_Pos.

◆ usart_man_set_tx_polarity()

void usart_man_set_tx_polarity ( Usart * p_usart,
uint8_t uc_polarity )

Configure the transmitter Manchester polarity when the Manchester encode/decode is enabled.

Parameters
p_usartPointer to a USART instance.
uc_polarityIndicate the transmitter Manchester polarity, which should be 0 or 1.

Definition at line 1971 of file usart.c.

1972{
1973 p_usart->US_MAN = (p_usart->US_MAN & ~US_MAN_TX_MPOL) |
1974 (uc_polarity << 12);
1975}
#define US_MAN_TX_MPOL
(US_MAN) Transmitter Manchester Polarity

References Usart::US_MAN, and US_MAN_TX_MPOL.

◆ usart_man_set_tx_pre_len()

void usart_man_set_tx_pre_len ( Usart * p_usart,
uint8_t uc_len )

Configure the transmitter preamble length when the Manchester encode/decode is enabled.

Parameters
p_usartPointer to a USART instance.
uc_lenThe transmitter preamble length, which should be 0 ~ 15.

Definition at line 1941 of file usart.c.

1942{
1943 p_usart->US_MAN = (p_usart->US_MAN & ~US_MAN_TX_PL_Msk) |
1944 US_MAN_TX_PL(uc_len);
1945}
#define US_MAN_TX_PL(value)
#define US_MAN_TX_PL_Msk
(US_MAN) Transmitter Preamble Length

References Usart::US_MAN, US_MAN_TX_PL, and US_MAN_TX_PL_Msk.

◆ usart_man_set_tx_pre_pattern()

void usart_man_set_tx_pre_pattern ( Usart * p_usart,
uint8_t uc_pattern )

Configure the transmitter preamble pattern when the Manchester encode/decode is enabled, which should be 0 ~ 3.

Parameters
p_usartPointer to a USART instance.
uc_pattern0 if the preamble is composed of '1's; 1 if the preamble is composed of '0's; 2 if the preamble is composed of '01's; 3 if the preamble is composed of '10's.

Definition at line 1957 of file usart.c.

1958{
1959 p_usart->US_MAN = (p_usart->US_MAN & ~US_MAN_TX_PP_Msk) |
1960 (uc_pattern << US_MAN_TX_PP_Pos);
1961}
#define US_MAN_TX_PP_Msk
(US_MAN) Transmitter Preamble Pattern
#define US_MAN_TX_PP_Pos

References Usart::US_MAN, US_MAN_TX_PP_Msk, and US_MAN_TX_PP_Pos.

◆ usart_putchar()

uint32_t usart_putchar ( Usart * p_usart,
uint32_t c )

Write to USART Transmit Holding Register.

Note
Before writing user should check if tx is ready (or empty).
Parameters
p_usartPointer to a USART instance.
cData to be sent.
Return values
0on success.
1on failure.

Definition at line 1725 of file usart.c.

1726{
1727 while (!(p_usart->US_CSR & US_CSR_TXRDY)) {
1728 }
1729
1730 p_usart->US_THR = US_THR_TXCHR(c);
1731
1732 return 0;
1733}
#define US_THR_TXCHR(value)
__O uint32_t US_THR
(Usart Offset: 0x001C) Transmitter Holding Register

References Usart::US_CSR, US_CSR_TXRDY, Usart::US_THR, and US_THR_TXCHR.

Referenced by usart_write_line().

◆ usart_read()

uint32_t usart_read ( Usart * p_usart,
uint32_t * c )

Read from USART Receive Holding Register.

Note
Before reading user should check if rx is ready.
Parameters
p_usartPointer to a USART instance.
cPointer where the one-byte received data will be stored.
Return values
0on success.
1if no data is available or errors.

Definition at line 1759 of file usart.c.

1760{
1761 if (!(p_usart->US_CSR & US_CSR_RXRDY)) {
1762 return 1;
1763 }
1764
1765 /* Read character */
1766 *c = p_usart->US_RHR & US_RHR_RXCHR_Msk;
1767
1768 return 0;
1769}

References Usart::US_CSR, US_CSR_RXRDY, Usart::US_RHR, and US_RHR_RXCHR_Msk.

Referenced by usart_serial_getchar().

◆ usart_reset()

void usart_reset ( Usart * p_usart)

Reset the USART and disable TX and RX.

Parameters
p_usartPointer to a USART instance.

Definition at line 240 of file usart.c.

241{
242 /* Disable the Write Protect. */
244
245 /* Reset registers that could cause unpredictable behavior after reset. */
246 p_usart->US_MR = 0;
247 p_usart->US_RTOR = 0;
248 p_usart->US_TTGR = 0;
249
250 /* Disable TX and RX. */
251 usart_reset_tx(p_usart);
252 usart_reset_rx(p_usart);
253 /* Reset status bits. */
254 usart_reset_status(p_usart);
255 /* Turn off RTS and DTR if exist. */
257#if (SAM3S || SAM4S || SAM3U || SAM4L || SAM4E)
259#endif
260}
void usart_reset_tx(Usart *p_usart)
Immediately stop and disable USART transmitter.
Definition usart.c:1404
void usart_drive_DTR_pin_high(Usart *p_usart)
Drive the pin DTR to 1.
Definition usart.c:1602
void usart_reset_status(Usart *p_usart)
Reset status bits (PARE, OVER, MANERR, UNRE and PXBRK in US_CSR).
Definition usart.c:1514
void usart_reset_rx(Usart *p_usart)
Immediately stop and disable USART receiver.
Definition usart.c:1446
void usart_drive_RTS_pin_high(Usart *p_usart)
Drive the pin RTS to 1.
Definition usart.c:1624
void usart_disable_writeprotect(Usart *p_usart)
Disable write protect of USART registers.
Definition usart.c:1907
__IO uint32_t US_RTOR
(Usart Offset: 0x0024) Receiver Time-out Register
__IO uint32_t US_TTGR
(Usart Offset: 0x0028) Transmitter Timeguard Register

References Usart::US_MR, Usart::US_RTOR, Usart::US_TTGR, usart_disable_writeprotect(), usart_drive_DTR_pin_high(), usart_drive_RTS_pin_high(), usart_reset_rx(), usart_reset_status(), and usart_reset_tx().

Referenced by usart_init_iso7816(), usart_init_rs232(), usart_init_spi_master(), usart_init_spi_slave(), usart_init_sync_master(), and usart_init_sync_slave().

◆ usart_reset_iterations()

void usart_reset_iterations ( Usart * p_usart)

Reset the ITERATION in US_CSR when the ISO7816 mode is enabled.

Parameters
p_usartPointer to a USART instance.

Definition at line 623 of file usart.c.

624{
625 p_usart->US_CR = US_CR_RSTIT;
626}
#define US_CR_RSTIT
(US_CR) Reset Iterations

References Usart::US_CR, and US_CR_RSTIT.

◆ usart_reset_nack()

void usart_reset_nack ( Usart * p_usart)

Reset NACK in US_CSR.

Parameters
p_usartPointer to a USART instance.

Definition at line 633 of file usart.c.

634{
635 p_usart->US_CR = US_CR_RSTNACK;
636}
#define US_CR_RSTNACK
(US_CR) Reset Non Acknowledge

References Usart::US_CR, and US_CR_RSTNACK.

◆ usart_reset_rx()

void usart_reset_rx ( Usart * p_usart)

Immediately stop and disable USART receiver.

Parameters
p_usartPointer to a USART instance.

Definition at line 1446 of file usart.c.

1447{
1448 /* Reset Receiver */
1449 p_usart->US_CR = US_CR_RSTRX | US_CR_RXDIS;
1450}
#define US_CR_RSTRX
(US_CR) Reset Receiver

References Usart::US_CR, US_CR_RSTRX, and US_CR_RXDIS.

Referenced by usart_reset().

◆ usart_reset_status()

void usart_reset_status ( Usart * p_usart)

Reset status bits (PARE, OVER, MANERR, UNRE and PXBRK in US_CSR).

Parameters
p_usartPointer to a USART instance.

Definition at line 1514 of file usart.c.

1515{
1516 p_usart->US_CR = US_CR_RSTSTA;
1517}
#define US_CR_RSTSTA
(US_CR) Reset Status Bits

References Usart::US_CR, and US_CR_RSTSTA.

Referenced by usart_reset().

◆ usart_reset_tx()

void usart_reset_tx ( Usart * p_usart)

Immediately stop and disable USART transmitter.

Parameters
p_usartPointer to a USART instance.

Definition at line 1404 of file usart.c.

1405{
1406 /* Reset transmitter */
1407 p_usart->US_CR = US_CR_RSTTX | US_CR_TXDIS;
1408}
#define US_CR_RSTTX
(US_CR) Reset Transmitter

References Usart::US_CR, US_CR_RSTTX, and US_CR_TXDIS.

Referenced by usart_reset().

◆ usart_restart_rx_timeout()

void usart_restart_rx_timeout ( Usart * p_usart)

Restart the receive timeout.

Parameters
p_usartPointer to a USART instance.

Definition at line 1580 of file usart.c.

1581{
1582 p_usart->US_CR = US_CR_RETTO;
1583}
#define US_CR_RETTO
(US_CR) Rearm Time-out

References Usart::US_CR, and US_CR_RETTO.

◆ usart_send_address()

uint32_t usart_send_address ( Usart * p_usart,
uint32_t ul_addr )

In Multidrop mode only, the next character written to the US_THR is sent with the address bit set.

Parameters
p_usartPointer to a USART instance.
ul_addrThe address to be sent out.
Return values
0on success.
1on failure.

Definition at line 1560 of file usart.c.

1561{
1562 if ((p_usart->US_MR & US_MR_PAR_MULTIDROP) != US_MR_PAR_MULTIDROP) {
1563 return 1;
1564 }
1565
1566 p_usart->US_CR = US_CR_SENDA;
1567
1568 if (usart_write(p_usart, ul_addr)) {
1569 return 1;
1570 } else {
1571 return 0;
1572 }
1573}
#define US_CR_SENDA
(US_CR) Send Address
#define US_MR_PAR_MULTIDROP
(US_MR) Multidrop mode
uint32_t usart_write(Usart *p_usart, uint32_t c)
Write to USART Transmit Holding Register.
Definition usart.c:1704

References Usart::US_CR, US_CR_SENDA, Usart::US_MR, US_MR_PAR_MULTIDROP, and usart_write().

◆ usart_set_async_baudrate()

uint32_t usart_set_async_baudrate ( Usart * p_usart,
uint32_t baudrate,
uint32_t ul_mck )

Calculate a clock divider(CD) and a fractional part (FP) for the USART asynchronous modes to generate a baudrate as close as possible to the baudrate set point.

Note
Baud rate calculation: Baudrate = ul_mck/(Over * (CD + FP/8)) (Over being 16 or 8). The maximal oversampling is selected if it allows to generate a baudrate close to the set point.
Parameters
p_usartPointer to a USART instance.
baudrateBaud rate set point.
ul_mckUSART module input clock frequency.
Return values
0Baud rate is successfully initialized.
1Baud rate set point is out of range for the given input clock frequency.

Definition at line 111 of file usart.c.

113{
114 uint32_t over;
115 uint32_t cd_fp;
116 uint32_t cd;
117 uint32_t fp;
118
119 /* Calculate the receiver sampling divide of baudrate clock. */
120 if (ul_mck >= HIGH_FRQ_SAMPLE_DIV * baudrate) {
121 over = HIGH_FRQ_SAMPLE_DIV;
122 } else {
123 over = LOW_FRQ_SAMPLE_DIV;
124 }
125
126 /* Calculate clock divider according to the fraction calculated formula. */
127 cd_fp = (8 * ul_mck + (over * baudrate) / 2) / (over * baudrate);
128 cd = cd_fp >> 3;
129 fp = cd_fp & 0x07;
130 if (cd < MIN_CD_VALUE || cd > MAX_CD_VALUE) {
131 return 1;
132 }
133
134 /* Configure the OVER bit in MR register. */
135 if (over == 8) {
136 p_usart->US_MR |= US_MR_OVER;
137 }
138
139 /* Configure the baudrate generate register. */
140 p_usart->US_BRGR = (cd << US_BRGR_CD_Pos) | (fp << US_BRGR_FP_Pos);
141
142 return 0;
143}
#define US_BRGR_FP_Pos
#define US_BRGR_CD_Pos
#define US_MR_OVER
(US_MR) Oversampling Mode
#define HIGH_FRQ_SAMPLE_DIV
Definition usart.c:81
#define LOW_FRQ_SAMPLE_DIV
Definition usart.c:82
#define MAX_CD_VALUE
Definition usart.c:78
__IO uint32_t US_BRGR
(Usart Offset: 0x0020) Baud Rate Generator Register

References HIGH_FRQ_SAMPLE_DIV, LOW_FRQ_SAMPLE_DIV, MAX_CD_VALUE, Usart::US_BRGR, US_BRGR_CD_Pos, US_BRGR_FP_Pos, Usart::US_MR, and US_MR_OVER.

Referenced by usart_init_rs232().

◆ usart_set_rx_timeout()

void usart_set_rx_timeout ( Usart * p_usart,
uint32_t timeout )

Configure the receive timeout register.

Parameters
p_usartPointer to a USART instance.
timeoutThe value of receive timeout.

Definition at line 1458 of file usart.c.

1459{
1460 p_usart->US_RTOR = timeout;
1461}

References Usart::US_RTOR.

◆ usart_set_tx_timeguard()

void usart_set_tx_timeguard ( Usart * p_usart,
uint32_t timeguard )

Configure the transmit timeguard register.

Parameters
p_usartPointer to a USART instance.
timeguardThe value of transmit timeguard.

Definition at line 1416 of file usart.c.

1417{
1418 p_usart->US_TTGR = timeguard;
1419}

References Usart::US_TTGR.

◆ usart_spi_force_chip_select()

void usart_spi_force_chip_select ( Usart * p_usart)

Drive the slave select line NSS (RTS pin) to 0 in SPI master mode.

Parameters
p_usartPointer to a USART instance.

Definition at line 1634 of file usart.c.

1635{
1636 p_usart->US_CR = US_CR_FCS;
1637}
#define US_CR_FCS
(US_CR) Force SPI Chip Select

References Usart::US_CR, and US_CR_FCS.

◆ usart_spi_release_chip_select()

void usart_spi_release_chip_select ( Usart * p_usart)

Drive the slave select line NSS (RTS pin) to 1 in SPI master mode.

Parameters
p_usartPointer to a USART instance.

Definition at line 1644 of file usart.c.

1645{
1646 p_usart->US_CR = US_CR_RCS;
1647}
#define US_CR_RCS
(US_CR) Release SPI Chip Select

References Usart::US_CR, and US_CR_RCS.

◆ usart_start_rx_timeout()

void usart_start_rx_timeout ( Usart * p_usart)

Start waiting for a character before clocking the timeout count.

Reset the status bit TIMEOUT in US_CSR.

Parameters
p_usartPointer to a USART instance.

Definition at line 1545 of file usart.c.

1546{
1547 p_usart->US_CR = US_CR_STTTO;
1548}
#define US_CR_STTTO
(US_CR) Start Time-out

References Usart::US_CR, and US_CR_STTTO.

◆ usart_start_tx_break()

void usart_start_tx_break ( Usart * p_usart)

Start transmission of a break.

Parameters
p_usartPointer to a USART instance.

Definition at line 1524 of file usart.c.

1525{
1526 p_usart->US_CR = US_CR_STTBRK;
1527}
#define US_CR_STTBRK
(US_CR) Start Break

References Usart::US_CR, and US_CR_STTBRK.

◆ usart_stop_tx_break()

void usart_stop_tx_break ( Usart * p_usart)

Stop transmission of a break.

Parameters
p_usartPointer to a USART instance.

Definition at line 1534 of file usart.c.

1535{
1536 p_usart->US_CR = US_CR_STPBRK;
1537}
#define US_CR_STPBRK
(US_CR) Stop Break

References Usart::US_CR, and US_CR_STPBRK.

◆ usart_write()

uint32_t usart_write ( Usart * p_usart,
uint32_t c )

Write to USART Transmit Holding Register.

Note
Before writing user should check if tx is ready (or empty).
Parameters
p_usartPointer to a USART instance.
cData to be sent.
Return values
0on success.
1on failure.

Definition at line 1704 of file usart.c.

1705{
1706 if (!(p_usart->US_CSR & US_CSR_TXRDY)) {
1707 return 1;
1708 }
1709
1710 p_usart->US_THR = US_THR_TXCHR(c);
1711 return 0;
1712}

References Usart::US_CSR, US_CSR_TXRDY, Usart::US_THR, and US_THR_TXCHR.

Referenced by usart_send_address(), and usart_serial_putchar().

◆ usart_write_line()

void usart_write_line ( Usart * p_usart,
const char * string )

Write one-line string through USART.

Parameters
p_usartPointer to a USART instance.
stringPointer to one-line string to be sent.

Definition at line 1741 of file usart.c.

1742{
1743 while (*string != '\0') {
1744 usart_putchar(p_usart, *string++);
1745 }
1746}
uint32_t usart_putchar(Usart *p_usart, uint32_t c)
Write to USART Transmit Holding Register.
Definition usart.c:1725

References usart_putchar().