1 | #include <msp430.h>
|
2 | #define USSensoren 4
|
3 |
|
4 | int RXByteCtr, RPT_Flag = 0; // enables repeated start when 1
|
5 | unsigned char TXData[2];
|
6 | unsigned char RXData[2];
|
7 | int anzahlTXNachrichten=0;
|
8 | int anzahlRXNachrichten=0;
|
9 | unsigned char TXByteCtr, RX = 0;
|
10 |
|
11 |
|
12 | char RS232SendeBuffer[4];
|
13 |
|
14 | void Setup_TX(int);
|
15 | void Setup_RX(int);
|
16 | void Transmit(void);
|
17 | void Receive(void);
|
18 | void RS232init(void);
|
19 |
|
20 | int main(void)
|
21 | {
|
22 |
|
23 |
|
24 | int startadresse;
|
25 | WDTCTL = WDTPW + WDTHOLD; // Stop WDT
|
26 | RS232init();
|
27 | P1SEL |= BIT6 + BIT7; // Assign I2C pins to USCI_B0
|
28 | P1SEL2|= BIT6 + BIT7; // Assign I2C pins to USCI_B0
|
29 |
|
30 |
|
31 |
|
32 | while(1){
|
33 |
|
34 | //Transmit process
|
35 | anzahlTXNachrichten=0; //setze gesendete Nach-richten auf 0
|
36 | anzahlRXNachrichten=0; //setze gesendete Nach-richten auf 0
|
37 | TXData[0]=0x00; //Sende an Register 0
|
38 | TXData[1]=0x51; //Schreibe "Messung in cm" auslösen
|
39 | TXByteCtr = 2; // Bytes die übertragen werden
|
40 | Setup_TX(0);
|
41 | Transmit();
|
42 | while (UCB0CTL1 & UCTXSTP); // Ensure stop condition got sent
|
43 | _delay_cycles(100000); //delay ca. 100ms
|
44 |
|
45 | for( startadresse=112; startadresse<112+USSensoren;startadresse++) //Lese 4 Sensoren aus
|
46 | {
|
47 | anzahlTXNachrichten=0; //setze gesendete Nach-richten auf 0
|
48 | anzahlRXNachrichten=0; //setze gesendete Nach-richten auf 0
|
49 | //Transmit process
|
50 | TXData[0]=0x02; //Sende an Register 2
|
51 | TXByteCtr = 1; // Load TX byte counter
|
52 | Setup_TX(startadresse);
|
53 | RPT_Flag = 1;
|
54 | Transmit();
|
55 | while (UCB0CTL1 & UCTXSTP); // Ensure stop condition got sent
|
56 |
|
57 | //Receive process
|
58 | RXByteCtr = 2; // lese zwei Bytes aus
|
59 | Setup_RX(startadresse);
|
60 | Receive();
|
61 |
|
62 |
|
63 | switch(startadresse){
|
64 | case 112: RS232SendeBuffer[0] = (char)RXData[1];
|
65 | break;
|
66 | case 113: RS232SendeBuffer[1] = (char)RXData[1];
|
67 | break;
|
68 | case 114: RS232SendeBuffer[2] = (char)RXData[1];
|
69 | break;
|
70 | case 115: RS232SendeBuffer[3] = (char)RXData[1];
|
71 | break;
|
72 | }
|
73 |
|
74 | while (UCB0CTL1 & UCTXSTP); // Ensure stop condition got sent
|
75 | }
|
76 | }
|
77 | }
|
78 |
|
79 | //-------------------------------------------------------------------------------
|
80 | // The USCI_B0 data ISR is used to move received data from the I2C slave
|
81 | // to the MSP430 memory. It is structured such that it can be used to receive
|
82 | // any 2+ number of bytes by pre-loading RXByteCtr with the byte count.
|
83 | //-------------------------------------------------------------------------------
|
84 | #pragma vector = USCIAB0TX_VECTOR
|
85 | __interrupt void USCIAB0TX_ISR(void)
|
86 | {
|
87 | if(RX == 1){ // Master Recieve?
|
88 | RXByteCtr--; // Decrement RX byte counter
|
89 | if (RXByteCtr)
|
90 | {
|
91 | RXData[anzahlRXNachrichten++] = UCB0RXBUF; // Move RX data to address PRxData
|
92 | }
|
93 | else
|
94 | {
|
95 | if(RPT_Flag == 0)
|
96 | UCB0CTL1 |= UCTXSTP; // No Repeated Start: stop condition
|
97 | if(RPT_Flag == 1){ // if Repeated Start: do nothing
|
98 | RPT_Flag = 0;
|
99 | }
|
100 | RXData[anzahlRXNachrichten++] = UCB0RXBUF; // Move RX data to address PRxData
|
101 | __bic_SR_register_on_exit(CPUOFF); // Exit LPM0
|
102 | }
|
103 | }
|
104 |
|
105 | else
|
106 | { // Master Transmit
|
107 | if (TXByteCtr) // Check TX byte counter
|
108 | {
|
109 | UCB0TXBUF = TXData[anzahlTXNachrichten++]; // Load TX buffer
|
110 | TXByteCtr--; // Decrement TX byte counter
|
111 | }
|
112 | else
|
113 | {
|
114 | if(RPT_Flag == 1){
|
115 | RPT_Flag = 0;
|
116 | __bic_SR_register_on_exit(CPUOFF);
|
117 | }
|
118 | else{
|
119 | UCB0CTL1 |= UCTXSTP; // I2C stop condition
|
120 | IFG2 &= ~UCB0TXIFG; // Clear USCI_B0 TX int flag
|
121 | __bic_SR_register_on_exit(CPUOFF); // Exit LPM0
|
122 | }
|
123 | }
|
124 | }
|
125 |
|
126 | }
|
127 |
|
128 | void Setup_TX(int USSensor){
|
129 | _DINT();
|
130 | RX = 0;
|
131 | IE2 &= ~UCB0RXIE;
|
132 | while (UCB0CTL1 & UCTXSTP); // Ensure stop condition got sent// Disable RX interrupt
|
133 | UCB0CTL1 |= UCSWRST; // Enable SW reset
|
134 | UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC; // I2C Master, synchronous mode
|
135 | UCB0CTL1 = UCSSEL_2 + UCSWRST; // Use SMCLK, keep SW reset
|
136 | UCB0BR0 = 30; // fSCL = SMCLK/12 = ~100kHz
|
137 | UCB0BR1 = 0;
|
138 | UCB0I2CSA = USSensor; // Slave Address is 048h
|
139 | UCB0CTL1 &= ~UCSWRST; // Clear SW reset, resume operation
|
140 | IE2 |= UCB0TXIE; // Enable TX interrupt
|
141 | }
|
142 | void Setup_RX(int USSensor){
|
143 | _DINT();
|
144 | RX = 1;
|
145 | IE2 &= ~UCB0TXIE;
|
146 | UCB0CTL1 |= UCSWRST; // Enable SW reset
|
147 | UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC; // I2C Master, synchronous mode
|
148 | UCB0CTL1 = UCSSEL_2 + UCSWRST; // Use SMCLK, keep SW reset
|
149 | UCB0BR0 = 30; // fSCL = SMCLK/12 = ~100kHz
|
150 | UCB0BR1 = 0;
|
151 | UCB0I2CSA = USSensor; // Slave Address is 0x70:112 0x71:113 0x72:114 0x73:115
|
152 | UCB0CTL1 &= ~UCSWRST; // Clear SW reset, resume operation
|
153 | IE2 |= UCB0RXIE; // Enable RX interrupt
|
154 | }
|
155 |
|
156 |
|
157 |
|
158 | void Transmit(void){
|
159 | while (UCB0CTL1 & UCTXSTP); // Ensure stop condition got sent
|
160 | UCB0CTL1 |= UCTR + UCTXSTT; // I2C TX, start condition
|
161 | __bis_SR_register(CPUOFF + GIE); // Enter LPM0 w/ interrupts
|
162 | }
|
163 | void Receive(void){
|
164 | while (UCB0CTL1 & UCTXSTP); // Ensure stop condition got sent
|
165 | UCB0CTL1 |= UCTXSTT; // I2C start condition
|
166 | __bis_SR_register(CPUOFF + GIE); // Enter LPM0 w/ interrupts
|
167 | }
|
168 |
|
169 | void RS232init(void)
|
170 | {
|
171 | if (CALBC1_1MHZ==0xFF) // If calibration constant erased
|
172 | {
|
173 | while(1); // do not load, trap CPU!!
|
174 | }
|
175 | DCOCTL = 0; // Select lowest DCOx and MODx settings
|
176 | BCSCTL1 = CALBC1_1MHZ; // Set DCO
|
177 | DCOCTL = CALDCO_1MHZ;
|
178 | P1SEL = BIT1 + BIT2 ; // P1.1 = RXD, P1.2=TXD
|
179 | P1SEL2 = BIT1 + BIT2 ; // P1.1 = RXD, P1.2=TXD
|
180 | UCA0CTL1 |= UCSSEL_2; // SMCLK
|
181 | UCA0BR0 = 104; // 1MHz 9600
|
182 | UCA0BR1 = 0; // 1MHz 9600
|
183 | UCA0MCTL = UCBRS0; // Modulation UCBRSx = 1
|
184 | UCA0CTL1 &= ~UCSWRST; // **Initialize USCI state machine**
|
185 | IE2 |= UCA0RXIE; // Enable USCI_A0 RX interrupt
|
186 |
|
187 | // __bis_SR_register(LPM0_bits + GIE); // Enter LPM0, interrupts enabled
|
188 |
|
189 | }
|
190 |
|
191 | #pragma vector=USCIAB0RX_VECTOR
|
192 | __interrupt void USCI0RX_ISR(void)
|
193 | {
|
194 | static int bufferCounter;
|
195 |
|
196 |
|
197 | while (!(IFG2&UCA0TXIFG)); // USCI_A0 TX buffer ready?
|
198 | //UCA0TXBUF = UCA0RXBUF;
|
199 |
|
200 | bufferCounter++;
|
201 |
|
202 | switch(bufferCounter){
|
203 |
|
204 | case 1: UCA0TXBUF = RS232SendeBuffer[0];
|
205 | break;
|
206 | case 2: UCA0TXBUF = RS232SendeBuffer[1];
|
207 | break;
|
208 | case 3: UCA0TXBUF = RS232SendeBuffer[2];
|
209 | break;
|
210 | case 4: UCA0TXBUF = RS232SendeBuffer[3];
|
211 | break;
|
212 | case 5:
|
213 | bufferCounter=0;
|
214 | IFG2 &= ~UCA0RXIFG;
|
215 | break;
|
216 | }
|
217 |
|
218 | //UCA0TXBUF = TX_StringRS232; // TX -> RXed character)
|
219 |
|
220 | //UCA0TXBUF = TX_StringRS232[2]; // TX -> RXed character)
|
221 | //UCA0TXBUF = TX_StringRS232[3]; // TX -> RXed character)
|
222 |
|
223 | }
|