#include #include "SPI.h" uchar SPI_CS; int SPIInit(){ UCA0CTL1 = UCSWRST; // setup A0 for SPI UCA0CTL0 = SPI_Mode3 | UCMSB | UCMST | (0x10 << 1) | UCSYNC; UCA0CTL1 |= UCSSEL_2; UCA0BR1 = 0; //TODO: set corect frequency UCA0BR0 = 4; // config port //set SEL to USCI (0b01); MOSI (pin 1), MISO (pin 2), CLK (pin 4) P1SEL |= BIT1 | BIT2 | BIT4; P1SEL2 |= BIT1 | BIT2 | BIT4; UCA0CTL1 &= ~UCSWRST; // enable interrupts IE2 |= UCA0TXIE; IFG2 &= ~UCA0TXIFG; // set initial values for vars SPI_packetC = 0; SPI_CS = 0; __enable_interrupt(); return 0; } void SPISend(){ P1OUT &= ~SPI_CS; UCA0TXBUF = SPI_packet[SPI_packetC]; } void SPIInitSend(uchar cs, enum SPI_Mode mode){ while(SPI_CS != 0) //TODO: search for a more power effient way for a delay __delay_cycles (16000); UCA0CTL0 |= mode; UCA0CTL0 &= ~mode ^ 0xC0; SPI_CS = cs; } #pragma vector = USCIAB0TX_VECTOR __interrupt void ISR_EUSCI_A0(){ SPI_packet[SPI_packetC] = UCA0RXIFG; if(SPI_packetC == 4){ P1OUT |= SPI_CS; SPI_packetC = 0; IFG2 &= ~UCA0TXIFG; SPI_CS = 0; }else{ SPI_packetC++; UCA0TXBUF = SPI_packet[SPI_packetC]; } }