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


von Wolfgang (Gast)


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

von Jörg S. (Gast)


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
}

von Wolfgang (Gast)


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

von Jörg S. (Gast)


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
}

von Wolfgang (Gast)


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

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.