MSP430G2553 Master Transmitter geht nicht

Gast #3661124
Lesenswert?

Hallo Freunde,
ich möchte Daten vom Master zum Slave senden (MSP430G2553).
Mein Programm sieht folgendermaßen aus:

Mein Programm sieht folgendermaßen aus:
                     /|\  /|\
//               MSP430G2xx3      10k  10k     MSP430G2xx3
//                   slave         |    |        master
//             -----------------   |    |  -----------------
//           -|XIN  P1.7/UCB0SDA|<-|---+->|P1.7/UCB0SDA  XIN|-
//            |                 |  |      |                 |
//           -|XOUT             |  |      |             XOUT|-
//            |     P1.6/UCB0SCL|<-+----->|P1.6/UCB0SCL     |
//            |                 |         |                 |
//

//********************************************************************** 
********
#include <msp430.h>

char SLV_Addr = 0x90;
unsigned char TXData;
unsigned char TXByteCtr;
int test = 0;

int main(void)
{
  WDTCTL = WDTPW + WDTHOLD;                 //   Stop WDT

//Universal Serial Communication Interface

//Initialization and Reset (452 SLAU144J) The USCI_Bx modules suppport 
I2C
    // 1. Set UCSWRST
    UCB0CTL1 |= UCSWRST;                      //   Enable SW reset
    //2. Initialize all USCI register with UCSWRST = 1
    UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC;     //   I2C Master, 
,synchronous mode


    UCB0CTL1 = UCSSEL_2 + UCSWRST;            //   Use SMCLK, keep SW 
reset (SMCLK)


    UCB0BR0 = 12;                             //  bit rate control 
register 0   fSCL = SMCLK/12 = ~100kHz
    UCB0BR1 = 0;                //  bit rate control register 1

    UCB0I2CSA = SLV_Addr;                         //Slave Address is 
048h
                          //size of Slave-Adress
    //3. Configure Ports
    P1SEL |= BIT6 + BIT7;                     //   Assign I2C pins to 
USCI_B0   Selektionsregister  0 – Digital‐IO
    P1SEL2|= BIT6 + BIT7;                     // 
1 – Funktionsbaustein
    P1REN |= 0xC0;                           // P1.6 & P1.7 Pullups
    //4. Clear UCSWRST
    UCB0CTL1 &= ~UCSWRST;                     //   Clear SW reset, 
resume operation
    //5. Enable interrupts
    IE2 |= UCB0TXIE;                          //   Enable TX interrupt


    //I2C Master Transmitter Mode (459 SLAU144J)

    TXData = 0x00;                            // Holds TX data






  while (1)
  {
    TXByteCtr = 1;                          // Load TX byte counter
    while (UCB0CTL1 & UCTXSTP);             // Ensure stop condition got 
sent
    while (!(IFG2 & UCB0TXIFG));  // Wait while IFG is low
    UCB0CTL1 |= UCTR + UCTXSTT;             // I2C TransmitterMode, 
start condition
    __bis_SR_register(CPUOFF + GIE);        // Enter LPM0 w/ interrupts
                                            // Remain in LPM0 until all 
data
                                            // is TX'd
    TXData++;                               // Increment data byte
  }
}

//---------------------------------------------------------------------- 
--------
// The USCIAB0TX_ISR is structured such that it can be used to transmit 
any
// number of bytes by pre-loading TXByteCtr with the byte count.
//---------------------------------------------------------------------- 
--------
#pragma vector = USCIAB0TX_VECTOR
__interrupt void USCIAB0TX_ISR(void)
{
  test++;
  if (TXByteCtr)                            // Check TX byte counter
  {
    UCB0TXBUF = TXData;                     // Load TX buffer
    TXByteCtr--;                            // Decrement TX byte counter
  }
  else
  {
    UCB0CTL1 |= UCTXSTP;                    // I2C stop condition
    IFG2 &= ~UCB0TXIFG;                     // Clear USCI_B0 TX int flag
    __bic_SR_register_on_exit(CPUOFF);      // Exit LPM0
  }
}


Es orientiert sich stark an dem Beispiel von TI.

Wenn ich das richtig sehe prüfe ich mit
while (!(IFG2 & UCB0TXIFG));  // Wait while IFG is low
ob die Startbedingungen erfüllt sind:
-bus available, generate Start condition, transmits slave adress.

In dieser Schleife häng ich fest.
Das heißt das irgendwas nicht mit den Startbedinungen stimmt?

Wäre nett wenn mir einer helfen könnte.

PS: externe Widerstände hab ich nun wegen P1REN nicht angeschlossen.

Gruß
Smazze
Gast #3661220
Lesenswert?

Danke für die Antwort.
Hatte vor ein paar Tagen mit 2 MSP430G2331 rumgespielt.
Da lief das mit den beiden PREN xD
Allerdings ist das auch USI ?^^

Einfach beim Master zwischen VCC und Clock und Datenleitung die 
Widerstände anbring?

Weißt du ob auch auch 2kOhm reichen?
2,2 hab ich grad nicht hier :/
Gast #3661284
Lesenswert?

:-)

2K gehen auch. 2.2K wird von Phillips empfohlen für VCC=3.3V, für VCC=5V 
sollten es 4.7K sein.
10K macht halt die steigenden Flanken u.U. so rund, dass keine 
gesicherte Kommunikation möglich ist. Und eingebaute Pullups sind 
meistens sogar noch hochohmiger, also total unbrauchbar.
Mit deinen 2K Widerständen fließt jetzt halt 0.15mA mehr Strom ggü. 2K2 
-> also egal.

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