I2C STM32F103

Gast #5621225
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?
Angehängte Dateien:
Gast #5621344
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.
Gast #5690640
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
}
Gast #5691060
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren