Forum: Mikrocontroller und Digitale Elektronik I2C mit dem MSP430 in Hardware - es passiert nichts!


von GinTonic (Gast)


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!

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Pullups an SCK und SDA vorhanden?

von MSP ist gut (Gast)


Lesenswert?

Setzte einmal den Co unter auf einen Wert größer 1.

von GinTonic (Gast)


Lesenswert?

@Rufus: Wenn ich die internen Pullups aktiviere dann tut sich leider 
auch nichts, außer dass beide dann auf 3,3V liegen.

@MSP ist gut: Meinst du TXByteCtr?

von Max G. (l0wside) Benutzerseite


Lesenswert?

- Passen die Pins zu den Ports (im Datenblatt geprüft)?
- Ist SMCLK vorhanden?
- Wie weit kommt dein Programm (mit dem Debugger prüfen)? Hängt es schon 
bei while (UCB0CTL1 & UCTXSTP);, oder kommt nur der Sendeinterrupt 
nicht?

Max

von ma r. (gintonic)


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.

von Eumel (Gast)


Lesenswert?

GinTonic schrieb:
> @Rufus: Wenn ich die internen Pullups aktiviere dann tut sich leider
> auch nichts, außer dass beide dann auf 3,3V liegen.

Er meint die externen die zu I2C dazugehören.

von Martin (Gast)


Lesenswert?

Hi,

hängt am I2C auch ein Endgerät dran und passt die Adresse?
Wie hast du festgestellt, dass sich nichts tut - Oszilloskop, 
Multimeter?

VG
Martin

von ma r. (gintonic)


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.

von Martin (Gast)


Lesenswert?

Nutzt du das Launchpad?
Ersetz mal den MSP durch den anderen, der dem Launchpad beiliegt

von ma r. (gintonic)


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;

von ma r. (gintonic)


Lesenswert?

Ich habe gerade festgestellt dass ACLK doch nicht funktioniert, da 
kommen nur Peaks und eigentlich müsstes es ja ein Rechtecksignal sein... 
Ich glaube mein Launchpad ist kaputt

von Martin (Gast)


Lesenswert?

wahrscheinlich nicht das Launchpad sondern der MSP.
Hatte ich leider auch schon

von DirkZ (Gast)


Lesenswert?

ma re schrieb:
> Ja, nutze das Launchpad,

Hast Du den Jumper 1.6 (LED2) abgezogen?

von ma r. (gintonic)


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...

von DirkZ (Gast)


Lesenswert?

Nach dem Schaubild

https://github.com/energia/Energia/wiki/Hardware

geht I2C nur an P1.6 u.1.7 und  msp430g2553.pdf, Seite 7.


Und auf die Angabe ca. 1.2 MHz verlass' ich mich nicht. Genau (auf 25°C 
kalibriert) 1 MHz:


BCSCTL1 = CALBC1_1MHZ;
DCOCTL = CALDCO_1MHZ;


// UCB0BR0 = 12;                      // fSCL = SMCLK/12 = ~100kHz


UCB0BR0 = 10;                      // fSCL = SMCLK/10 = ~100kHz

von ma r. (gintonic)


Lesenswert?

Ja, geht nur an P1.6 und P1.7. Da sollte dann ja auch eigentlich was zu 
sehen sein, dem Code nach, den ich oben gepostet habe. Leider kommt aber 
mit den zwei Zeilen auch kein Signal.

von christoph (Gast)


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?

von ma r. (gintonic)


Lesenswert?

Christoph, ich habe deinen Rat befolgt (2 Pullups mit jeweils 1kOhm), 
die Situation ist die selbe (konstante 3.3V). Ich sehe auch keine 
kleinen Spannungspeaks (weder an sda noch an scl). Wenn ich die Pullups 
abziehe liegen beide Pegel auf 0V.

von DirkZ (Gast)


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

von ma r. (gintonic)


Lesenswert?

10k muss ich erst kaufen ;)

von ma r. (gintonic)


Lesenswert?

edit: Habe es mit einem Potentiometer (auf 10k) probiert und es bleibt 
alles wie gehabt.

Habe gerade bemerkt, dass das Programm bei
1
     while (UCB0CTL1 & UCTXSTP);             // Ensure stop condition got sent
hängen hängen bleibt.

von Mrs MSP (Gast)


Lesenswert?


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.