-/*\r
- LUFA Library\r
- Copyright (C) Dean Camera, 2009.\r
- \r
- dean [at] fourwalledcubicle [dot] com\r
- www.fourwalledcubicle.com\r
-*/\r
-\r
-/*\r
- Copyright 2009 Dean Camera (dean [at] fourwalledcubicle [dot] com)\r
-\r
- Permission to use, copy, modify, and distribute this software\r
- and its documentation for any purpose and without fee is hereby\r
- granted, provided that the above copyright notice appear in all\r
- copies and that both that the copyright notice and this\r
- permission notice and warranty disclaimer appear in supporting\r
- documentation, and that the name of the author not be used in\r
- advertising or publicity pertaining to distribution of the\r
- software without specific, written prior permission.\r
-\r
- The author disclaim all warranties with regard to this\r
- software, including all implied warranties of merchantability\r
- and fitness. In no event shall the author be liable for any\r
- special, indirect or consequential damages or any damages\r
- whatsoever resulting from loss of use, data or profits, whether\r
- in an action of contract, negligence or other tortious action,\r
- arising out of or in connection with the use or performance of\r
- this software.\r
-*/\r
-\r
-/** \file\r
- *\r
- * Hardware SPI subsystem driver for the supported USB AVRs models.\r
- */\r
-\r
-/** \ingroup Group_PeripheralDrivers\r
- * @defgroup Group_SPI SPI Driver - LUFA/Drivers/Peripheral/SPI.h\r
- *\r
- * \section Sec_Dependencies Module Source Dependencies\r
- * The following files must be built with any user project that uses this module:\r
- * - None\r
- *\r
- * \section Module Description\r
- * Driver for the hardware SPI port avaliable on most AVR models. This module provides\r
- * an easy to use driver for the setup of and transfer of data over the AVR's SPI port.\r
- *\r
- * @{\r
- */\r
-\r
-#ifndef __SPI_H__\r
-#define __SPI_H__\r
-\r
- /* Includes: */\r
- #include <stdbool.h>\r
-\r
- /* Enable C linkage for C++ Compilers: */\r
- #if defined(__cplusplus)\r
- extern "C" {\r
- #endif\r
-\r
- /* Private Interface - For use in library only: */\r
- #if !defined(__DOXYGEN__)\r
- /* Macros: */\r
- #define SPI_USE_DOUBLESPEED (1 << 7)\r
- #endif\r
- \r
- /* Public Interface - May be used in end-application: */\r
- /* Macros: */\r
- /** SPI prescaler mask for SPI_Init(). Divides the system clock by a factor of 2. */\r
- #define SPI_SPEED_FCPU_DIV_2 SPI_USE_DOUBLESPEED\r
-\r
- /** SPI prescaler mask for SPI_Init(). Divides the system clock by a factor of 4. */\r
- #define SPI_SPEED_FCPU_DIV_4 0\r
-\r
- /** SPI prescaler mask for SPI_Init(). Divides the system clock by a factor of 8. */\r
- #define SPI_SPEED_FCPU_DIV_8 (SPI_USE_DOUBLESPEED | (1 << SPR0))\r
-\r
- /** SPI prescaler mask for SPI_Init(). Divides the system clock by a factor of 16. */\r
- #define SPI_SPEED_FCPU_DIV_16 (1 << SPR0)\r
-\r
- /** SPI prescaler mask for SPI_Init(). Divides the system clock by a factor of 32. */\r
- #define SPI_SPEED_FCPU_DIV_32 (SPI_USE_DOUBLESPEED | (1 << SPR1))\r
-\r
- /** SPI prescaler mask for SPI_Init(). Divides the system clock by a factor of 64. */\r
- #define SPI_SPEED_FCPU_DIV_64 (SPI_USE_DOUBLESPEED | (1 << SPR1) | (1 << SPR0))\r
-\r
- /** SPI prescaler mask for SPI_Init(). Divides the system clock by a factor of 128. */\r
- #define SPI_SPEED_FCPU_DIV_128 ((1 << SPR1) | (1 << SPR0))\r
-\r
- /* Inline Functions: */\r
- /** Initializes the SPI subsystem, ready for transfers. Must be called before calling any other\r
- * SPI routines.\r
- *\r
- * \param[in] PrescalerMask Prescaler mask to set the SPI clock speed\r
- * \param[in] Master If true, sets the SPI system to use master mode, slave if false\r
- */\r
- static inline void SPI_Init(const uint8_t PrescalerMask, const bool Master)\r
- {\r
- DDRB |= ((1 << 1) | (1 << 2));\r
- PORTB |= ((1 << 0) | (1 << 3));\r
- \r
- SPCR = ((1 << SPE) | (Master << MSTR) | (1 << CPOL) | (1 << CPHA) |\r
- (PrescalerMask & ~SPI_USE_DOUBLESPEED));\r
- \r
- if (PrescalerMask & SPI_USE_DOUBLESPEED)\r
- SPSR |= (1 << SPI2X);\r
- else\r
- SPSR &= ~(1 << SPI2X);\r
- }\r
- \r
- /** Turns off the SPI driver, disabling and returning used hardware to their default configuration. */\r
- static inline void SPI_ShutDown(void)\r
- {\r
- DDRB &= ~((1 << 1) | (1 << 2));\r
- PORTB &= ~((1 << 0) | (1 << 3));\r
- \r
- SPCR = 0;\r
- SPSR = 0;\r
- }\r
- \r
- /** Sends and receives a byte through the SPI interface, blocking until the transfer is complete.\r
- *\r
- * \param[in] Byte Byte to send through the SPI interface\r
- *\r
- * \return Response byte from the attached SPI device\r
- */\r
- static inline uint8_t SPI_TransferByte(const uint8_t Byte) ATTR_ALWAYS_INLINE;\r
- static inline uint8_t SPI_TransferByte(const uint8_t Byte)\r
- {\r
- SPDR = Byte;\r
- while (!(SPSR & (1 << SPIF)));\r
- return SPDR;\r
- }\r
-\r
- /** Sends a byte through the SPI interface, blocking until the transfer is complete. The response\r
- * byte sent to from the attached SPI device is ignored.\r
- *\r
- * \param[in] Byte Byte to send through the SPI interface\r
- */\r
- static inline void SPI_SendByte(const uint8_t Byte) ATTR_ALWAYS_INLINE;\r
- static inline void SPI_SendByte(const uint8_t Byte)\r
- {\r
- SPDR = Byte;\r
- while (!(SPSR & (1 << SPIF)));\r
- }\r
-\r
- /** Sends a dummy byte through the SPI interface, blocking until the transfer is complete. The response\r
- * byte from the attached SPI device is returned.\r
- *\r
- * \return The response byte from the attached SPI device\r
- */\r
- static inline uint8_t SPI_ReceiveByte(void) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT;\r
- static inline uint8_t SPI_ReceiveByte(void)\r
- {\r
- SPDR = 0x00;\r
- while (!(SPSR & (1 << SPIF)));\r
- return SPDR;\r
- }\r
-\r
- /* Disable C linkage for C++ Compilers: */\r
- #if defined(__cplusplus)\r
- }\r
- #endif\r
- \r
-#endif\r
-\r
-/** @} */\r
+/*
+ LUFA Library
+ Copyright (C) Dean Camera, 2019.
+
+ dean [at] fourwalledcubicle [dot] com
+ www.lufa-lib.org
+*/
+
+/*
+ Copyright 2019 Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+ Permission to use, copy, modify, distribute, and sell this
+ software and its documentation for any purpose is hereby granted
+ without fee, provided that the above copyright notice appear in
+ all copies and that both that the copyright notice and this
+ permission notice and warranty disclaimer appear in supporting
+ documentation, and that the name of the author not be used in
+ advertising or publicity pertaining to distribution of the
+ software without specific, written prior permission.
+
+ The author disclaims all warranties with regard to this
+ software, including all implied warranties of merchantability
+ and fitness. In no event shall the author be liable for any
+ special, indirect or consequential damages or any damages
+ whatsoever resulting from loss of use, data or profits, whether
+ in an action of contract, negligence or other tortious action,
+ arising out of or in connection with the use or performance of
+ this software.
+*/
+
+/** \file
+ * \brief Hardware Serial Peripheral Interface driver.
+ *
+ * This file is the master dispatch header file for the device-specific SPI driver, for microcontrollers
+ * containing a hardware SPI.
+ *
+ * User code should include this file, which will in turn include the correct SPI driver header file for the
+ * currently selected architecture and microcontroller model.
+ */
+
+/** \ingroup Group_PeripheralDrivers
+ * \defgroup Group_SPI SPI Driver - LUFA/Drivers/Peripheral/SPI.h
+ * \brief Hardware Serial Peripheral Interface driver.
+ *
+ * \section Sec_SPI_Dependencies Module Source Dependencies
+ * The following files must be built with any user project that uses this module:
+ * - None
+ *
+ * \section Sec_SPI_ModDescription Module Description
+ * Hardware SPI driver. This module provides an easy to use driver for the setup and transfer of data over
+ * the selected architecture and microcontroller model's SPI port.
+ *
+ * \note The exact API for this driver may vary depending on the target used - see
+ * individual target module documentation for the API specific to your target processor.
+ */
+
+#ifndef __SPI_H__
+#define __SPI_H__
+
+ /* Macros: */
+ #define __INCLUDE_FROM_SPI_H
+
+ /* Includes: */
+ #include "../../Common/Common.h"
+
+ /* Includes: */
+ #if (ARCH == ARCH_AVR8)
+ #include "AVR8/SPI_AVR8.h"
+ #elif (ARCH == ARCH_XMEGA)
+ #include "XMEGA/SPI_XMEGA.h"
+ #else
+ #error The SPI peripheral driver is not currently available for your selected architecture.
+ #endif
+
+#endif
+