4646#define MSBFIRST 1
4747#endif
4848
49+ #define SPI0_CS 21
50+ #define SPI1_CS SS
51+
52+ #define SPIDEV_0 0
53+ #define SPIDEV_1 1
4954/* For Arduino Uno compatibility, divider values are doubled to provide equivalent clock rates
5055 * e.g. SPI_CLOCK_DIV4 will produce a 4MHz clock
5156 * The Intel Curie has a 32MHz base clock and a min divider of 2, so max SPI clock is 16MHz
6368#define SPI_MODE2 0x02
6469#define SPI_MODE3 0x03
6570
71+ #define NUM_SPIDEVS 2
6672class SPISettings {
6773public:
6874 SPISettings (uint32_t clock, uint8_t bitOrder, uint8_t dataMode) {
@@ -86,7 +92,12 @@ class SPISettings {
8692
8793class SPIClass {
8894public:
89- SPIClass (void ) { initialized = 0 ; }
95+ SPIClass (int dev) {
96+ spi_addr = spidevs[dev][0 ];
97+ enable_val = spidevs[dev][1 ];
98+ disable_val = spidevs[dev][2 ];
99+ ss_gpio = spidevs[dev][3 ];
100+ }
90101
91102 // Initialize the SPI library
92103 void begin ();
@@ -131,14 +142,14 @@ class SPIClass {
131142#endif
132143
133144 /* disable controller */
134- SPI1_M_REG_VAL ( SPIEN) &= SPI_DISABLE;
145+ SPI_M_REG_VAL (spi_addr, SPIEN) &= SPI_DISABLE;
135146 /* Configure clock divider, frame size and data mode */
136- SPI1_M_REG_VAL ( BAUDR) = settings.baudr ;
137- SPI1_M_REG_VAL ( CTRL0) = settings.ctrl0 ;
147+ SPI_M_REG_VAL (spi_addr, BAUDR) = settings.baudr ;
148+ SPI_M_REG_VAL (spi_addr, CTRL0) = settings.ctrl0 ;
138149 frameSize = SPI_8_BIT;
139150 lsbFirst = settings.lsbFirst ;
140151 /* Enable controller */
141- SPI1_M_REG_VAL ( SPIEN) |= SPI_ENABLE;
152+ SPI_M_REG_VAL (spi_addr, SPIEN) |= SPI_ENABLE;
142153 }
143154
144155 // Write to the SPI bus (MOSI pin) and also receive (MISO pin)
@@ -186,15 +197,15 @@ class SPIClass {
186197 uint32_t transferSize = SPI_FIFO_DEPTH > remaining ? remaining : SPI_FIFO_DEPTH;
187198 /* Fill the TX FIFO */
188199 for (uint32_t i = 0 ; i < transferSize; i++)
189- SPI1_M_REG_VAL ( DR) = *(p + i);
200+ SPI_M_REG_VAL (spi_addr, DR) = *(p + i);
190201 remaining -= transferSize;
191202 /* Wait for transfer to complete */
192- while (SPI1_M_REG_VAL ( SR) & SPI_STATUS_BUSY) ;
203+ while (SPI_M_REG_VAL (spi_addr, SR) & SPI_STATUS_BUSY) ;
193204 do {
194- uint32_t rxLevel = SPI1_M_REG_VAL ( RXFL);
205+ uint32_t rxLevel = SPI_M_REG_VAL (spi_addr, RXFL);
195206 /* Drain the RX FIFO */
196207 for (uint32_t i = 0 ; i < rxLevel; i++)
197- *(p + i) = SPI1_M_REG_VAL ( DR);
208+ *(p + i) = SPI_M_REG_VAL (spi_addr, DR);
198209 p += rxLevel;
199210 transferSize -= rxLevel;
200211 } while (transferSize);
@@ -248,6 +259,10 @@ class SPIClass {
248259 void setClockDivider (uint8_t clockDiv);
249260
250261private:
262+ int ss_gpio;
263+ uint32_t spi_addr;
264+ uint32_t enable_val;
265+ uint32_t disable_val;
251266 uint32_t initialized;
252267 uint32_t interruptMode; // 0=none, 1-7=mask, 8=global
253268 uint32_t interruptMask[3 ]; // which interrupts to mask
@@ -260,26 +275,38 @@ class SPIClass {
260275 inline void setFrameSize (uint32_t size) {
261276 if (frameSize != size) {
262277 /* disable controller */
263- SPI1_M_REG_VAL ( SPIEN) &= SPI_DISABLE;
278+ SPI_M_REG_VAL (spi_addr, SPIEN) &= SPI_DISABLE;
264279 /* Configure new frame size */
265280 frameSize = size;
266- SPI1_M_REG_VAL (CTRL0) = (SPI1_M_REG_VAL (CTRL0) & ~(SPI_FSIZE_MASK)) | ((frameSize << SPI_FSIZE_SHIFT) & SPI_FSIZE_MASK);
281+ SPI_M_REG_VAL (spi_addr, CTRL0) = (SPI_M_REG_VAL (spi_addr, CTRL0)
282+ & ~(SPI_FSIZE_MASK)) | ((frameSize << SPI_FSIZE_SHIFT)
283+ & SPI_FSIZE_MASK);
267284 /* Enable controller */
268- SPI1_M_REG_VAL ( SPIEN) |= SPI_ENABLE;
285+ SPI_M_REG_VAL (spi_addr, SPIEN) |= SPI_ENABLE;
269286 }
270287 }
271288
272289 inline uint32_t singleTransfer (uint32_t data) {
273290 /* Write to TX FIFO */
274- SPI1_M_REG_VAL ( DR) = data;
291+ SPI_M_REG_VAL (spi_addr, DR) = data;
275292 /* Wait for transfer to complete */
276- while (SPI1_M_REG_VAL ( SR) & SPI_STATUS_BUSY) ;
277- while (SPI1_M_REG_VAL ( RXFL) == 0 ) ;
293+ while (SPI_M_REG_VAL (spi_addr, SR) & SPI_STATUS_BUSY) ;
294+ while (SPI_M_REG_VAL (spi_addr, RXFL) == 0 ) ;
278295 /* Read from RX FIFO */
279- return SPI1_M_REG_VAL ( DR);
296+ return SPI_M_REG_VAL (spi_addr, DR);
280297 }
298+
299+ void init ();
300+ void set_dev (int dev);
301+ int spidevs[NUM_SPIDEVS][4 ] =
302+ {
303+ /* base addr. Clk. enable value Clk. disable value SS GPIO */
304+ {(int )SOC_MST_SPI0_REGISTER_BASE, ENABLE_SPI_MASTER_0, DISABLE_SPI_MASTER_0, SPI0_CS},
305+ {(int )SOC_MST_SPI1_REGISTER_BASE, ENABLE_SPI_MASTER_1, DISABLE_SPI_MASTER_1, SPI1_CS}
306+ };
281307};
282308
283309extern SPIClass SPI;
310+ extern SPIClass SPI1;
284311
285312#endif
0 commit comments