Forum: Mikrocontroller und Digitale Elektronik MSP430f2274 USCI I2C


von Mitch B. (gnu)


Lesenswert?

Hallo,

ich bin dabei 2 MSP430F2274 über I2C zu verbinden.
Als Beispiel habe ich die TI Application Note "Using the USCI I2C Master 
(slaa382.pdf)" genommen.
Allerdings haperts schon beim I2C Master.

Die SDA und SCL Pins der Controller sind miteinander verbunden und an 2 
10kOhm PullUp Widerständen gegen 3,3V angeschlossen.

Die beiden Leitungen des Busses sind an ein Oszi angeschlossen.
Wenn ich die Pins per Software einfach toggle (P3OUT^= 0x06) kann ich 
das auf dem Oszi schön erkennen - auch mit den 10k 
PullUp-Widerständen...

Für Testzwecke habe ich folgenden Code erstellt.
Der Master wird als I2C Master (Transmitt) initialisiert und soll dann 
Daten ausgeben UCB0TXBUF = 0x44.
Das ganze in der While-Schleife, so dass es sich wiederholt und ggf. auf 
dem Oszi erkennbar ist.

1
#include "msp430x22x4.h"
2
3
#define SDA_PIN 0x02                  // UCB0SDA pin
4
#define SCL_PIN 0x04                  // UCB0SCL pin
5
6
unsigned int slave_address;
7
unsigned int prescale;
8
9
int main( void )
10
{
11
  // Stop watchdog timer to prevent time out reset
12
  WDTCTL = WDTPW + WDTHOLD;
13
14
  slave_address = 0x50;
15
  prescale = 0x11;
16
  
17
  BCSCTL1 = CALBC1_8MHZ; 
18
  DCOCTL = CALDCO_8MHZ;
19
20
  while(1){
21
  // Transmit Init
22
     P3SEL |= SDA_PIN + SCL_PIN;        // Assign I2C pins to USCI_B0
23
     UCB0CTL1 = UCSWRST;                // Enable SW reset
24
     UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC; // I2C Master, synchronous mode
25
     UCB0CTL1 = UCSSEL_2 + UCSWRST;        // Use SMCLK, keep SW reset
26
     UCB0BR0 = prescale;                // set prescaler
27
     UCB0BR1 = 0;
28
     UCB0I2CSA = slave_address;         // Set slave address
29
     UCB0CTL1 &= ~UCSWRST;           // Clear SW reset, resume operation
30
     UCB0I2CIE = UCNACKIE;
31
     IE2 = UCB0TXIE;                   // Enable TX ready interrupt
32
33
     UCB0CTL1 |= UCTR + UCTXSTT;       // Transmit Mode + Start Cond.
34
35
     UCB0TXBUF = 0x44;                 // Transmit something
36
 
37
  }
38
}

An den Pins passiert allerdings nichts.
Es wird weder während der Initialisierung die Adresse des Slaves über 
den Bus geschickt, noch irgendetwas anderes.
Die SDA Leitung ist ohne Veränderung high und die SCL Leitung low.

Ich weiß leider nicht mehr weiter. Bin für jede Hilfe dankbar.

Vielen Dank,

Mitch

von szimmi (Gast)


Angehängte Dateien:

Lesenswert?

Da liegen mehrere Dinge im Argen. Du hast die Initialisierung in der 
while-Schleife. Das heisst, selbst wenn er was senden wollte, kommt er 
nicht dazu, weil du nach dem Senden gleich wieder initialisierst. Schau 
Dir mal das Beispiel im Anhang an.
Übernimm das mal mit den notwendigen Anpassungen. Dann sollte was 
rauskommen.

von Mitch B. (gnu)


Lesenswert?

Danke für den Tipp mit der Initialisierung.
Ich habe die Initialisierung nun vor die while-Schleife geschrieben und 
in die While-Schleifen ein Delay eingebaut.
1
 while (1)
2
  {
3
    UCB0CTL1 |= UCTR + UCTXSTT;             // I2C TX, start condition
4
    UCB0TXBUF = 0x44; 
5
    
6
    i = 500;                              // SW Delay
7
    do i--;
8
    while (i != 0);
9
  }
Allerdings habe ich noch immer keinen sichtbaren Effekt.

Wie kann ich den Master "zwingen" etwas über den Bus auszugeben?
An welcher Stelle kann der Bus für die USCI Hardware blockiert sein, so 
dass der Master nichts tut?
Es sollte doch auch ohne Slave möglich sein an den Pins des Masters 
Pegeländerungen abzulesen....?

von Jörg S. (Gast)


Lesenswert?

> Es sollte doch auch ohne Slave möglich sein an den Pins des Masters
> Pegeländerungen abzulesen....?
Ja.

Die Pins evt. noch auf Ausgang stellen?

von Mitch B. (gnu)


Lesenswert?

Ich kann tun was ich will... es kommen keine Signale über den Bus.

Ich habe jetzt auch mal die Codebeispiele
msp430x22x4_uscib0_i2c_08.c - Master TX multiple bytes
msp430x22x4_uscib0_i2c_09.c - Slave RX multiple bytes
von http://www.ti.com/litv/zip/slac144
auf die Controller geladen. Allerdings erfolglos. Die sollten ja 
eigentlich funktionieren...?

Den Hardwareaufbau habe ich erfolgreich mit 2 MSP430F2013 und dessen USI 
I2C kontrolliert. Dort funktioniert es. Dort kann ich am Oszi auch 
hervorragend die Übertragung verfolgen. Mit dem F2274 bleibt es still.

Gibt es noch irgendwelche Einstellungen (Register) außerhalb der USCI 
I2C Routinen die initialisiert werden müssen? Im Handbuch der 
MSP430x2xxx Familie konnte ich auch nichts weiter finden...
Kann es sein, dass der Bus durch irgendetwas blockiert wird?
Hat schonmal jemand gleiche Erfahrungen gemacht?
Ich zweifle bald an der Hardware...

Grüße,

Mitsch

von Mitch B. (gnu)


Angehängte Dateien:

Lesenswert?

Sobald ich die I2C Pins initialisiere
1
P3SEL |= SDA_PIN + SCL_PIN;        // Assign I2C pins to USCI_B0
geht die SDA Leitung auf LOW
und die SCL Leitung auf High.

Sollten nicht beide Leitungen auf High sein?


Kann ich für I2C am F2274 auch andere Pins nehmen anstatt P3.1 SDA und 
P3.2 SDL? Ich befürchte nein, will nur sicher gehen.
Wenn ich P3.0 als SDA nehme habe ich "Signale" auf dem Oszi (High | Low 
übergang auf High) und das wiederholt sich alle 30 µs. SCL bleibt 
annähernd High.
Andere Pinbelegungen sind auch nicht sinnvoller...

Ich weiß nicht was ich noch falsch machen könnte...???

Hab schon mehrere Controller durchprobiert. Immer das gleiche 
Phänomen...
Testcode im Anhang.
Andere TI Beispiele funktionieren auch nicht....

von Mitch B. (gnu)


Lesenswert?

USCI I2C auf dem MSP340-RF2500 Target Board mit MSP430F2274 geht doch. 
;-)

Falls es in Zukunft mal jemanden interessieren sollte...

Auf dem Target Board sitzt noch ein Funkchip (C2500). Dieser ist Chip 
select und an die gleiche interne Hardware wie das I2C gekoppelt.
Setzt man vor der Initialisierung der I2C Pins P3.1, P3.2 alle Pins die 
der C2500 benutzen würde auf High (P3.0 - P3.3) schaltet man den 
Funkchip damit aus. Wahrscheinlich reicht auch die CS Leitung, 
allerdings habe ich beim herumprobieren damit nicht 100% voraussagbare 
Ergebnisse erzielt.
Er stört so den I2C Bus nicht und die Signale laufen wie von selbst.

von Gerald (Gast)


Lesenswert?

Hi, braucht man fuer USCI einen externen Oscillator wenn man den UART 
mode verwenden will?

LG

von Anton G. (anton_g)


Lesenswert?

Nein brauch man nicht wenn man den DCO anlässt, oder niedrige boadrate 
mit dem VLO nutzt.

DCO anlassen hast im LP0 zu gehn (CPU off).

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.