21#include "spi_msp432.h"
22#include "irq_dispatcher.h"
27uint32_t SPI_CLK = SystemCoreClock;
28extern uint32_t SubsystemMasterClock
__attribute__((weak,alias(
"SPI_CLK")));
31function<void(uint8_t)> spi_msp432::_intHandler[8];
34 const bool spi_master, uint16_t mode) :
35 _initialized(false), _master(spi_master), _generate_CS(true),
36 _EUSCI_CTLW0(mod->CTLW0), _EUSCI_BRW (mod->BRW),
37 _EUSCI_STATW(mod->STATW), _EUSCI_RXBUF(mod->RXBUF),
38 _EUSCI_TXBUF(mod->TXBUF), _EUSCI_IE (mod->IE),
39 _EUSCI_IFG (mod->IFG), _EUSCI_IV (mod->IV),
44 irq_dispatcher::link_in();
48 if (mod == EUSCI_A0_SPI) {
49 _clk.setGpio (PORT_PIN(1, 1));
50 _miso.setGpio(PORT_PIN(1, 2));
51 _mosi.setGpio(PORT_PIN(1, 3));
53 }
else if (mod == EUSCI_A1_SPI) {
54 _clk.setGpio (PORT_PIN(2, 1));
55 _miso.setGpio(PORT_PIN(2, 2));
56 _mosi.setGpio(PORT_PIN(2, 3));
58 }
else if (mod == EUSCI_A2_SPI) {
59 _clk.setGpio (PORT_PIN(3, 1));
60 _miso.setGpio(PORT_PIN(3, 2));
61 _mosi.setGpio(PORT_PIN(3, 3));
63 }
else if (mod == EUSCI_A3_SPI) {
64 _clk.setGpio (PORT_PIN(9, 5));
65 _miso.setGpio(PORT_PIN(9, 6));
66 _mosi.setGpio(PORT_PIN(9, 7));
73 const bool spi_master, uint16_t mode) :
74 _initialized(false), _master(spi_master), _generate_CS(true),
75 _EUSCI_CTLW0(mod->CTLW0), _EUSCI_BRW (mod->BRW),
76 _EUSCI_STATW(mod->STATW), _EUSCI_RXBUF(mod->RXBUF),
77 _EUSCI_TXBUF(mod->TXBUF), _EUSCI_IE (mod->IE),
78 _EUSCI_IFG (mod->IFG), _EUSCI_IV (mod->IV),
83 if (mod == EUSCI_B0_SPI) {
84 _clk.setGpio (PORT_PIN(1, 5));
85 _miso.setGpio(PORT_PIN(1, 7));
86 _mosi.setGpio(PORT_PIN(1, 6));
88 }
else if (mod == EUSCI_B1_SPI) {
89 _clk.setGpio (PORT_PIN(6, 3));
90 _miso.setGpio(PORT_PIN(6, 5));
91 _mosi.setGpio(PORT_PIN(6, 4));
93 }
else if (mod == EUSCI_B2_SPI) {
94 _clk.setGpio( PORT_PIN(3, 5));
95 _miso.setGpio(PORT_PIN(3, 7));
96 _mosi.setGpio(PORT_PIN(3, 6));
98 }
else if (mod == EUSCI_B3_SPI) {
99 _clk.setGpio( PORT_PIN(10, 1));
100 _miso.setGpio(PORT_PIN(10, 3));
101 _mosi.setGpio(PORT_PIN(10, 2));
107spi_msp432::~spi_msp432() {
118void spi_msp432::initialize() {
123 _clk.setMode (_master ? GPIO::OUTPUT : GPIO::INPUT);
125 _miso.setMode(_master ? GPIO::INPUT : GPIO::OUTPUT);
127 _mosi.setMode(_master ? GPIO::OUTPUT : GPIO::INPUT);
131 _cs.gpioMode(_master ? GPIO::OUTPUT | GPIO::INIT_HIGH : GPIO::INPUT);
146 _EUSCI_CTLW0 |= _mode;
154 _EUSCI_CTLW0 &= ~EUSCI_A_CTLW0_SWRST;
161int16_t spi_msp432::spiTxRx(
const uint8_t *txbuf, uint8_t *rxbuf, uint16_t len)
163 if (!_initialized) initialize();
166 if (_generate_CS) _cs.gpioWrite(LOW);
169 while(_cs.gpioRead()) ;
174 rxbuf[0] = _EUSCI_RXBUF;
176 for (
int i = 0; i < len; ++i)
179 _EUSCI_TXBUF = (uint16_t) (txbuf[i]);
182 rxbuf[i] = (uint8_t)(_EUSCI_RXBUF);
189 if (_generate_CS) _cs.gpioWrite(HIGH);
192 while(!_cs.gpioRead()) ;
197int16_t spi_msp432::spiTx(
const uint8_t *txbuf, uint16_t len) {
198 if (!_initialized) initialize();
201 if (_generate_CS) _cs.gpioWrite(LOW);
204 while(_cs.gpioRead()) ;
210 for (
int i = 0; i < len; ++i)
213 _EUSCI_TXBUF = (uint16_t) (txbuf[i]);
220 if (_generate_CS) _cs.gpioWrite(HIGH);
223 while(!_cs.gpioRead()) ;
228int16_t spi_msp432::spiRx(uint8_t tx_byte, uint8_t *rxbuf, uint16_t len) {
229 if (!_initialized) initialize();
232 if (_generate_CS) _cs.gpioWrite(LOW);
235 while(_cs.gpioRead()) ;
240 rxbuf[0] = _EUSCI_RXBUF;
242 for (
int i = 0; i < len; ++i)
245 _EUSCI_TXBUF = (uint16_t) (tx_byte);
248 rxbuf[i] = (uint8_t)(_EUSCI_RXBUF);
255 if (_generate_CS) _cs.gpioWrite(HIGH);
258 while(!_cs.gpioRead()) ;
264void spi_msp432::setSpeed(uint32_t baud)
266 if (!_initialized) initialize();
267 _EUSCI_BRW = SubsystemMasterClock / baud;
270void spi_msp432::generateCS(
bool val)
272 if (!_initialized) initialize();
276void spi_msp432::setCS(
bool val) {
277 if (!_initialized) initialize();
281void spi_msp432::spiAttachRxIrq(function<
void(uint8_t data)> f) {
283 _intHandler[_irq-16] = f;
287 NVIC_EnableIRQ(_irq);
294void EUSCIA0_SPI_IRQHandler(
void)
296 spi_msp432::_intHandler[0]( EUSCI_A0->RXBUF );
299void EUSCIA1_SPI_IRQHandler(
void)
301 spi_msp432::_intHandler[1]( EUSCI_A1->RXBUF );
304void EUSCIA2_SPI_IRQHandler(
void)
306 spi_msp432::_intHandler[2]( EUSCI_A2->RXBUF );
309void EUSCIA3_SPI_IRQHandler(
void)
311 spi_msp432::_intHandler[3]( EUSCI_A3->RXBUF );
314void EUSCIB0_SPI_IRQHandler(
void)
316 spi_msp432::_intHandler[4]( EUSCI_B0->RXBUF );
319void EUSCIB1_SPI_IRQHandler(
void)
321 spi_msp432::_intHandler[5]( EUSCI_B1->RXBUF );
324void EUSCIB2_SPI_IRQHandler(
void)
326 spi_msp432::_intHandler[6]( EUSCI_B2->RXBUF );
329void EUSCIB3_SPI_IRQHandler(
void)
331 spi_msp432::_intHandler[7]( EUSCI_B3->RXBUF );
#define EUSCI_A_CTLW0_STEM
#define EUSCI_A_CTLW0_MST
#define EUSCI_A_IFG_RXIFG
#define EUSCI_A_STATW_BUSY
#define EUSCI_A_IFG_TXIFG
#define EUSCI_A_CTLW0_SWRST
#define EUSCI_A_CTLW0_SYNC
void __attribute__((noreturn))(*rom_reset_usb_boot_fn)(uint32_t
Reboot the device into BOOTSEL mode.