- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 10 von 11

Thema: I2C Kommunikation zwischen Nucleo STM32F103RBT6 und Sensor Honeywell HIH9120

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    30.04.2012
    Beiträge
    13

    I2C Kommunikation zwischen Nucleo STM32F103RBT6 und Sensor Honeywell HIH9120

    Hallo zusammen,

    ich versuche ein Temperatur- und Feuchtigkeitssensor mit dem Entwicklungsboard Nucleo STM32 zu verbinden. Dieser Sensor lässt sich mit I2C ansprechen und die Adresse ist laut Datenblatt 0x27. Nun arbeite ich mit dem mbed Compiler und habe folgendes Programm zur Kommunikation.

    Mein Programmcode sieht wie folgt aus:
    #include "mbed.h"
    I2C i2c(PB_11, PB_10);

    const int addr = 0x27;

    int main() {
    char cmd[2];
    while (1) {
    cmd[0] = 0x01;
    cmd[1] = 0x00;
    i2c.write(addr, cmd, 1);

    wait_ms(10);
    }
    }


    Mit einem Logic Analyzer nehme ich die Kommunikation auf um mein Problem zu beheben und stelle folgendes fest:
    - Bei einer eingegebenen Adresse addr=0x26 spricht der Mikrocontroller eine Adresse 0x26 an
    - Bei einer eingegebenen Adresse addr=0x27 spricht der Mikrocontroller eine Adresse 0x28 an
    - Bei einer eingegebenen Adresse addr=0x28 spricht der Mikrocontroller eine Adresse 0x28 an

    Das ist in meinen Augen extrem merkwürdig und ich kann mir da nicht weiterhelfen. Hat jemand Erfahrung mit dem Entwicklungsboard und kann mir bei dem Fehler auf die Sprünge helfen?

    Danke für Hilfestellungen im voraus!

    Angehangen das Screenshot des Logic Analyzers bei addr=0x27

    Klicke auf die Grafik für eine größere Ansicht

Name:	screenshot.jpg
Hits:	10
Größe:	55,9 KB
ID:	30223
    Geändert von Klacknack (02.06.2015 um 06:37 Uhr)

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    04.09.2011
    Ort
    Hessen
    Beiträge
    707
    Hallo,

    eigentlich hat eine I2C-Adresse nur 7 Bit, das 8. zeigt an, ob gelesen oder geschrieben wird. Die mbed Implementierungen von read und write mit mehreren Parametern erwarten eine 8-Bit Adresse. Da steht ja auch in der Doku
    The mbed API uses 8 bit addresses, so make sure to take that 7 bit address and left shift it by 1 before passing it.
    bei read
    address 8-bit I2C slave address [ addr | 1 ]
    und write
    address 8-bit I2C slave address [ addr | 0 ]
    Wenn du rohe 8-Bit Werte schreiben willst, kannst du die write Funktion mit einem Parameter verwenden und die Übertragung Byte für Byte in einer for-Schleife machen.
    Geändert von Mxt (02.06.2015 um 08:23 Uhr) Grund: Verschrieben

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    30.04.2012
    Beiträge
    13
    Hallo,

    danke erstmal für die Antwort und entschuldigung dass ich eine Woche darauf nicht reagiert habe, war aber durch andere Baustellen leider völlig eingenommen. Also deine Antwort erklärt das Problem sehr gut. Nun habe ich mir gedacht ich mache es ganz simpel, indem erstmal beginne den Sensor lediglich einen write befehl zu geben. Der Code ist recht simpel und wie folgt:

    #include"mbed.h"

    I2C i2c(PB_11, PB_10); //sda, scl
    const int addr = 0x4E; //Adresse 0x27 um ein Bit nach links geschoben
    double result=0;

    int main() {
    while(1){
    i2c.start();
    i2c.write(addr);
    i2c.stop();
    }
    }

    Das Ergebnis mit dem Logic Analyzer gemessen ist angehangen. Meiner Meinung nach sieht die I2C Kommunikation des Mikrocontrollers richtig aus, jedoch bleibt das Acknowledge des Sensors aus. Ich habe die Beschaltung gefühlt 100 mal kontrolliert und ich kann mir nicht vorstellen dass der Sensor kaputt ist. Kann mir jemand mit Erfahrung in der Kommunikation weiterhelfen und erkennt da einen Fehler?

    Danke
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken screenshot.jpg  

  4. #4
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    14.11.2013
    Ort
    Home
    Beiträge
    213
    Hallo Klacknack,

    kenne Entwicklungsboard Nucleo STM32 nicht. Somit nur eine allgemeine Antwort.

    Bin ein begeisterter Fan von I²C Bus. Die häufigsten Fehler liegen beim Bustakt und der H-Pegel der Leidungen.
    Mit einem Takt bis 100kHz sollten ziemlich alle Sensoren funktionieren. Wichtig sind die Abschlusswiderstände von SDA und SCL zu den Sensoren. Meine Erfahrungen 4,7 k auf Vcc sind bis ca. 20 Meter Leitungslänge OK.
    Leider programmiere ich „nur“ noch mit BASCOM. Hatte schon mal ein Programm eingestellt wie viele unterschiedliche I²C –Teilnehmer am Bus angeschossen und geprüft werden können.
    Wie gesagt, sehr oft liegt es am Aufbau der Hardware, wenn solche Fehler auftreten.
    Softwaremäßig ist es wie bei allen Bussysteme nötig, hat sich der Teilnehmer gemeldet und die Informationen geschickt den Bus wieder frei zu geben[Start ansprechen, lesen oder schreiben Stop].


    Mit freundlichen Grüßen
    fredred

  5. #5
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.08.2008
    Ort
    DE
    Beiträge
    523
    Bau dir doch mal einen I2C Scanner (Arduino Beispiel):

    Code:
    1. void loop()
    2. {
    3. byte error, address;
    4. int nDevices;
    5. Serial.println("Scanning...");
    6. nDevices = 0;
    7. for(address = 1; address < 127; address++ )
    8. {
    9. // The i2c_scanner uses the return value of
    10. // the Write.endTransmisstion to see if
    11. // a device did acknowledge to the address.
    12. Wire.beginTransmission(address);
    13. error = Wire.endTransmission();
    14. if (error == 0)
    15. {
    16. Serial.print("I2C device found at address 0x");
    17. if (address<16)
    18. Serial.print("0");
    19. Serial.print(address,HEX);
    20. Serial.println(" !");
    21. nDevices++;
    22. }
    23. else if (error==4)
    24. {
    25. Serial.print("Unknow error at address 0x");
    26. if (address<16)
    27. Serial.print("0");
    28. Serial.println(address,HEX);
    29. }
    30. }
    31. if (nDevices == 0)
    32. Serial.println("No I2C devices found\n");
    33. else
    34. Serial.println("done\n");
    35. delay(5000); // wait 5 seconds for next scan
    36. }

    mfg

  6. #6
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    14.11.2013
    Ort
    Home
    Beiträge
    213
    Hallo Wsk8,

    Ein Scanner wie du schreibst ist okay. Mein Hinweis sollte nur Vermitteln, ist die Hardware „Dumm“, kann eine Software, nicht den Fehler eindeutig erkennen. Die vielen guten Softwarelösungen gehen ja immer davon aus, es ist ein Fehler im Programm. Oft sind es aber nur kleine Fehler, wenn ein neues Modul nicht korrekt angeschlossen wird.

    Gruß fredred

Ähnliche Themen

  1. Antworten: 0
    Letzter Beitrag: 26.02.2014, 08:09
  2. i2c Kommunikation zwischen ATmega2561 und MD25
    Von loewe.xy im Forum C - Programmierung (GCC u.a.)
    Antworten: 1
    Letzter Beitrag: 23.05.2013, 23:37
  3. Kommunikation zwischen AVR's I2c- Bascom Code?
    Von toter_fisch im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 4
    Letzter Beitrag: 01.04.2012, 21:53
  4. Kommunikation zwischen uP und Pc
    Von XC866 im Forum C - Programmierung (GCC u.a.)
    Antworten: 3
    Letzter Beitrag: 14.02.2007, 15:48
  5. Kommunikation zwischen AVR und PC
    Von im Forum AVR Hardwarethemen
    Antworten: 8
    Letzter Beitrag: 10.02.2004, 13:26

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen