Forum: Mikrocontroller und Digitale Elektronik MSP430G2553 Master Transmitter geht nicht


von Smazze (Gast)


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

von Easylife (Gast)


Lesenswert?

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

Solltest du aber tun, und zwar 2.2K, nicht 10K.

von Smazze (Gast)


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 :/

von Smazze (Gast)


Lesenswert?

Scheint erstmal zu klappen!!!
Wunderbar xD
DANKE!!!

glaub du hast mir viel Zeit und nerven gespaart ;))

von Easylife (Gast)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.