mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik MSP430 --I2C -- Byte senden und empfangen


Autor: Wolfgang (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die größeren MSP430F1xx  z.B. MSP430F168 enthalten ein I2C modul mit dem 
eine Verbindung zu I2C tauglichen Geräten hergestellt werden kann.
In SLAU 049E finde ich einfach nichts, wie man ein Byte senden oder 
empfangen kann.
Bei SPI wird durch Laden des Sendebuffers, also  wenn ich schreibe (in 
C)
 TXBUF0 = 0x01;
das Byte 0x01 gesendet
Der Empfang ist bei SPI ähnlich.
Vielleicht kann mir jemand mal einen Hinweis geben, wie das bei I2C 
geht.
Mit freundlichen Grüßen
Wolfgang

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

Bewertung
0 lesenswert
nicht lesenswert
Ein kleines Beispiel von mir:

/*!
 * \brief Schreibfunktion für 1 Byte Daten auf I²C Bus EEPROM
 * \param adresse 2 Byte Adresse
 * \param daten_byte Daten Byte das geschrieben werden soll
 */
void I2C_write_byte_EEPROM (unsigned int adresse, unsigned char 
daten_byte)
{
  unsigned char adr_high;
  unsigned char adr_low;

  adr_high = adresse >> 8;
  adr_low = adresse & 0xFF;

  //  while (I2CDCTL&I2CBUSY);  // wait until I2C module has finished 
all operations

  I2CNDAT = 0x03;                           // 3 Byte senden
  I2CSA = EEPROM_I2C_ADDRESS;               // Slave Adresse

  U0CTL |= MST;                             // Master
  I2CTCTL |= I2CTRX + I2CSTT + I2CSTP;      // TX Mode, Start, Stop
  while ((I2CIFG & TXRDYIFG) == 0);         // Wait for transmitter
  I2CDRB = adr_high;                        // Adresse High-Byte
  while ((I2CIFG & TXRDYIFG) == 0);         // Wait for transmitter
  I2CDRB = adr_low;                         // Adresse Low_Byte
  while ((I2CIFG & TXRDYIFG) == 0);         // Wait for transmitter
  I2CDRB = daten_byte;                      // Daten
  //while ((I2CTCTL & I2CSTP) == I2CSTP);   // Auf Stop warten
  while ((I2CIFG & ARDYIFG) == 0);          // Warten bis I2CNDAT Anzahl

  I2CIFG=0x00;                              // Clear I2C interrupt Flags
}

Autor: Wolfgang (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke
Aha, wenn ich I2CDRB mit daten_byte lade, wird das Byte ausgegeben.
und wie kann ich ein Byte empfangen? z.B. einen Temperaturfühler 
abfragen
Wolfgang

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

Bewertung
0 lesenswert
nicht lesenswert
Meine Funktionen basieren eigentlich hauptsächlich auf den TI 
Beispielen. Da solltest du mal reinschauen:
http://www-s.ti.com/sc/techzip/slac015.zip


/*!
 * \brief Lesefunktion für 1 Byte Daten von I²C Bus EEPROM
 * \param adresse 2 Byte Adresse
 * \param daten_byte Pointer auf Daten Byte
 */
void I2C_read_byte_EEPROM (unsigned int adresse, unsigned char 
*daten_byte)
{
  unsigned char adr_high;
  unsigned char adr_low;

  adr_high = adresse >> 8;
  adr_low = adresse & 0xFF;

//  while (I2CDCTL&I2CBUSY);  // wait until I2C module has finished all 
operations

  I2CNDAT = 0x02;                           // 2 Byte senden
  I2CSA = EEPROM_I2C_ADDRESS;               // Slave Adresse

  U0CTL |= MST;                             // Master
  I2CTCTL |= I2CTRX + I2CSTT;               // TX Mode, Start (kein 
Stop!)
  while ((I2CIFG & TXRDYIFG) == 0);         // Wait for transmitter
  I2CDRB = adr_high;                        // Adresse High-Byte
  while ((I2CIFG & TXRDYIFG) == 0);         // Wait for transmitter
  I2CDRB = adr_low;                         // Adresse Low_Byte
  while ((I2CIFG & ARDYIFG) == 0);          // Warten bis alle Daten 
raus

  I2CNDAT = 0x01;                           // 1 Byte empfangen
  U0CTL |= MST;                             // Master mode
  I2CTCTL &= ~I2CTRX;                       // RX Mode
  I2CTCTL |= I2CSTT + I2CSTP;               // Start, Stop
  //while ((I2CIFG & RXRDYIFG) == 0);       // Wait for Receiver
  //while ((I2CIFG & ARDYIFG) == 0);        // Warten bis I2CNDAT anzahl
  while ((I2CTCTL & I2CSTP) == I2CSTP);     // Auf Stop warten
  *daten_byte = I2CDRB;                     // Daten holen

  I2CIFG=0x00;                              // Clear I2C interrupt Flags
}

Autor: Wolfgang (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke Jörg
jetzt geht es bestimmt vorwärts,
in meiner Beispielendatei slac015 konnte ich nichts finden, da die Datei 
von 2004 noch keine Beispiel mit I2C enthielt

Wolfgang

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.