added prescaler for 16 bit pwm in LPC1347 target

Fork of mbed-dev by mbed official

Committer:
JojoS
Date:
Sat Sep 10 15:32:04 2016 +0000
Revision:
147:ba84b7dc41a7
Parent:
107:414e9c822e99
added prescaler for 16 bit timers (solution as in LPC11xx), default prescaler 31 for max 28 ms period time

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 107:414e9c822e99 1 /**
mbed_official 107:414e9c822e99 2 * \file
mbed_official 107:414e9c822e99 3 *
mbed_official 107:414e9c822e99 4 * \brief Universal Synchronous Asynchronous Receiver Transmitter (USART) driver
mbed_official 107:414e9c822e99 5 * for SAM.
mbed_official 107:414e9c822e99 6 *
mbed_official 107:414e9c822e99 7 * Copyright (c) 2011-2015 Atmel Corporation. All rights reserved.
mbed_official 107:414e9c822e99 8 *
mbed_official 107:414e9c822e99 9 * \asf_license_start
mbed_official 107:414e9c822e99 10 *
mbed_official 107:414e9c822e99 11 * \page License
mbed_official 107:414e9c822e99 12 *
mbed_official 107:414e9c822e99 13 * Redistribution and use in source and binary forms, with or without
mbed_official 107:414e9c822e99 14 * modification, are permitted provided that the following conditions are met:
mbed_official 107:414e9c822e99 15 *
mbed_official 107:414e9c822e99 16 * 1. Redistributions of source code must retain the above copyright notice,
mbed_official 107:414e9c822e99 17 * this list of conditions and the following disclaimer.
mbed_official 107:414e9c822e99 18 *
mbed_official 107:414e9c822e99 19 * 2. Redistributions in binary form must reproduce the above copyright notice,
mbed_official 107:414e9c822e99 20 * this list of conditions and the following disclaimer in the documentation
mbed_official 107:414e9c822e99 21 * and/or other materials provided with the distribution.
mbed_official 107:414e9c822e99 22 *
mbed_official 107:414e9c822e99 23 * 3. The name of Atmel may not be used to endorse or promote products derived
mbed_official 107:414e9c822e99 24 * from this software without specific prior written permission.
mbed_official 107:414e9c822e99 25 *
mbed_official 107:414e9c822e99 26 * 4. This software may only be redistributed and used in connection with an
mbed_official 107:414e9c822e99 27 * Atmel microcontroller product.
mbed_official 107:414e9c822e99 28 *
mbed_official 107:414e9c822e99 29 * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED
mbed_official 107:414e9c822e99 30 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
mbed_official 107:414e9c822e99 31 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
mbed_official 107:414e9c822e99 32 * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR
mbed_official 107:414e9c822e99 33 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
mbed_official 107:414e9c822e99 34 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
mbed_official 107:414e9c822e99 35 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
mbed_official 107:414e9c822e99 36 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
mbed_official 107:414e9c822e99 37 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
mbed_official 107:414e9c822e99 38 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
mbed_official 107:414e9c822e99 39 * POSSIBILITY OF SUCH DAMAGE.
mbed_official 107:414e9c822e99 40 *
mbed_official 107:414e9c822e99 41 * \asf_license_stop
mbed_official 107:414e9c822e99 42 *
mbed_official 107:414e9c822e99 43 */
mbed_official 107:414e9c822e99 44 /*
mbed_official 107:414e9c822e99 45 * Support and FAQ: visit <a href="http://www.atmel.com/design-support/">Atmel Support</a>
mbed_official 107:414e9c822e99 46 */
mbed_official 107:414e9c822e99 47
mbed_official 107:414e9c822e99 48 #include "usart.h"
mbed_official 107:414e9c822e99 49
mbed_official 107:414e9c822e99 50 /// @cond 0
mbed_official 107:414e9c822e99 51 /**INDENT-OFF**/
mbed_official 107:414e9c822e99 52 #ifdef __cplusplus
mbed_official 107:414e9c822e99 53 extern "C" {
mbed_official 107:414e9c822e99 54 #endif
mbed_official 107:414e9c822e99 55 /**INDENT-ON**/
mbed_official 107:414e9c822e99 56 /// @endcond
mbed_official 107:414e9c822e99 57
mbed_official 107:414e9c822e99 58 /**
mbed_official 107:414e9c822e99 59 * \defgroup sam_drivers_usart_group Universal Synchronous Asynchronous
mbed_official 107:414e9c822e99 60 * Receiver Transmitter (USART)
mbed_official 107:414e9c822e99 61 *
mbed_official 107:414e9c822e99 62 * The Universal Synchronous Asynchronous Receiver Transceiver (USART)
mbed_official 107:414e9c822e99 63 * provides one full duplex universal synchronous asynchronous serial link.
mbed_official 107:414e9c822e99 64 * Data frame format is widely programmable (data length, parity, number of
mbed_official 107:414e9c822e99 65 * stop bits) to support a maximum of standards. The receiver implements
mbed_official 107:414e9c822e99 66 * parity error, framing error and overrun error detection. The receiver
mbed_official 107:414e9c822e99 67 * time-out enables handling variable-length frames and the transmitter
mbed_official 107:414e9c822e99 68 * timeguard facilitates communications with slow remote devices. Multidrop
mbed_official 107:414e9c822e99 69 * communications are also supported through address bit handling in reception
mbed_official 107:414e9c822e99 70 * and transmission. The driver supports the following modes:
mbed_official 107:414e9c822e99 71 * RS232, RS485, SPI, IrDA, ISO7816, MODEM, Hardware handshaking and LIN.
mbed_official 107:414e9c822e99 72 *
mbed_official 107:414e9c822e99 73 * @{
mbed_official 107:414e9c822e99 74 */
mbed_official 107:414e9c822e99 75
mbed_official 107:414e9c822e99 76 /* The write protect key value. */
mbed_official 107:414e9c822e99 77 #ifndef US_WPMR_WPKEY_PASSWD
mbed_official 107:414e9c822e99 78 #define US_WPMR_WPKEY_PASSWD US_WPMR_WPKEY(0x555341U)
mbed_official 107:414e9c822e99 79 #endif
mbed_official 107:414e9c822e99 80
mbed_official 107:414e9c822e99 81 #ifndef US_WPMR_WPKEY_PASSWD
mbed_official 107:414e9c822e99 82 # define US_WPMR_WPKEY_PASSWD US_WPMR_WPKEY(US_WPKEY_VALUE)
mbed_official 107:414e9c822e99 83 #endif
mbed_official 107:414e9c822e99 84
mbed_official 107:414e9c822e99 85 /* The CD value scope programmed in MR register. */
mbed_official 107:414e9c822e99 86 #define MIN_CD_VALUE 0x01
mbed_official 107:414e9c822e99 87 #define MIN_CD_VALUE_SPI 0x04
mbed_official 107:414e9c822e99 88 #define MAX_CD_VALUE US_BRGR_CD_Msk
mbed_official 107:414e9c822e99 89
mbed_official 107:414e9c822e99 90 /* The receiver sampling divide of baudrate clock. */
mbed_official 107:414e9c822e99 91 #define HIGH_FRQ_SAMPLE_DIV 16
mbed_official 107:414e9c822e99 92 #define LOW_FRQ_SAMPLE_DIV 8
mbed_official 107:414e9c822e99 93
mbed_official 107:414e9c822e99 94 /* Max transmitter timeguard. */
mbed_official 107:414e9c822e99 95 #define MAX_TRAN_GUARD_TIME US_TTGR_TG_Msk
mbed_official 107:414e9c822e99 96
mbed_official 107:414e9c822e99 97 /* The non-existent parity error number. */
mbed_official 107:414e9c822e99 98 #define USART_PARITY_ERROR 5
mbed_official 107:414e9c822e99 99
mbed_official 107:414e9c822e99 100 /* ISO7816 protocol type. */
mbed_official 107:414e9c822e99 101 #define ISO7816_T_0 0
mbed_official 107:414e9c822e99 102 #define ISO7816_T_1 1
mbed_official 107:414e9c822e99 103
mbed_official 107:414e9c822e99 104 /**
mbed_official 107:414e9c822e99 105 * \brief Calculate a clock divider(CD) and a fractional part (FP) for the
mbed_official 107:414e9c822e99 106 * USART asynchronous modes to generate a baudrate as close as possible to
mbed_official 107:414e9c822e99 107 * the baudrate set point.
mbed_official 107:414e9c822e99 108 *
mbed_official 107:414e9c822e99 109 * \note Baud rate calculation: Baudrate = ul_mck/(Over * (CD + FP/8))
mbed_official 107:414e9c822e99 110 * (Over being 16 or 8). The maximal oversampling is selected if it allows to
mbed_official 107:414e9c822e99 111 * generate a baudrate close to the set point.
mbed_official 107:414e9c822e99 112 *
mbed_official 107:414e9c822e99 113 * \param p_usart Pointer to a USART instance.
mbed_official 107:414e9c822e99 114 * \param baudrate Baud rate set point.
mbed_official 107:414e9c822e99 115 * \param ul_mck USART module input clock frequency.
mbed_official 107:414e9c822e99 116 *
mbed_official 107:414e9c822e99 117 * \retval 0 Baud rate is successfully initialized.
mbed_official 107:414e9c822e99 118 * \retval 1 Baud rate set point is out of range for the given input clock
mbed_official 107:414e9c822e99 119 * frequency.
mbed_official 107:414e9c822e99 120 */
mbed_official 107:414e9c822e99 121 uint32_t usart_set_async_baudrate(Usart *p_usart,
mbed_official 107:414e9c822e99 122 uint32_t baudrate, uint32_t ul_mck)
mbed_official 107:414e9c822e99 123 {
mbed_official 107:414e9c822e99 124 uint32_t over;
mbed_official 107:414e9c822e99 125 uint32_t cd_fp;
mbed_official 107:414e9c822e99 126 uint32_t cd;
mbed_official 107:414e9c822e99 127 uint32_t fp;
mbed_official 107:414e9c822e99 128
mbed_official 107:414e9c822e99 129 /* Calculate the receiver sampling divide of baudrate clock. */
mbed_official 107:414e9c822e99 130 if (ul_mck >= HIGH_FRQ_SAMPLE_DIV * baudrate) {
mbed_official 107:414e9c822e99 131 over = HIGH_FRQ_SAMPLE_DIV;
mbed_official 107:414e9c822e99 132 } else {
mbed_official 107:414e9c822e99 133 over = LOW_FRQ_SAMPLE_DIV;
mbed_official 107:414e9c822e99 134 }
mbed_official 107:414e9c822e99 135
mbed_official 107:414e9c822e99 136 /* Calculate clock divider according to the fraction calculated formula. */
mbed_official 107:414e9c822e99 137 cd_fp = (8 * ul_mck + (over * baudrate) / 2) / (over * baudrate);
mbed_official 107:414e9c822e99 138 cd = cd_fp >> 3;
mbed_official 107:414e9c822e99 139 fp = cd_fp & 0x07;
mbed_official 107:414e9c822e99 140 if (cd < MIN_CD_VALUE || cd > MAX_CD_VALUE) {
mbed_official 107:414e9c822e99 141 return 1;
mbed_official 107:414e9c822e99 142 }
mbed_official 107:414e9c822e99 143
mbed_official 107:414e9c822e99 144 /* Configure the OVER bit in MR register. */
mbed_official 107:414e9c822e99 145 if (over == 8) {
mbed_official 107:414e9c822e99 146 p_usart->US_MR |= US_MR_OVER;
mbed_official 107:414e9c822e99 147 }
mbed_official 107:414e9c822e99 148
mbed_official 107:414e9c822e99 149 /* Configure the baudrate generate register. */
mbed_official 107:414e9c822e99 150 p_usart->US_BRGR = (cd << US_BRGR_CD_Pos) | (fp << US_BRGR_FP_Pos);
mbed_official 107:414e9c822e99 151
mbed_official 107:414e9c822e99 152 return 0;
mbed_official 107:414e9c822e99 153 }
mbed_official 107:414e9c822e99 154
mbed_official 107:414e9c822e99 155 /**
mbed_official 107:414e9c822e99 156 * \brief Calculate a clock divider for the USART synchronous master modes
mbed_official 107:414e9c822e99 157 * to generate a baudrate as close as possible to the baudrate set point.
mbed_official 107:414e9c822e99 158 *
mbed_official 107:414e9c822e99 159 * \note Synchronous baudrate calculation: baudrate = ul_mck / cd
mbed_official 107:414e9c822e99 160 *
mbed_official 107:414e9c822e99 161 * \param p_usart Pointer to a USART instance.
mbed_official 107:414e9c822e99 162 * \param baudrate Baud rate set point.
mbed_official 107:414e9c822e99 163 * \param ul_mck USART module input clock frequency.
mbed_official 107:414e9c822e99 164 *
mbed_official 107:414e9c822e99 165 * \retval 0 Baud rate is successfully initialized.
mbed_official 107:414e9c822e99 166 * \retval 1 Baud rate set point is out of range for the given input clock
mbed_official 107:414e9c822e99 167 * frequency.
mbed_official 107:414e9c822e99 168 */
mbed_official 107:414e9c822e99 169 static uint32_t usart_set_sync_master_baudrate(Usart *p_usart,
mbed_official 107:414e9c822e99 170 uint32_t baudrate, uint32_t ul_mck)
mbed_official 107:414e9c822e99 171 {
mbed_official 107:414e9c822e99 172 uint32_t cd;
mbed_official 107:414e9c822e99 173
mbed_official 107:414e9c822e99 174 /* Calculate clock divider according to the formula in synchronous mode. */
mbed_official 107:414e9c822e99 175 cd = (ul_mck + baudrate / 2) / baudrate;
mbed_official 107:414e9c822e99 176
mbed_official 107:414e9c822e99 177 if (cd < MIN_CD_VALUE || cd > MAX_CD_VALUE) {
mbed_official 107:414e9c822e99 178 return 1;
mbed_official 107:414e9c822e99 179 }
mbed_official 107:414e9c822e99 180
mbed_official 107:414e9c822e99 181 /* Configure the baudrate generate register. */
mbed_official 107:414e9c822e99 182 p_usart->US_BRGR = cd << US_BRGR_CD_Pos;
mbed_official 107:414e9c822e99 183
mbed_official 107:414e9c822e99 184 p_usart->US_MR = (p_usart->US_MR & ~US_MR_USCLKS_Msk) |
mbed_official 107:414e9c822e99 185 US_MR_USCLKS_MCK | US_MR_SYNC;
mbed_official 107:414e9c822e99 186 return 0;
mbed_official 107:414e9c822e99 187 }
mbed_official 107:414e9c822e99 188
mbed_official 107:414e9c822e99 189 /**
mbed_official 107:414e9c822e99 190 * \brief Select the SCK pin as the source of baud rate for the USART
mbed_official 107:414e9c822e99 191 * synchronous slave modes.
mbed_official 107:414e9c822e99 192 *
mbed_official 107:414e9c822e99 193 * \param p_usart Pointer to a USART instance.
mbed_official 107:414e9c822e99 194 */
mbed_official 107:414e9c822e99 195 static void usart_set_sync_slave_baudrate(Usart *p_usart)
mbed_official 107:414e9c822e99 196 {
mbed_official 107:414e9c822e99 197 p_usart->US_MR = (p_usart->US_MR & ~US_MR_USCLKS_Msk) |
mbed_official 107:414e9c822e99 198 US_MR_USCLKS_SCK | US_MR_SYNC;
mbed_official 107:414e9c822e99 199 }
mbed_official 107:414e9c822e99 200
mbed_official 107:414e9c822e99 201 /**
mbed_official 107:414e9c822e99 202 * \brief Calculate a clock divider (\e CD) for the USART SPI master mode to
mbed_official 107:414e9c822e99 203 * generate a baud rate as close as possible to the baud rate set point.
mbed_official 107:414e9c822e99 204 *
mbed_official 107:414e9c822e99 205 * \note Baud rate calculation:
mbed_official 107:414e9c822e99 206 * \f$ Baudrate = \frac{SelectedClock}{CD} \f$.
mbed_official 107:414e9c822e99 207 *
mbed_official 107:414e9c822e99 208 * \param p_usart Pointer to a USART instance.
mbed_official 107:414e9c822e99 209 * \param baudrate Baud rate set point.
mbed_official 107:414e9c822e99 210 * \param ul_mck USART module input clock frequency.
mbed_official 107:414e9c822e99 211 *
mbed_official 107:414e9c822e99 212 * \retval 0 Baud rate is successfully initialized.
mbed_official 107:414e9c822e99 213 * \retval 1 Baud rate set point is out of range for the given input clock
mbed_official 107:414e9c822e99 214 * frequency.
mbed_official 107:414e9c822e99 215 */
mbed_official 107:414e9c822e99 216 static uint32_t usart_set_spi_master_baudrate(Usart *p_usart,
mbed_official 107:414e9c822e99 217 uint32_t baudrate, uint32_t ul_mck)
mbed_official 107:414e9c822e99 218 {
mbed_official 107:414e9c822e99 219 uint32_t cd;
mbed_official 107:414e9c822e99 220
mbed_official 107:414e9c822e99 221 /* Calculate the clock divider according to the formula in SPI mode. */
mbed_official 107:414e9c822e99 222 cd = (ul_mck + baudrate / 2) / baudrate;
mbed_official 107:414e9c822e99 223
mbed_official 107:414e9c822e99 224 if (cd < MIN_CD_VALUE_SPI || cd > MAX_CD_VALUE) {
mbed_official 107:414e9c822e99 225 return 1;
mbed_official 107:414e9c822e99 226 }
mbed_official 107:414e9c822e99 227
mbed_official 107:414e9c822e99 228 p_usart->US_BRGR = cd << US_BRGR_CD_Pos;
mbed_official 107:414e9c822e99 229
mbed_official 107:414e9c822e99 230 return 0;
mbed_official 107:414e9c822e99 231 }
mbed_official 107:414e9c822e99 232
mbed_official 107:414e9c822e99 233 /**
mbed_official 107:414e9c822e99 234 * \brief Select the SCK pin as the source of baudrate for the USART SPI slave
mbed_official 107:414e9c822e99 235 * mode.
mbed_official 107:414e9c822e99 236 *
mbed_official 107:414e9c822e99 237 * \param p_usart Pointer to a USART instance.
mbed_official 107:414e9c822e99 238 */
mbed_official 107:414e9c822e99 239 static void usart_set_spi_slave_baudrate(Usart *p_usart)
mbed_official 107:414e9c822e99 240 {
mbed_official 107:414e9c822e99 241 p_usart->US_MR &= ~US_MR_USCLKS_Msk;
mbed_official 107:414e9c822e99 242 p_usart->US_MR |= US_MR_USCLKS_SCK;
mbed_official 107:414e9c822e99 243 }
mbed_official 107:414e9c822e99 244
mbed_official 107:414e9c822e99 245 /**
mbed_official 107:414e9c822e99 246 * \brief Reset the USART and disable TX and RX.
mbed_official 107:414e9c822e99 247 *
mbed_official 107:414e9c822e99 248 * \param p_usart Pointer to a USART instance.
mbed_official 107:414e9c822e99 249 */
mbed_official 107:414e9c822e99 250 void usart_reset(Usart *p_usart)
mbed_official 107:414e9c822e99 251 {
mbed_official 107:414e9c822e99 252 /* Disable the Write Protect. */
mbed_official 107:414e9c822e99 253 usart_disable_writeprotect(p_usart);
mbed_official 107:414e9c822e99 254
mbed_official 107:414e9c822e99 255 /* Reset registers that could cause unpredictable behavior after reset. */
mbed_official 107:414e9c822e99 256 p_usart->US_MR = 0;
mbed_official 107:414e9c822e99 257 p_usart->US_RTOR = 0;
mbed_official 107:414e9c822e99 258 p_usart->US_TTGR = 0;
mbed_official 107:414e9c822e99 259
mbed_official 107:414e9c822e99 260 /* Disable TX and RX. */
mbed_official 107:414e9c822e99 261 usart_reset_tx(p_usart);
mbed_official 107:414e9c822e99 262 usart_reset_rx(p_usart);
mbed_official 107:414e9c822e99 263 /* Reset status bits. */
mbed_official 107:414e9c822e99 264 usart_reset_status(p_usart);
mbed_official 107:414e9c822e99 265 /* Turn off RTS and DTR if exist. */
mbed_official 107:414e9c822e99 266 usart_drive_RTS_pin_high(p_usart);
mbed_official 107:414e9c822e99 267 #if (SAM3S || SAM4S || SAM3U || SAM4L || SAM4E)
mbed_official 107:414e9c822e99 268 usart_drive_DTR_pin_high(p_usart);
mbed_official 107:414e9c822e99 269 #endif
mbed_official 107:414e9c822e99 270 }
mbed_official 107:414e9c822e99 271
mbed_official 107:414e9c822e99 272 /**
mbed_official 107:414e9c822e99 273 * \brief Configure USART to work in RS232 mode.
mbed_official 107:414e9c822e99 274 *
mbed_official 107:414e9c822e99 275 * \note By default, the transmitter and receiver aren't enabled.
mbed_official 107:414e9c822e99 276 *
mbed_official 107:414e9c822e99 277 * \param p_usart Pointer to a USART instance.
mbed_official 107:414e9c822e99 278 * \param p_usart_opt Pointer to sam_usart_opt_t instance.
mbed_official 107:414e9c822e99 279 * \param ul_mck USART module input clock frequency.
mbed_official 107:414e9c822e99 280 *
mbed_official 107:414e9c822e99 281 * \retval 0 on success.
mbed_official 107:414e9c822e99 282 * \retval 1 on failure.
mbed_official 107:414e9c822e99 283 */
mbed_official 107:414e9c822e99 284 uint32_t usart_init_rs232(Usart *p_usart,
mbed_official 107:414e9c822e99 285 const sam_usart_opt_t *p_usart_opt, uint32_t ul_mck)
mbed_official 107:414e9c822e99 286 {
mbed_official 107:414e9c822e99 287 static uint32_t ul_reg_val;
mbed_official 107:414e9c822e99 288
mbed_official 107:414e9c822e99 289 /* Reset the USART and shut down TX and RX. */
mbed_official 107:414e9c822e99 290 usart_reset(p_usart);
mbed_official 107:414e9c822e99 291
mbed_official 107:414e9c822e99 292 ul_reg_val = 0;
mbed_official 107:414e9c822e99 293 /* Check whether the input values are legal. */
mbed_official 107:414e9c822e99 294 if (!p_usart_opt || usart_set_async_baudrate(p_usart,
mbed_official 107:414e9c822e99 295 p_usart_opt->baudrate, ul_mck)) {
mbed_official 107:414e9c822e99 296 return 1;
mbed_official 107:414e9c822e99 297 }
mbed_official 107:414e9c822e99 298
mbed_official 107:414e9c822e99 299 /* Configure the USART option. */
mbed_official 107:414e9c822e99 300 ul_reg_val |= p_usart_opt->char_length | p_usart_opt->parity_type |
mbed_official 107:414e9c822e99 301 p_usart_opt->channel_mode | p_usart_opt->stop_bits;
mbed_official 107:414e9c822e99 302
mbed_official 107:414e9c822e99 303 /* Configure the USART mode as normal mode. */
mbed_official 107:414e9c822e99 304 ul_reg_val |= US_MR_USART_MODE_NORMAL;
mbed_official 107:414e9c822e99 305
mbed_official 107:414e9c822e99 306 p_usart->US_MR |= ul_reg_val;
mbed_official 107:414e9c822e99 307
mbed_official 107:414e9c822e99 308 return 0;
mbed_official 107:414e9c822e99 309 }
mbed_official 107:414e9c822e99 310
mbed_official 107:414e9c822e99 311 /**
mbed_official 107:414e9c822e99 312 * \brief Configure USART to work in hardware handshaking mode.
mbed_official 107:414e9c822e99 313 *
mbed_official 107:414e9c822e99 314 * \note By default, the transmitter and receiver aren't enabled.
mbed_official 107:414e9c822e99 315 *
mbed_official 107:414e9c822e99 316 * \param p_usart Pointer to a USART instance.
mbed_official 107:414e9c822e99 317 * \param p_usart_opt Pointer to sam_usart_opt_t instance.
mbed_official 107:414e9c822e99 318 * \param ul_mck USART module input clock frequency.
mbed_official 107:414e9c822e99 319 *
mbed_official 107:414e9c822e99 320 * \retval 0 on success.
mbed_official 107:414e9c822e99 321 * \retval 1 on failure.
mbed_official 107:414e9c822e99 322 */
mbed_official 107:414e9c822e99 323 uint32_t usart_init_hw_handshaking(Usart *p_usart,
mbed_official 107:414e9c822e99 324 const sam_usart_opt_t *p_usart_opt, uint32_t ul_mck)
mbed_official 107:414e9c822e99 325 {
mbed_official 107:414e9c822e99 326 /* Initialize the USART as standard RS232. */
mbed_official 107:414e9c822e99 327 if (usart_init_rs232(p_usart, p_usart_opt, ul_mck)) {
mbed_official 107:414e9c822e99 328 return 1;
mbed_official 107:414e9c822e99 329 }
mbed_official 107:414e9c822e99 330
mbed_official 107:414e9c822e99 331 /* Set hardware handshaking mode. */
mbed_official 107:414e9c822e99 332 p_usart->US_MR = (p_usart->US_MR & ~US_MR_USART_MODE_Msk) |
mbed_official 107:414e9c822e99 333 US_MR_USART_MODE_HW_HANDSHAKING;
mbed_official 107:414e9c822e99 334
mbed_official 107:414e9c822e99 335 return 0;
mbed_official 107:414e9c822e99 336 }
mbed_official 107:414e9c822e99 337
mbed_official 107:414e9c822e99 338 #if (SAM3S || SAM4S || SAM3U || SAM4L || SAM4E)
mbed_official 107:414e9c822e99 339
mbed_official 107:414e9c822e99 340 /**
mbed_official 107:414e9c822e99 341 * \brief Configure USART to work in modem mode.
mbed_official 107:414e9c822e99 342 *
mbed_official 107:414e9c822e99 343 * \note By default, the transmitter and receiver aren't enabled.
mbed_official 107:414e9c822e99 344 *
mbed_official 107:414e9c822e99 345 * \param p_usart Pointer to a USART instance.
mbed_official 107:414e9c822e99 346 * \param p_usart_opt Pointer to sam_usart_opt_t instance.
mbed_official 107:414e9c822e99 347 * \param ul_mck USART module input clock frequency.
mbed_official 107:414e9c822e99 348 *
mbed_official 107:414e9c822e99 349 * \retval 0 on success.
mbed_official 107:414e9c822e99 350 * \retval 1 on failure.
mbed_official 107:414e9c822e99 351 */
mbed_official 107:414e9c822e99 352 uint32_t usart_init_modem(Usart *p_usart,
mbed_official 107:414e9c822e99 353 const sam_usart_opt_t *p_usart_opt, uint32_t ul_mck)
mbed_official 107:414e9c822e99 354 {
mbed_official 107:414e9c822e99 355 /*
mbed_official 107:414e9c822e99 356 * SAM3S, SAM4S and SAM4E series support MODEM mode only on USART1,
mbed_official 107:414e9c822e99 357 * SAM3U and SAM4L series support MODEM mode only on USART0.
mbed_official 107:414e9c822e99 358 */
mbed_official 107:414e9c822e99 359 #if (SAM3S || SAM4S || SAM4E)
mbed_official 107:414e9c822e99 360 #ifdef USART1
mbed_official 107:414e9c822e99 361 if (p_usart != USART1) {
mbed_official 107:414e9c822e99 362 return 1;
mbed_official 107:414e9c822e99 363 }
mbed_official 107:414e9c822e99 364 #endif
mbed_official 107:414e9c822e99 365 #elif (SAM3U || SAM4L)
mbed_official 107:414e9c822e99 366 if (p_usart != USART0) {
mbed_official 107:414e9c822e99 367 return 1;
mbed_official 107:414e9c822e99 368 }
mbed_official 107:414e9c822e99 369 #endif
mbed_official 107:414e9c822e99 370
mbed_official 107:414e9c822e99 371 /* Initialize the USART as standard RS232. */
mbed_official 107:414e9c822e99 372 if (usart_init_rs232(p_usart, p_usart_opt, ul_mck)) {
mbed_official 107:414e9c822e99 373 return 1;
mbed_official 107:414e9c822e99 374 }
mbed_official 107:414e9c822e99 375
mbed_official 107:414e9c822e99 376 /* Set MODEM mode. */
mbed_official 107:414e9c822e99 377 p_usart->US_MR = (p_usart->US_MR & ~US_MR_USART_MODE_Msk) |
mbed_official 107:414e9c822e99 378 US_MR_USART_MODE_MODEM;
mbed_official 107:414e9c822e99 379
mbed_official 107:414e9c822e99 380 return 0;
mbed_official 107:414e9c822e99 381 }
mbed_official 107:414e9c822e99 382 #endif
mbed_official 107:414e9c822e99 383
mbed_official 107:414e9c822e99 384 /**
mbed_official 107:414e9c822e99 385 * \brief Configure USART to work in SYNC mode and act as a master.
mbed_official 107:414e9c822e99 386 *
mbed_official 107:414e9c822e99 387 * \note By default, the transmitter and receiver aren't enabled.
mbed_official 107:414e9c822e99 388 *
mbed_official 107:414e9c822e99 389 * \param p_usart Pointer to a USART instance.
mbed_official 107:414e9c822e99 390 * \param p_usart_opt Pointer to sam_usart_opt_t instance.
mbed_official 107:414e9c822e99 391 * \param ul_mck USART module input clock frequency.
mbed_official 107:414e9c822e99 392 *
mbed_official 107:414e9c822e99 393 * \retval 0 on success.
mbed_official 107:414e9c822e99 394 * \retval 1 on failure.
mbed_official 107:414e9c822e99 395 */
mbed_official 107:414e9c822e99 396 uint32_t usart_init_sync_master(Usart *p_usart,
mbed_official 107:414e9c822e99 397 const sam_usart_opt_t *p_usart_opt, uint32_t ul_mck)
mbed_official 107:414e9c822e99 398 {
mbed_official 107:414e9c822e99 399 static uint32_t ul_reg_val;
mbed_official 107:414e9c822e99 400
mbed_official 107:414e9c822e99 401 /* Reset the USART and shut down TX and RX. */
mbed_official 107:414e9c822e99 402 usart_reset(p_usart);
mbed_official 107:414e9c822e99 403
mbed_official 107:414e9c822e99 404 ul_reg_val = 0;
mbed_official 107:414e9c822e99 405 /* Check whether the input values are legal. */
mbed_official 107:414e9c822e99 406 if (!p_usart_opt || usart_set_sync_master_baudrate(p_usart,
mbed_official 107:414e9c822e99 407 p_usart_opt->baudrate, ul_mck)) {
mbed_official 107:414e9c822e99 408 return 1;
mbed_official 107:414e9c822e99 409 }
mbed_official 107:414e9c822e99 410
mbed_official 107:414e9c822e99 411 /* Configure the USART option. */
mbed_official 107:414e9c822e99 412 ul_reg_val |= p_usart_opt->char_length | p_usart_opt->parity_type |
mbed_official 107:414e9c822e99 413 p_usart_opt->channel_mode | p_usart_opt->stop_bits;
mbed_official 107:414e9c822e99 414
mbed_official 107:414e9c822e99 415 /* Set normal mode and output clock as synchronous master. */
mbed_official 107:414e9c822e99 416 ul_reg_val |= US_MR_USART_MODE_NORMAL | US_MR_CLKO;
mbed_official 107:414e9c822e99 417 p_usart->US_MR |= ul_reg_val;
mbed_official 107:414e9c822e99 418
mbed_official 107:414e9c822e99 419 return 0;
mbed_official 107:414e9c822e99 420 }
mbed_official 107:414e9c822e99 421
mbed_official 107:414e9c822e99 422 /**
mbed_official 107:414e9c822e99 423 * \brief Configure USART to work in SYNC mode and act as a slave.
mbed_official 107:414e9c822e99 424 *
mbed_official 107:414e9c822e99 425 * \note By default, the transmitter and receiver aren't enabled.
mbed_official 107:414e9c822e99 426 *
mbed_official 107:414e9c822e99 427 * \param p_usart Pointer to a USART instance.
mbed_official 107:414e9c822e99 428 * \param p_usart_opt Pointer to sam_usart_opt_t instance.
mbed_official 107:414e9c822e99 429 *
mbed_official 107:414e9c822e99 430 * \retval 0 on success.
mbed_official 107:414e9c822e99 431 * \retval 1 on failure.
mbed_official 107:414e9c822e99 432 */
mbed_official 107:414e9c822e99 433 uint32_t usart_init_sync_slave(Usart *p_usart,
mbed_official 107:414e9c822e99 434 const sam_usart_opt_t *p_usart_opt)
mbed_official 107:414e9c822e99 435 {
mbed_official 107:414e9c822e99 436 static uint32_t ul_reg_val;
mbed_official 107:414e9c822e99 437
mbed_official 107:414e9c822e99 438 /* Reset the USART and shut down TX and RX. */
mbed_official 107:414e9c822e99 439 usart_reset(p_usart);
mbed_official 107:414e9c822e99 440
mbed_official 107:414e9c822e99 441 ul_reg_val = 0;
mbed_official 107:414e9c822e99 442 usart_set_sync_slave_baudrate(p_usart);
mbed_official 107:414e9c822e99 443
mbed_official 107:414e9c822e99 444 /* Check whether the input values are legal. */
mbed_official 107:414e9c822e99 445 if (!p_usart_opt) {
mbed_official 107:414e9c822e99 446 return 1;
mbed_official 107:414e9c822e99 447 }
mbed_official 107:414e9c822e99 448
mbed_official 107:414e9c822e99 449 /* Configure the USART option. */
mbed_official 107:414e9c822e99 450 ul_reg_val |= p_usart_opt->char_length | p_usart_opt->parity_type |
mbed_official 107:414e9c822e99 451 p_usart_opt->channel_mode | p_usart_opt->stop_bits;
mbed_official 107:414e9c822e99 452
mbed_official 107:414e9c822e99 453 /* Set normal mode. */
mbed_official 107:414e9c822e99 454 ul_reg_val |= US_MR_USART_MODE_NORMAL;
mbed_official 107:414e9c822e99 455 p_usart->US_MR |= ul_reg_val;
mbed_official 107:414e9c822e99 456
mbed_official 107:414e9c822e99 457 return 0;
mbed_official 107:414e9c822e99 458 }
mbed_official 107:414e9c822e99 459
mbed_official 107:414e9c822e99 460 /**
mbed_official 107:414e9c822e99 461 * \brief Configure USART to work in RS485 mode.
mbed_official 107:414e9c822e99 462 *
mbed_official 107:414e9c822e99 463 * \note By default, the transmitter and receiver aren't enabled.
mbed_official 107:414e9c822e99 464 *
mbed_official 107:414e9c822e99 465 * \param p_usart Pointer to a USART instance.
mbed_official 107:414e9c822e99 466 * \param p_usart_opt Pointer to sam_usart_opt_t instance.
mbed_official 107:414e9c822e99 467 * \param ul_mck USART module input clock frequency.
mbed_official 107:414e9c822e99 468 *
mbed_official 107:414e9c822e99 469 * \retval 0 on success.
mbed_official 107:414e9c822e99 470 * \retval 1 on failure.
mbed_official 107:414e9c822e99 471 */
mbed_official 107:414e9c822e99 472 uint32_t usart_init_rs485(Usart *p_usart,
mbed_official 107:414e9c822e99 473 const sam_usart_opt_t *p_usart_opt, uint32_t ul_mck)
mbed_official 107:414e9c822e99 474 {
mbed_official 107:414e9c822e99 475 /* Initialize the USART as standard RS232. */
mbed_official 107:414e9c822e99 476 if (usart_init_rs232(p_usart, p_usart_opt, ul_mck)) {
mbed_official 107:414e9c822e99 477 return 1;
mbed_official 107:414e9c822e99 478 }
mbed_official 107:414e9c822e99 479
mbed_official 107:414e9c822e99 480 /* Set RS485 mode. */
mbed_official 107:414e9c822e99 481 p_usart->US_MR = (p_usart->US_MR & ~US_MR_USART_MODE_Msk) |
mbed_official 107:414e9c822e99 482 US_MR_USART_MODE_RS485;
mbed_official 107:414e9c822e99 483
mbed_official 107:414e9c822e99 484 return 0;
mbed_official 107:414e9c822e99 485 }
mbed_official 107:414e9c822e99 486
mbed_official 107:414e9c822e99 487 #if (!SAMG55 && !SAMV71 && !SAMV70 && !SAME70 && !SAMS70)
mbed_official 107:414e9c822e99 488 /**
mbed_official 107:414e9c822e99 489 * \brief Configure USART to work in IrDA mode.
mbed_official 107:414e9c822e99 490 *
mbed_official 107:414e9c822e99 491 * \note By default, the transmitter and receiver aren't enabled.
mbed_official 107:414e9c822e99 492 *
mbed_official 107:414e9c822e99 493 * \param p_usart Pointer to a USART instance.
mbed_official 107:414e9c822e99 494 * \param p_usart_opt Pointer to sam_usart_opt_t instance.
mbed_official 107:414e9c822e99 495 * \param ul_mck USART module input clock frequency.
mbed_official 107:414e9c822e99 496 *
mbed_official 107:414e9c822e99 497 * \retval 0 on success.
mbed_official 107:414e9c822e99 498 * \retval 1 on failure.
mbed_official 107:414e9c822e99 499 */
mbed_official 107:414e9c822e99 500 uint32_t usart_init_irda(Usart *p_usart,
mbed_official 107:414e9c822e99 501 const sam_usart_opt_t *p_usart_opt, uint32_t ul_mck)
mbed_official 107:414e9c822e99 502 {
mbed_official 107:414e9c822e99 503 /* Initialize the USART as standard RS232. */
mbed_official 107:414e9c822e99 504 if (usart_init_rs232(p_usart, p_usart_opt, ul_mck)) {
mbed_official 107:414e9c822e99 505 return 1;
mbed_official 107:414e9c822e99 506 }
mbed_official 107:414e9c822e99 507
mbed_official 107:414e9c822e99 508 /* Set IrDA filter. */
mbed_official 107:414e9c822e99 509 p_usart->US_IF = p_usart_opt->irda_filter;
mbed_official 107:414e9c822e99 510
mbed_official 107:414e9c822e99 511 /* Set IrDA mode. */
mbed_official 107:414e9c822e99 512 p_usart->US_MR = (p_usart->US_MR & ~US_MR_USART_MODE_Msk) |
mbed_official 107:414e9c822e99 513 US_MR_USART_MODE_IRDA;
mbed_official 107:414e9c822e99 514
mbed_official 107:414e9c822e99 515 return 0;
mbed_official 107:414e9c822e99 516 }
mbed_official 107:414e9c822e99 517 #endif
mbed_official 107:414e9c822e99 518
mbed_official 107:414e9c822e99 519 #if (!SAMV71 && !SAMV70 && !SAME70 && !SAMS70)
mbed_official 107:414e9c822e99 520 /**
mbed_official 107:414e9c822e99 521 * \brief Calculate a clock divider (\e CD) for the USART ISO7816 mode to
mbed_official 107:414e9c822e99 522 * generate an ISO7816 clock as close as possible to the clock set point.
mbed_official 107:414e9c822e99 523 *
mbed_official 107:414e9c822e99 524 * \note ISO7816 clock calculation: Clock = ul_mck / cd
mbed_official 107:414e9c822e99 525 *
mbed_official 107:414e9c822e99 526 * \param p_usart Pointer to a USART instance.
mbed_official 107:414e9c822e99 527 * \param clock ISO7816 clock set point.
mbed_official 107:414e9c822e99 528 * \param ul_mck USART module input clock frequency.
mbed_official 107:414e9c822e99 529 *
mbed_official 107:414e9c822e99 530 * \retval 0 ISO7816 clock is successfully initialized.
mbed_official 107:414e9c822e99 531 * \retval 1 ISO7816 clock set point is out of range for the given input clock
mbed_official 107:414e9c822e99 532 * frequency.
mbed_official 107:414e9c822e99 533 */
mbed_official 107:414e9c822e99 534 static uint32_t usart_set_iso7816_clock(Usart *p_usart,
mbed_official 107:414e9c822e99 535 uint32_t clock, uint32_t ul_mck)
mbed_official 107:414e9c822e99 536 {
mbed_official 107:414e9c822e99 537 uint32_t cd;
mbed_official 107:414e9c822e99 538
mbed_official 107:414e9c822e99 539 /* Calculate clock divider according to the formula in ISO7816 mode. */
mbed_official 107:414e9c822e99 540 cd = (ul_mck + clock / 2) / clock;
mbed_official 107:414e9c822e99 541
mbed_official 107:414e9c822e99 542 if (cd < MIN_CD_VALUE || cd > MAX_CD_VALUE) {
mbed_official 107:414e9c822e99 543 return 1;
mbed_official 107:414e9c822e99 544 }
mbed_official 107:414e9c822e99 545
mbed_official 107:414e9c822e99 546 p_usart->US_MR = (p_usart->US_MR & ~(US_MR_USCLKS_Msk | US_MR_SYNC |
mbed_official 107:414e9c822e99 547 US_MR_OVER)) | US_MR_USCLKS_MCK | US_MR_CLKO;
mbed_official 107:414e9c822e99 548
mbed_official 107:414e9c822e99 549 /* Configure the baudrate generate register. */
mbed_official 107:414e9c822e99 550 p_usart->US_BRGR = cd << US_BRGR_CD_Pos;
mbed_official 107:414e9c822e99 551
mbed_official 107:414e9c822e99 552 return 0;
mbed_official 107:414e9c822e99 553 }
mbed_official 107:414e9c822e99 554
mbed_official 107:414e9c822e99 555 /**
mbed_official 107:414e9c822e99 556 * \brief Configure USART to work in ISO7816 mode.
mbed_official 107:414e9c822e99 557 *
mbed_official 107:414e9c822e99 558 * \note By default, the transmitter and receiver aren't enabled.
mbed_official 107:414e9c822e99 559 *
mbed_official 107:414e9c822e99 560 * \param p_usart Pointer to a USART instance.
mbed_official 107:414e9c822e99 561 * \param p_usart_opt Pointer to sam_usart_opt_t instance.
mbed_official 107:414e9c822e99 562 * \param ul_mck USART module input clock frequency.
mbed_official 107:414e9c822e99 563 *
mbed_official 107:414e9c822e99 564 * \retval 0 on success.
mbed_official 107:414e9c822e99 565 * \retval 1 on failure.
mbed_official 107:414e9c822e99 566 */
mbed_official 107:414e9c822e99 567 uint32_t usart_init_iso7816(Usart *p_usart,
mbed_official 107:414e9c822e99 568 const usart_iso7816_opt_t *p_usart_opt, uint32_t ul_mck)
mbed_official 107:414e9c822e99 569 {
mbed_official 107:414e9c822e99 570 static uint32_t ul_reg_val;
mbed_official 107:414e9c822e99 571
mbed_official 107:414e9c822e99 572 /* Reset the USART and shut down TX and RX. */
mbed_official 107:414e9c822e99 573 usart_reset(p_usart);
mbed_official 107:414e9c822e99 574
mbed_official 107:414e9c822e99 575 ul_reg_val = 0;
mbed_official 107:414e9c822e99 576
mbed_official 107:414e9c822e99 577 /* Check whether the input values are legal. */
mbed_official 107:414e9c822e99 578 if (!p_usart_opt || ((p_usart_opt->parity_type != US_MR_PAR_EVEN) &&
mbed_official 107:414e9c822e99 579 (p_usart_opt->parity_type != US_MR_PAR_ODD))) {
mbed_official 107:414e9c822e99 580 return 1;
mbed_official 107:414e9c822e99 581 }
mbed_official 107:414e9c822e99 582
mbed_official 107:414e9c822e99 583 if (p_usart_opt->protocol_type == ISO7816_T_0) {
mbed_official 107:414e9c822e99 584 ul_reg_val |= US_MR_USART_MODE_IS07816_T_0 | US_MR_NBSTOP_2_BIT |
mbed_official 107:414e9c822e99 585 (p_usart_opt->max_iterations << US_MR_MAX_ITERATION_Pos);
mbed_official 107:414e9c822e99 586
mbed_official 107:414e9c822e99 587 if (p_usart_opt->bit_order) {
mbed_official 107:414e9c822e99 588 ul_reg_val |= US_MR_MSBF;
mbed_official 107:414e9c822e99 589 }
mbed_official 107:414e9c822e99 590 } else if (p_usart_opt->protocol_type == ISO7816_T_1) {
mbed_official 107:414e9c822e99 591 /*
mbed_official 107:414e9c822e99 592 * Only LSBF is used in the T=1 protocol, and max_iterations field
mbed_official 107:414e9c822e99 593 * is only used in T=0 mode.
mbed_official 107:414e9c822e99 594 */
mbed_official 107:414e9c822e99 595 if (p_usart_opt->bit_order || p_usart_opt->max_iterations) {
mbed_official 107:414e9c822e99 596 return 1;
mbed_official 107:414e9c822e99 597 }
mbed_official 107:414e9c822e99 598
mbed_official 107:414e9c822e99 599 /* Set USART mode to ISO7816, T=1, and always uses 1 stop bit. */
mbed_official 107:414e9c822e99 600 ul_reg_val |= US_MR_USART_MODE_IS07816_T_1 | US_MR_NBSTOP_1_BIT;
mbed_official 107:414e9c822e99 601 } else {
mbed_official 107:414e9c822e99 602 return 1;
mbed_official 107:414e9c822e99 603 }
mbed_official 107:414e9c822e99 604
mbed_official 107:414e9c822e99 605 /* Set up the baudrate. */
mbed_official 107:414e9c822e99 606 if (usart_set_iso7816_clock(p_usart, p_usart_opt->iso7816_hz, ul_mck)) {
mbed_official 107:414e9c822e99 607 return 1;
mbed_official 107:414e9c822e99 608 }
mbed_official 107:414e9c822e99 609
mbed_official 107:414e9c822e99 610 /* Set FIDI register: bit rate = iso7816_hz / fidi_ratio. */
mbed_official 107:414e9c822e99 611 p_usart->US_FIDI = p_usart_opt->fidi_ratio;
mbed_official 107:414e9c822e99 612
mbed_official 107:414e9c822e99 613 /* Set ISO7816 parity type in the MODE register. */
mbed_official 107:414e9c822e99 614 ul_reg_val |= p_usart_opt->parity_type;
mbed_official 107:414e9c822e99 615
mbed_official 107:414e9c822e99 616 if (p_usart_opt->inhibit_nack) {
mbed_official 107:414e9c822e99 617 ul_reg_val |= US_MR_INACK;
mbed_official 107:414e9c822e99 618 }
mbed_official 107:414e9c822e99 619 if (p_usart_opt->dis_suc_nack) {
mbed_official 107:414e9c822e99 620 ul_reg_val |= US_MR_DSNACK;
mbed_official 107:414e9c822e99 621 }
mbed_official 107:414e9c822e99 622
mbed_official 107:414e9c822e99 623 p_usart->US_MR |= ul_reg_val;
mbed_official 107:414e9c822e99 624
mbed_official 107:414e9c822e99 625 return 0;
mbed_official 107:414e9c822e99 626 }
mbed_official 107:414e9c822e99 627
mbed_official 107:414e9c822e99 628 /**
mbed_official 107:414e9c822e99 629 * \brief Reset the ITERATION in US_CSR when the ISO7816 mode is enabled.
mbed_official 107:414e9c822e99 630 *
mbed_official 107:414e9c822e99 631 * \param p_usart Pointer to a USART instance.
mbed_official 107:414e9c822e99 632 */
mbed_official 107:414e9c822e99 633 void usart_reset_iterations(Usart *p_usart)
mbed_official 107:414e9c822e99 634 {
mbed_official 107:414e9c822e99 635 p_usart->US_CR = US_CR_RSTIT;
mbed_official 107:414e9c822e99 636 }
mbed_official 107:414e9c822e99 637
mbed_official 107:414e9c822e99 638 /**
mbed_official 107:414e9c822e99 639 * \brief Reset NACK in US_CSR.
mbed_official 107:414e9c822e99 640 *
mbed_official 107:414e9c822e99 641 * \param p_usart Pointer to a USART instance.
mbed_official 107:414e9c822e99 642 */
mbed_official 107:414e9c822e99 643 void usart_reset_nack(Usart *p_usart)
mbed_official 107:414e9c822e99 644 {
mbed_official 107:414e9c822e99 645 p_usart->US_CR = US_CR_RSTNACK;
mbed_official 107:414e9c822e99 646 }
mbed_official 107:414e9c822e99 647
mbed_official 107:414e9c822e99 648 /**
mbed_official 107:414e9c822e99 649 * \brief Check if one receive buffer is filled.
mbed_official 107:414e9c822e99 650 *
mbed_official 107:414e9c822e99 651 * \param p_usart Pointer to a USART instance.
mbed_official 107:414e9c822e99 652 *
mbed_official 107:414e9c822e99 653 * \retval 1 Receive is complete.
mbed_official 107:414e9c822e99 654 * \retval 0 Receive is still pending.
mbed_official 107:414e9c822e99 655 */
mbed_official 107:414e9c822e99 656 uint32_t usart_is_rx_buf_end(Usart *p_usart)
mbed_official 107:414e9c822e99 657 {
mbed_official 107:414e9c822e99 658 return (p_usart->US_CSR & US_CSR_ENDRX) > 0;
mbed_official 107:414e9c822e99 659 }
mbed_official 107:414e9c822e99 660
mbed_official 107:414e9c822e99 661 /**
mbed_official 107:414e9c822e99 662 * \brief Check if one transmit buffer is empty.
mbed_official 107:414e9c822e99 663 *
mbed_official 107:414e9c822e99 664 * \param p_usart Pointer to a USART instance.
mbed_official 107:414e9c822e99 665 *
mbed_official 107:414e9c822e99 666 * \retval 1 Transmit is complete.
mbed_official 107:414e9c822e99 667 * \retval 0 Transmit is still pending.
mbed_official 107:414e9c822e99 668 */
mbed_official 107:414e9c822e99 669 uint32_t usart_is_tx_buf_end(Usart *p_usart)
mbed_official 107:414e9c822e99 670 {
mbed_official 107:414e9c822e99 671 return (p_usart->US_CSR & US_CSR_ENDTX) > 0;
mbed_official 107:414e9c822e99 672 }
mbed_official 107:414e9c822e99 673
mbed_official 107:414e9c822e99 674 /**
mbed_official 107:414e9c822e99 675 * \brief Check if both receive buffers are full.
mbed_official 107:414e9c822e99 676 *
mbed_official 107:414e9c822e99 677 * \param p_usart Pointer to a USART instance.
mbed_official 107:414e9c822e99 678 *
mbed_official 107:414e9c822e99 679 * \retval 1 Receive buffers are full.
mbed_official 107:414e9c822e99 680 * \retval 0 Receive buffers are not full.
mbed_official 107:414e9c822e99 681 */
mbed_official 107:414e9c822e99 682 uint32_t usart_is_rx_buf_full(Usart *p_usart)
mbed_official 107:414e9c822e99 683 {
mbed_official 107:414e9c822e99 684 return (p_usart->US_CSR & US_CSR_RXBUFF) > 0;
mbed_official 107:414e9c822e99 685 }
mbed_official 107:414e9c822e99 686
mbed_official 107:414e9c822e99 687 /**
mbed_official 107:414e9c822e99 688 * \brief Check if both transmit buffers are empty.
mbed_official 107:414e9c822e99 689 *
mbed_official 107:414e9c822e99 690 * \param p_usart Pointer to a USART instance.
mbed_official 107:414e9c822e99 691 *
mbed_official 107:414e9c822e99 692 * \retval 1 Transmit buffers are empty.
mbed_official 107:414e9c822e99 693 * \retval 0 Transmit buffers are not empty.
mbed_official 107:414e9c822e99 694 */
mbed_official 107:414e9c822e99 695 uint32_t usart_is_tx_buf_empty(Usart *p_usart)
mbed_official 107:414e9c822e99 696 {
mbed_official 107:414e9c822e99 697 return (p_usart->US_CSR & US_CSR_TXBUFE) > 0;
mbed_official 107:414e9c822e99 698 }
mbed_official 107:414e9c822e99 699
mbed_official 107:414e9c822e99 700 /**
mbed_official 107:414e9c822e99 701 * \brief Get the total number of errors that occur during an ISO7816 transfer.
mbed_official 107:414e9c822e99 702 *
mbed_official 107:414e9c822e99 703 * \param p_usart Pointer to a USART instance.
mbed_official 107:414e9c822e99 704 *
mbed_official 107:414e9c822e99 705 * \return The number of errors that occurred.
mbed_official 107:414e9c822e99 706 */
mbed_official 107:414e9c822e99 707 uint8_t usart_get_error_number(Usart *p_usart)
mbed_official 107:414e9c822e99 708 {
mbed_official 107:414e9c822e99 709 return (p_usart->US_NER & US_NER_NB_ERRORS_Msk);
mbed_official 107:414e9c822e99 710 }
mbed_official 107:414e9c822e99 711
mbed_official 107:414e9c822e99 712 #endif
mbed_official 107:414e9c822e99 713
mbed_official 107:414e9c822e99 714 /**
mbed_official 107:414e9c822e99 715 * \brief Configure USART to work in SPI mode and act as a master.
mbed_official 107:414e9c822e99 716 *
mbed_official 107:414e9c822e99 717 * \note By default, the transmitter and receiver aren't enabled.
mbed_official 107:414e9c822e99 718 *
mbed_official 107:414e9c822e99 719 * \param p_usart Pointer to a USART instance.
mbed_official 107:414e9c822e99 720 * \param p_usart_opt Pointer to sam_usart_opt_t instance.
mbed_official 107:414e9c822e99 721 * \param ul_mck USART module input clock frequency.
mbed_official 107:414e9c822e99 722 *
mbed_official 107:414e9c822e99 723 * \retval 0 on success.
mbed_official 107:414e9c822e99 724 * \retval 1 on failure.
mbed_official 107:414e9c822e99 725 */
mbed_official 107:414e9c822e99 726 uint32_t usart_init_spi_master(Usart *p_usart,
mbed_official 107:414e9c822e99 727 const usart_spi_opt_t *p_usart_opt, uint32_t ul_mck)
mbed_official 107:414e9c822e99 728 {
mbed_official 107:414e9c822e99 729 static uint32_t ul_reg_val;
mbed_official 107:414e9c822e99 730
mbed_official 107:414e9c822e99 731 /* Reset the USART and shut down TX and RX. */
mbed_official 107:414e9c822e99 732 usart_reset(p_usart);
mbed_official 107:414e9c822e99 733
mbed_official 107:414e9c822e99 734 ul_reg_val = 0;
mbed_official 107:414e9c822e99 735 /* Check whether the input values are legal. */
mbed_official 107:414e9c822e99 736 if (!p_usart_opt || (p_usart_opt->spi_mode > SPI_MODE_3) ||
mbed_official 107:414e9c822e99 737 usart_set_spi_master_baudrate(p_usart, p_usart_opt->baudrate,
mbed_official 107:414e9c822e99 738 ul_mck)) {
mbed_official 107:414e9c822e99 739 return 1;
mbed_official 107:414e9c822e99 740 }
mbed_official 107:414e9c822e99 741
mbed_official 107:414e9c822e99 742 /* Configure the character length bit in MR register. */
mbed_official 107:414e9c822e99 743 ul_reg_val |= p_usart_opt->char_length;
mbed_official 107:414e9c822e99 744
mbed_official 107:414e9c822e99 745 /* Set SPI master mode and channel mode. */
mbed_official 107:414e9c822e99 746 ul_reg_val |= US_MR_USART_MODE_SPI_MASTER | US_MR_CLKO |
mbed_official 107:414e9c822e99 747 p_usart_opt->channel_mode;
mbed_official 107:414e9c822e99 748
mbed_official 107:414e9c822e99 749 switch (p_usart_opt->spi_mode) {
mbed_official 107:414e9c822e99 750 case SPI_MODE_0:
mbed_official 107:414e9c822e99 751 ul_reg_val |= US_MR_CPHA;
mbed_official 107:414e9c822e99 752 ul_reg_val &= ~US_MR_CPOL;
mbed_official 107:414e9c822e99 753 break;
mbed_official 107:414e9c822e99 754
mbed_official 107:414e9c822e99 755 case SPI_MODE_1:
mbed_official 107:414e9c822e99 756 ul_reg_val &= ~US_MR_CPHA;
mbed_official 107:414e9c822e99 757 ul_reg_val &= ~US_MR_CPOL;
mbed_official 107:414e9c822e99 758 break;
mbed_official 107:414e9c822e99 759
mbed_official 107:414e9c822e99 760 case SPI_MODE_2:
mbed_official 107:414e9c822e99 761 ul_reg_val |= US_MR_CPHA;
mbed_official 107:414e9c822e99 762 ul_reg_val |= US_MR_CPOL;
mbed_official 107:414e9c822e99 763 break;
mbed_official 107:414e9c822e99 764
mbed_official 107:414e9c822e99 765 case SPI_MODE_3:
mbed_official 107:414e9c822e99 766 ul_reg_val &= ~US_MR_CPHA;
mbed_official 107:414e9c822e99 767 ul_reg_val |= US_MR_CPOL;
mbed_official 107:414e9c822e99 768 break;
mbed_official 107:414e9c822e99 769
mbed_official 107:414e9c822e99 770 default:
mbed_official 107:414e9c822e99 771 break;
mbed_official 107:414e9c822e99 772 }
mbed_official 107:414e9c822e99 773
mbed_official 107:414e9c822e99 774 p_usart->US_MR |= ul_reg_val;
mbed_official 107:414e9c822e99 775
mbed_official 107:414e9c822e99 776 return 0;
mbed_official 107:414e9c822e99 777 }
mbed_official 107:414e9c822e99 778
mbed_official 107:414e9c822e99 779 /**
mbed_official 107:414e9c822e99 780 * \brief Configure USART to work in SPI mode and act as a slave.
mbed_official 107:414e9c822e99 781 *
mbed_official 107:414e9c822e99 782 * \note By default, the transmitter and receiver aren't enabled.
mbed_official 107:414e9c822e99 783 *
mbed_official 107:414e9c822e99 784 * \param p_usart Pointer to a USART instance.
mbed_official 107:414e9c822e99 785 * \param p_usart_opt Pointer to sam_usart_opt_t instance.
mbed_official 107:414e9c822e99 786 *
mbed_official 107:414e9c822e99 787 * \retval 0 on success.
mbed_official 107:414e9c822e99 788 * \retval 1 on failure.
mbed_official 107:414e9c822e99 789 */
mbed_official 107:414e9c822e99 790 uint32_t usart_init_spi_slave(Usart *p_usart,
mbed_official 107:414e9c822e99 791 const usart_spi_opt_t *p_usart_opt)
mbed_official 107:414e9c822e99 792 {
mbed_official 107:414e9c822e99 793 static uint32_t ul_reg_val;
mbed_official 107:414e9c822e99 794
mbed_official 107:414e9c822e99 795 /* Reset the USART and shut down TX and RX. */
mbed_official 107:414e9c822e99 796 usart_reset(p_usart);
mbed_official 107:414e9c822e99 797
mbed_official 107:414e9c822e99 798 ul_reg_val = 0;
mbed_official 107:414e9c822e99 799 usart_set_spi_slave_baudrate(p_usart);
mbed_official 107:414e9c822e99 800
mbed_official 107:414e9c822e99 801 /* Check whether the input values are legal. */
mbed_official 107:414e9c822e99 802 if (!p_usart_opt || p_usart_opt->spi_mode > SPI_MODE_3) {
mbed_official 107:414e9c822e99 803 return 1;
mbed_official 107:414e9c822e99 804 }
mbed_official 107:414e9c822e99 805
mbed_official 107:414e9c822e99 806 /* Configure the character length bit in MR register. */
mbed_official 107:414e9c822e99 807 ul_reg_val |= p_usart_opt->char_length;
mbed_official 107:414e9c822e99 808
mbed_official 107:414e9c822e99 809 /* Set SPI slave mode and channel mode. */
mbed_official 107:414e9c822e99 810 ul_reg_val |= US_MR_USART_MODE_SPI_SLAVE | p_usart_opt->channel_mode;
mbed_official 107:414e9c822e99 811
mbed_official 107:414e9c822e99 812 switch (p_usart_opt->spi_mode) {
mbed_official 107:414e9c822e99 813 case SPI_MODE_0:
mbed_official 107:414e9c822e99 814 ul_reg_val |= US_MR_CPHA;
mbed_official 107:414e9c822e99 815 ul_reg_val &= ~US_MR_CPOL;
mbed_official 107:414e9c822e99 816 break;
mbed_official 107:414e9c822e99 817
mbed_official 107:414e9c822e99 818 case SPI_MODE_1:
mbed_official 107:414e9c822e99 819 ul_reg_val &= ~US_MR_CPHA;
mbed_official 107:414e9c822e99 820 ul_reg_val &= ~US_MR_CPOL;
mbed_official 107:414e9c822e99 821 break;
mbed_official 107:414e9c822e99 822
mbed_official 107:414e9c822e99 823 case SPI_MODE_2:
mbed_official 107:414e9c822e99 824 ul_reg_val |= US_MR_CPHA;
mbed_official 107:414e9c822e99 825 ul_reg_val |= US_MR_CPOL;
mbed_official 107:414e9c822e99 826 break;
mbed_official 107:414e9c822e99 827
mbed_official 107:414e9c822e99 828 case SPI_MODE_3:
mbed_official 107:414e9c822e99 829 ul_reg_val |= US_MR_CPOL;
mbed_official 107:414e9c822e99 830 ul_reg_val &= ~US_MR_CPHA;
mbed_official 107:414e9c822e99 831 break;
mbed_official 107:414e9c822e99 832
mbed_official 107:414e9c822e99 833 default:
mbed_official 107:414e9c822e99 834 break;
mbed_official 107:414e9c822e99 835 }
mbed_official 107:414e9c822e99 836
mbed_official 107:414e9c822e99 837 p_usart->US_MR |= ul_reg_val;
mbed_official 107:414e9c822e99 838
mbed_official 107:414e9c822e99 839 return 0;
mbed_official 107:414e9c822e99 840 }
mbed_official 107:414e9c822e99 841
mbed_official 107:414e9c822e99 842 #if (SAM3XA || SAM4L || SAMG55 || SAMV71 || SAMV70 || SAME70 || SAMS70)
mbed_official 107:414e9c822e99 843
mbed_official 107:414e9c822e99 844 /**
mbed_official 107:414e9c822e99 845 * \brief Configure USART to work in LIN mode and act as a LIN master.
mbed_official 107:414e9c822e99 846 *
mbed_official 107:414e9c822e99 847 * \note By default, the transmitter and receiver aren't enabled.
mbed_official 107:414e9c822e99 848 *
mbed_official 107:414e9c822e99 849 * \param p_usart Pointer to a USART instance.
mbed_official 107:414e9c822e99 850 * \param ul_baudrate Baudrate to be used.
mbed_official 107:414e9c822e99 851 * \param ul_mck USART module input clock frequency.
mbed_official 107:414e9c822e99 852 *
mbed_official 107:414e9c822e99 853 * \retval 0 on success.
mbed_official 107:414e9c822e99 854 * \retval 1 on failure.
mbed_official 107:414e9c822e99 855 */
mbed_official 107:414e9c822e99 856 uint32_t usart_init_lin_master(Usart *p_usart,uint32_t ul_baudrate,
mbed_official 107:414e9c822e99 857 uint32_t ul_mck)
mbed_official 107:414e9c822e99 858 {
mbed_official 107:414e9c822e99 859 /* Reset the USART and shut down TX and RX. */
mbed_official 107:414e9c822e99 860 usart_reset(p_usart);
mbed_official 107:414e9c822e99 861
mbed_official 107:414e9c822e99 862 /* Set up the baudrate. */
mbed_official 107:414e9c822e99 863 if (usart_set_async_baudrate(p_usart, ul_baudrate, ul_mck)) {
mbed_official 107:414e9c822e99 864 return 1;
mbed_official 107:414e9c822e99 865 }
mbed_official 107:414e9c822e99 866
mbed_official 107:414e9c822e99 867 /* Set LIN master mode. */
mbed_official 107:414e9c822e99 868 p_usart->US_MR = (p_usart->US_MR & ~US_MR_USART_MODE_Msk) |
mbed_official 107:414e9c822e99 869 US_MR_USART_MODE_LIN_MASTER;
mbed_official 107:414e9c822e99 870
mbed_official 107:414e9c822e99 871 usart_enable_rx(p_usart);
mbed_official 107:414e9c822e99 872 usart_enable_tx(p_usart);
mbed_official 107:414e9c822e99 873
mbed_official 107:414e9c822e99 874 return 0;
mbed_official 107:414e9c822e99 875 }
mbed_official 107:414e9c822e99 876
mbed_official 107:414e9c822e99 877 /**
mbed_official 107:414e9c822e99 878 * \brief Configure USART to work in LIN mode and act as a LIN slave.
mbed_official 107:414e9c822e99 879 *
mbed_official 107:414e9c822e99 880 * \note By default, the transmitter and receiver aren't enabled.
mbed_official 107:414e9c822e99 881 *
mbed_official 107:414e9c822e99 882 * \param p_usart Pointer to a USART instance.
mbed_official 107:414e9c822e99 883 * \param ul_baudrate Baudrate to be used.
mbed_official 107:414e9c822e99 884 * \param ul_mck USART module input clock frequency.
mbed_official 107:414e9c822e99 885 *
mbed_official 107:414e9c822e99 886 * \retval 0 on success.
mbed_official 107:414e9c822e99 887 * \retval 1 on failure.
mbed_official 107:414e9c822e99 888 */
mbed_official 107:414e9c822e99 889 uint32_t usart_init_lin_slave(Usart *p_usart, uint32_t ul_baudrate,
mbed_official 107:414e9c822e99 890 uint32_t ul_mck)
mbed_official 107:414e9c822e99 891 {
mbed_official 107:414e9c822e99 892 /* Reset the USART and shut down TX and RX. */
mbed_official 107:414e9c822e99 893 usart_reset(p_usart);
mbed_official 107:414e9c822e99 894
mbed_official 107:414e9c822e99 895 usart_enable_rx(p_usart);
mbed_official 107:414e9c822e99 896 usart_enable_tx(p_usart);
mbed_official 107:414e9c822e99 897
mbed_official 107:414e9c822e99 898 /* Set LIN slave mode. */
mbed_official 107:414e9c822e99 899 p_usart->US_MR = (p_usart->US_MR & ~US_MR_USART_MODE_Msk) |
mbed_official 107:414e9c822e99 900 US_MR_USART_MODE_LIN_SLAVE;
mbed_official 107:414e9c822e99 901
mbed_official 107:414e9c822e99 902 /* Set up the baudrate. */
mbed_official 107:414e9c822e99 903 if (usart_set_async_baudrate(p_usart, ul_baudrate, ul_mck)) {
mbed_official 107:414e9c822e99 904 return 1;
mbed_official 107:414e9c822e99 905 }
mbed_official 107:414e9c822e99 906
mbed_official 107:414e9c822e99 907 return 0;
mbed_official 107:414e9c822e99 908 }
mbed_official 107:414e9c822e99 909
mbed_official 107:414e9c822e99 910 /**
mbed_official 107:414e9c822e99 911 * \brief Abort the current LIN transmission.
mbed_official 107:414e9c822e99 912 *
mbed_official 107:414e9c822e99 913 * \param p_usart Pointer to a USART instance.
mbed_official 107:414e9c822e99 914 */
mbed_official 107:414e9c822e99 915 void usart_lin_abort_tx(Usart *p_usart)
mbed_official 107:414e9c822e99 916 {
mbed_official 107:414e9c822e99 917 p_usart->US_CR = US_CR_LINABT;
mbed_official 107:414e9c822e99 918 }
mbed_official 107:414e9c822e99 919
mbed_official 107:414e9c822e99 920 /**
mbed_official 107:414e9c822e99 921 * \brief Send a wakeup signal on the LIN bus.
mbed_official 107:414e9c822e99 922 *
mbed_official 107:414e9c822e99 923 * \param p_usart Pointer to a USART instance.
mbed_official 107:414e9c822e99 924 */
mbed_official 107:414e9c822e99 925 void usart_lin_send_wakeup_signal(Usart *p_usart)
mbed_official 107:414e9c822e99 926 {
mbed_official 107:414e9c822e99 927 p_usart->US_CR = US_CR_LINWKUP;
mbed_official 107:414e9c822e99 928 }
mbed_official 107:414e9c822e99 929
mbed_official 107:414e9c822e99 930 /**
mbed_official 107:414e9c822e99 931 * \brief Configure the LIN node action, which should be one of PUBLISH,
mbed_official 107:414e9c822e99 932 * SUBSCRIBE or IGNORE.
mbed_official 107:414e9c822e99 933 *
mbed_official 107:414e9c822e99 934 * \param p_usart Pointer to a USART instance.
mbed_official 107:414e9c822e99 935 * \param uc_action 0 for PUBLISH, 1 for SUBSCRIBE, 2 for IGNORE.
mbed_official 107:414e9c822e99 936 */
mbed_official 107:414e9c822e99 937 void usart_lin_set_node_action(Usart *p_usart, uint8_t uc_action)
mbed_official 107:414e9c822e99 938 {
mbed_official 107:414e9c822e99 939 p_usart->US_LINMR = (p_usart->US_LINMR & ~US_LINMR_NACT_Msk) |
mbed_official 107:414e9c822e99 940 (uc_action << US_LINMR_NACT_Pos);
mbed_official 107:414e9c822e99 941 }
mbed_official 107:414e9c822e99 942
mbed_official 107:414e9c822e99 943 /**
mbed_official 107:414e9c822e99 944 * \brief Disable the parity check during the LIN communication.
mbed_official 107:414e9c822e99 945 *
mbed_official 107:414e9c822e99 946 * \param p_usart Pointer to a USART instance.
mbed_official 107:414e9c822e99 947 */
mbed_official 107:414e9c822e99 948 void usart_lin_disable_parity(Usart *p_usart)
mbed_official 107:414e9c822e99 949 {
mbed_official 107:414e9c822e99 950 p_usart->US_LINMR |= US_LINMR_PARDIS;
mbed_official 107:414e9c822e99 951 }
mbed_official 107:414e9c822e99 952
mbed_official 107:414e9c822e99 953 /**
mbed_official 107:414e9c822e99 954 * \brief Enable the parity check during the LIN communication.
mbed_official 107:414e9c822e99 955 *
mbed_official 107:414e9c822e99 956 * \param p_usart Pointer to a USART instance.
mbed_official 107:414e9c822e99 957 */
mbed_official 107:414e9c822e99 958 void usart_lin_enable_parity(Usart *p_usart)
mbed_official 107:414e9c822e99 959 {
mbed_official 107:414e9c822e99 960 p_usart->US_LINMR &= ~US_LINMR_PARDIS;
mbed_official 107:414e9c822e99 961 }
mbed_official 107:414e9c822e99 962
mbed_official 107:414e9c822e99 963 /**
mbed_official 107:414e9c822e99 964 * \brief Disable the checksum during the LIN communication.
mbed_official 107:414e9c822e99 965 *
mbed_official 107:414e9c822e99 966 * \param p_usart Pointer to a USART instance.
mbed_official 107:414e9c822e99 967 */
mbed_official 107:414e9c822e99 968 void usart_lin_disable_checksum(Usart *p_usart)
mbed_official 107:414e9c822e99 969 {
mbed_official 107:414e9c822e99 970 p_usart->US_LINMR |= US_LINMR_CHKDIS;
mbed_official 107:414e9c822e99 971 }
mbed_official 107:414e9c822e99 972
mbed_official 107:414e9c822e99 973 /**
mbed_official 107:414e9c822e99 974 * \brief Enable the checksum during the LIN communication.
mbed_official 107:414e9c822e99 975 *
mbed_official 107:414e9c822e99 976 * \param p_usart Pointer to a USART instance.
mbed_official 107:414e9c822e99 977 */
mbed_official 107:414e9c822e99 978 void usart_lin_enable_checksum(Usart *p_usart)
mbed_official 107:414e9c822e99 979 {
mbed_official 107:414e9c822e99 980 p_usart->US_LINMR &= ~US_LINMR_CHKDIS;
mbed_official 107:414e9c822e99 981 }
mbed_official 107:414e9c822e99 982
mbed_official 107:414e9c822e99 983 /**
mbed_official 107:414e9c822e99 984 * \brief Configure the checksum type during the LIN communication.
mbed_official 107:414e9c822e99 985 *
mbed_official 107:414e9c822e99 986 * \param p_usart Pointer to a USART instance.
mbed_official 107:414e9c822e99 987 * \param uc_type 0 for LIN 2.0 Enhanced checksum or 1 for LIN 1.3 Classic
mbed_official 107:414e9c822e99 988 * checksum.
mbed_official 107:414e9c822e99 989 */
mbed_official 107:414e9c822e99 990 void usart_lin_set_checksum_type(Usart *p_usart, uint8_t uc_type)
mbed_official 107:414e9c822e99 991 {
mbed_official 107:414e9c822e99 992 p_usart->US_LINMR = (p_usart->US_LINMR & ~US_LINMR_CHKTYP) |
mbed_official 107:414e9c822e99 993 (uc_type << 4);
mbed_official 107:414e9c822e99 994 }
mbed_official 107:414e9c822e99 995
mbed_official 107:414e9c822e99 996 /**
mbed_official 107:414e9c822e99 997 * \brief Configure the data length mode during the LIN communication.
mbed_official 107:414e9c822e99 998 *
mbed_official 107:414e9c822e99 999 * \param p_usart Pointer to a USART instance.
mbed_official 107:414e9c822e99 1000 * \param uc_mode Indicate the data length type: 0 if the data length is
mbed_official 107:414e9c822e99 1001 * defined by the DLC of LIN mode register or 1 if the data length is defined
mbed_official 107:414e9c822e99 1002 * by the bit 5 and 6 of the identifier.
mbed_official 107:414e9c822e99 1003 */
mbed_official 107:414e9c822e99 1004 void usart_lin_set_data_len_mode(Usart *p_usart, uint8_t uc_mode)
mbed_official 107:414e9c822e99 1005 {
mbed_official 107:414e9c822e99 1006 p_usart->US_LINMR = (p_usart->US_LINMR & ~US_LINMR_DLM) |
mbed_official 107:414e9c822e99 1007 (uc_mode << 5);
mbed_official 107:414e9c822e99 1008 }
mbed_official 107:414e9c822e99 1009
mbed_official 107:414e9c822e99 1010 /**
mbed_official 107:414e9c822e99 1011 * \brief Disable the frame slot mode during the LIN communication.
mbed_official 107:414e9c822e99 1012 *
mbed_official 107:414e9c822e99 1013 * \param p_usart Pointer to a USART instance.
mbed_official 107:414e9c822e99 1014 */
mbed_official 107:414e9c822e99 1015 void usart_lin_disable_frame_slot(Usart *p_usart)
mbed_official 107:414e9c822e99 1016 {
mbed_official 107:414e9c822e99 1017 p_usart->US_LINMR |= US_LINMR_FSDIS;
mbed_official 107:414e9c822e99 1018 }
mbed_official 107:414e9c822e99 1019
mbed_official 107:414e9c822e99 1020 /**
mbed_official 107:414e9c822e99 1021 * \brief Enable the frame slot mode during the LIN communication.
mbed_official 107:414e9c822e99 1022 *
mbed_official 107:414e9c822e99 1023 * \param p_usart Pointer to a USART instance.
mbed_official 107:414e9c822e99 1024 */
mbed_official 107:414e9c822e99 1025 void usart_lin_enable_frame_slot(Usart *p_usart)
mbed_official 107:414e9c822e99 1026 {
mbed_official 107:414e9c822e99 1027 p_usart->US_LINMR &= ~US_LINMR_FSDIS;
mbed_official 107:414e9c822e99 1028 }
mbed_official 107:414e9c822e99 1029
mbed_official 107:414e9c822e99 1030 /**
mbed_official 107:414e9c822e99 1031 * \brief Configure the wakeup signal type during the LIN communication.
mbed_official 107:414e9c822e99 1032 *
mbed_official 107:414e9c822e99 1033 * \param p_usart Pointer to a USART instance.
mbed_official 107:414e9c822e99 1034 * \param uc_type Indicate the checksum type: 0 if the wakeup signal is a
mbed_official 107:414e9c822e99 1035 * LIN 2.0 wakeup signal; 1 if the wakeup signal is a LIN 1.3 wakeup signal.
mbed_official 107:414e9c822e99 1036 */
mbed_official 107:414e9c822e99 1037 void usart_lin_set_wakeup_signal_type(Usart *p_usart, uint8_t uc_type)
mbed_official 107:414e9c822e99 1038 {
mbed_official 107:414e9c822e99 1039 p_usart->US_LINMR = (p_usart->US_LINMR & ~US_LINMR_WKUPTYP) |
mbed_official 107:414e9c822e99 1040 (uc_type << 7);
mbed_official 107:414e9c822e99 1041 }
mbed_official 107:414e9c822e99 1042
mbed_official 107:414e9c822e99 1043 /**
mbed_official 107:414e9c822e99 1044 * \brief Configure the response data length if the data length is defined by
mbed_official 107:414e9c822e99 1045 * the DLC field during the LIN communication.
mbed_official 107:414e9c822e99 1046 *
mbed_official 107:414e9c822e99 1047 * \param p_usart Pointer to a USART instance.
mbed_official 107:414e9c822e99 1048 * \param uc_len Indicate the response data length.
mbed_official 107:414e9c822e99 1049 */
mbed_official 107:414e9c822e99 1050 void usart_lin_set_response_data_len(Usart *p_usart, uint8_t uc_len)
mbed_official 107:414e9c822e99 1051 {
mbed_official 107:414e9c822e99 1052 p_usart->US_LINMR = (p_usart->US_LINMR & ~US_LINMR_DLC_Msk) |
mbed_official 107:414e9c822e99 1053 ((uc_len - 1) << US_LINMR_DLC_Pos);
mbed_official 107:414e9c822e99 1054 }
mbed_official 107:414e9c822e99 1055
mbed_official 107:414e9c822e99 1056 /**
mbed_official 107:414e9c822e99 1057 * \brief The LIN mode register is not written by the PDC.
mbed_official 107:414e9c822e99 1058 *
mbed_official 107:414e9c822e99 1059 * \param p_usart Pointer to a USART instance.
mbed_official 107:414e9c822e99 1060 */
mbed_official 107:414e9c822e99 1061 void usart_lin_disable_pdc_mode(Usart *p_usart)
mbed_official 107:414e9c822e99 1062 {
mbed_official 107:414e9c822e99 1063 p_usart->US_LINMR &= ~US_LINMR_PDCM;
mbed_official 107:414e9c822e99 1064 }
mbed_official 107:414e9c822e99 1065
mbed_official 107:414e9c822e99 1066 /**
mbed_official 107:414e9c822e99 1067 * \brief The LIN mode register (except this flag) is written by the PDC.
mbed_official 107:414e9c822e99 1068 *
mbed_official 107:414e9c822e99 1069 * \param p_usart Pointer to a USART instance.
mbed_official 107:414e9c822e99 1070 */
mbed_official 107:414e9c822e99 1071 void usart_lin_enable_pdc_mode(Usart *p_usart)
mbed_official 107:414e9c822e99 1072 {
mbed_official 107:414e9c822e99 1073 p_usart->US_LINMR |= US_LINMR_PDCM;
mbed_official 107:414e9c822e99 1074 }
mbed_official 107:414e9c822e99 1075
mbed_official 107:414e9c822e99 1076 /**
mbed_official 107:414e9c822e99 1077 * \brief Configure the LIN identifier when USART works in LIN master mode.
mbed_official 107:414e9c822e99 1078 *
mbed_official 107:414e9c822e99 1079 * \param p_usart Pointer to a USART instance.
mbed_official 107:414e9c822e99 1080 * \param uc_id The identifier to be transmitted.
mbed_official 107:414e9c822e99 1081 */
mbed_official 107:414e9c822e99 1082 void usart_lin_set_tx_identifier(Usart *p_usart, uint8_t uc_id)
mbed_official 107:414e9c822e99 1083 {
mbed_official 107:414e9c822e99 1084 p_usart->US_LINIR = (p_usart->US_LINIR & ~US_LINIR_IDCHR_Msk) |
mbed_official 107:414e9c822e99 1085 US_LINIR_IDCHR(uc_id);
mbed_official 107:414e9c822e99 1086 }
mbed_official 107:414e9c822e99 1087
mbed_official 107:414e9c822e99 1088 /**
mbed_official 107:414e9c822e99 1089 * \brief Read the identifier when USART works in LIN mode.
mbed_official 107:414e9c822e99 1090 *
mbed_official 107:414e9c822e99 1091 * \param p_usart Pointer to a USART instance.
mbed_official 107:414e9c822e99 1092 *
mbed_official 107:414e9c822e99 1093 * \return The last identifier received in LIN slave mode or the last
mbed_official 107:414e9c822e99 1094 * identifier transmitted in LIN master mode.
mbed_official 107:414e9c822e99 1095 */
mbed_official 107:414e9c822e99 1096 uint8_t usart_lin_read_identifier(Usart *p_usart)
mbed_official 107:414e9c822e99 1097 {
mbed_official 107:414e9c822e99 1098 return (p_usart->US_LINIR & US_LINIR_IDCHR_Msk);
mbed_official 107:414e9c822e99 1099 }
mbed_official 107:414e9c822e99 1100
mbed_official 107:414e9c822e99 1101 /**
mbed_official 107:414e9c822e99 1102 * \brief Get data length.
mbed_official 107:414e9c822e99 1103 *
mbed_official 107:414e9c822e99 1104 * \param p_usart Pointer to a USART instance.
mbed_official 107:414e9c822e99 1105 *
mbed_official 107:414e9c822e99 1106 * \return Data length.
mbed_official 107:414e9c822e99 1107 */
mbed_official 107:414e9c822e99 1108 uint8_t usart_lin_get_data_length(Usart *usart)
mbed_official 107:414e9c822e99 1109 {
mbed_official 107:414e9c822e99 1110 if (usart->US_LINMR & US_LINMR_DLM) {
mbed_official 107:414e9c822e99 1111 uint8_t data_length = 1 << ((usart->US_LINIR >>
mbed_official 107:414e9c822e99 1112 (US_LINIR_IDCHR_Pos + 4)) & 0x03);
mbed_official 107:414e9c822e99 1113 return data_length;
mbed_official 107:414e9c822e99 1114 } else {
mbed_official 107:414e9c822e99 1115 return ((usart->US_LINMR & US_LINMR_DLC_Msk) >> US_LINMR_DLC_Pos) + 1;
mbed_official 107:414e9c822e99 1116 }
mbed_official 107:414e9c822e99 1117 }
mbed_official 107:414e9c822e99 1118
mbed_official 107:414e9c822e99 1119 #endif
mbed_official 107:414e9c822e99 1120
mbed_official 107:414e9c822e99 1121 #if (SAMV71 || SAMV70 || SAME70 || SAMS70)
mbed_official 107:414e9c822e99 1122 /**
mbed_official 107:414e9c822e99 1123 * \brief Get identifier send status.
mbed_official 107:414e9c822e99 1124 *
mbed_official 107:414e9c822e99 1125 * \param p_usart Pointer to a USART instance.
mbed_official 107:414e9c822e99 1126 *
mbed_official 107:414e9c822e99 1127 * \return
mbed_official 107:414e9c822e99 1128 * 0: No LIN identifier has been sent since the last RSTSTA.
mbed_official 107:414e9c822e99 1129 * 1: :At least one LIN identifier has been sent since the last RSTSTA.
mbed_official 107:414e9c822e99 1130 */
mbed_official 107:414e9c822e99 1131 uint8_t usart_lin_identifier_send_complete(Usart *usart)
mbed_official 107:414e9c822e99 1132 {
mbed_official 107:414e9c822e99 1133 return (usart->US_CSR & US_CSR_LINID) > 0;
mbed_official 107:414e9c822e99 1134 }
mbed_official 107:414e9c822e99 1135
mbed_official 107:414e9c822e99 1136 /**
mbed_official 107:414e9c822e99 1137 * \brief Get identifier received status.
mbed_official 107:414e9c822e99 1138 *
mbed_official 107:414e9c822e99 1139 * \param p_usart Pointer to a USART instance.
mbed_official 107:414e9c822e99 1140 *
mbed_official 107:414e9c822e99 1141 * \return
mbed_official 107:414e9c822e99 1142 * 0: No LIN identifier has been reveived since the last RSTSTA.
mbed_official 107:414e9c822e99 1143 * 1: At least one LIN identifier has been received since the last RSTSTA.
mbed_official 107:414e9c822e99 1144 */
mbed_official 107:414e9c822e99 1145 uint8_t usart_lin_identifier_reception_complete(Usart *usart)
mbed_official 107:414e9c822e99 1146 {
mbed_official 107:414e9c822e99 1147 return (usart->US_CSR & US_CSR_LINID) > 0;
mbed_official 107:414e9c822e99 1148 }
mbed_official 107:414e9c822e99 1149
mbed_official 107:414e9c822e99 1150 /**
mbed_official 107:414e9c822e99 1151 * \brief Get transmission status.
mbed_official 107:414e9c822e99 1152 *
mbed_official 107:414e9c822e99 1153 * \param p_usart Pointer to a USART instance.
mbed_official 107:414e9c822e99 1154 *
mbed_official 107:414e9c822e99 1155 * \return
mbed_official 107:414e9c822e99 1156 * 0: The USART is idle or a LIN transfer is ongoing.
mbed_official 107:414e9c822e99 1157 * 1: A LIN transfer has been completed since the last RSTSTA.
mbed_official 107:414e9c822e99 1158 */
mbed_official 107:414e9c822e99 1159 uint8_t usart_lin_tx_complete(Usart *usart)
mbed_official 107:414e9c822e99 1160 {
mbed_official 107:414e9c822e99 1161 return (usart->US_CSR & US_CSR_LINTC) > 0;
mbed_official 107:414e9c822e99 1162 }
mbed_official 107:414e9c822e99 1163
mbed_official 107:414e9c822e99 1164 /**
mbed_official 107:414e9c822e99 1165 * \brief Configure USART to work in LON mode.
mbed_official 107:414e9c822e99 1166 *
mbed_official 107:414e9c822e99 1167 * \note By default, the transmitter and receiver aren't enabled.
mbed_official 107:414e9c822e99 1168 *
mbed_official 107:414e9c822e99 1169 * \param p_usart Pointer to a USART instance.
mbed_official 107:414e9c822e99 1170 * \param ul_baudrate Baudrate to be used.
mbed_official 107:414e9c822e99 1171 * \param ul_mck USART module input clock frequency.
mbed_official 107:414e9c822e99 1172 *
mbed_official 107:414e9c822e99 1173 * \retval 0 on success.
mbed_official 107:414e9c822e99 1174 * \retval 1 on failure.
mbed_official 107:414e9c822e99 1175 */
mbed_official 107:414e9c822e99 1176 uint32_t usart_init_lon(Usart *p_usart,uint32_t ul_baudrate,
mbed_official 107:414e9c822e99 1177 uint32_t ul_mck)
mbed_official 107:414e9c822e99 1178 {
mbed_official 107:414e9c822e99 1179 /* Reset the USART and shut down TX and RX. */
mbed_official 107:414e9c822e99 1180 usart_reset(p_usart);
mbed_official 107:414e9c822e99 1181
mbed_official 107:414e9c822e99 1182 /* Set up the baudrate. */
mbed_official 107:414e9c822e99 1183 if (usart_set_async_baudrate(p_usart, ul_baudrate, ul_mck)) {
mbed_official 107:414e9c822e99 1184 return 1;
mbed_official 107:414e9c822e99 1185 }
mbed_official 107:414e9c822e99 1186
mbed_official 107:414e9c822e99 1187 /* Set LIN master mode. */
mbed_official 107:414e9c822e99 1188 p_usart->US_MR = (p_usart->US_MR & ~US_MR_USART_MODE_Msk) |
mbed_official 107:414e9c822e99 1189 US_MR_USART_MODE_LON;
mbed_official 107:414e9c822e99 1190
mbed_official 107:414e9c822e99 1191 usart_enable_rx(p_usart);
mbed_official 107:414e9c822e99 1192 usart_enable_tx(p_usart);
mbed_official 107:414e9c822e99 1193
mbed_official 107:414e9c822e99 1194 return 0;
mbed_official 107:414e9c822e99 1195 }
mbed_official 107:414e9c822e99 1196
mbed_official 107:414e9c822e99 1197 /**
mbed_official 107:414e9c822e99 1198 * \brief set LON parameter value.
mbed_official 107:414e9c822e99 1199 *
mbed_official 107:414e9c822e99 1200 * \param p_usart Pointer to a USART instance.
mbed_official 107:414e9c822e99 1201 * \param uc_type 0: LON comm_type = 1 mode,
mbed_official 107:414e9c822e99 1202 * 1: LON comm_type = 2 mode
mbed_official 107:414e9c822e99 1203 */
mbed_official 107:414e9c822e99 1204 void usart_lon_set_comm_type(Usart *p_usart, uint8_t uc_type)
mbed_official 107:414e9c822e99 1205 {
mbed_official 107:414e9c822e99 1206 p_usart->US_LONMR = (p_usart->US_LONMR & ~US_LONMR_COMMT) |
mbed_official 107:414e9c822e99 1207 (uc_type << 0);
mbed_official 107:414e9c822e99 1208 }
mbed_official 107:414e9c822e99 1209
mbed_official 107:414e9c822e99 1210 /**
mbed_official 107:414e9c822e99 1211 * \brief Disable LON Collision Detection Feature.
mbed_official 107:414e9c822e99 1212 *
mbed_official 107:414e9c822e99 1213 * \param p_usart Pointer to a USART instance.
mbed_official 107:414e9c822e99 1214 */
mbed_official 107:414e9c822e99 1215 void usart_lon_disable_coll_detection(Usart *p_usart)
mbed_official 107:414e9c822e99 1216 {
mbed_official 107:414e9c822e99 1217 p_usart->US_LONMR |= US_LONMR_COLDET;
mbed_official 107:414e9c822e99 1218 }
mbed_official 107:414e9c822e99 1219
mbed_official 107:414e9c822e99 1220 /**
mbed_official 107:414e9c822e99 1221 * \brief Enable LON Collision Detection Feature.
mbed_official 107:414e9c822e99 1222 *
mbed_official 107:414e9c822e99 1223 * \param p_usart Pointer to a USART instance.
mbed_official 107:414e9c822e99 1224 */
mbed_official 107:414e9c822e99 1225 void usart_lon_enable_coll_detection(Usart *p_usart)
mbed_official 107:414e9c822e99 1226 {
mbed_official 107:414e9c822e99 1227 p_usart->US_LONMR &= ~US_LONMR_COLDET;
mbed_official 107:414e9c822e99 1228 }
mbed_official 107:414e9c822e99 1229
mbed_official 107:414e9c822e99 1230 /**
mbed_official 107:414e9c822e99 1231 * \brief set Terminate Frame upon Collision Notification.
mbed_official 107:414e9c822e99 1232 *
mbed_official 107:414e9c822e99 1233 * \param p_usart Pointer to a USART instance.
mbed_official 107:414e9c822e99 1234 * \param uc_type 0: Do not terminate the frame in LON comm_type = 1 mode upon collision detection.
mbed_official 107:414e9c822e99 1235 * 1:Terminate the frame in LON comm_type = 1 mode upon collision detection if possible.
mbed_official 107:414e9c822e99 1236 */
mbed_official 107:414e9c822e99 1237 void usart_lon_set_tcol(Usart *p_usart, uint8_t uc_type)
mbed_official 107:414e9c822e99 1238 {
mbed_official 107:414e9c822e99 1239 p_usart->US_LONMR = (p_usart->US_LONMR & ~US_LONMR_TCOL) |
mbed_official 107:414e9c822e99 1240 (uc_type << 2);
mbed_official 107:414e9c822e99 1241 }
mbed_official 107:414e9c822e99 1242
mbed_official 107:414e9c822e99 1243 /**
mbed_official 107:414e9c822e99 1244 * \brief set LON Collision Detection on Frame Tail.
mbed_official 107:414e9c822e99 1245 *
mbed_official 107:414e9c822e99 1246 * \param p_usart Pointer to a USART instance.
mbed_official 107:414e9c822e99 1247 * \param uc_type 0: Detect collisions after CRC has been sent but prior end of transmission in LON comm_type = 1 mode.
mbed_official 107:414e9c822e99 1248 * 1: Ignore collisions after CRC has been sent but prior end of transmission in LON comm_type = 1 mode.
mbed_official 107:414e9c822e99 1249 */
mbed_official 107:414e9c822e99 1250 void usart_lon_set_cdtail(Usart *p_usart, uint8_t uc_type)
mbed_official 107:414e9c822e99 1251 {
mbed_official 107:414e9c822e99 1252 p_usart->US_LONMR = (p_usart->US_LONMR & ~US_LONMR_CDTAIL) |
mbed_official 107:414e9c822e99 1253 (uc_type << 3);
mbed_official 107:414e9c822e99 1254 }
mbed_official 107:414e9c822e99 1255
mbed_official 107:414e9c822e99 1256 /**
mbed_official 107:414e9c822e99 1257 * \brief set LON DMA Mode.
mbed_official 107:414e9c822e99 1258 *
mbed_official 107:414e9c822e99 1259 * \param p_usart Pointer to a USART instance.
mbed_official 107:414e9c822e99 1260 * \param uc_type 0: The LON data length register US_LONDL is not written by the DMA.
mbed_official 107:414e9c822e99 1261 * 1: The LON data length register US_LONDL is written by the DMA.
mbed_official 107:414e9c822e99 1262 */
mbed_official 107:414e9c822e99 1263 void usart_lon_set_dmam(Usart *p_usart, uint8_t uc_type)
mbed_official 107:414e9c822e99 1264 {
mbed_official 107:414e9c822e99 1265 p_usart->US_LONMR = (p_usart->US_LONMR & ~US_LONMR_DMAM) |
mbed_official 107:414e9c822e99 1266 (uc_type << 4);
mbed_official 107:414e9c822e99 1267 }
mbed_official 107:414e9c822e99 1268
mbed_official 107:414e9c822e99 1269 /**
mbed_official 107:414e9c822e99 1270 * \brief set LON Beta1 Length after Transmission.
mbed_official 107:414e9c822e99 1271 *
mbed_official 107:414e9c822e99 1272 * \param p_usart Pointer to a USART instance.
mbed_official 107:414e9c822e99 1273 * \param ul_len 1-16777215: LON beta1 length after transmission in tbit
mbed_official 107:414e9c822e99 1274 */
mbed_official 107:414e9c822e99 1275 void usart_lon_set_beta1_tx_len(Usart *p_usart, uint32_t ul_len)
mbed_official 107:414e9c822e99 1276 {
mbed_official 107:414e9c822e99 1277 p_usart->US_LONB1TX = US_LONB1TX_BETA1TX(ul_len);
mbed_official 107:414e9c822e99 1278 }
mbed_official 107:414e9c822e99 1279
mbed_official 107:414e9c822e99 1280 /**
mbed_official 107:414e9c822e99 1281 * \brief set LON Beta1 Length after Reception.
mbed_official 107:414e9c822e99 1282 *
mbed_official 107:414e9c822e99 1283 * \param p_usart Pointer to a USART instance.
mbed_official 107:414e9c822e99 1284 * \param ul_len 1-16777215: LON beta1 length after reception in tbit.
mbed_official 107:414e9c822e99 1285 */
mbed_official 107:414e9c822e99 1286 void usart_lon_set_beta1_rx_len(Usart *p_usart, uint32_t ul_len)
mbed_official 107:414e9c822e99 1287 {
mbed_official 107:414e9c822e99 1288 p_usart->US_LONB1RX = US_LONB1RX_BETA1RX(ul_len);
mbed_official 107:414e9c822e99 1289 }
mbed_official 107:414e9c822e99 1290
mbed_official 107:414e9c822e99 1291 /**
mbed_official 107:414e9c822e99 1292 * \brief set LON Priority.
mbed_official 107:414e9c822e99 1293 *
mbed_official 107:414e9c822e99 1294 * \param p_usart Pointer to a USART instance.
mbed_official 107:414e9c822e99 1295 * \param uc_psnb 0 -127: LON Priority Slot Number.
mbed_official 107:414e9c822e99 1296 * \param uc_nps 0 -127: LON Node Priority Slot.
mbed_official 107:414e9c822e99 1297 */
mbed_official 107:414e9c822e99 1298 void usart_lon_set_priority(Usart *p_usart, uint8_t uc_psnb, uint8_t uc_nps)
mbed_official 107:414e9c822e99 1299 {
mbed_official 107:414e9c822e99 1300 p_usart->US_LONPRIO = US_LONPRIO_PSNB(uc_psnb) | US_LONPRIO_NPS(uc_nps);
mbed_official 107:414e9c822e99 1301 }
mbed_official 107:414e9c822e99 1302
mbed_official 107:414e9c822e99 1303 /**
mbed_official 107:414e9c822e99 1304 * \brief set LON Indeterminate Time after Transmission.
mbed_official 107:414e9c822e99 1305 *
mbed_official 107:414e9c822e99 1306 * \param p_usart Pointer to a USART instance.
mbed_official 107:414e9c822e99 1307 * \param ul_time 1-16777215: LON Indeterminate Time after Transmission (comm_type = 1 mode only).
mbed_official 107:414e9c822e99 1308 */
mbed_official 107:414e9c822e99 1309 void usart_lon_set_tx_idt(Usart *p_usart, uint32_t ul_time)
mbed_official 107:414e9c822e99 1310 {
mbed_official 107:414e9c822e99 1311 p_usart->US_IDTTX = US_IDTTX_IDTTX(ul_time);
mbed_official 107:414e9c822e99 1312 }
mbed_official 107:414e9c822e99 1313
mbed_official 107:414e9c822e99 1314 /**
mbed_official 107:414e9c822e99 1315 * \brief set LON Indeterminate Time after Reception.
mbed_official 107:414e9c822e99 1316 *
mbed_official 107:414e9c822e99 1317 * \param p_usart Pointer to a USART instance.
mbed_official 107:414e9c822e99 1318 * \param ul_time 1-16777215: LON Indeterminate Time after Reception (comm_type = 1 mode only).
mbed_official 107:414e9c822e99 1319 */
mbed_official 107:414e9c822e99 1320 void usart_lon_set_rx_idt(Usart *p_usart, uint32_t ul_time)
mbed_official 107:414e9c822e99 1321 {
mbed_official 107:414e9c822e99 1322 p_usart->US_IDTRX = US_IDTRX_IDTRX(ul_time);
mbed_official 107:414e9c822e99 1323 }
mbed_official 107:414e9c822e99 1324
mbed_official 107:414e9c822e99 1325 /**
mbed_official 107:414e9c822e99 1326 * \brief set LON Preamble Length.
mbed_official 107:414e9c822e99 1327 *
mbed_official 107:414e9c822e99 1328 * \param p_usart Pointer to a USART instance.
mbed_official 107:414e9c822e99 1329 * \param ul_len 1-16383: LON preamble length in tbit(without byte-sync).
mbed_official 107:414e9c822e99 1330 */
mbed_official 107:414e9c822e99 1331 void usart_lon_set_pre_len(Usart *p_usart, uint32_t ul_len)
mbed_official 107:414e9c822e99 1332 {
mbed_official 107:414e9c822e99 1333 p_usart->US_LONPR = US_LONPR_LONPL(ul_len);
mbed_official 107:414e9c822e99 1334 }
mbed_official 107:414e9c822e99 1335
mbed_official 107:414e9c822e99 1336 /**
mbed_official 107:414e9c822e99 1337 * \brief set LON Data Length.
mbed_official 107:414e9c822e99 1338 *
mbed_official 107:414e9c822e99 1339 * \param p_usart Pointer to a USART instance.
mbed_official 107:414e9c822e99 1340 * \param uc_len 0-255: LON data length is LONDL+1 bytes.
mbed_official 107:414e9c822e99 1341 */
mbed_official 107:414e9c822e99 1342 void usart_lon_set_data_len(Usart *p_usart, uint8_t uc_len)
mbed_official 107:414e9c822e99 1343 {
mbed_official 107:414e9c822e99 1344 p_usart->US_LONDL = US_LONDL_LONDL(uc_len);
mbed_official 107:414e9c822e99 1345 }
mbed_official 107:414e9c822e99 1346
mbed_official 107:414e9c822e99 1347 /**
mbed_official 107:414e9c822e99 1348 * \brief set LON Priority.
mbed_official 107:414e9c822e99 1349 *
mbed_official 107:414e9c822e99 1350 * \param p_usart Pointer to a USART instance.
mbed_official 107:414e9c822e99 1351 * \param uc_bli LON Backlog Increment.
mbed_official 107:414e9c822e99 1352 * \param uc_altp LON Alternate Path Bit.
mbed_official 107:414e9c822e99 1353 * \param uc_pb LON Priority Bit.
mbed_official 107:414e9c822e99 1354 */
mbed_official 107:414e9c822e99 1355 void usart_lon_set_l2hdr(Usart *p_usart, uint8_t uc_bli, uint8_t uc_altp, uint8_t uc_pb)
mbed_official 107:414e9c822e99 1356 {
mbed_official 107:414e9c822e99 1357 p_usart->US_LONL2HDR = US_LONL2HDR_BLI(uc_bli) | (uc_altp << 6) | (uc_pb << 7);
mbed_official 107:414e9c822e99 1358 }
mbed_official 107:414e9c822e99 1359
mbed_official 107:414e9c822e99 1360 /**
mbed_official 107:414e9c822e99 1361 * \brief Check if LON Transmission End.
mbed_official 107:414e9c822e99 1362 *
mbed_official 107:414e9c822e99 1363 * \param p_usart Pointer to a USART instance.
mbed_official 107:414e9c822e99 1364 *
mbed_official 107:414e9c822e99 1365 * \retval 1 At least one transmission has been performed since the last RSTSTA.
mbed_official 107:414e9c822e99 1366 * \retval 0 Transmission on going or no transmission occurred since the last RSTSTA.
mbed_official 107:414e9c822e99 1367 */
mbed_official 107:414e9c822e99 1368 uint32_t usart_lon_is_tx_end(Usart *p_usart)
mbed_official 107:414e9c822e99 1369 {
mbed_official 107:414e9c822e99 1370 return (p_usart->US_CSR & US_CSR_LTXD) > 0;
mbed_official 107:414e9c822e99 1371 }
mbed_official 107:414e9c822e99 1372
mbed_official 107:414e9c822e99 1373 /**
mbed_official 107:414e9c822e99 1374 * \brief Check if LON Reception End.
mbed_official 107:414e9c822e99 1375 *
mbed_official 107:414e9c822e99 1376 * \param p_usart Pointer to a USART instance.
mbed_official 107:414e9c822e99 1377 *
mbed_official 107:414e9c822e99 1378 * \retval 1 At least one Reception has been performed since the last RSTSTA.
mbed_official 107:414e9c822e99 1379 * \retval 0 Reception on going or no Reception occurred since the last RSTSTA.
mbed_official 107:414e9c822e99 1380 */
mbed_official 107:414e9c822e99 1381 uint32_t usart_lon_is_rx_end(Usart *p_usart)
mbed_official 107:414e9c822e99 1382 {
mbed_official 107:414e9c822e99 1383 return (p_usart->US_CSR & US_CSR_LRXD) > 0;
mbed_official 107:414e9c822e99 1384 }
mbed_official 107:414e9c822e99 1385 #endif
mbed_official 107:414e9c822e99 1386
mbed_official 107:414e9c822e99 1387 /**
mbed_official 107:414e9c822e99 1388 * \brief Enable USART transmitter.
mbed_official 107:414e9c822e99 1389 *
mbed_official 107:414e9c822e99 1390 * \param p_usart Pointer to a USART instance.
mbed_official 107:414e9c822e99 1391 */
mbed_official 107:414e9c822e99 1392 void usart_enable_tx(Usart *p_usart)
mbed_official 107:414e9c822e99 1393 {
mbed_official 107:414e9c822e99 1394 p_usart->US_CR = US_CR_TXEN;
mbed_official 107:414e9c822e99 1395 }
mbed_official 107:414e9c822e99 1396
mbed_official 107:414e9c822e99 1397 /**
mbed_official 107:414e9c822e99 1398 * \brief Disable USART transmitter.
mbed_official 107:414e9c822e99 1399 *
mbed_official 107:414e9c822e99 1400 * \param p_usart Pointer to a USART instance.
mbed_official 107:414e9c822e99 1401 */
mbed_official 107:414e9c822e99 1402 void usart_disable_tx(Usart *p_usart)
mbed_official 107:414e9c822e99 1403 {
mbed_official 107:414e9c822e99 1404 p_usart->US_CR = US_CR_TXDIS;
mbed_official 107:414e9c822e99 1405 }
mbed_official 107:414e9c822e99 1406
mbed_official 107:414e9c822e99 1407 /**
mbed_official 107:414e9c822e99 1408 * \brief Immediately stop and disable USART transmitter.
mbed_official 107:414e9c822e99 1409 *
mbed_official 107:414e9c822e99 1410 * \param p_usart Pointer to a USART instance.
mbed_official 107:414e9c822e99 1411 */
mbed_official 107:414e9c822e99 1412 void usart_reset_tx(Usart *p_usart)
mbed_official 107:414e9c822e99 1413 {
mbed_official 107:414e9c822e99 1414 /* Reset transmitter */
mbed_official 107:414e9c822e99 1415 p_usart->US_CR = US_CR_RSTTX | US_CR_TXDIS;
mbed_official 107:414e9c822e99 1416 }
mbed_official 107:414e9c822e99 1417
mbed_official 107:414e9c822e99 1418 /**
mbed_official 107:414e9c822e99 1419 * \brief Configure the transmit timeguard register.
mbed_official 107:414e9c822e99 1420 *
mbed_official 107:414e9c822e99 1421 * \param p_usart Pointer to a USART instance.
mbed_official 107:414e9c822e99 1422 * \param timeguard The value of transmit timeguard.
mbed_official 107:414e9c822e99 1423 */
mbed_official 107:414e9c822e99 1424 void usart_set_tx_timeguard(Usart *p_usart, uint32_t timeguard)
mbed_official 107:414e9c822e99 1425 {
mbed_official 107:414e9c822e99 1426 p_usart->US_TTGR = timeguard;
mbed_official 107:414e9c822e99 1427 }
mbed_official 107:414e9c822e99 1428
mbed_official 107:414e9c822e99 1429 /**
mbed_official 107:414e9c822e99 1430 * \brief Enable USART receiver.
mbed_official 107:414e9c822e99 1431 *
mbed_official 107:414e9c822e99 1432 * \param p_usart Pointer to a USART instance.
mbed_official 107:414e9c822e99 1433 */
mbed_official 107:414e9c822e99 1434 void usart_enable_rx(Usart *p_usart)
mbed_official 107:414e9c822e99 1435 {
mbed_official 107:414e9c822e99 1436 p_usart->US_CR = US_CR_RXEN;
mbed_official 107:414e9c822e99 1437 }
mbed_official 107:414e9c822e99 1438
mbed_official 107:414e9c822e99 1439 /**
mbed_official 107:414e9c822e99 1440 * \brief Disable USART receiver.
mbed_official 107:414e9c822e99 1441 *
mbed_official 107:414e9c822e99 1442 * \param p_usart Pointer to a USART instance.
mbed_official 107:414e9c822e99 1443 */
mbed_official 107:414e9c822e99 1444 void usart_disable_rx(Usart *p_usart)
mbed_official 107:414e9c822e99 1445 {
mbed_official 107:414e9c822e99 1446 p_usart->US_CR = US_CR_RXDIS;
mbed_official 107:414e9c822e99 1447 }
mbed_official 107:414e9c822e99 1448
mbed_official 107:414e9c822e99 1449 /**
mbed_official 107:414e9c822e99 1450 * \brief Immediately stop and disable USART receiver.
mbed_official 107:414e9c822e99 1451 *
mbed_official 107:414e9c822e99 1452 * \param p_usart Pointer to a USART instance.
mbed_official 107:414e9c822e99 1453 */
mbed_official 107:414e9c822e99 1454 void usart_reset_rx(Usart *p_usart)
mbed_official 107:414e9c822e99 1455 {
mbed_official 107:414e9c822e99 1456 /* Reset Receiver */
mbed_official 107:414e9c822e99 1457 p_usart->US_CR = US_CR_RSTRX | US_CR_RXDIS;
mbed_official 107:414e9c822e99 1458 }
mbed_official 107:414e9c822e99 1459
mbed_official 107:414e9c822e99 1460 /**
mbed_official 107:414e9c822e99 1461 * \brief Configure the receive timeout register.
mbed_official 107:414e9c822e99 1462 *
mbed_official 107:414e9c822e99 1463 * \param p_usart Pointer to a USART instance.
mbed_official 107:414e9c822e99 1464 * \param timeout The value of receive timeout.
mbed_official 107:414e9c822e99 1465 */
mbed_official 107:414e9c822e99 1466 void usart_set_rx_timeout(Usart *p_usart, uint32_t timeout)
mbed_official 107:414e9c822e99 1467 {
mbed_official 107:414e9c822e99 1468 p_usart->US_RTOR = timeout;
mbed_official 107:414e9c822e99 1469 }
mbed_official 107:414e9c822e99 1470
mbed_official 107:414e9c822e99 1471 /**
mbed_official 107:414e9c822e99 1472 * \brief Enable USART interrupts.
mbed_official 107:414e9c822e99 1473 *
mbed_official 107:414e9c822e99 1474 * \param p_usart Pointer to a USART peripheral.
mbed_official 107:414e9c822e99 1475 * \param ul_sources Interrupt sources bit map.
mbed_official 107:414e9c822e99 1476 */
mbed_official 107:414e9c822e99 1477 void usart_enable_interrupt(Usart *p_usart, uint32_t ul_sources)
mbed_official 107:414e9c822e99 1478 {
mbed_official 107:414e9c822e99 1479 p_usart->US_IER = ul_sources;
mbed_official 107:414e9c822e99 1480 }
mbed_official 107:414e9c822e99 1481
mbed_official 107:414e9c822e99 1482 /**
mbed_official 107:414e9c822e99 1483 * \brief Disable USART interrupts.
mbed_official 107:414e9c822e99 1484 *
mbed_official 107:414e9c822e99 1485 * \param p_usart Pointer to a USART peripheral.
mbed_official 107:414e9c822e99 1486 * \param ul_sources Interrupt sources bit map.
mbed_official 107:414e9c822e99 1487 */
mbed_official 107:414e9c822e99 1488 void usart_disable_interrupt(Usart *p_usart, uint32_t ul_sources)
mbed_official 107:414e9c822e99 1489 {
mbed_official 107:414e9c822e99 1490 p_usart->US_IDR = ul_sources;
mbed_official 107:414e9c822e99 1491 }
mbed_official 107:414e9c822e99 1492
mbed_official 107:414e9c822e99 1493 /**
mbed_official 107:414e9c822e99 1494 * \brief Read USART interrupt mask.
mbed_official 107:414e9c822e99 1495 *
mbed_official 107:414e9c822e99 1496 * \param p_usart Pointer to a USART peripheral.
mbed_official 107:414e9c822e99 1497 *
mbed_official 107:414e9c822e99 1498 * \return The interrupt mask value.
mbed_official 107:414e9c822e99 1499 */
mbed_official 107:414e9c822e99 1500 uint32_t usart_get_interrupt_mask(Usart *p_usart)
mbed_official 107:414e9c822e99 1501 {
mbed_official 107:414e9c822e99 1502 return p_usart->US_IMR;
mbed_official 107:414e9c822e99 1503 }
mbed_official 107:414e9c822e99 1504
mbed_official 107:414e9c822e99 1505 /**
mbed_official 107:414e9c822e99 1506 * \brief Get current status.
mbed_official 107:414e9c822e99 1507 *
mbed_official 107:414e9c822e99 1508 * \param p_usart Pointer to a USART instance.
mbed_official 107:414e9c822e99 1509 *
mbed_official 107:414e9c822e99 1510 * \return The current USART status.
mbed_official 107:414e9c822e99 1511 */
mbed_official 107:414e9c822e99 1512 uint32_t usart_get_status(Usart *p_usart)
mbed_official 107:414e9c822e99 1513 {
mbed_official 107:414e9c822e99 1514 return p_usart->US_CSR;
mbed_official 107:414e9c822e99 1515 }
mbed_official 107:414e9c822e99 1516
mbed_official 107:414e9c822e99 1517 /**
mbed_official 107:414e9c822e99 1518 * \brief Reset status bits (PARE, OVER, MANERR, UNRE and PXBRK in US_CSR).
mbed_official 107:414e9c822e99 1519 *
mbed_official 107:414e9c822e99 1520 * \param p_usart Pointer to a USART instance.
mbed_official 107:414e9c822e99 1521 */
mbed_official 107:414e9c822e99 1522 void usart_reset_status(Usart *p_usart)
mbed_official 107:414e9c822e99 1523 {
mbed_official 107:414e9c822e99 1524 p_usart->US_CR = US_CR_RSTSTA;
mbed_official 107:414e9c822e99 1525 }
mbed_official 107:414e9c822e99 1526
mbed_official 107:414e9c822e99 1527 /**
mbed_official 107:414e9c822e99 1528 * \brief Start transmission of a break.
mbed_official 107:414e9c822e99 1529 *
mbed_official 107:414e9c822e99 1530 * \param p_usart Pointer to a USART instance.
mbed_official 107:414e9c822e99 1531 */
mbed_official 107:414e9c822e99 1532 void usart_start_tx_break(Usart *p_usart)
mbed_official 107:414e9c822e99 1533 {
mbed_official 107:414e9c822e99 1534 p_usart->US_CR = US_CR_STTBRK;
mbed_official 107:414e9c822e99 1535 }
mbed_official 107:414e9c822e99 1536
mbed_official 107:414e9c822e99 1537 /**
mbed_official 107:414e9c822e99 1538 * \brief Stop transmission of a break.
mbed_official 107:414e9c822e99 1539 *
mbed_official 107:414e9c822e99 1540 * \param p_usart Pointer to a USART instance.
mbed_official 107:414e9c822e99 1541 */
mbed_official 107:414e9c822e99 1542 void usart_stop_tx_break(Usart *p_usart)
mbed_official 107:414e9c822e99 1543 {
mbed_official 107:414e9c822e99 1544 p_usart->US_CR = US_CR_STPBRK;
mbed_official 107:414e9c822e99 1545 }
mbed_official 107:414e9c822e99 1546
mbed_official 107:414e9c822e99 1547 /**
mbed_official 107:414e9c822e99 1548 * \brief Start waiting for a character before clocking the timeout count.
mbed_official 107:414e9c822e99 1549 * Reset the status bit TIMEOUT in US_CSR.
mbed_official 107:414e9c822e99 1550 *
mbed_official 107:414e9c822e99 1551 * \param p_usart Pointer to a USART instance.
mbed_official 107:414e9c822e99 1552 */
mbed_official 107:414e9c822e99 1553 void usart_start_rx_timeout(Usart *p_usart)
mbed_official 107:414e9c822e99 1554 {
mbed_official 107:414e9c822e99 1555 p_usart->US_CR = US_CR_STTTO;
mbed_official 107:414e9c822e99 1556 }
mbed_official 107:414e9c822e99 1557
mbed_official 107:414e9c822e99 1558 /**
mbed_official 107:414e9c822e99 1559 * \brief In Multidrop mode only, the next character written to the US_THR
mbed_official 107:414e9c822e99 1560 * is sent with the address bit set.
mbed_official 107:414e9c822e99 1561 *
mbed_official 107:414e9c822e99 1562 * \param p_usart Pointer to a USART instance.
mbed_official 107:414e9c822e99 1563 * \param ul_addr The address to be sent out.
mbed_official 107:414e9c822e99 1564 *
mbed_official 107:414e9c822e99 1565 * \retval 0 on success.
mbed_official 107:414e9c822e99 1566 * \retval 1 on failure.
mbed_official 107:414e9c822e99 1567 */
mbed_official 107:414e9c822e99 1568 uint32_t usart_send_address(Usart *p_usart, uint32_t ul_addr)
mbed_official 107:414e9c822e99 1569 {
mbed_official 107:414e9c822e99 1570 if ((p_usart->US_MR & US_MR_PAR_MULTIDROP) != US_MR_PAR_MULTIDROP) {
mbed_official 107:414e9c822e99 1571 return 1;
mbed_official 107:414e9c822e99 1572 }
mbed_official 107:414e9c822e99 1573
mbed_official 107:414e9c822e99 1574 p_usart->US_CR = US_CR_SENDA;
mbed_official 107:414e9c822e99 1575
mbed_official 107:414e9c822e99 1576 if (usart_write(p_usart, ul_addr)) {
mbed_official 107:414e9c822e99 1577 return 1;
mbed_official 107:414e9c822e99 1578 } else {
mbed_official 107:414e9c822e99 1579 return 0;
mbed_official 107:414e9c822e99 1580 }
mbed_official 107:414e9c822e99 1581 }
mbed_official 107:414e9c822e99 1582
mbed_official 107:414e9c822e99 1583 /**
mbed_official 107:414e9c822e99 1584 * \brief Restart the receive timeout.
mbed_official 107:414e9c822e99 1585 *
mbed_official 107:414e9c822e99 1586 * \param p_usart Pointer to a USART instance.
mbed_official 107:414e9c822e99 1587 */
mbed_official 107:414e9c822e99 1588 void usart_restart_rx_timeout(Usart *p_usart)
mbed_official 107:414e9c822e99 1589 {
mbed_official 107:414e9c822e99 1590 p_usart->US_CR = US_CR_RETTO;
mbed_official 107:414e9c822e99 1591 }
mbed_official 107:414e9c822e99 1592
mbed_official 107:414e9c822e99 1593 #if (SAM3S || SAM4S || SAM3U || SAM4L || SAM4E)
mbed_official 107:414e9c822e99 1594
mbed_official 107:414e9c822e99 1595 /**
mbed_official 107:414e9c822e99 1596 * \brief Drive the pin DTR to 0.
mbed_official 107:414e9c822e99 1597 *
mbed_official 107:414e9c822e99 1598 * \param p_usart Pointer to a USART instance.
mbed_official 107:414e9c822e99 1599 */
mbed_official 107:414e9c822e99 1600 void usart_drive_DTR_pin_low(Usart *p_usart)
mbed_official 107:414e9c822e99 1601 {
mbed_official 107:414e9c822e99 1602 p_usart->US_CR = US_CR_DTREN;
mbed_official 107:414e9c822e99 1603 }
mbed_official 107:414e9c822e99 1604
mbed_official 107:414e9c822e99 1605 /**
mbed_official 107:414e9c822e99 1606 * \brief Drive the pin DTR to 1.
mbed_official 107:414e9c822e99 1607 *
mbed_official 107:414e9c822e99 1608 * \param p_usart Pointer to a USART instance.
mbed_official 107:414e9c822e99 1609 */
mbed_official 107:414e9c822e99 1610 void usart_drive_DTR_pin_high(Usart *p_usart)
mbed_official 107:414e9c822e99 1611 {
mbed_official 107:414e9c822e99 1612 p_usart->US_CR = US_CR_DTRDIS;
mbed_official 107:414e9c822e99 1613 }
mbed_official 107:414e9c822e99 1614
mbed_official 107:414e9c822e99 1615 #endif
mbed_official 107:414e9c822e99 1616
mbed_official 107:414e9c822e99 1617 /**
mbed_official 107:414e9c822e99 1618 * \brief Drive the pin RTS to 0.
mbed_official 107:414e9c822e99 1619 *
mbed_official 107:414e9c822e99 1620 * \param p_usart Pointer to a USART instance.
mbed_official 107:414e9c822e99 1621 */
mbed_official 107:414e9c822e99 1622 void usart_drive_RTS_pin_low(Usart *p_usart)
mbed_official 107:414e9c822e99 1623 {
mbed_official 107:414e9c822e99 1624 p_usart->US_CR = US_CR_RTSEN;
mbed_official 107:414e9c822e99 1625 }
mbed_official 107:414e9c822e99 1626
mbed_official 107:414e9c822e99 1627 /**
mbed_official 107:414e9c822e99 1628 * \brief Drive the pin RTS to 1.
mbed_official 107:414e9c822e99 1629 *
mbed_official 107:414e9c822e99 1630 * \param p_usart Pointer to a USART instance.
mbed_official 107:414e9c822e99 1631 */
mbed_official 107:414e9c822e99 1632 void usart_drive_RTS_pin_high(Usart *p_usart)
mbed_official 107:414e9c822e99 1633 {
mbed_official 107:414e9c822e99 1634 p_usart->US_CR = US_CR_RTSDIS;
mbed_official 107:414e9c822e99 1635 }
mbed_official 107:414e9c822e99 1636
mbed_official 107:414e9c822e99 1637 /**
mbed_official 107:414e9c822e99 1638 * \brief Drive the slave select line NSS (RTS pin) to 0 in SPI master mode.
mbed_official 107:414e9c822e99 1639 *
mbed_official 107:414e9c822e99 1640 * \param p_usart Pointer to a USART instance.
mbed_official 107:414e9c822e99 1641 */
mbed_official 107:414e9c822e99 1642 void usart_spi_force_chip_select(Usart *p_usart)
mbed_official 107:414e9c822e99 1643 {
mbed_official 107:414e9c822e99 1644 p_usart->US_CR = US_CR_FCS;
mbed_official 107:414e9c822e99 1645 }
mbed_official 107:414e9c822e99 1646
mbed_official 107:414e9c822e99 1647 /**
mbed_official 107:414e9c822e99 1648 * \brief Drive the slave select line NSS (RTS pin) to 1 in SPI master mode.
mbed_official 107:414e9c822e99 1649 *
mbed_official 107:414e9c822e99 1650 * \param p_usart Pointer to a USART instance.
mbed_official 107:414e9c822e99 1651 */
mbed_official 107:414e9c822e99 1652 void usart_spi_release_chip_select(Usart *p_usart)
mbed_official 107:414e9c822e99 1653 {
mbed_official 107:414e9c822e99 1654 p_usart->US_CR = US_CR_RCS;
mbed_official 107:414e9c822e99 1655 }
mbed_official 107:414e9c822e99 1656
mbed_official 107:414e9c822e99 1657 /**
mbed_official 107:414e9c822e99 1658 * \brief Check if Transmit is Ready.
mbed_official 107:414e9c822e99 1659 * Check if data have been loaded in USART_THR and are waiting to be loaded
mbed_official 107:414e9c822e99 1660 * into the Transmit Shift Register (TSR).
mbed_official 107:414e9c822e99 1661 *
mbed_official 107:414e9c822e99 1662 * \param p_usart Pointer to a USART instance.
mbed_official 107:414e9c822e99 1663 *
mbed_official 107:414e9c822e99 1664 * \retval 1 No data is in the Transmit Holding Register.
mbed_official 107:414e9c822e99 1665 * \retval 0 There is data in the Transmit Holding Register.
mbed_official 107:414e9c822e99 1666 */
mbed_official 107:414e9c822e99 1667 uint32_t usart_is_tx_ready(Usart *p_usart)
mbed_official 107:414e9c822e99 1668 {
mbed_official 107:414e9c822e99 1669 return (p_usart->US_CSR & US_CSR_TXRDY) > 0;
mbed_official 107:414e9c822e99 1670 }
mbed_official 107:414e9c822e99 1671
mbed_official 107:414e9c822e99 1672 /**
mbed_official 107:414e9c822e99 1673 * \brief Check if Transmit Holding Register is empty.
mbed_official 107:414e9c822e99 1674 * Check if the last data written in USART_THR have been loaded in TSR and the
mbed_official 107:414e9c822e99 1675 * last data loaded in TSR have been transmitted.
mbed_official 107:414e9c822e99 1676 *
mbed_official 107:414e9c822e99 1677 * \param p_usart Pointer to a USART instance.
mbed_official 107:414e9c822e99 1678 *
mbed_official 107:414e9c822e99 1679 * \retval 1 Transmitter is empty.
mbed_official 107:414e9c822e99 1680 * \retval 0 Transmitter is not empty.
mbed_official 107:414e9c822e99 1681 */
mbed_official 107:414e9c822e99 1682 uint32_t usart_is_tx_empty(Usart *p_usart)
mbed_official 107:414e9c822e99 1683 {
mbed_official 107:414e9c822e99 1684 return (p_usart->US_CSR & US_CSR_TXEMPTY) > 0;
mbed_official 107:414e9c822e99 1685 }
mbed_official 107:414e9c822e99 1686
mbed_official 107:414e9c822e99 1687 /**
mbed_official 107:414e9c822e99 1688 * \brief Check if the received data are ready.
mbed_official 107:414e9c822e99 1689 * Check if Data have been received and loaded into USART_RHR.
mbed_official 107:414e9c822e99 1690 *
mbed_official 107:414e9c822e99 1691 * \param p_usart Pointer to a USART instance.
mbed_official 107:414e9c822e99 1692 *
mbed_official 107:414e9c822e99 1693 * \retval 1 Some data has been received.
mbed_official 107:414e9c822e99 1694 * \retval 0 No data has been received.
mbed_official 107:414e9c822e99 1695 */
mbed_official 107:414e9c822e99 1696 uint32_t usart_is_rx_ready(Usart *p_usart)
mbed_official 107:414e9c822e99 1697 {
mbed_official 107:414e9c822e99 1698 return (p_usart->US_CSR & US_CSR_RXRDY) > 0;
mbed_official 107:414e9c822e99 1699 }
mbed_official 107:414e9c822e99 1700
mbed_official 107:414e9c822e99 1701 /**
mbed_official 107:414e9c822e99 1702 * \brief Write to USART Transmit Holding Register.
mbed_official 107:414e9c822e99 1703 *
mbed_official 107:414e9c822e99 1704 * \note Before writing user should check if tx is ready (or empty).
mbed_official 107:414e9c822e99 1705 *
mbed_official 107:414e9c822e99 1706 * \param p_usart Pointer to a USART instance.
mbed_official 107:414e9c822e99 1707 * \param c Data to be sent.
mbed_official 107:414e9c822e99 1708 *
mbed_official 107:414e9c822e99 1709 * \retval 0 on success.
mbed_official 107:414e9c822e99 1710 * \retval 1 on failure.
mbed_official 107:414e9c822e99 1711 */
mbed_official 107:414e9c822e99 1712 uint32_t usart_write(Usart *p_usart, uint32_t c)
mbed_official 107:414e9c822e99 1713 {
mbed_official 107:414e9c822e99 1714 if (!(p_usart->US_CSR & US_CSR_TXRDY)) {
mbed_official 107:414e9c822e99 1715 return 1;
mbed_official 107:414e9c822e99 1716 }
mbed_official 107:414e9c822e99 1717
mbed_official 107:414e9c822e99 1718 p_usart->US_THR = US_THR_TXCHR(c);
mbed_official 107:414e9c822e99 1719 return 0;
mbed_official 107:414e9c822e99 1720 }
mbed_official 107:414e9c822e99 1721
mbed_official 107:414e9c822e99 1722 /**
mbed_official 107:414e9c822e99 1723 * \brief Write to USART Transmit Holding Register.
mbed_official 107:414e9c822e99 1724 *
mbed_official 107:414e9c822e99 1725 * \note Before writing user should check if tx is ready (or empty).
mbed_official 107:414e9c822e99 1726 *
mbed_official 107:414e9c822e99 1727 * \param p_usart Pointer to a USART instance.
mbed_official 107:414e9c822e99 1728 * \param c Data to be sent.
mbed_official 107:414e9c822e99 1729 *
mbed_official 107:414e9c822e99 1730 * \retval 0 on success.
mbed_official 107:414e9c822e99 1731 * \retval 1 on failure.
mbed_official 107:414e9c822e99 1732 */
mbed_official 107:414e9c822e99 1733 uint32_t usart_putchar(Usart *p_usart, uint32_t c)
mbed_official 107:414e9c822e99 1734 {
mbed_official 107:414e9c822e99 1735 while (!(p_usart->US_CSR & US_CSR_TXRDY)) {
mbed_official 107:414e9c822e99 1736 }
mbed_official 107:414e9c822e99 1737
mbed_official 107:414e9c822e99 1738 p_usart->US_THR = US_THR_TXCHR(c);
mbed_official 107:414e9c822e99 1739
mbed_official 107:414e9c822e99 1740 return 0;
mbed_official 107:414e9c822e99 1741 }
mbed_official 107:414e9c822e99 1742
mbed_official 107:414e9c822e99 1743 /**
mbed_official 107:414e9c822e99 1744 * \brief Write one-line string through USART.
mbed_official 107:414e9c822e99 1745 *
mbed_official 107:414e9c822e99 1746 * \param p_usart Pointer to a USART instance.
mbed_official 107:414e9c822e99 1747 * \param string Pointer to one-line string to be sent.
mbed_official 107:414e9c822e99 1748 */
mbed_official 107:414e9c822e99 1749 void usart_write_line(Usart *p_usart, const char *string)
mbed_official 107:414e9c822e99 1750 {
mbed_official 107:414e9c822e99 1751 while (*string != '\0') {
mbed_official 107:414e9c822e99 1752 usart_putchar(p_usart, *string++);
mbed_official 107:414e9c822e99 1753 }
mbed_official 107:414e9c822e99 1754 }
mbed_official 107:414e9c822e99 1755
mbed_official 107:414e9c822e99 1756 /**
mbed_official 107:414e9c822e99 1757 * \brief Read from USART Receive Holding Register.
mbed_official 107:414e9c822e99 1758 *
mbed_official 107:414e9c822e99 1759 * \note Before reading user should check if rx is ready.
mbed_official 107:414e9c822e99 1760 *
mbed_official 107:414e9c822e99 1761 * \param p_usart Pointer to a USART instance.
mbed_official 107:414e9c822e99 1762 * \param c Pointer where the one-byte received data will be stored.
mbed_official 107:414e9c822e99 1763 *
mbed_official 107:414e9c822e99 1764 * \retval 0 on success.
mbed_official 107:414e9c822e99 1765 * \retval 1 if no data is available or errors.
mbed_official 107:414e9c822e99 1766 */
mbed_official 107:414e9c822e99 1767 uint32_t usart_read(Usart *p_usart, uint32_t *c)
mbed_official 107:414e9c822e99 1768 {
mbed_official 107:414e9c822e99 1769 if (!(p_usart->US_CSR & US_CSR_RXRDY)) {
mbed_official 107:414e9c822e99 1770 return 1;
mbed_official 107:414e9c822e99 1771 }
mbed_official 107:414e9c822e99 1772
mbed_official 107:414e9c822e99 1773 /* Read character */
mbed_official 107:414e9c822e99 1774 *c = p_usart->US_RHR & US_RHR_RXCHR_Msk;
mbed_official 107:414e9c822e99 1775
mbed_official 107:414e9c822e99 1776 return 0;
mbed_official 107:414e9c822e99 1777 }
mbed_official 107:414e9c822e99 1778
mbed_official 107:414e9c822e99 1779 /**
mbed_official 107:414e9c822e99 1780 * \brief Read from USART Receive Holding Register.
mbed_official 107:414e9c822e99 1781 * Before reading user should check if rx is ready.
mbed_official 107:414e9c822e99 1782 *
mbed_official 107:414e9c822e99 1783 * \param p_usart Pointer to a USART instance.
mbed_official 107:414e9c822e99 1784 * \param c Pointer where the one-byte received data will be stored.
mbed_official 107:414e9c822e99 1785 *
mbed_official 107:414e9c822e99 1786 * \retval 0 Data has been received.
mbed_official 107:414e9c822e99 1787 * \retval 1 on failure.
mbed_official 107:414e9c822e99 1788 */
mbed_official 107:414e9c822e99 1789 uint32_t usart_getchar(Usart *p_usart, uint32_t *c)
mbed_official 107:414e9c822e99 1790 {
mbed_official 107:414e9c822e99 1791 /* Wait until it's not empty or timeout has reached. */
mbed_official 107:414e9c822e99 1792 while (!(p_usart->US_CSR & US_CSR_RXRDY)) {
mbed_official 107:414e9c822e99 1793 }
mbed_official 107:414e9c822e99 1794
mbed_official 107:414e9c822e99 1795 /* Read character */
mbed_official 107:414e9c822e99 1796 *c = p_usart->US_RHR & US_RHR_RXCHR_Msk;
mbed_official 107:414e9c822e99 1797
mbed_official 107:414e9c822e99 1798 return 0;
mbed_official 107:414e9c822e99 1799 }
mbed_official 107:414e9c822e99 1800
mbed_official 107:414e9c822e99 1801 #if (SAM3XA || SAM3U)
mbed_official 107:414e9c822e99 1802 /**
mbed_official 107:414e9c822e99 1803 * \brief Get Transmit address for DMA operation.
mbed_official 107:414e9c822e99 1804 *
mbed_official 107:414e9c822e99 1805 * \param p_usart Pointer to a USART instance.
mbed_official 107:414e9c822e99 1806 *
mbed_official 107:414e9c822e99 1807 * \return Transmit address for DMA access.
mbed_official 107:414e9c822e99 1808 */
mbed_official 107:414e9c822e99 1809 uint32_t *usart_get_tx_access(Usart *p_usart)
mbed_official 107:414e9c822e99 1810 {
mbed_official 107:414e9c822e99 1811 return (uint32_t *)&(p_usart->US_THR);
mbed_official 107:414e9c822e99 1812 }
mbed_official 107:414e9c822e99 1813
mbed_official 107:414e9c822e99 1814 /**
mbed_official 107:414e9c822e99 1815 * \brief Get Receive address for DMA operation.
mbed_official 107:414e9c822e99 1816 *
mbed_official 107:414e9c822e99 1817 * \param p_usart Pointer to a USART instance.
mbed_official 107:414e9c822e99 1818 *
mbed_official 107:414e9c822e99 1819 * \return Receive address for DMA access.
mbed_official 107:414e9c822e99 1820 */
mbed_official 107:414e9c822e99 1821 uint32_t *usart_get_rx_access(Usart *p_usart)
mbed_official 107:414e9c822e99 1822 {
mbed_official 107:414e9c822e99 1823 return (uint32_t *)&(p_usart->US_RHR);
mbed_official 107:414e9c822e99 1824 }
mbed_official 107:414e9c822e99 1825 #endif
mbed_official 107:414e9c822e99 1826
mbed_official 107:414e9c822e99 1827 #if (!SAM4L && !SAMV71 && !SAMV70 && !SAME70 && !SAMS70)
mbed_official 107:414e9c822e99 1828 /**
mbed_official 107:414e9c822e99 1829 * \brief Get USART PDC base address.
mbed_official 107:414e9c822e99 1830 *
mbed_official 107:414e9c822e99 1831 * \param p_usart Pointer to a UART instance.
mbed_official 107:414e9c822e99 1832 *
mbed_official 107:414e9c822e99 1833 * \return USART PDC registers base for PDC driver to access.
mbed_official 107:414e9c822e99 1834 */
mbed_official 107:414e9c822e99 1835 Pdc *usart_get_pdc_base(Usart *p_usart)
mbed_official 107:414e9c822e99 1836 {
mbed_official 107:414e9c822e99 1837 Pdc *p_pdc_base;
mbed_official 107:414e9c822e99 1838
mbed_official 107:414e9c822e99 1839 p_pdc_base = (Pdc *)NULL;
mbed_official 107:414e9c822e99 1840
mbed_official 107:414e9c822e99 1841 #ifdef PDC_USART
mbed_official 107:414e9c822e99 1842 if (p_usart == USART) {
mbed_official 107:414e9c822e99 1843 p_pdc_base = PDC_USART;
mbed_official 107:414e9c822e99 1844 return p_pdc_base;
mbed_official 107:414e9c822e99 1845 }
mbed_official 107:414e9c822e99 1846 #endif
mbed_official 107:414e9c822e99 1847 #ifdef PDC_USART0
mbed_official 107:414e9c822e99 1848 if (p_usart == USART0) {
mbed_official 107:414e9c822e99 1849 p_pdc_base = PDC_USART0;
mbed_official 107:414e9c822e99 1850 return p_pdc_base;
mbed_official 107:414e9c822e99 1851 }
mbed_official 107:414e9c822e99 1852 #endif
mbed_official 107:414e9c822e99 1853 #ifdef PDC_USART1
mbed_official 107:414e9c822e99 1854 else if (p_usart == USART1) {
mbed_official 107:414e9c822e99 1855 p_pdc_base = PDC_USART1;
mbed_official 107:414e9c822e99 1856 return p_pdc_base;
mbed_official 107:414e9c822e99 1857 }
mbed_official 107:414e9c822e99 1858 #endif
mbed_official 107:414e9c822e99 1859 #ifdef PDC_USART2
mbed_official 107:414e9c822e99 1860 else if (p_usart == USART2) {
mbed_official 107:414e9c822e99 1861 p_pdc_base = PDC_USART2;
mbed_official 107:414e9c822e99 1862 return p_pdc_base;
mbed_official 107:414e9c822e99 1863 }
mbed_official 107:414e9c822e99 1864 #endif
mbed_official 107:414e9c822e99 1865 #ifdef PDC_USART3
mbed_official 107:414e9c822e99 1866 else if (p_usart == USART3) {
mbed_official 107:414e9c822e99 1867 p_pdc_base = PDC_USART3;
mbed_official 107:414e9c822e99 1868 return p_pdc_base;
mbed_official 107:414e9c822e99 1869 }
mbed_official 107:414e9c822e99 1870 #endif
mbed_official 107:414e9c822e99 1871 #ifdef PDC_USART4
mbed_official 107:414e9c822e99 1872 else if (p_usart == USART4) {
mbed_official 107:414e9c822e99 1873 p_pdc_base = PDC_USART4;
mbed_official 107:414e9c822e99 1874 return p_pdc_base;
mbed_official 107:414e9c822e99 1875 }
mbed_official 107:414e9c822e99 1876 #endif
mbed_official 107:414e9c822e99 1877 #ifdef PDC_USART5
mbed_official 107:414e9c822e99 1878 else if (p_usart == USART5) {
mbed_official 107:414e9c822e99 1879 p_pdc_base = PDC_USART5;
mbed_official 107:414e9c822e99 1880 return p_pdc_base;
mbed_official 107:414e9c822e99 1881 }
mbed_official 107:414e9c822e99 1882 #endif
mbed_official 107:414e9c822e99 1883 #ifdef PDC_USART6
mbed_official 107:414e9c822e99 1884 else if (p_usart == USART6) {
mbed_official 107:414e9c822e99 1885 p_pdc_base = PDC_USART6;
mbed_official 107:414e9c822e99 1886 return p_pdc_base;
mbed_official 107:414e9c822e99 1887 }
mbed_official 107:414e9c822e99 1888 #endif
mbed_official 107:414e9c822e99 1889 #ifdef PDC_USART7
mbed_official 107:414e9c822e99 1890 else if (p_usart == USART7) {
mbed_official 107:414e9c822e99 1891 p_pdc_base = PDC_USART7;
mbed_official 107:414e9c822e99 1892 return p_pdc_base;
mbed_official 107:414e9c822e99 1893 }
mbed_official 107:414e9c822e99 1894 #endif
mbed_official 107:414e9c822e99 1895
mbed_official 107:414e9c822e99 1896 return p_pdc_base;
mbed_official 107:414e9c822e99 1897 }
mbed_official 107:414e9c822e99 1898 #endif
mbed_official 107:414e9c822e99 1899
mbed_official 107:414e9c822e99 1900 /**
mbed_official 107:414e9c822e99 1901 * \brief Enable write protect of USART registers.
mbed_official 107:414e9c822e99 1902 *
mbed_official 107:414e9c822e99 1903 * \param p_usart Pointer to a USART instance.
mbed_official 107:414e9c822e99 1904 */
mbed_official 107:414e9c822e99 1905 void usart_enable_writeprotect(Usart *p_usart)
mbed_official 107:414e9c822e99 1906 {
mbed_official 107:414e9c822e99 1907 p_usart->US_WPMR = US_WPMR_WPEN | US_WPMR_WPKEY_PASSWD;
mbed_official 107:414e9c822e99 1908 }
mbed_official 107:414e9c822e99 1909
mbed_official 107:414e9c822e99 1910 /**
mbed_official 107:414e9c822e99 1911 * \brief Disable write protect of USART registers.
mbed_official 107:414e9c822e99 1912 *
mbed_official 107:414e9c822e99 1913 * \param p_usart Pointer to a USART instance.
mbed_official 107:414e9c822e99 1914 */
mbed_official 107:414e9c822e99 1915 void usart_disable_writeprotect(Usart *p_usart)
mbed_official 107:414e9c822e99 1916 {
mbed_official 107:414e9c822e99 1917 p_usart->US_WPMR = US_WPMR_WPKEY_PASSWD;
mbed_official 107:414e9c822e99 1918 }
mbed_official 107:414e9c822e99 1919
mbed_official 107:414e9c822e99 1920 /**
mbed_official 107:414e9c822e99 1921 * \brief Get write protect status.
mbed_official 107:414e9c822e99 1922 *
mbed_official 107:414e9c822e99 1923 * \param p_usart Pointer to a USART instance.
mbed_official 107:414e9c822e99 1924 *
mbed_official 107:414e9c822e99 1925 * \return 0 if no write protect violation occurred, or 16-bit write protect
mbed_official 107:414e9c822e99 1926 * violation source.
mbed_official 107:414e9c822e99 1927 */
mbed_official 107:414e9c822e99 1928 uint32_t usart_get_writeprotect_status(Usart *p_usart)
mbed_official 107:414e9c822e99 1929 {
mbed_official 107:414e9c822e99 1930 uint32_t reg_value;
mbed_official 107:414e9c822e99 1931
mbed_official 107:414e9c822e99 1932 reg_value = p_usart->US_WPSR;
mbed_official 107:414e9c822e99 1933 if (reg_value & US_WPSR_WPVS) {
mbed_official 107:414e9c822e99 1934 return (reg_value & US_WPSR_WPVSRC_Msk) >> US_WPSR_WPVSRC_Pos;
mbed_official 107:414e9c822e99 1935 } else {
mbed_official 107:414e9c822e99 1936 return 0;
mbed_official 107:414e9c822e99 1937 }
mbed_official 107:414e9c822e99 1938 }
mbed_official 107:414e9c822e99 1939
mbed_official 107:414e9c822e99 1940 #if (SAM3S || SAM4S || SAM3U || SAM3XA || SAM4L || SAM4E || SAM4C || SAM4CP || SAM4CM)
mbed_official 107:414e9c822e99 1941
mbed_official 107:414e9c822e99 1942 /**
mbed_official 107:414e9c822e99 1943 * \brief Configure the transmitter preamble length when the Manchester
mbed_official 107:414e9c822e99 1944 * encode/decode is enabled.
mbed_official 107:414e9c822e99 1945 *
mbed_official 107:414e9c822e99 1946 * \param p_usart Pointer to a USART instance.
mbed_official 107:414e9c822e99 1947 * \param uc_len The transmitter preamble length, which should be 0 ~ 15.
mbed_official 107:414e9c822e99 1948 */
mbed_official 107:414e9c822e99 1949 void usart_man_set_tx_pre_len(Usart *p_usart, uint8_t uc_len)
mbed_official 107:414e9c822e99 1950 {
mbed_official 107:414e9c822e99 1951 p_usart->US_MAN = (p_usart->US_MAN & ~US_MAN_TX_PL_Msk) |
mbed_official 107:414e9c822e99 1952 US_MAN_TX_PL(uc_len);
mbed_official 107:414e9c822e99 1953 }
mbed_official 107:414e9c822e99 1954
mbed_official 107:414e9c822e99 1955 /**
mbed_official 107:414e9c822e99 1956 * \brief Configure the transmitter preamble pattern when the Manchester
mbed_official 107:414e9c822e99 1957 * encode/decode is enabled, which should be 0 ~ 3.
mbed_official 107:414e9c822e99 1958 *
mbed_official 107:414e9c822e99 1959 * \param p_usart Pointer to a USART instance.
mbed_official 107:414e9c822e99 1960 * \param uc_pattern 0 if the preamble is composed of '1's;
mbed_official 107:414e9c822e99 1961 * 1 if the preamble is composed of '0's;
mbed_official 107:414e9c822e99 1962 * 2 if the preamble is composed of '01's;
mbed_official 107:414e9c822e99 1963 * 3 if the preamble is composed of '10's.
mbed_official 107:414e9c822e99 1964 */
mbed_official 107:414e9c822e99 1965 void usart_man_set_tx_pre_pattern(Usart *p_usart, uint8_t uc_pattern)
mbed_official 107:414e9c822e99 1966 {
mbed_official 107:414e9c822e99 1967 p_usart->US_MAN = (p_usart->US_MAN & ~US_MAN_TX_PP_Msk) |
mbed_official 107:414e9c822e99 1968 (uc_pattern << US_MAN_TX_PP_Pos);
mbed_official 107:414e9c822e99 1969 }
mbed_official 107:414e9c822e99 1970
mbed_official 107:414e9c822e99 1971 /**
mbed_official 107:414e9c822e99 1972 * \brief Configure the transmitter Manchester polarity when the Manchester
mbed_official 107:414e9c822e99 1973 * encode/decode is enabled.
mbed_official 107:414e9c822e99 1974 *
mbed_official 107:414e9c822e99 1975 * \param p_usart Pointer to a USART instance.
mbed_official 107:414e9c822e99 1976 * \param uc_polarity Indicate the transmitter Manchester polarity, which
mbed_official 107:414e9c822e99 1977 * should be 0 or 1.
mbed_official 107:414e9c822e99 1978 */
mbed_official 107:414e9c822e99 1979 void usart_man_set_tx_polarity(Usart *p_usart, uint8_t uc_polarity)
mbed_official 107:414e9c822e99 1980 {
mbed_official 107:414e9c822e99 1981 p_usart->US_MAN = (p_usart->US_MAN & ~US_MAN_TX_MPOL) |
mbed_official 107:414e9c822e99 1982 (uc_polarity << 12);
mbed_official 107:414e9c822e99 1983 }
mbed_official 107:414e9c822e99 1984
mbed_official 107:414e9c822e99 1985 /**
mbed_official 107:414e9c822e99 1986 * \brief Configure the detected receiver preamble length when the Manchester
mbed_official 107:414e9c822e99 1987 * encode/decode is enabled.
mbed_official 107:414e9c822e99 1988 *
mbed_official 107:414e9c822e99 1989 * \param p_usart Pointer to a USART instance.
mbed_official 107:414e9c822e99 1990 * \param uc_len The detected receiver preamble length, which should be 0 ~ 15.
mbed_official 107:414e9c822e99 1991 */
mbed_official 107:414e9c822e99 1992 void usart_man_set_rx_pre_len(Usart *p_usart, uint8_t uc_len)
mbed_official 107:414e9c822e99 1993 {
mbed_official 107:414e9c822e99 1994 p_usart->US_MAN = (p_usart->US_MAN & ~US_MAN_RX_PL_Msk) |
mbed_official 107:414e9c822e99 1995 US_MAN_RX_PL(uc_len);
mbed_official 107:414e9c822e99 1996 }
mbed_official 107:414e9c822e99 1997
mbed_official 107:414e9c822e99 1998 /**
mbed_official 107:414e9c822e99 1999 * \brief Configure the detected receiver preamble pattern when the Manchester
mbed_official 107:414e9c822e99 2000 * encode/decode is enabled, which should be 0 ~ 3.
mbed_official 107:414e9c822e99 2001 *
mbed_official 107:414e9c822e99 2002 * \param p_usart Pointer to a USART instance.
mbed_official 107:414e9c822e99 2003 * \param uc_pattern 0 if the preamble is composed of '1's;
mbed_official 107:414e9c822e99 2004 * 1 if the preamble is composed of '0's;
mbed_official 107:414e9c822e99 2005 * 2 if the preamble is composed of '01's;
mbed_official 107:414e9c822e99 2006 * 3 if the preamble is composed of '10's.
mbed_official 107:414e9c822e99 2007 */
mbed_official 107:414e9c822e99 2008 void usart_man_set_rx_pre_pattern(Usart *p_usart, uint8_t uc_pattern)
mbed_official 107:414e9c822e99 2009 {
mbed_official 107:414e9c822e99 2010 p_usart->US_MAN = (p_usart->US_MAN & ~US_MAN_RX_PP_Msk) |
mbed_official 107:414e9c822e99 2011 (uc_pattern << US_MAN_RX_PP_Pos);
mbed_official 107:414e9c822e99 2012 }
mbed_official 107:414e9c822e99 2013
mbed_official 107:414e9c822e99 2014 /**
mbed_official 107:414e9c822e99 2015 * \brief Configure the receiver Manchester polarity when the Manchester
mbed_official 107:414e9c822e99 2016 * encode/decode is enabled.
mbed_official 107:414e9c822e99 2017 *
mbed_official 107:414e9c822e99 2018 * \param p_usart Pointer to a USART instance.
mbed_official 107:414e9c822e99 2019 * \param uc_polarity Indicate the receiver Manchester polarity, which should
mbed_official 107:414e9c822e99 2020 * be 0 or 1.
mbed_official 107:414e9c822e99 2021 */
mbed_official 107:414e9c822e99 2022 void usart_man_set_rx_polarity(Usart *p_usart, uint8_t uc_polarity)
mbed_official 107:414e9c822e99 2023 {
mbed_official 107:414e9c822e99 2024 p_usart->US_MAN = (p_usart->US_MAN & ~US_MAN_RX_MPOL) |
mbed_official 107:414e9c822e99 2025 (uc_polarity << 28);
mbed_official 107:414e9c822e99 2026 }
mbed_official 107:414e9c822e99 2027
mbed_official 107:414e9c822e99 2028 /**
mbed_official 107:414e9c822e99 2029 * \brief Enable drift compensation.
mbed_official 107:414e9c822e99 2030 *
mbed_official 107:414e9c822e99 2031 * \note The 16X clock mode must be enabled.
mbed_official 107:414e9c822e99 2032 *
mbed_official 107:414e9c822e99 2033 * \param p_usart Pointer to a USART instance.
mbed_official 107:414e9c822e99 2034 */
mbed_official 107:414e9c822e99 2035 void usart_man_enable_drift_compensation(Usart *p_usart)
mbed_official 107:414e9c822e99 2036 {
mbed_official 107:414e9c822e99 2037 p_usart->US_MAN |= US_MAN_DRIFT;
mbed_official 107:414e9c822e99 2038 }
mbed_official 107:414e9c822e99 2039
mbed_official 107:414e9c822e99 2040 /**
mbed_official 107:414e9c822e99 2041 * \brief Disable drift compensation.
mbed_official 107:414e9c822e99 2042 *
mbed_official 107:414e9c822e99 2043 * \param p_usart Pointer to a USART instance.
mbed_official 107:414e9c822e99 2044 */
mbed_official 107:414e9c822e99 2045 void usart_man_disable_drift_compensation(Usart *p_usart)
mbed_official 107:414e9c822e99 2046 {
mbed_official 107:414e9c822e99 2047 p_usart->US_MAN &= ~US_MAN_DRIFT;
mbed_official 107:414e9c822e99 2048 }
mbed_official 107:414e9c822e99 2049
mbed_official 107:414e9c822e99 2050 #endif
mbed_official 107:414e9c822e99 2051
mbed_official 107:414e9c822e99 2052 #if SAM4L
mbed_official 107:414e9c822e99 2053
mbed_official 107:414e9c822e99 2054 uint32_t usart_get_version(Usart *p_usart)
mbed_official 107:414e9c822e99 2055 {
mbed_official 107:414e9c822e99 2056 return p_usart->US_VERSION;
mbed_official 107:414e9c822e99 2057 }
mbed_official 107:414e9c822e99 2058
mbed_official 107:414e9c822e99 2059 #endif
mbed_official 107:414e9c822e99 2060
mbed_official 107:414e9c822e99 2061 #if SAMG55
mbed_official 107:414e9c822e99 2062 /**
mbed_official 107:414e9c822e99 2063 * \brief Set sleepwalking match mode.
mbed_official 107:414e9c822e99 2064 *
mbed_official 107:414e9c822e99 2065 * \param p_uart Pointer to a USART instance.
mbed_official 107:414e9c822e99 2066 * \param ul_low_value First comparison value for received character.
mbed_official 107:414e9c822e99 2067 * \param ul_high_value Second comparison value for received character.
mbed_official 107:414e9c822e99 2068 * \param cmpmode ture for start condition, false for flag only.
mbed_official 107:414e9c822e99 2069 * \param cmppar ture for parity check, false for no.
mbed_official 107:414e9c822e99 2070 */
mbed_official 107:414e9c822e99 2071 void usart_set_sleepwalking(Usart *p_uart, uint8_t ul_low_value,
mbed_official 107:414e9c822e99 2072 bool cmpmode, bool cmppar, uint8_t ul_high_value)
mbed_official 107:414e9c822e99 2073 {
mbed_official 107:414e9c822e99 2074 Assert(ul_low_value <= ul_high_value);
mbed_official 107:414e9c822e99 2075
mbed_official 107:414e9c822e99 2076 uint32_t temp = 0;
mbed_official 107:414e9c822e99 2077
mbed_official 107:414e9c822e99 2078 if (cmpmode) {
mbed_official 107:414e9c822e99 2079 temp |= US_CMPR_CMPMODE_START_CONDITION;
mbed_official 107:414e9c822e99 2080 }
mbed_official 107:414e9c822e99 2081
mbed_official 107:414e9c822e99 2082 if (cmppar) {
mbed_official 107:414e9c822e99 2083 temp |= US_CMPR_CMPPAR;
mbed_official 107:414e9c822e99 2084 }
mbed_official 107:414e9c822e99 2085
mbed_official 107:414e9c822e99 2086 temp |= US_CMPR_VAL1(ul_low_value);
mbed_official 107:414e9c822e99 2087
mbed_official 107:414e9c822e99 2088 temp |= US_CMPR_VAL2(ul_high_value);
mbed_official 107:414e9c822e99 2089
mbed_official 107:414e9c822e99 2090 p_uart->US_CMPR= temp;
mbed_official 107:414e9c822e99 2091 }
mbed_official 107:414e9c822e99 2092 #endif
mbed_official 107:414e9c822e99 2093
mbed_official 107:414e9c822e99 2094 //@}
mbed_official 107:414e9c822e99 2095
mbed_official 107:414e9c822e99 2096 /// @cond 0
mbed_official 107:414e9c822e99 2097 /**INDENT-OFF**/
mbed_official 107:414e9c822e99 2098 #ifdef __cplusplus
mbed_official 107:414e9c822e99 2099 }
mbed_official 107:414e9c822e99 2100 #endif
mbed_official 107:414e9c822e99 2101 /**INDENT-ON**/
mbed_official 107:414e9c822e99 2102 /// @endcond