- Akku Tests und Balkonkraftwerk Speicher         
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
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    04.09.2011
    Ort
    Hessen
    Beiträge
    707
    Hallo,

    ich habe in meiner Sammlung ein kleines Beispiel für einen 24LC256 EEPROM, ist allerdings für den LPC1768 konfiguriert. Man muss die Pin Bezeichnungen für einen Nucleo anpassen, auch hat der nur eine LED. Aber es ist das schöne an mbed, dass die Programme mit so wenigen Änderungen auf Cortex-M verschiedener Hersteller laufen.

    Headerdatei
    Code:
    #ifndef I2C_EEPROM_H
    #define I2C_EEPROM_H
    
    #include <vector>
    
    //
    // Klasse für 24LC256 usw.
    //
    class I2C_Memory {
    private:
        int m_Address;
        I2C m_i2c;
        bool m_Ok;    
        
        //
        // Übertragungsfehler merken
        //
        void DoWrite(int value) {
            if (!m_i2c.write(value))
                m_Ok = false;
        }
        
    public:
    
        //
        // Konstruktor
        //
        I2C_Memory(int address, PinName sda, PinName scl) : m_Address(address), m_i2c(sda, scl), m_Ok(true) 
        {}   
        
        //
        // Schreiben
        //
        bool Write(unsigned short start_address, const std::vector<uint8_t>& data) {
            m_Ok = true;
            
            char hb = (start_address & 0xff00) >> 8;
            char lb = start_address & 0xff;
            
            m_i2c.start();
            
            DoWrite(m_Address);
            DoWrite(hb);
            DoWrite(lb);
            
            for(unsigned int i = 0; i < data.size(); i++) {
                DoWrite(data[i]);
            }
            
            m_i2c.stop();
            
            return m_Ok;
        }
        
        //
        // Lesen
        //
        bool Read(unsigned int start_address, unsigned int count, std::vector<uint8_t>& data) {
            m_Ok = true;
            data.clear();
            
            char hb = (start_address & 0xff00) >> 8;
            char lb = start_address & 0xff;
            
            m_i2c.start();
            
            DoWrite(m_Address);
            DoWrite(hb);
            DoWrite(lb); 
            
            m_i2c.start();
            
            DoWrite(m_Address + 1);   
            
            for(unsigned int i = 0; i < count - 1; i++) {
                data.push_back(m_i2c.read(1));
            }
            if ( count > 0 ) {
                data.push_back(m_i2c.read(0));   // Letztes Lesen mit NACK quittieren
            }      
            
            m_i2c.stop();                      
            
            return m_Ok;
        } 
    };
        
    #endif
    Beispielprogramm
    Code:
    #include "mbed.h"
    #include "I2C_EEPROM.h"
    
    I2C i2c(p9, p10);
    
    DigitalOut led1(LED1);
    DigitalOut led2(LED2);
    DigitalOut led3(LED3);
    
    int main() {
        I2C_Memory memory(0xa0, p9, p10);
        
        while(1) {
            led1 = 0;
            led2 = 0;
            led3 = 0;
            
            wait(1.0);
            
            std::vector<uint8_t> data;
            
            if ( memory.Read(0, 256, data) ) {
                led1 = 1;
                
                for(int i = 0; i < data.size(); i++) {
                    printf("%0.2x ", data[i]);
                }
                printf("\r\n\r\n");
            }
            else {
                led2 = 1;
            }
            
            wait(5.0);
        }
    }

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

    also nachdem ich mich nochmal sehr intensiv daran gesetzt habe und wieder keine Kommunikation zustande gekommen ist. Habe ich mir meine Schaltung und Bauteilliste zum 100sten mal angesehen und den Fehler gefunden. Und der ist wirklich peinlich! Ich habe in der Bestellnummer die letzte Zahl falsch eingegeben und den Sensor anstatt mit I2C Kommunikation einen mit SPI-Kommunikation bestellt. Die Schaltung ist geändert und die Software zu SPI Kommunikation geschrieben und es funktioniert einwandfrei.

    Weiß noch nicht ob ich mich über den gefundenen Fehler freuen oder ärgern soll Jedenfalls bedanke ich mich bei allen für die mithilfe. Ich denke die I2C Kommunikation meines µC hat funktioniert und weswegen die Antwort des Sensors ausblieb weiß ich nun.

    Gruß und Danke

Ähnliche Themen

  1. Antworten: 0
    Letzter Beitrag: 26.02.2014, 07: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, 22: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, 20:53
  4. Kommunikation zwischen uP und Pc
    Von XC866 im Forum C - Programmierung (GCC u.a.)
    Antworten: 3
    Letzter Beitrag: 14.02.2007, 14:48
  5. [ERLEDIGT] Kommunikation zwischen AVR und PC
    Von im Forum AVR Hardwarethemen
    Antworten: 8
    Letzter Beitrag: 10.02.2004, 12:26

Berechtigungen

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

Labornetzteil AliExpress