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 Serial Peripheral Interface (SPI) driver for SAM.
mbed_official 107:414e9c822e99 5 *
mbed_official 107:414e9c822e99 6 * Copyright (c) 2011-2015 Atmel Corporation. All rights reserved.
mbed_official 107:414e9c822e99 7 *
mbed_official 107:414e9c822e99 8 * \asf_license_start
mbed_official 107:414e9c822e99 9 *
mbed_official 107:414e9c822e99 10 * \page License
mbed_official 107:414e9c822e99 11 *
mbed_official 107:414e9c822e99 12 * Redistribution and use in source and binary forms, with or without
mbed_official 107:414e9c822e99 13 * modification, are permitted provided that the following conditions are met:
mbed_official 107:414e9c822e99 14 *
mbed_official 107:414e9c822e99 15 * 1. Redistributions of source code must retain the above copyright notice,
mbed_official 107:414e9c822e99 16 * this list of conditions and the following disclaimer.
mbed_official 107:414e9c822e99 17 *
mbed_official 107:414e9c822e99 18 * 2. Redistributions in binary form must reproduce the above copyright notice,
mbed_official 107:414e9c822e99 19 * this list of conditions and the following disclaimer in the documentation
mbed_official 107:414e9c822e99 20 * and/or other materials provided with the distribution.
mbed_official 107:414e9c822e99 21 *
mbed_official 107:414e9c822e99 22 * 3. The name of Atmel may not be used to endorse or promote products derived
mbed_official 107:414e9c822e99 23 * from this software without specific prior written permission.
mbed_official 107:414e9c822e99 24 *
mbed_official 107:414e9c822e99 25 * 4. This software may only be redistributed and used in connection with an
mbed_official 107:414e9c822e99 26 * Atmel microcontroller product.
mbed_official 107:414e9c822e99 27 *
mbed_official 107:414e9c822e99 28 * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED
mbed_official 107:414e9c822e99 29 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
mbed_official 107:414e9c822e99 30 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
mbed_official 107:414e9c822e99 31 * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR
mbed_official 107:414e9c822e99 32 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
mbed_official 107:414e9c822e99 33 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
mbed_official 107:414e9c822e99 34 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
mbed_official 107:414e9c822e99 35 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
mbed_official 107:414e9c822e99 36 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
mbed_official 107:414e9c822e99 37 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
mbed_official 107:414e9c822e99 38 * POSSIBILITY OF SUCH DAMAGE.
mbed_official 107:414e9c822e99 39 *
mbed_official 107:414e9c822e99 40 * \asf_license_stop
mbed_official 107:414e9c822e99 41 *
mbed_official 107:414e9c822e99 42 */
mbed_official 107:414e9c822e99 43 /*
mbed_official 107:414e9c822e99 44 * Support and FAQ: visit <a href="http://www.atmel.com/design-support/">Atmel Support</a>
mbed_official 107:414e9c822e99 45 */
mbed_official 107:414e9c822e99 46
mbed_official 107:414e9c822e99 47 #ifndef SPI_H_INCLUDED
mbed_official 107:414e9c822e99 48 #define SPI_H_INCLUDED
mbed_official 107:414e9c822e99 49
mbed_official 107:414e9c822e99 50 #include "compiler.h"
mbed_official 107:414e9c822e99 51
mbed_official 107:414e9c822e99 52 /// @cond 0
mbed_official 107:414e9c822e99 53 /**INDENT-OFF**/
mbed_official 107:414e9c822e99 54 #ifdef __cplusplus
mbed_official 107:414e9c822e99 55 extern "C" {
mbed_official 107:414e9c822e99 56 #endif
mbed_official 107:414e9c822e99 57 /**INDENT-ON**/
mbed_official 107:414e9c822e99 58 /// @endcond
mbed_official 107:414e9c822e99 59
mbed_official 107:414e9c822e99 60 /** Time-out value (number of attempts). */
mbed_official 107:414e9c822e99 61 #define SPI_TIMEOUT 15000
mbed_official 107:414e9c822e99 62
mbed_official 107:414e9c822e99 63 /** Status codes used by the SPI driver. */
mbed_official 107:414e9c822e99 64 typedef enum {
mbed_official 107:414e9c822e99 65 SPI_ERROR = -1,
mbed_official 107:414e9c822e99 66 SPI_OK = 0,
mbed_official 107:414e9c822e99 67 SPI_ERROR_TIMEOUT = 1,
mbed_official 107:414e9c822e99 68 SPI_ERROR_ARGUMENT,
mbed_official 107:414e9c822e99 69 SPI_ERROR_OVERRUN,
mbed_official 107:414e9c822e99 70 SPI_ERROR_MODE_FAULT,
mbed_official 107:414e9c822e99 71 SPI_ERROR_OVERRUN_AND_MODE_FAULT
mbed_official 107:414e9c822e99 72 } spi_status_t;
mbed_official 107:414e9c822e99 73
mbed_official 107:414e9c822e99 74 /** SPI Chip Select behavior modes while transferring. */
mbed_official 107:414e9c822e99 75 typedef enum spi_cs_behavior {
mbed_official 107:414e9c822e99 76 /** CS does not rise until a new transfer is requested on different chip select. */
mbed_official 107:414e9c822e99 77 SPI_CS_KEEP_LOW = SPI_CSR_CSAAT,
mbed_official 107:414e9c822e99 78 /** CS rises if there is no more data to transfer. */
mbed_official 107:414e9c822e99 79 SPI_CS_RISE_NO_TX = 0,
mbed_official 107:414e9c822e99 80 /** CS is de-asserted systematically during a time DLYBCS. */
mbed_official 107:414e9c822e99 81 SPI_CS_RISE_FORCED = SPI_CSR_CSNAAT
mbed_official 107:414e9c822e99 82 } spi_cs_behavior_t;
mbed_official 107:414e9c822e99 83
mbed_official 107:414e9c822e99 84 /**
mbed_official 107:414e9c822e99 85 * \brief Generate Peripheral Chip Select Value from Chip Select ID
mbed_official 107:414e9c822e99 86 * \note When chip select n is working, PCS bit n is set to low level.
mbed_official 107:414e9c822e99 87 *
mbed_official 107:414e9c822e99 88 * \param chip_sel_id The chip select number used
mbed_official 107:414e9c822e99 89 */
mbed_official 107:414e9c822e99 90 #define spi_get_pcs(chip_sel_id) ((~(1u<<(chip_sel_id)))&0xF)
mbed_official 107:414e9c822e99 91
mbed_official 107:414e9c822e99 92 /**
mbed_official 107:414e9c822e99 93 * \brief Reset SPI and set it to Slave mode.
mbed_official 107:414e9c822e99 94 *
mbed_official 107:414e9c822e99 95 * \param p_spi Pointer to an SPI instance.
mbed_official 107:414e9c822e99 96 */
mbed_official 107:414e9c822e99 97 static inline void spi_reset(Spi *p_spi)
mbed_official 107:414e9c822e99 98 {
mbed_official 107:414e9c822e99 99 p_spi->SPI_CR = SPI_CR_SWRST;
mbed_official 107:414e9c822e99 100 }
mbed_official 107:414e9c822e99 101
mbed_official 107:414e9c822e99 102 /**
mbed_official 107:414e9c822e99 103 * \brief Enable SPI.
mbed_official 107:414e9c822e99 104 *
mbed_official 107:414e9c822e99 105 * \param p_spi Pointer to an SPI instance.
mbed_official 107:414e9c822e99 106 */
mbed_official 107:414e9c822e99 107 static inline void spi_enable(Spi *p_spi)
mbed_official 107:414e9c822e99 108 {
mbed_official 107:414e9c822e99 109 p_spi->SPI_CR = SPI_CR_SPIEN;
mbed_official 107:414e9c822e99 110 }
mbed_official 107:414e9c822e99 111
mbed_official 107:414e9c822e99 112 /**
mbed_official 107:414e9c822e99 113 * \brief Disable SPI.
mbed_official 107:414e9c822e99 114 *
mbed_official 107:414e9c822e99 115 * \note CS is de-asserted, which indicates that the last data is done, and user
mbed_official 107:414e9c822e99 116 * should check TX_EMPTY before disabling SPI.
mbed_official 107:414e9c822e99 117 *
mbed_official 107:414e9c822e99 118 * \param p_spi Pointer to an SPI instance.
mbed_official 107:414e9c822e99 119 */
mbed_official 107:414e9c822e99 120 static inline void spi_disable(Spi *p_spi)
mbed_official 107:414e9c822e99 121 {
mbed_official 107:414e9c822e99 122 p_spi->SPI_CR = SPI_CR_SPIDIS;
mbed_official 107:414e9c822e99 123 }
mbed_official 107:414e9c822e99 124
mbed_official 107:414e9c822e99 125 /**
mbed_official 107:414e9c822e99 126 * \brief Issue a LASTXFER command.
mbed_official 107:414e9c822e99 127 * The next transfer is the last transfer and after that CS is de-asserted.
mbed_official 107:414e9c822e99 128 *
mbed_official 107:414e9c822e99 129 * \param p_spi Pointer to an SPI instance.
mbed_official 107:414e9c822e99 130 */
mbed_official 107:414e9c822e99 131 static inline void spi_set_lastxfer(Spi *p_spi)
mbed_official 107:414e9c822e99 132 {
mbed_official 107:414e9c822e99 133 p_spi->SPI_CR = SPI_CR_LASTXFER;
mbed_official 107:414e9c822e99 134 }
mbed_official 107:414e9c822e99 135
mbed_official 107:414e9c822e99 136 /**
mbed_official 107:414e9c822e99 137 * \brief Set SPI to Master mode.
mbed_official 107:414e9c822e99 138 *
mbed_official 107:414e9c822e99 139 * \param p_spi Pointer to an SPI instance.
mbed_official 107:414e9c822e99 140 */
mbed_official 107:414e9c822e99 141 static inline void spi_set_master_mode(Spi *p_spi)
mbed_official 107:414e9c822e99 142 {
mbed_official 107:414e9c822e99 143 p_spi->SPI_MR |= SPI_MR_MSTR;
mbed_official 107:414e9c822e99 144 }
mbed_official 107:414e9c822e99 145
mbed_official 107:414e9c822e99 146 /**
mbed_official 107:414e9c822e99 147 * \brief Set SPI to Slave mode.
mbed_official 107:414e9c822e99 148 *
mbed_official 107:414e9c822e99 149 * \param p_spi Pointer to an SPI instance.
mbed_official 107:414e9c822e99 150 */
mbed_official 107:414e9c822e99 151 static inline void spi_set_slave_mode(Spi *p_spi)
mbed_official 107:414e9c822e99 152 {
mbed_official 107:414e9c822e99 153 p_spi->SPI_MR &= (~SPI_MR_MSTR);
mbed_official 107:414e9c822e99 154 }
mbed_official 107:414e9c822e99 155
mbed_official 107:414e9c822e99 156 /**
mbed_official 107:414e9c822e99 157 * \brief Get SPI work mode.
mbed_official 107:414e9c822e99 158 *
mbed_official 107:414e9c822e99 159 * \param p_spi Pointer to an SPI instance.
mbed_official 107:414e9c822e99 160 *
mbed_official 107:414e9c822e99 161 * \return 1 for master mode, 0 for slave mode.
mbed_official 107:414e9c822e99 162 */
mbed_official 107:414e9c822e99 163 static inline uint32_t spi_get_mode(Spi *p_spi)
mbed_official 107:414e9c822e99 164 {
mbed_official 107:414e9c822e99 165 if (p_spi->SPI_MR & SPI_MR_MSTR) {
mbed_official 107:414e9c822e99 166 return 1;
mbed_official 107:414e9c822e99 167 } else {
mbed_official 107:414e9c822e99 168 return 0;
mbed_official 107:414e9c822e99 169 }
mbed_official 107:414e9c822e99 170 }
mbed_official 107:414e9c822e99 171
mbed_official 107:414e9c822e99 172 /**
mbed_official 107:414e9c822e99 173 * \brief Set Variable Peripheral Select.
mbed_official 107:414e9c822e99 174 * Peripheral Chip Select can be controlled by SPI_TDR.
mbed_official 107:414e9c822e99 175 *
mbed_official 107:414e9c822e99 176 * \param p_spi Pointer to an SPI instance.
mbed_official 107:414e9c822e99 177 */
mbed_official 107:414e9c822e99 178 static inline void spi_set_variable_peripheral_select(Spi *p_spi)
mbed_official 107:414e9c822e99 179 {
mbed_official 107:414e9c822e99 180 p_spi->SPI_MR |= SPI_MR_PS;
mbed_official 107:414e9c822e99 181 }
mbed_official 107:414e9c822e99 182
mbed_official 107:414e9c822e99 183 /**
mbed_official 107:414e9c822e99 184 * \brief Set Fixed Peripheral Select.
mbed_official 107:414e9c822e99 185 * Peripheral Chip Select is controlled by SPI_MR.
mbed_official 107:414e9c822e99 186 *
mbed_official 107:414e9c822e99 187 * \param p_spi Pointer to an SPI instance.
mbed_official 107:414e9c822e99 188 */
mbed_official 107:414e9c822e99 189 static inline void spi_set_fixed_peripheral_select(Spi *p_spi)
mbed_official 107:414e9c822e99 190 {
mbed_official 107:414e9c822e99 191 p_spi->SPI_MR &= (~SPI_MR_PS);
mbed_official 107:414e9c822e99 192 }
mbed_official 107:414e9c822e99 193
mbed_official 107:414e9c822e99 194 /**
mbed_official 107:414e9c822e99 195 * \brief Get Peripheral Select mode.
mbed_official 107:414e9c822e99 196 *
mbed_official 107:414e9c822e99 197 * \param p_spi Pointer to an SPI instance.
mbed_official 107:414e9c822e99 198 *
mbed_official 107:414e9c822e99 199 * \return 1 for Variable mode, 0 for fixed mode.
mbed_official 107:414e9c822e99 200 */
mbed_official 107:414e9c822e99 201 static inline uint32_t spi_get_peripheral_select_mode(Spi *p_spi)
mbed_official 107:414e9c822e99 202 {
mbed_official 107:414e9c822e99 203 if (p_spi->SPI_MR & SPI_MR_PS) {
mbed_official 107:414e9c822e99 204 return 1;
mbed_official 107:414e9c822e99 205 } else {
mbed_official 107:414e9c822e99 206 return 0;
mbed_official 107:414e9c822e99 207 }
mbed_official 107:414e9c822e99 208 }
mbed_official 107:414e9c822e99 209
mbed_official 107:414e9c822e99 210 /**
mbed_official 107:414e9c822e99 211 * \brief Enable Peripheral Select Decode.
mbed_official 107:414e9c822e99 212 *
mbed_official 107:414e9c822e99 213 * \param p_spi Pointer to an SPI instance.
mbed_official 107:414e9c822e99 214 */
mbed_official 107:414e9c822e99 215 static inline void spi_enable_peripheral_select_decode(Spi *p_spi)
mbed_official 107:414e9c822e99 216 {
mbed_official 107:414e9c822e99 217 p_spi->SPI_MR |= SPI_MR_PCSDEC;
mbed_official 107:414e9c822e99 218 }
mbed_official 107:414e9c822e99 219
mbed_official 107:414e9c822e99 220 /**
mbed_official 107:414e9c822e99 221 * \brief Disable Peripheral Select Decode.
mbed_official 107:414e9c822e99 222 *
mbed_official 107:414e9c822e99 223 * \param p_spi Pointer to an SPI instance.
mbed_official 107:414e9c822e99 224 */
mbed_official 107:414e9c822e99 225 static inline void spi_disable_peripheral_select_decode(Spi *p_spi)
mbed_official 107:414e9c822e99 226 {
mbed_official 107:414e9c822e99 227 p_spi->SPI_MR &= (~SPI_MR_PCSDEC);
mbed_official 107:414e9c822e99 228 }
mbed_official 107:414e9c822e99 229
mbed_official 107:414e9c822e99 230 /**
mbed_official 107:414e9c822e99 231 * \brief Get Peripheral Select Decode mode.
mbed_official 107:414e9c822e99 232 *
mbed_official 107:414e9c822e99 233 * \param p_spi Pointer to an SPI instance.
mbed_official 107:414e9c822e99 234 *
mbed_official 107:414e9c822e99 235 * \return 1 for decode mode, 0 for direct mode.
mbed_official 107:414e9c822e99 236 */
mbed_official 107:414e9c822e99 237 static inline uint32_t spi_get_peripheral_select_decode_setting(Spi *p_spi)
mbed_official 107:414e9c822e99 238 {
mbed_official 107:414e9c822e99 239 if (p_spi->SPI_MR & SPI_MR_PCSDEC) {
mbed_official 107:414e9c822e99 240 return 1;
mbed_official 107:414e9c822e99 241 } else {
mbed_official 107:414e9c822e99 242 return 0;
mbed_official 107:414e9c822e99 243 }
mbed_official 107:414e9c822e99 244 }
mbed_official 107:414e9c822e99 245
mbed_official 107:414e9c822e99 246 /**
mbed_official 107:414e9c822e99 247 * \brief Enable Mode Fault Detection.
mbed_official 107:414e9c822e99 248 *
mbed_official 107:414e9c822e99 249 * \param p_spi Pointer to an SPI instance.
mbed_official 107:414e9c822e99 250 */
mbed_official 107:414e9c822e99 251 static inline void spi_enable_mode_fault_detect(Spi *p_spi)
mbed_official 107:414e9c822e99 252 {
mbed_official 107:414e9c822e99 253 p_spi->SPI_MR &= (~SPI_MR_MODFDIS);
mbed_official 107:414e9c822e99 254 }
mbed_official 107:414e9c822e99 255
mbed_official 107:414e9c822e99 256 /**
mbed_official 107:414e9c822e99 257 * \brief Disable Mode Fault Detection.
mbed_official 107:414e9c822e99 258 *
mbed_official 107:414e9c822e99 259 * \param p_spi Pointer to an SPI instance.
mbed_official 107:414e9c822e99 260 */
mbed_official 107:414e9c822e99 261 static inline void spi_disable_mode_fault_detect(Spi *p_spi)
mbed_official 107:414e9c822e99 262 {
mbed_official 107:414e9c822e99 263 p_spi->SPI_MR |= SPI_MR_MODFDIS;
mbed_official 107:414e9c822e99 264 }
mbed_official 107:414e9c822e99 265
mbed_official 107:414e9c822e99 266 /**
mbed_official 107:414e9c822e99 267 * \brief Check if mode fault detection is enabled.
mbed_official 107:414e9c822e99 268 *
mbed_official 107:414e9c822e99 269 * \param p_spi Pointer to an SPI instance.
mbed_official 107:414e9c822e99 270 *
mbed_official 107:414e9c822e99 271 * \return 1 for disabled, 0 for enabled.
mbed_official 107:414e9c822e99 272 */
mbed_official 107:414e9c822e99 273 static inline uint32_t spi_get_mode_fault_detect_setting(Spi *p_spi)
mbed_official 107:414e9c822e99 274 {
mbed_official 107:414e9c822e99 275 if (p_spi->SPI_MR & SPI_MR_MODFDIS) {
mbed_official 107:414e9c822e99 276 return 1;
mbed_official 107:414e9c822e99 277 } else {
mbed_official 107:414e9c822e99 278 return 0;
mbed_official 107:414e9c822e99 279 }
mbed_official 107:414e9c822e99 280 }
mbed_official 107:414e9c822e99 281
mbed_official 107:414e9c822e99 282 /**
mbed_official 107:414e9c822e99 283 * \brief Enable waiting RX_EMPTY before transfer starts.
mbed_official 107:414e9c822e99 284 *
mbed_official 107:414e9c822e99 285 * \param p_spi Pointer to an SPI instance.
mbed_official 107:414e9c822e99 286 */
mbed_official 107:414e9c822e99 287 static inline void spi_enable_tx_on_rx_empty(Spi *p_spi)
mbed_official 107:414e9c822e99 288 {
mbed_official 107:414e9c822e99 289 p_spi->SPI_MR |= SPI_MR_WDRBT;
mbed_official 107:414e9c822e99 290 }
mbed_official 107:414e9c822e99 291
mbed_official 107:414e9c822e99 292 /**
mbed_official 107:414e9c822e99 293 * \brief Disable waiting RX_EMPTY before transfer starts.
mbed_official 107:414e9c822e99 294 *
mbed_official 107:414e9c822e99 295 * \param p_spi Pointer to an SPI instance.
mbed_official 107:414e9c822e99 296 */
mbed_official 107:414e9c822e99 297 static inline void spi_disable_tx_on_rx_empty(Spi *p_spi)
mbed_official 107:414e9c822e99 298 {
mbed_official 107:414e9c822e99 299 p_spi->SPI_MR &= (~SPI_MR_WDRBT);
mbed_official 107:414e9c822e99 300 }
mbed_official 107:414e9c822e99 301
mbed_official 107:414e9c822e99 302 /**
mbed_official 107:414e9c822e99 303 * \brief Check if SPI waits RX_EMPTY before transfer starts.
mbed_official 107:414e9c822e99 304 *
mbed_official 107:414e9c822e99 305 * \param p_spi Pointer to an SPI instance.
mbed_official 107:414e9c822e99 306 *
mbed_official 107:414e9c822e99 307 * \return 1 for SPI waits, 0 for no wait.
mbed_official 107:414e9c822e99 308 */
mbed_official 107:414e9c822e99 309 static inline uint32_t spi_get_tx_on_rx_empty_setting(Spi *p_spi)
mbed_official 107:414e9c822e99 310 {
mbed_official 107:414e9c822e99 311 if (p_spi->SPI_MR & SPI_MR_WDRBT) {
mbed_official 107:414e9c822e99 312 return 1;
mbed_official 107:414e9c822e99 313 } else {
mbed_official 107:414e9c822e99 314 return 0;
mbed_official 107:414e9c822e99 315 }
mbed_official 107:414e9c822e99 316 }
mbed_official 107:414e9c822e99 317
mbed_official 107:414e9c822e99 318 /**
mbed_official 107:414e9c822e99 319 * \brief Enable loopback mode.
mbed_official 107:414e9c822e99 320 *
mbed_official 107:414e9c822e99 321 * \param p_spi Pointer to an SPI instance.
mbed_official 107:414e9c822e99 322 */
mbed_official 107:414e9c822e99 323 static inline void spi_enable_loopback(Spi *p_spi)
mbed_official 107:414e9c822e99 324 {
mbed_official 107:414e9c822e99 325 p_spi->SPI_MR |= SPI_MR_LLB;
mbed_official 107:414e9c822e99 326 }
mbed_official 107:414e9c822e99 327
mbed_official 107:414e9c822e99 328 /**
mbed_official 107:414e9c822e99 329 * \brief Disable loopback mode.
mbed_official 107:414e9c822e99 330 *
mbed_official 107:414e9c822e99 331 * \param p_spi Pointer to an SPI instance.
mbed_official 107:414e9c822e99 332 */
mbed_official 107:414e9c822e99 333 static inline void spi_disable_loopback(Spi *p_spi)
mbed_official 107:414e9c822e99 334 {
mbed_official 107:414e9c822e99 335 p_spi->SPI_MR &= (~SPI_MR_LLB);
mbed_official 107:414e9c822e99 336 }
mbed_official 107:414e9c822e99 337
mbed_official 107:414e9c822e99 338 void spi_enable_clock(Spi *p_spi);
mbed_official 107:414e9c822e99 339 void spi_disable_clock(Spi *p_spi);
mbed_official 107:414e9c822e99 340 void spi_set_peripheral_chip_select_value(Spi *p_spi, uint32_t ul_value);
mbed_official 107:414e9c822e99 341 void spi_set_delay_between_chip_select(Spi *p_spi, uint32_t ul_delay);
mbed_official 107:414e9c822e99 342 spi_status_t spi_read(Spi *p_spi, uint16_t *us_data, uint8_t *p_pcs);
mbed_official 107:414e9c822e99 343 spi_status_t spi_write(Spi *p_spi, uint16_t us_data, uint8_t uc_pcs,
mbed_official 107:414e9c822e99 344 uint8_t uc_last);
mbed_official 107:414e9c822e99 345
mbed_official 107:414e9c822e99 346 /**
mbed_official 107:414e9c822e99 347 * \brief Read status register.
mbed_official 107:414e9c822e99 348 *
mbed_official 107:414e9c822e99 349 * \param p_spi Pointer to an SPI instance.
mbed_official 107:414e9c822e99 350 *
mbed_official 107:414e9c822e99 351 * \return SPI status register value.
mbed_official 107:414e9c822e99 352 */
mbed_official 107:414e9c822e99 353 static inline uint32_t spi_read_status(Spi *p_spi)
mbed_official 107:414e9c822e99 354 {
mbed_official 107:414e9c822e99 355 return p_spi->SPI_SR;
mbed_official 107:414e9c822e99 356 }
mbed_official 107:414e9c822e99 357
mbed_official 107:414e9c822e99 358 /**
mbed_official 107:414e9c822e99 359 * \brief Test if the SPI is enabled.
mbed_official 107:414e9c822e99 360 *
mbed_official 107:414e9c822e99 361 * \param p_spi Pointer to an SPI instance.
mbed_official 107:414e9c822e99 362 *
mbed_official 107:414e9c822e99 363 * \return 1 if the SPI is enabled, otherwise 0.
mbed_official 107:414e9c822e99 364 */
mbed_official 107:414e9c822e99 365 static inline uint32_t spi_is_enabled(Spi *p_spi)
mbed_official 107:414e9c822e99 366 {
mbed_official 107:414e9c822e99 367 if (p_spi->SPI_SR & SPI_SR_SPIENS) {
mbed_official 107:414e9c822e99 368 return 1;
mbed_official 107:414e9c822e99 369 } else {
mbed_official 107:414e9c822e99 370 return 0;
mbed_official 107:414e9c822e99 371 }
mbed_official 107:414e9c822e99 372 }
mbed_official 107:414e9c822e99 373
mbed_official 107:414e9c822e99 374 /**
mbed_official 107:414e9c822e99 375 * \brief Put one data to a SPI peripheral.
mbed_official 107:414e9c822e99 376 *
mbed_official 107:414e9c822e99 377 * \param p_spi Base address of the SPI instance.
mbed_official 107:414e9c822e99 378 * \param data The data byte to be loaded
mbed_official 107:414e9c822e99 379 *
mbed_official 107:414e9c822e99 380 */
mbed_official 107:414e9c822e99 381 static inline void spi_put(Spi *p_spi, uint16_t data)
mbed_official 107:414e9c822e99 382 {
mbed_official 107:414e9c822e99 383 p_spi->SPI_TDR = SPI_TDR_TD(data);
mbed_official 107:414e9c822e99 384 }
mbed_official 107:414e9c822e99 385
mbed_official 107:414e9c822e99 386 /** \brief Get one data to a SPI peripheral.
mbed_official 107:414e9c822e99 387 *
mbed_official 107:414e9c822e99 388 * \param p_spi Base address of the SPI instance.
mbed_official 107:414e9c822e99 389 * \return The data byte
mbed_official 107:414e9c822e99 390 *
mbed_official 107:414e9c822e99 391 */
mbed_official 107:414e9c822e99 392 static inline uint16_t spi_get(Spi *p_spi)
mbed_official 107:414e9c822e99 393 {
mbed_official 107:414e9c822e99 394 return (p_spi->SPI_RDR & SPI_RDR_RD_Msk);
mbed_official 107:414e9c822e99 395 }
mbed_official 107:414e9c822e99 396
mbed_official 107:414e9c822e99 397 /**
mbed_official 107:414e9c822e99 398 * \brief Check if all transmissions are complete.
mbed_official 107:414e9c822e99 399 *
mbed_official 107:414e9c822e99 400 * \param p_spi Pointer to an SPI instance.
mbed_official 107:414e9c822e99 401 *
mbed_official 107:414e9c822e99 402 * \retval 1 if transmissions are complete.
mbed_official 107:414e9c822e99 403 * \retval 0 if transmissions are not complete.
mbed_official 107:414e9c822e99 404 */
mbed_official 107:414e9c822e99 405 static inline uint32_t spi_is_tx_empty(Spi *p_spi)
mbed_official 107:414e9c822e99 406 {
mbed_official 107:414e9c822e99 407 if (p_spi->SPI_SR & SPI_SR_TXEMPTY) {
mbed_official 107:414e9c822e99 408 return 1;
mbed_official 107:414e9c822e99 409 } else {
mbed_official 107:414e9c822e99 410 return 0;
mbed_official 107:414e9c822e99 411 }
mbed_official 107:414e9c822e99 412 }
mbed_official 107:414e9c822e99 413
mbed_official 107:414e9c822e99 414 /**
mbed_official 107:414e9c822e99 415 * \brief Check if all transmissions are ready.
mbed_official 107:414e9c822e99 416 *
mbed_official 107:414e9c822e99 417 * \param p_spi Pointer to an SPI instance.
mbed_official 107:414e9c822e99 418 *
mbed_official 107:414e9c822e99 419 * \retval 1 if transmissions are complete.
mbed_official 107:414e9c822e99 420 * \retval 0 if transmissions are not complete.
mbed_official 107:414e9c822e99 421 */
mbed_official 107:414e9c822e99 422 static inline uint32_t spi_is_tx_ready(Spi *p_spi)
mbed_official 107:414e9c822e99 423 {
mbed_official 107:414e9c822e99 424 if (p_spi->SPI_SR & SPI_SR_TDRE) {
mbed_official 107:414e9c822e99 425 return 1;
mbed_official 107:414e9c822e99 426 } else {
mbed_official 107:414e9c822e99 427 return 0;
mbed_official 107:414e9c822e99 428 }
mbed_official 107:414e9c822e99 429 }
mbed_official 107:414e9c822e99 430
mbed_official 107:414e9c822e99 431 /**
mbed_official 107:414e9c822e99 432 * \brief Check if the SPI contains a received character.
mbed_official 107:414e9c822e99 433 *
mbed_official 107:414e9c822e99 434 * \param p_spi Pointer to an SPI instance.
mbed_official 107:414e9c822e99 435 *
mbed_official 107:414e9c822e99 436 * \return 1 if the SPI Receive Holding Register is full, otherwise 0.
mbed_official 107:414e9c822e99 437 */
mbed_official 107:414e9c822e99 438 static inline uint32_t spi_is_rx_full(Spi *p_spi)
mbed_official 107:414e9c822e99 439 {
mbed_official 107:414e9c822e99 440 if (p_spi->SPI_SR & SPI_SR_RDRF) {
mbed_official 107:414e9c822e99 441 return 1;
mbed_official 107:414e9c822e99 442 } else {
mbed_official 107:414e9c822e99 443 return 0;
mbed_official 107:414e9c822e99 444 }
mbed_official 107:414e9c822e99 445 }
mbed_official 107:414e9c822e99 446
mbed_official 107:414e9c822e99 447 /**
mbed_official 107:414e9c822e99 448 * \brief Check if all receptions are ready.
mbed_official 107:414e9c822e99 449 *
mbed_official 107:414e9c822e99 450 * \param p_spi Pointer to an SPI instance.
mbed_official 107:414e9c822e99 451 *
mbed_official 107:414e9c822e99 452 * \return 1 if the SPI Receiver is ready, otherwise 0.
mbed_official 107:414e9c822e99 453 */
mbed_official 107:414e9c822e99 454 static inline uint32_t spi_is_rx_ready(Spi *p_spi)
mbed_official 107:414e9c822e99 455 {
mbed_official 107:414e9c822e99 456 if ((p_spi->SPI_SR & (SPI_SR_RDRF | SPI_SR_TXEMPTY))
mbed_official 107:414e9c822e99 457 == (SPI_SR_RDRF | SPI_SR_TXEMPTY)) {
mbed_official 107:414e9c822e99 458 return 1;
mbed_official 107:414e9c822e99 459 } else {
mbed_official 107:414e9c822e99 460 return 0;
mbed_official 107:414e9c822e99 461 }
mbed_official 107:414e9c822e99 462 }
mbed_official 107:414e9c822e99 463
mbed_official 107:414e9c822e99 464 /**
mbed_official 107:414e9c822e99 465 * \brief Enable SPI interrupts.
mbed_official 107:414e9c822e99 466 *
mbed_official 107:414e9c822e99 467 * \param p_spi Pointer to an SPI instance.
mbed_official 107:414e9c822e99 468 * \param ul_sources Interrupts to be enabled.
mbed_official 107:414e9c822e99 469 */
mbed_official 107:414e9c822e99 470 static inline void spi_enable_interrupt(Spi *p_spi, uint32_t ul_sources)
mbed_official 107:414e9c822e99 471 {
mbed_official 107:414e9c822e99 472 p_spi->SPI_IER = ul_sources;
mbed_official 107:414e9c822e99 473 }
mbed_official 107:414e9c822e99 474
mbed_official 107:414e9c822e99 475 /**
mbed_official 107:414e9c822e99 476 * \brief Disable SPI interrupts.
mbed_official 107:414e9c822e99 477 *
mbed_official 107:414e9c822e99 478 * \param p_spi Pointer to an SPI instance.
mbed_official 107:414e9c822e99 479 * \param ul_sources Interrupts to be disabled.
mbed_official 107:414e9c822e99 480 */
mbed_official 107:414e9c822e99 481 static inline void spi_disable_interrupt(Spi *p_spi, uint32_t ul_sources)
mbed_official 107:414e9c822e99 482 {
mbed_official 107:414e9c822e99 483 p_spi->SPI_IDR = ul_sources;
mbed_official 107:414e9c822e99 484 }
mbed_official 107:414e9c822e99 485
mbed_official 107:414e9c822e99 486 /**
mbed_official 107:414e9c822e99 487 * \brief Read SPI interrupt mask.
mbed_official 107:414e9c822e99 488 *
mbed_official 107:414e9c822e99 489 * \param p_spi Pointer to an SPI instance.
mbed_official 107:414e9c822e99 490 *
mbed_official 107:414e9c822e99 491 * \return The interrupt mask value.
mbed_official 107:414e9c822e99 492 */
mbed_official 107:414e9c822e99 493 static inline uint32_t spi_read_interrupt_mask(Spi *p_spi)
mbed_official 107:414e9c822e99 494 {
mbed_official 107:414e9c822e99 495 return p_spi->SPI_IMR;
mbed_official 107:414e9c822e99 496 }
mbed_official 107:414e9c822e99 497
mbed_official 107:414e9c822e99 498 void spi_set_clock_polarity(Spi *p_spi, uint32_t ul_pcs_ch,
mbed_official 107:414e9c822e99 499 uint32_t ul_polarity);
mbed_official 107:414e9c822e99 500 void spi_set_clock_phase(Spi *p_spi, uint32_t ul_pcs_ch, uint32_t ul_phase);
mbed_official 107:414e9c822e99 501 void spi_configure_cs_behavior(Spi *p_spi, uint32_t ul_pcs_ch,
mbed_official 107:414e9c822e99 502 uint32_t ul_cs_behavior);
mbed_official 107:414e9c822e99 503 void spi_set_bits_per_transfer(Spi *p_spi, uint32_t ul_pcs_ch, uint32_t ul_bits);
mbed_official 107:414e9c822e99 504 int16_t spi_calc_baudrate_div(const uint32_t baudrate, uint32_t mck);
mbed_official 107:414e9c822e99 505 void spi_set_baudrate_div(Spi *p_spi, uint32_t ul_pcs_ch,
mbed_official 107:414e9c822e99 506 uint8_t uc_baudrate_divider);
mbed_official 107:414e9c822e99 507 void spi_set_transfer_delay(Spi *p_spi, uint32_t ul_pcs_ch, uint8_t uc_dlybs,
mbed_official 107:414e9c822e99 508 uint8_t uc_dlybct);
mbed_official 107:414e9c822e99 509
mbed_official 107:414e9c822e99 510 #if (SAM3S || SAM3N || SAM4S || SAM4E || SAM4N || SAM4C || SAMG || SAM4CP || SAM4CM)
mbed_official 107:414e9c822e99 511 /**
mbed_official 107:414e9c822e99 512 * \brief Get PDC registers base address.
mbed_official 107:414e9c822e99 513 *
mbed_official 107:414e9c822e99 514 * \param p_spi Pointer to an SPI instance.
mbed_official 107:414e9c822e99 515 *
mbed_official 107:414e9c822e99 516 * \return PDC registers base for PDC driver to access.
mbed_official 107:414e9c822e99 517 */
mbed_official 107:414e9c822e99 518 static inline Pdc *spi_get_pdc_base(Spi *p_spi)
mbed_official 107:414e9c822e99 519 {
mbed_official 107:414e9c822e99 520 return (Pdc *)&(p_spi->SPI_RPR);
mbed_official 107:414e9c822e99 521 }
mbed_official 107:414e9c822e99 522 #endif
mbed_official 107:414e9c822e99 523
mbed_official 107:414e9c822e99 524 #if (SAM3U || SAM3XA || SAMV71 || SAMV70 || SAME70 || SAMS70)
mbed_official 107:414e9c822e99 525 /**
mbed_official 107:414e9c822e99 526 * \brief Get transmit data register address for DMA operation.
mbed_official 107:414e9c822e99 527 *
mbed_official 107:414e9c822e99 528 * \param p_spi Pointer to an SPI instance.
mbed_official 107:414e9c822e99 529 *
mbed_official 107:414e9c822e99 530 * \return Transmit address for DMA access.
mbed_official 107:414e9c822e99 531 */
mbed_official 107:414e9c822e99 532 static inline void *spi_get_tx_access(Spi *p_spi)
mbed_official 107:414e9c822e99 533 {
mbed_official 107:414e9c822e99 534 return (void *)&(p_spi->SPI_TDR);
mbed_official 107:414e9c822e99 535 }
mbed_official 107:414e9c822e99 536
mbed_official 107:414e9c822e99 537 /**
mbed_official 107:414e9c822e99 538 * \brief Get receive data register address for DMA operation.
mbed_official 107:414e9c822e99 539 *
mbed_official 107:414e9c822e99 540 * \param p_spi Pointer to an SPI instance.
mbed_official 107:414e9c822e99 541 *
mbed_official 107:414e9c822e99 542 * \return Receive address for DMA access.
mbed_official 107:414e9c822e99 543 */
mbed_official 107:414e9c822e99 544 static inline void *spi_get_rx_access(Spi *p_spi)
mbed_official 107:414e9c822e99 545 {
mbed_official 107:414e9c822e99 546 return (void *)&(p_spi->SPI_RDR);
mbed_official 107:414e9c822e99 547 }
mbed_official 107:414e9c822e99 548 #endif
mbed_official 107:414e9c822e99 549
mbed_official 107:414e9c822e99 550 void spi_set_writeprotect(Spi *p_spi, uint32_t ul_enable);
mbed_official 107:414e9c822e99 551 uint32_t spi_get_writeprotect_status(Spi *p_spi);
mbed_official 107:414e9c822e99 552
mbed_official 107:414e9c822e99 553 /// @cond 0
mbed_official 107:414e9c822e99 554 /**INDENT-OFF**/
mbed_official 107:414e9c822e99 555 #ifdef __cplusplus
mbed_official 107:414e9c822e99 556 }
mbed_official 107:414e9c822e99 557 #endif
mbed_official 107:414e9c822e99 558 /**INDENT-ON**/
mbed_official 107:414e9c822e99 559 /// @endcond
mbed_official 107:414e9c822e99 560
mbed_official 107:414e9c822e99 561 /**
mbed_official 107:414e9c822e99 562 * \page sam_spi_quickstart Quickstart guide for SAM SPI driver
mbed_official 107:414e9c822e99 563 *
mbed_official 107:414e9c822e99 564 * This is the quickstart guide for the \ref spi_group "SAM SPI driver",
mbed_official 107:414e9c822e99 565 * with step-by-step instructions on how to configure and use the driver in a
mbed_official 107:414e9c822e99 566 * selection of use cases.
mbed_official 107:414e9c822e99 567 *
mbed_official 107:414e9c822e99 568 * The use cases contain several code fragments. The code fragments in the
mbed_official 107:414e9c822e99 569 * steps for setup can be copied into a custom initialization function, while
mbed_official 107:414e9c822e99 570 * the steps for usage can be copied into, e.g.the main application function.
mbed_official 107:414e9c822e99 571 *
mbed_official 107:414e9c822e99 572 * \section spi_basic_use_case Basic use case
mbed_official 107:414e9c822e99 573 * In this basic use case, the SPI module are configured for:
mbed_official 107:414e9c822e99 574 * - Master mode
mbed_official 107:414e9c822e99 575 * - Interrupt-based handling
mbed_official 107:414e9c822e99 576 *
mbed_official 107:414e9c822e99 577 * \subsection sam_spi_quickstart_prereq Prerequisites
mbed_official 107:414e9c822e99 578 * -# \ref sysclk_group "System Clock Management (Sysclock)"
mbed_official 107:414e9c822e99 579 *
mbed_official 107:414e9c822e99 580 * \section spi_basic_use_case_setup Setup steps
mbed_official 107:414e9c822e99 581 * \subsection spi_basic_use_case_setup_code Example code
mbed_official 107:414e9c822e99 582 * Add to application C-file:
mbed_official 107:414e9c822e99 583 * \code
mbed_official 107:414e9c822e99 584 void spi_master_init(Spi *p_spi)
mbed_official 107:414e9c822e99 585 {
mbed_official 107:414e9c822e99 586 spi_enable_clock(p_spi);
mbed_official 107:414e9c822e99 587 spi_reset(p_spi);
mbed_official 107:414e9c822e99 588 spi_set_master_mode(p_spi);
mbed_official 107:414e9c822e99 589 spi_disable_mode_fault_detect(p_spi);
mbed_official 107:414e9c822e99 590 spi_disable_loopback(p_spi);
mbed_official 107:414e9c822e99 591 spi_set_peripheral_chip_select_value(p_spi,
mbed_official 107:414e9c822e99 592 spi_get_pcs(DEFAULT_CHIP_ID));
mbed_official 107:414e9c822e99 593 spi_set_fixed_peripheral_select(p_spi);
mbed_official 107:414e9c822e99 594 spi_disable_peripheral_select_decode(p_spi);
mbed_official 107:414e9c822e99 595 spi_set_delay_between_chip_select(p_spi, CONFIG_SPI_MASTER_DELAY_BCS);
mbed_official 107:414e9c822e99 596 }
mbed_official 107:414e9c822e99 597 void spi_master_setup_device(Spi *p_spi, struct spi_device *device,
mbed_official 107:414e9c822e99 598 spi_flags_t flags, uint32_t baud_rate, board_spi_select_id_t sel_id)
mbed_official 107:414e9c822e99 599 {
mbed_official 107:414e9c822e99 600 spi_set_transfer_delay(p_spi, device->id, CONFIG_SPI_MASTER_DELAY_BS,
mbed_official 107:414e9c822e99 601 CONFIG_SPI_MASTER_DELAY_BCT);
mbed_official 107:414e9c822e99 602
mbed_official 107:414e9c822e99 603 spi_set_bits_per_transfer(p_spi, device->id, CONFIG_SPI_MASTER_BITS_PER_TRANSFER);
mbed_official 107:414e9c822e99 604 spi_set_baudrate_div(p_spi, device->id,
mbed_official 107:414e9c822e99 605 spi_calc_baudrate_div(baud_rate, sysclk_get_cpu_hz()));
mbed_official 107:414e9c822e99 606
mbed_official 107:414e9c822e99 607 spi_configure_cs_behavior(p_spi, device->id, SPI_CS_KEEP_LOW);
mbed_official 107:414e9c822e99 608
mbed_official 107:414e9c822e99 609 spi_set_clock_polarity(p_spi, device->id, flags >> 1);
mbed_official 107:414e9c822e99 610 spi_set_clock_phase(p_spi, device->id, ((flags & 0x1) ^ 0x1));
mbed_official 107:414e9c822e99 611 }
mbed_official 107:414e9c822e99 612 \endcode
mbed_official 107:414e9c822e99 613 *
mbed_official 107:414e9c822e99 614 * \subsection spi_basic_use_case_setup_flow Workflow
mbed_official 107:414e9c822e99 615 * -# Initialize the SPI in master mode:
mbed_official 107:414e9c822e99 616 * - \code
mbed_official 107:414e9c822e99 617 void spi_master_init(SPI_EXAMPLE);
mbed_official 107:414e9c822e99 618 \endcode
mbed_official 107:414e9c822e99 619 * -# Set up an SPI device:
mbed_official 107:414e9c822e99 620 * - \code void spi_master_setup_device(SPI_EXAMPLE, &SPI_DEVICE_EXAMPLE,
mbed_official 107:414e9c822e99 621 SPI_MODE_0, SPI_EXAMPLE_BAUDRATE, 0); \endcode
mbed_official 107:414e9c822e99 622 * - \note The returned device descriptor structure must be passed to the driver
mbed_official 107:414e9c822e99 623 * whenever that device should be used as current slave device.
mbed_official 107:414e9c822e99 624 * -# Enable SPI module:
mbed_official 107:414e9c822e99 625 * - \code spi_enable(SPI_EXAMPLE); \endcode
mbed_official 107:414e9c822e99 626 */
mbed_official 107:414e9c822e99 627 #endif /* SPI_H_INCLUDED */