I2C STM32F103

Gast #5621225
Hallo,

ich bin gerade etwas am verzweifeln. Ich versuche einen I2C am STM32F103 
zum laufen zu bekommen. Hierfür habe ich genau den Code von 
http://diller-technologies.de/stm32.html#i2c genommen. Deswegen habe ich 
das Projekt nicht angehängt (kann ich aber natürlich tun).

Ich möchte einen RCT ansprechen: 
https://datasheets.maximintegrated.com/en/ds/DS1307.pdf

Zum Test wollte ich einfach mal die Sekunden auslesen.

In der main Schleife führe ich folgenden Code aus:
1
    i2c_writeByte(0xD0,0x00); // wir wollen die Sekunden lesen
2
    Delay(1);
3
    i2c_readTwoBytes(0xD0); // jetzt schauen wir ob sie da sind?

Dann erhalte ich Bild1 bzw. Bild1zoom, was erstmal bezüglich des Sendens 
recht ordentlich aussieht. Leider wird beim lese Befehl nur ein Start 
und Stop Bedingung ausgeführt.

Kommetiere ich den ersten Befehl (das schreiben aus), scheint auch der 
Lesebefehl zu funktionieren Logic Analyzer zeigt auf jeden Fall etwas 
plausibles an. Kann mir jemand helfen diesen Fehler zu finden? Wo könnte 
ich wie suchen? Irgendwas wird anscheinden nicht richtig zurückgesetzt 
nach dem Schreiben, oder?
Angehängte Dateien:
Gast
nach kurzem darüberschauen zu später Stunde:
Nach dem Write darf kein Stop kommen, wie in Fig.6 muss eine Sequenz
Start-I2CAddrWrite-Registernr-Start-I2CAddrRead-data-Stop erzeugt 
werden.
Gast
Ich bin nicht so der Crack für I2C, aber lt. Datenblatt S.13 ist lesen 
so:
Slave Adress (D0) Word Adress (00) Slave Adress (D1) Daten Daten Daten
Bit 0 bei der Adress lesen und schreiben! Befehl schreiben, dann Daten 
lesen.
Gast
So könnte es klappen (symbolischer Code):
1
uint8_t DS1307_ReadDataFrom (uint8_t memaddr)
2
{
3
  uint8_t val;
4

5
  I2C_SetStart ((uint8_t)DS1307_ADDR);        // write mode, start condition
6
  I2C_WriteByte ((uint8_t)memaddr);           // write address
7
  I2C_SetStart ((uint8_t)(DS1307_ADDR + 1));  // read mode, repeated start
8
  val = I2C_ReadByte ();                      // read data
9
  I2C_SetStop ();                             // stop condition
10

11
  return val;
12
}
Gast
Hardware I2C vom STM32F103 ist buggy steht im Errata Sheet. Ich habe 
lange Zeit versucht einen IMU über I2C auszulesen, habe gescheitert. Da 
manchmal kein ACK kam. Den selben Code habe ich auf gd32f103 ausprobiert 
und funktioniert.
Gast
stmfresser schrieb:
> Hardware I2C vom STM32F103 ist buggy steht im Errata Sheet.

Für solche Fälle mache ich immer Soft-I2C. Das ist ganz
einfach und funktioniert prächtig solange man keinen Slave
zu implementieren braucht.

Ausserdem hat man die praktisch freie Wahl der Pinbelegung.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 7 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.