2020-05-27 11:47:04 +02:00

91 lines
2.1 KiB
C

#include <msp430.h>
#include "SPI.h"
uchar SPI_CS = 0;
int SPIInit(){
UCA0CTL1 = UCSWRST;
// setup A0 for SPI
UCA0CTL0 = UCMSB | UCMST | (0x10 << 1) | UCSYNC;
UCA0CTL1 |= UCSSEL_2;
UCA0BR1 = 0;
UCA0BR0 = 16; // 1 MHz
// 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;
}
//TODO: add clock freqency configuration
/*
* do some configuration before sending the data.
*
* @arg uchar cs: the bit of port 1 connected to the chip select pin of target device
* @arg enum SPI_Mode: the SPI modus (clock pase and polarity)
* @arg enum SPI_clock: the clock freqency
*/
void SPIInitSend(uchar cs, enum SPI_Mode mode, enum SPI_Clock clk){
//TODO: add a clock as powerefficent delay
while(SPI_CS != 0); // wait for last transmit to be done
// set clock frequency
UCA0BR0 = clk;
// set SPI mode
UCA0CTL0 &= 0x3F; // set mode bits to 0
UCA0CTL0 |= mode;
// save chip select
SPI_CS = cs;
}
//TODO: make it asyncronily with interupt.
/*
* Send the packet stored in SPI_packet. it start from SPI_packetC to the last byte
*/
void SPISend(){
P1OUT &= ~SPI_CS; // select slave
while(SPI_packetC < 5){
// send one byte
UCA0TXBUF = SPI_packet[SPI_packetC];
//TODO: fix the delay! it's to short with low data speeds
if(UCA0BR0 > 4)
// if de frequency lower than 4 MHz do a manual delay. this is a workaround for the to short delay
// this works down to 1 MHz
__delay_cycles(129);
else
while(UCB0STAT & UCBUSY); // wait for SPI TX/RX to finish
// save recieved data
SPI_packet[SPI_packetC] = UCA0RXBUF;
// increase counter for next byte
SPI_packetC++;
}
SPI_packetC = 0; // recet counter
P1OUT |= SPI_CS; // deselect slave
SPI_CS = 0;
}