UART per USCI zwischen zwei MSP430-F2274

Gast #3115450
Lesenswert?

Hi Leute,
ich kriege es einfach nicht hin eine UART-Kommunikation zwischen zwei 
F2274 aufzubauen. Hab schon viel rumprobiert, aber es funktioniert 
überhaupt nicht so wie ich es mir gedacht habe.
Und zwar sollen erst einmal nur die zwei µCs mit einander reden. Der 
eine sendet dem anderen ein Byte. Im Debugger (IAR) setze ich in einen 
Breakpoint in der Rx ISR. Aber die wird nie angesprungen.

Hier der Code für den Transmitter. Er soll permanent das selbe, 
willkürliche, Byte versenden:
1
#include "msp430x22x4.h"
2

3
void main(void)
4
{
5
  WDTCTL = WDTPW + WDTHOLD;      // Stop watchdog timer
6
  BCSCTL1 = CALBC1_8MHZ;   // DCO auf 12MHz einstellen
7
  DCOCTL = CALDCO_8MHZ;          // DCO auf 12MHz einstellen
8
  P1DIR = 0xFF;
9
  P3SEL = 0x30;                  // P3.4,5 = USCI_A0 TXD/RXD
10
  UCA0CTL1 |= UCSSEL_2;          // CLK = SMCLK
11
  UCA0BR0 = 0x41;                // 8MHz/9600 = 833,33
12
  UCA0BR1 = 0x3;
13
  UCA0MCTL = UCBRS_2;           
14
  UCA0CTL1 &= ~UCSWRST;          // **Initialize USCI state machine**
15
  IE2 |= UCA0RXIE;    // Enable USCI_A0 TX/RX interrupt
16

17
  _EINT();
18
  
19
  while(1);
20
}
21

22
// USCI A0/B0 Transmit ISR
23
#pragma vector=USCIAB0TX_VECTOR
24
__interrupt void USCI0TX_ISR(void)
25
{
26
  UCA0TXBUF = 0x81;           
27
}

Und hier der Code für den Receiver. Dort soll halt ienfach mal die ISR 
angesprungen werden. Im Debugger schaue ich mir dann den RxBuffer an. 
Dort sollte dann ja 0x81 drinstehen, wenn alles geklappt hat:
1
#include "msp430x22x4.h"
2

3
void main(void)
4
{
5
  WDTCTL = WDTPW + WDTHOLD;      // Stop watchdog timer
6
  BCSCTL1 = CALBC1_8MHZ;   // DCO auf 12MHz einstellen
7
  DCOCTL = CALDCO_8MHZ;          // DCO auf 12MHz einstellen  
8
  P1DIR = 0xFF;
9
  P3SEL = 0x30;                  // P3.4,5 = USCI_A0 TXD/RXD
10
  UCA0CTL1 |= UCSSEL_2;          // CLK = SMCLK
11
  UCA0BR0 = 0x41;                // 8MHz/9600 = 833,33
12
  UCA0BR1 = 0x3;
13
  UCA0MCTL = UCBRS_2;            
14
  UCA0CTL1 &= ~UCSWRST;          // **Initialize USCI state machine**
15
  IE2 |= UCA0RXIE;              // Enable USCI_A0 TX/RX interrupt
16

17
  _EINT();
18
  
19
  while(1);
20
  
21
}
22

23

24

25
// USCI A0/B0 Receive ISR
26
#pragma vector=USCIAB0RX_VECTOR
27
__interrupt void USCI0RX_ISR(void)
28
{
29
    P1OUT = 0x01; 
30
}

Bitte Leute, was mache ich falsch? Vielen Dank schon für eure Hilfe.
Gast #3115654
Lesenswert?

Geht den der Sender in den TX-Interrupt überhaupt rein? Du solltest ja 
vielleicht vor deiner Endlosschleife erstmal manuell ein Byte in den 
Puffer schreiben, damit das ganze anläuft. Oder ist das Flag von Anfang 
an gesetzt und er springt rein? Kann auch sein, müsste sogar...


ABER: Darüber hinaus setzt du auch beim Sender das RXIE und nicht TX. 
Insofern kann schon die ISR garnicht funktionieren. Schau mit IAR 
erstmal hier, dann den Empfänger.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren