diff options
Diffstat (limited to 'libmaple/spi.h')
| -rw-r--r-- | libmaple/spi.h | 115 | 
1 files changed, 115 insertions, 0 deletions
diff --git a/libmaple/spi.h b/libmaple/spi.h new file mode 100644 index 0000000..cde3b42 --- /dev/null +++ b/libmaple/spi.h @@ -0,0 +1,115 @@ +/* ***************************************************************************** + * The MIT License + * + * Copyright (c) 2010 Perry Hung. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * ****************************************************************************/ + +/** + *  @brief libmaple serial peripheral interface (SPI) prototypes and declarations + */ + +#ifndef _SPI_H_ +#define _SPI_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +/* peripheral addresses */ +#define SPI1_BASE                   0x40013000 +#define SPI2_BASE                   0x40003800 + +/* baud rate prescaler bits */ +#define CR1_BR                      0x00000038 +#define CR1_BR_PRESCALE_2           0x00000000 +#define CR1_BR_PRESCALE_4           0x00000008 +#define CR1_BR_PRESCALE_8           0x00000010 +#define CR1_BR_PRESCALE_16          0x00000018 +#define CR1_BR_PRESCALE_32          0x00000020 +#define CR1_BR_PRESCALE_64          0x00000028 +#define CR1_BR_PRESCALE_128         0x00000030 +#define CR1_BR_PRESCALE_256         0x00000038 + +#define CR1_LSBFIRST                    BIT(7)     // data frame format +#define CR1_MSTR                        BIT(2)     // master selection +#define CR1_SSM                         BIT(9)     // software slave management +#define CR1_SSI                         BIT(8)     // internal slave select +#define CR1_SPE                         BIT(6)     // peripheral enable + +/* Status register bits  */ +#define SR_RXNE                         BIT(0)     // rx buffer not empty +#define SR_TXE                          BIT(1)     // transmit buffer empty +#define SR_BSY                          BIT(7)     // busy flag + +typedef struct SPI { +   __io uint16 CR1; +   uint16 pad0; +   __io uint8 CR2; +   uint8 pad1[3]; +   __io uint8 SR; +   uint8 pad2[3]; +   __io uint16 DR; +   uint16 pad3; +   __io uint16 CRCPR; +   uint16 pad4; +   __io uint16 RXCRCR; +   uint16 pad5; +   __io uint16 TXCRCR; +   uint16 pad6; +} SPI; + +enum { +   SPI_MSBFIRST         = 0, +   SPI_LSBFIRST         = BIT(7), +}; + +enum { +   SPI_PRESCALE_2       = (0x0 << 3), +   SPI_PRESCALE_4       = (0x1 << 3), +   SPI_PRESCALE_8       = (0x2 << 3), +   SPI_PRESCALE_16      = (0x3 << 3), +   SPI_PRESCALE_32      = (0x4 << 3), +   SPI_PRESCALE_64      = (0x5 << 3), +   SPI_PRESCALE_128     = (0x6 << 3), +   SPI_PRESCALE_256     = (0x7 << 3) +}; + +void spi_init(uint32 spi_num, +              uint32 prescale, +              uint32 endian, +              uint32 mode); +void spi_tx(uint32 spi_num, uint8 data); + +static inline uint8 spi_rx(uint32 spi_num) { +   SPI *spi; + +   ASSERT(spi_num == 1 || spi_num == 2); +   spi = (spi_num == 1) ? (SPI*)SPI1_BASE : (SPI*)SPI2_BASE; + +   return spi->DR; +} + +#ifdef __cplusplus +} +#endif + +#endif +  | 
