Forum: Mikrocontroller und Digitale Elektronik I2C STM32F103


von Jan (Gast)


Angehängte Dateien:

Lesenswert?

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?

von Johannes S. (Gast)


Lesenswert?

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.

von dochgast (Gast)


Lesenswert?

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.

von Edgar M. (edgar)


Angehängte Dateien:

Lesenswert?

Hier ist ein Black Pill mit I2C in Aktion. In der Anleitung, die sehr 
ausführlich ist, wird Schritt für Schritt vorgegangen.

von Pit (Gast)


Lesenswert?

Das letzte Bit bei der Adresse entscheidet über lesen oder schreiben. Da 
scheints mir irgendwie zu hakeln.

Gruß Pit

von Hint Hint (Gast)


Lesenswert?

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
}

von Benedikt S. (benedikt_s)


Lesenswert?

Was ist das für ein Logikanalysator?

von Stefan F. (Gast)


Lesenswert?

Benedikt S. schrieb:
> Was ist das für ein Logikanalysator?

Steht in der Kopfzeile: PulseView (gehört zu Sigrok), das ist die freie 
Alternative zur Saleae Software.

von stmfresser (Gast)


Lesenswert?

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.

von Hint Hint (Gast)


Lesenswert?

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.

von Edgar M. (edgar)


Angehängte Dateien:

Lesenswert?

Hallo Jan,
in der Datei STM32_DS1307.pdf habe ich versucht deine eingangs gestellte 
Frage zu beantworten.
MfG

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
Noch kein Account? Hier anmelden.