I2C mit dem MSP430 in Hardware - es passiert nichts!

Gast #3297645
Lesenswert?

Hallo zusammen!

Ich möchte meinen MSP430G2553 mit anderen Geräten per I2C verbinden. Um 
erstmal grundsätzlich zu sehen wie das (seitens MSP430) funktioniert, 
habe ich mir einen Beispielcode von MSP430ware besorgt 
(msp430g2xx3_uscib0_i2c_06). Er soll laut Beschreibung als Master 
versuchen ein Byte zum Slave zu schicken.
1
#include <msp430.h>
2

3
unsigned char TXData;
4
unsigned char TXByteCtr;
5

6
int main(void)
7
{
8
  WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
9
  P1SEL |= BIT6 + BIT7;                     // Assign I2C pins to USCI_B0
10
  P1SEL2|= BIT6 + BIT7;                     // Assign I2C pins to USCI_B0
11
  UCB0CTL1 |= UCSWRST;                      // Enable SW reset
12
  UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC;     // I2C Master, synchronous mode
13
  UCB0CTL1 = UCSSEL_2 + UCSWRST;            // Use SMCLK, keep SW reset
14
  UCB0BR0 = 12;                             // fSCL = SMCLK/12 = ~100kHz
15
  UCB0BR1 = 0;
16
  UCB0I2CSA = 0x48;                         // Slave Address is 048h
17
  UCB0CTL1 &= ~UCSWRST;                     // Clear SW reset, resume operation
18
  IE2 |= UCB0TXIE;                          // Enable TX interrupt
19

20
  TXData = 0x00;                            // Holds TX data
21

22
  while (1)
23
  {
24
    TXByteCtr = 1;                          // Load TX byte counter
25
    while (UCB0CTL1 & UCTXSTP);             // Ensure stop condition got sent
26
    UCB0CTL1 |= UCTR + UCTXSTT;             // I2C TX, start condition
27
    __bis_SR_register(CPUOFF + GIE);        // Enter LPM0 w/ interrupts
28
                                            // Remain in LPM0 until all data
29
                                            // is TX'd
30
    TXData++;                               // Increment data byte
31
  }
32
}
33

34
//------------------------------------------------------------------------------
35
// The USCIAB0TX_ISR is structured such that it can be used to transmit any
36
// number of bytes by pre-loading TXByteCtr with the byte count.
37
//------------------------------------------------------------------------------
38
#pragma vector = USCIAB0TX_VECTOR
39
__interrupt void USCIAB0TX_ISR(void)
40
{
41
  if (TXByteCtr)                            // Check TX byte counter
42
  {
43
    UCB0TXBUF = TXData;                     // Load TX buffer
44
    TXByteCtr--;                            // Decrement TX byte counter
45
  }
46
  else
47
  {
48
    UCB0CTL1 |= UCTXSTP;                    // I2C stop condition
49
    IFG2 &= ~UCB0TXIFG;                     // Clear USCI_B0 TX int flag
50
    __bic_SR_register_on_exit(CPUOFF);      // Exit LPM0
51
  }
52
}

aber es tut sich nichts! An Pin 22 und 23 passiert leider garnichts. 
Kann mir da bitte jemand helfen?

Vielen Dank schon mal!
#3298546
Lesenswert?

-TXByteCtr auf >1 setzen macht keinen Unterschied.
-Pins müssten zu Ports passen, da es ein MSP430ware Beispielcode für 
g2x53 ist. Der Port heißt im Datenblatt bei der Pinbeschriftung "UCB0", 
was eine Abkürzung für das in der Codebeschreibung "USCI_B0" genannte 
sein müsste.
-Was meinst du mit SMCLK vorhanden? Die ist doch immer vorhanden oder?
-Der Interrupt wird aufgerufen und die if-Schleife darin wird ausgeführt 
(TXByteCtr != 0). Das Programm führt auch die von dir genannte While 
Schleife aus.
#3298617
Lesenswert?

-Externe Pullups habe ich nicht dran, hatte das mal vor na weile 
ausprobiert und es änderte nichts. Deshalb habe ich auch die Adresse 
nicht angepasst.
-Momentan habe ich kein weiteres I2C Gerät angeschlossen, ich prüfe 
direkt mit dem Oszilloskop die beiden Ports.
#3298774
Lesenswert?

Ja, nutze das Launchpad, aber ich habe leider den G2452 nicht 
greifbar... Der Beispielcode seitens TI dazu sieht aber komplett anders 
aus! Ich habe übrigens mal SMCLK an P1.4 gelegt und gemessen - kein 
Signal! Wie kann das sein, wo doch SMCLK ab Start auf ~1Mhz lieg? ACLK 
funktioniert auf P1.0. Code dafür:
1
P1DIR |= BIT4 + BIT0;
2
P1SEL |= BIT4 + BIT0;
#3303304
Lesenswert?

@Martin: Ich habe es mit 2 verschiedenen G2553 getestet, bei beiden das 
selbe Verhalten.

@DirkZ: die Jumper waren beide gesetzt, aber auch nach dem entfernen 
sehe ich nur einen Puls an P1.0 und nichts an P1.4 (wo SMCLK sein 
müsste). Evtl könnte das auch daran liegen, dass meine Analogbandbreite 
vom Oszi nicht groß genug ist, SMCLK müsste ja auf ca 1Mhz liegen und 
das ist glaube ich zu viel. Aber warum dann kein SCL? Das soll ja nur 
100kHz haben...
Gast #3304837
Lesenswert?

vergiß die internen Pull-Ups und verwende externe Widerstände.

Die internen PullUps sind OK wenn du den Pin als normalen IO verwendest 
und dahinter irgendeine digitale Logic hängen hast.

Für I2C reichen die Pull-Ups nicht aus - das Problem hatte ich mal mit 
einem MSP430F2272...

Du siehst wohl am Oszi ganz kleine Spannungs-spikes, richtig?
Gast #3306077
Lesenswert?

und mit 10k wie im Bsp?

//  *** to be used with "msp430g2xx3_uscib0_i2c_06.c" ***
//
//                                /|\  /|\
//               MSP430G2xx3      10k  10k     MSP430G2xx3
//                   slave         |    |        master
//             -----------------   |    |  -----------------
//           -|XIN  P1.7/UCB0SDA|<-|---+->|P1.7/UCB0SDA  XIN|-
//            |                 |  |      |                 |
//           -|XOUT             |  |      |             XOUT|-
//            |     P1.6/UCB0SCL|<-+----->|P1.6/UCB0SCL     |
//            |                 |         |                 |
//

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