add frequency option
This commit is contained in:
parent
977c26b2ca
commit
2d38b034ac
75
SPI.c
75
SPI.c
@ -1,17 +1,17 @@
|
||||
#include <msp430.h>
|
||||
#include "SPI.h"
|
||||
|
||||
uchar SPI_CS;
|
||||
uchar SPI_CS = 0;
|
||||
|
||||
int SPIInit(){
|
||||
|
||||
UCA0CTL1 = UCSWRST;
|
||||
|
||||
// setup A0 for SPI
|
||||
UCA0CTL0 = SPI_Mode3 | UCMSB | UCMST | (0x10 << 1) | UCSYNC;
|
||||
UCA0CTL0 = UCMSB | UCMST | (0x10 << 1) | UCSYNC;
|
||||
UCA0CTL1 |= UCSSEL_2;
|
||||
UCA0BR1 = 0; //TODO: set corect frequency
|
||||
UCA0BR0 = 4;
|
||||
UCA0BR1 = 0;
|
||||
UCA0BR0 = 16; // 1 MHz
|
||||
|
||||
|
||||
// config port
|
||||
@ -23,8 +23,8 @@ int SPIInit(){
|
||||
UCA0CTL1 &= ~UCSWRST;
|
||||
|
||||
// enable interrupts
|
||||
IE2 |= UCA0TXIE;
|
||||
IFG2 &= ~UCA0TXIFG;
|
||||
// IE2 |= UCA0TXIE;
|
||||
// IFG2 &= ~UCA0TXIFG;
|
||||
|
||||
// set initial values for vars
|
||||
SPI_packetC = 0;
|
||||
@ -35,31 +35,56 @@ int SPIInit(){
|
||||
return 0;
|
||||
}
|
||||
|
||||
void SPISend(){
|
||||
P1OUT &= ~SPI_CS;
|
||||
UCA0TXBUF = SPI_packet[SPI_packetC];
|
||||
}
|
||||
//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
|
||||
|
||||
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);
|
||||
// set clock frequency
|
||||
UCA0BR0 = clk;
|
||||
|
||||
// set SPI mode
|
||||
UCA0CTL0 &= 0x3F; // set mode bits to 0
|
||||
UCA0CTL0 |= mode;
|
||||
UCA0CTL0 &= ~mode ^ 0xC0;
|
||||
|
||||
// save chip select
|
||||
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++;
|
||||
//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] = UCA0RXIFG;
|
||||
|
||||
// increase counter for next byte
|
||||
SPI_packetC++;
|
||||
}
|
||||
|
||||
SPI_packetC = 0; // recet counter
|
||||
P1OUT |= SPI_CS; // deselect slave
|
||||
SPI_CS = 0;
|
||||
}
|
||||
|
||||
3
SPI.h
3
SPI.h
@ -11,12 +11,13 @@
|
||||
#include "typedefExtention.h"
|
||||
|
||||
enum SPI_Mode {SPI_Mode0=0b00<<6, SPI_Mode1=0b10<<6, SPI_Mode2=0b11<<6, SPI_Mode3=0b01<<6};
|
||||
enum SPI_Clock {SPI_Clock_1MHz=16, SPI_Clock_2MHz=8, SPI_Clock_4MHz=4, SPI_Clock_8MHz=2};
|
||||
|
||||
uchar SPI_packet[5];
|
||||
char SPI_packetC;
|
||||
|
||||
int SPIInit();
|
||||
void SPISend();
|
||||
void SPIInitSend(uchar cs, enum SPI_Mode mode);
|
||||
void SPIInitSend(uchar cs, enum SPI_Mode mode, enum SPI_Clock clk);
|
||||
|
||||
#endif /* SPI_C_ */
|
||||
|
||||
@ -88,7 +88,7 @@ void MC_write(uchar addr, ulong data) {
|
||||
char i;
|
||||
|
||||
// wait for SPI bus to be available
|
||||
SPIInitSend(MC_CS, SPI_Mode3);
|
||||
SPIInitSend(MC_CS, SPI_Mode3, SPI_Clock_1MHz);
|
||||
|
||||
// set write bit to write
|
||||
addr &= ~0x01;
|
||||
@ -109,7 +109,7 @@ ulong MC_read(unsigned char addr) {
|
||||
ulong data;
|
||||
|
||||
// wait for SPI bus to be available
|
||||
SPIInitSend(MC_CS, SPI_Mode3);
|
||||
SPIInitSend(MC_CS, SPI_Mode3, SPI_Clock_1MHz);
|
||||
|
||||
// set write bit to read
|
||||
addr |= 0x01;
|
||||
@ -119,7 +119,7 @@ ulong MC_read(unsigned char addr) {
|
||||
SPISend();
|
||||
|
||||
// wait for SPI bus to be available
|
||||
SPIInitSend(MC_CS, SPI_Mode3);
|
||||
SPIInitSend(MC_CS, SPI_Mode3, SPI_Clock_1MHz);
|
||||
|
||||
// set write bit to read
|
||||
addr |= 0x01;
|
||||
|
||||
@ -68,7 +68,7 @@ void MD_write(uchar addr, ulong data) {
|
||||
char i;
|
||||
|
||||
// wait for SPI bus to be available
|
||||
SPIInitSend(MD_CS, SPI_Mode3);
|
||||
SPIInitSend(MD_CS, SPI_Mode3, SPI_Clock_4MHz);
|
||||
|
||||
// set write bit to write
|
||||
addr |= 0x80;
|
||||
@ -89,7 +89,7 @@ unsigned long MD_read(uchar addr) {
|
||||
ulong data;
|
||||
|
||||
// wait for SPI bus to be available
|
||||
SPIInitSend(MD_CS, SPI_Mode3);
|
||||
SPIInitSend(MD_CS, SPI_Mode3, SPI_Clock_4MHz);
|
||||
|
||||
// set write bit to read
|
||||
addr &= ~0x80;
|
||||
@ -98,7 +98,7 @@ unsigned long MD_read(uchar addr) {
|
||||
SPISend(SPI_Mode3);
|
||||
|
||||
// wait for SPI bus to be available
|
||||
SPIInitSend(MD_CS, SPI_Mode3);
|
||||
SPIInitSend(MD_CS, SPI_Mode3, SPI_Clock_4MHz);
|
||||
|
||||
SPI_packet[0] = addr;
|
||||
SPISend(SPI_Mode3);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user