Mats van Reenen 84c0376a1a first push
2020-05-13 11:24:21 +02:00

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];
}
}