66 lines
1.2 KiB
C
66 lines
1.2 KiB
C
#include <msp430.h>
|
|
#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];
|
|
}
|
|
}
|