MSP430 --I2C -- Byte senden und empfangen

Gast #493549
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
Gast
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
}
Gast
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
Gast
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
}
Gast
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

Eine eigene Frage? Dieser Thread ist über 19 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.