www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik MSP430f2274 USCI I2C


Autor: Mitch B. (gnu)
Datum:

Bewertung
0 lesenswert
nicht 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.

#include "msp430x22x4.h"

#define SDA_PIN 0x02                  // UCB0SDA pin
#define SCL_PIN 0x04                  // UCB0SCL pin

unsigned int slave_address;
unsigned int prescale;

int main( void )
{
  // Stop watchdog timer to prevent time out reset
  WDTCTL = WDTPW + WDTHOLD;

  slave_address = 0x50;
  prescale = 0x11;
  
  BCSCTL1 = CALBC1_8MHZ; 
  DCOCTL = CALDCO_8MHZ;

  while(1){
  // Transmit Init
     P3SEL |= SDA_PIN + SCL_PIN;        // Assign I2C pins to USCI_B0
     UCB0CTL1 = UCSWRST;                // Enable SW reset
     UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC; // I2C Master, synchronous mode
     UCB0CTL1 = UCSSEL_2 + UCSWRST;        // Use SMCLK, keep SW reset
     UCB0BR0 = prescale;                // set prescaler
     UCB0BR1 = 0;
     UCB0I2CSA = slave_address;         // Set slave address
     UCB0CTL1 &= ~UCSWRST;           // Clear SW reset, resume operation
     UCB0I2CIE = UCNACKIE;
     IE2 = UCB0TXIE;                   // Enable TX ready interrupt

     UCB0CTL1 |= UCTR + UCTXSTT;       // Transmit Mode + Start Cond.

     UCB0TXBUF = 0x44;                 // Transmit something
 
  }
}

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

Autor: szimmi (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: Mitch B. (gnu)
Datum:

Bewertung
0 lesenswert
nicht 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.
 while (1)
  {
    UCB0CTL1 |= UCTR + UCTXSTT;             // I2C TX, start condition
    UCB0TXBUF = 0x44; 
    
    i = 500;                              // SW Delay
    do i--;
    while (i != 0);
  }
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....?

Autor: Jörg S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Mitch B. (gnu)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Mitch B. (gnu)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Sobald ich die I2C Pins initialisiere
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....

Autor: Mitch B. (gnu)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Gerald (Gast)
Datum:

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

LG

Autor: Anton G. (anton_g)
Datum:

Bewertung
0 lesenswert
nicht 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).

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.