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
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 }
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
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 }
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.