More AVR32 achitecture ports.
[pub/USBasp.git] / LUFA / Drivers / Peripheral / AVR32 / SPI.h
index 4322eaa..379ce7f 100644 (file)
                        /** SPI prescaler mask for SPI_Init(). Divides the system clock by a factor of 32. */\r
                        #define SPI_SPEED_FCPU_DIV_32          AVR32_SPI_MR_FDIV_MASK\r
                        \r
+                       /** SPI chip selection mode for direct peripheral-to-CS pin connections. */\r
+                       #define SPI_CS_4BITDECODER             AVR32_SPI_MR_PSDEC_MASK\r
+                       \r
+                       /** SPI chip selection mode for peripheral CS pin connections through a 4-bit decoder. */\r
+                       #define SPI_CS_DIRECT                  0\r
+                       \r
                        /** SPI mode mask for SPI_Init(). Indicates that the SPI interface should be initialized into slave mode. */\r
                        #define SPI_MODE_SLAVE                 0\r
 \r
                         *        configure these seperately to connect the SPI module to the desired GPIO pins via the\r
                         *        GPIO MUX registers.\r
                         *\r
-                        *  \param[in] SPIOptions  SPI Options, a mask consisting of one of each of the SPI_SPEED_*\r
-                        *                         and SPI_MODE_* masks\r
+                        *  \param[in] SPIOptions  SPI Options, a mask consisting of one of each of the SPI_SPEED_*,\r
+                        *                         SPI_CS_* and SPI_MODE_* masks\r
                         */\r
                        static inline void SPI_Init(const uintN_t SPIOptions)\r
                        {\r
-                               AVR32_SPI.cr = (AVR32_SPI_CR_SPIEN_MASK | AVR32_SPI_CR_SWRST_MASK);\r
+                               AVR32_PM.pbamask = (1 << 5);\r
+\r
+                               AVR32_SPI.CR.swrst = true;\r
+                               AVR32_SPI.CR.spien = true;\r
                                AVR32_SPI.mr = SPIOptions;\r
                        }\r
 \r
                        static inline void SPI_ShutDown(void)\r
                        {\r
                                AVR32_SPI.cr = AVR32_SPI_CR_SPIDIS_MASK;\r
+\r
+                               AVR32_PM.pbamask &= ~(1 << 5);\r
                        }\r
                        \r
                        /** Sends and receives a transfer through the SPI interface, blocking until the transfer is complete.\r
                        static inline uint16_t SPI_Transfer(const uint16_t Data) ATTR_ALWAYS_INLINE;\r
                        static inline uint16_t SPI_Transfer(const uint16_t Data)\r
                        {\r
-                               AVR32_SPI.TDR.td = Data;\r
                                while (!(AVR32_SPI.SR.tdre));\r
-                               return AVR32_SPI.rdr;\r
+                               AVR32_SPI.TDR.td = Data;\r
+\r
+                               while ((AVR32_SPI.sr & (AVR32_SPI_SR_RDRF_MASK | AVR32_SPI_SR_TXEMPTY_MASK)) !=\r
+                                                      (AVR32_SPI_SR_RDRF_MASK | AVR32_SPI_SR_TXEMPTY_MASK));\r
+                               return AVR32_SPI.RDR.rd;\r
                        }\r
 \r
                        /** Sends a transfer through the SPI interface, blocking until the transfer is complete. The response\r
                        static inline void SPI_Send(const uint16_t Data) ATTR_ALWAYS_INLINE;\r
                        static inline void SPI_Send(const uint16_t Data)\r
                        {\r
-                               AVR32_SPI.TDR.td = Data;\r
                                while (!(AVR32_SPI.SR.tdre));\r
+                               AVR32_SPI.TDR.td = Data;\r
                        }\r
 \r
                        /** Sends a dummy transfer through the SPI interface, blocking until the transfer is complete. The response\r
                        static inline uint16_t SPI_Receive(void) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT;\r
                        static inline uint16_t SPI_Receive(void)\r
                        {\r
-                               AVR32_SPI.TDR.td = 0x0000;\r
                                while (!(AVR32_SPI.SR.tdre));\r
+                               AVR32_SPI.TDR.td = 0x0000;\r
+\r
+                               while ((AVR32_SPI.sr & (AVR32_SPI_SR_RDRF_MASK | AVR32_SPI_SR_TXEMPTY_MASK)) !=\r
+                                                      (AVR32_SPI_SR_RDRF_MASK | AVR32_SPI_SR_TXEMPTY_MASK));\r
                                return AVR32_SPI.RDR.rd;\r
                        }\r
 \r