/
main.c
159 lines (128 loc) · 2.84 KB
/
main.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
#include <msp430.h>
#include <stdint.h>
#include <limits.h>
#include "queue.h"
#define RX BIT1
#define TX BIT2
queue UARTTXBuf;
queue SPITXBuf;
// Transfer one byte over SPI
void SPITransmit(uint8_t out) {
if (!QueueInsert(&SPITXBuf, out)) {
// Handle Queue overflow
__disable_interrupt();
for (;;); // This is here to intentionally break the code
}
// Turn the transmit interrupt back on
if(QueueSize(&SPITXBuf) == 1) {
IE2 |= UCB0TXIE;
}
}
// Transfer one byte over UART
void UARTTransmit(uint8_t out) {
if (!QueueInsert(&UARTTXBuf, out)) {
// Handle Queue overflow
__disable_interrupt();
for (;;); // This is here to intentionally break the code
}
// Turn the transmit interrupt back on
if(QueueSize(&UARTTXBuf) == 1) {
IE2 |= UCA0TXIE;
}
}
// Initilize UART on UCA0
void InitUART() {
// Put in reset
UCA0CTL1 = UCSWRST;
// Parity disabled, LSB first, 8 bit char, one stop bit, UART mode, asynchronous
UCA0CTL0 = 0;
// Source from SMCLK
UCA0CTL1 |= UCSSEL_3;
// Baud rate of 9600
// BRCLK= 20.304MHz UCBRx = 132, UCBRSx = 0 UCBRFx = 3, oversample mode
UCA0BR0 = 132;
UCA0BR1 = 0;
UCA0MCTL = UCBRF_3 | UCBRS_0 | UCOS16;
// Setup GPIO
P1SEL = TX | RX;
P1SEL2 = TX | RX;
P1DIR |= TX;
P1DIR &= ~RX;
// Enable
UCA0CTL1 &= ~UCSWRST;
}
// Initilize SPI Master on UCB0
// SPI P1.6 MISO, P1.7 MOSI, P1.5 CLK
// Uses UARTx on pins ...
void InitSPI() {
// Disable USCI
UCB0CTL1 |= UCSWRST;
// Set up pin functions and Directions
P1SEL |= BIT5| BIT6 | BIT7;
P1SEL2 |= BIT5| BIT6 | BIT7;
P1DIR |= BIT5 | BIT7; // P1.5, P1.7 Out
P1DIR &= ~BIT6; // P1.6 In
// Set mode and clock select
UCB0CTL0 = UCMSB | UCMST | UCSYNC;
UCB0CTL1 = UCSSEL_3 | UCSWRST;
// Set clock divider to 255
UCB0BR0 = 0xFF;
UCB0BR1 = 0x0;
// Turn on USCI in SPI mode
UCB0CTL1 &= ~UCSWRST;
}
#pragma vector=USCIAB0TX_VECTOR
__interrupt void TXISR() {
// UART
uint8_t out = 0;
if(QueuePop(&UARTTXBuf, &out)) {
UCA0TXBUF = out;
}
else {
// Done transfering disable transmit interrupt
IE2 &= ~UCA0TXIE;
}
// SPI
out = 0;
if(QueuePop(&SPITXBuf, &out)) {
UCB0TXBUF = out;
}
else {
// Done transfering disable transmit interrupt
IE2 &= ~UCB0TXIE;
}
}
#pragma vector=USCIAB0RX_VECTOR
__interrupt void RXISR() {
// UART
if(IFG2 & UCB0RXIFG) {
UARTTransmit(UCB0RXBUF);
}
// SPI
if (IFG2 & UCA0RXIFG) {
SPITransmit(UCA0RXBUF);
}
}
/*
* main.c
*/
int main(void) {
WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer
// Set up master clk
DCOCTL |= DCO2 | DCO1 | DCO0;
BCSCTL1 |= RSEL3 | RSEL2 | RSEL1 | RSEL0;
// Initilize communications
InitUART();
InitSPI();
// Enable interrupts
__enable_interrupt();
IE2 = UCA0TXIE | UCA0RXIE | UCB0TXIE | UCB0RXIE;
//while(!(IFG2 & UCA0RXIFG));
//uint8_t echo = UCA0RXBUF;
while(1) {
//UARTTransmit(echo);
//while(!(IFG2 & UCA0RXIFG));
//echo = UCA0RXBUF;
}
return 0;
}