mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik STM32 I2C sendet nichts


Autor: Bernd Schuster (mms)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

kann mir jmd helfen bei meinem STM32F103 Prozessor? Im Moment versuche 
ich über I2C eine Kommunikation aufzubauen; bis jetzt wird aber nichts 
gesendet!"

//i2c clock
RCC->APB1ENR |= 0x00400000; 

//portb clock enable
RCC->APB2ENR |= 0x00000008;

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
GPIO_Init(GPIOB, &GPIO_InitStructure);
  
I2C_InitSt.I2C_Mode = I2C_Mode_I2C;
I2C_InitSt.I2C_DutyCycle = I2C_DutyCycle_2;
I2C_InitSt.I2C_OwnAddress1 = 0x58;    //addr vom eeprom 
I2C_InitSt.I2C_Ack = I2C_Ack_Enable;
I2C_InitSt.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
I2C_InitSt.I2C_ClockSpeed = 100000;
I2C_Init(I2C2, &I2C_InitSt);

/* Enable the selected I2C peripheral I2C_Cmd(I2C2, ENABLE) */
I2C2->CR1 |= 0x0001;


Nach dieser Initialisierung ist die Clock low und der SDA ist high.

//send start condition 
I2C2->CR1 |= 0x0100;
while (!(I2C_sr() & 0x0001));

Das Bit wird richtig gesetzt im SR Register; I2C_sr() gibt den Inhalt 
vom Status Register zurück.
I2C2->DR = IntAddr | 0; //addr die beschrieben werden soll
while (!(I2C_sr() & 0x0002));

Hier wird das entsprechende  Bit nicht gesetzt, so dass der Prozessor 
hier verweilt; aut dem Bus kann man wie gesagt mit dem Oszi nichts 
erkennen; Pullups sind vorhanden.

Gruß
Bernd

Autor: Bernd Schuster (mms)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Als Fehlermeldung nach dem "Senden" der Daten, welche auf dem Bus 
genauso wenig zu sehen sind, wie die Slaveaddr... bekomm ich im status 
register die fehlermeldung "Misplaced Start or Stop condition"


Hab auch schon das Beispiel von der ST Seite ausprobiert - gleiches 
Verhalten. Die richtigen Pins sind es auf jeden Fall; kann diese auch 
als GPIO entsprechend steuern / high low schalten....

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Reihenfolge der Initialisierung könnte eine Rolle spielen. Ich hatte 
beobachtet, dass abhängig davon die SCL/SDA-Pins einen low-Puls auf den 
Bus brachten, der Devices irritieren kann. Also evtl. mal das I2C-Modul 
komplett vor den GPIO-Pins initialiseren, oder zwischen I2C-Takt und 
Pin-Konfiguration etwas Zeit verstreichen lassen.

Autor: Bernd Schuster (mms)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke für den Tip!

Habs mal mit Delays probiert und zuerst I2C und dann die GPIOs 
initialisiert;

Auf der Datenleitung passiert immer noch nichts - die ganze Zeit high. 
Und auf der Clock-Leitung.... die ist während der Initialisierung jetzt 
auf high; dann werden ca. 6 Takte gesendet und dann ist sie die ganze 
Zeit auf low...

Autor: Bernd (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jetzt bekomm ich zumindestens schon mal was angezeigt auf den beiden 
Leitungen; allerdings sieht es so aus, als ob der ACK Puls vom Device zu 
kurz ist und somit nicht erkannt wird.

Verwende ich das Bsp von ST, ist dieser Impuls größer bzw. länger, so 
dass er auch noch bei der fallenden Clock-Flanke vorhanden ist und 
erkannt wird. Bei diesem Bsp ist es allerdings so, dass ich zwar den 
Eeprom beschreiben kann aber anschließend nicht mehr auslesen...

Muss zwischen Schreiben und Lesen irgendetwas beachtet werden?

Bernd

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.