Forum: Mikrocontroller und Digitale Elektronik stm32vl - i2c will nicht.


von Stephan G. (Firma: none) (oppa)


Angehängte Dateien:

Lesenswert?

Hallo,

ich kämpfe mich gerade durch das Tutorial von Geoffrey M Brown. Um I2C 
zu üben möchte ich einen BMP085 auslesen.

Zuerst sah es so aus als ob komplett Stille herscht auf dem Bus. Dann 
habe ich den Logicanalyzer mal früh genug gestartet und sehe nun dass 
eine 0x76 gefolgt von einem NACK gesendet wird. Dann bleibt es ruhig. 
Wenn das die Slave Adresse sein soll, scheint so denn kein Register oder 
Befehl fängt mit 7 an, dann kann das nichts werden weil die 0x77 ist.

Was geht da ab ?

Grüße,
Stephan

von holger (Gast)


Lesenswert?

Sende statt 0x77 halt mal 0xEE.

von Stephan G. (Firma: none) (oppa)


Angehängte Dateien:

Lesenswert?

Aha, woher kommt die, 0x77 einen nach links geschoben ?

Dann geht es einen Hauch weiter. Die Registeradresse die gelesen werden 
soll wird noch korrekt nachgeschoben. Ich vermute das STOP darf nicht 
sein ?

Auf jeden Fall ist generell Leben drin. Da werde ich morgen mal die 
Kommunikation untersuchen. Ich hab das schon auf Tiva-Launchpad gemacht 
vor ein paar Wochen, da musste ich auch drei I2C Routinen 
"maßschneidern" bis es Rund lief.

Danke

: Bearbeitet durch User
von Stephan G. (Firma: none) (oppa)


Lesenswert?

Keine Ahnung wo das Problem ist, ich habe einfach dreist die Abfrage des 
Flags auskommentiert und ich bekomme sinnvolle Sensordaten.

Sicher nicht die reine Lehre aber es spielt...

Stephan
1
Status I2C_Read(I2C_TypeDef* I2Cx, uint8_t* buf, uint32_t nbyte, uint8_t SlaveAddress){
2
3
  __IO uint32_t Timeout = 0;
4
5
  if (!nbyte) return Success;
6
7
  // Wait for idle I2C interface
8
  Timed(I2C_GetFlagStatus(I2Cx, I2C_FLAG_BUSY));
9
10
  // Enable Acknowledgement, clear POS flag
11
  I2C_AcknowledgeConfig(I2Cx, ENABLE);
12
  I2C_NACKPositionConfig(I2Cx, I2C_NACKPosition_Current);
13
14
  // Initiate Start Sequence (wait for EV5)
15
  I2C_GenerateSTART(I2Cx, ENABLE);
16
  // Timed(!I2C_GetFlagStatus(I2Cx, I2C_EVENT_MASTER_MODE_SELECT)); <- RAUSGESCHMISSEN und es LÄUFT
17
18
  // Send Address
19
  I2C_Send7bitAddress(I2Cx, SlaveAddress, I2C_Direction_Receiver);
20
...

: Bearbeitet durch User
von Bernd (Gast)


Lesenswert?

Stephan G. schrieb:
> Keine Ahnung wo das Problem ist, ich habe einfach dreist die
> Abfrage des
> Flags auskommentiert und ich bekomme sinnvolle Sensordaten.

>   // Initiate Start Sequence (wait for EV5)
>   I2C_GenerateSTART(I2Cx, ENABLE);
>   // Timed(!I2C_GetFlagStatus(I2Cx, I2C_EVENT_MASTER_MODE_SELECT)); <-
> RAUSGESCHMISSEN und es LÄUFT

Wenn man auf das Event I2C_EVENT_MASTER_MODE_SELECT wartet, sollte man 
auch die Funktion I2C_CheckEvent() verwenden und nicht
I2C_GetFlagStatus().

Was ST geraucht hat, als es sich die I2C-Implementierung ausgedacht hat, 
weiß ich auch nicht. Da sind eindeutig zu viele Bibliotheken, Events, 
Funktionen, Flags, States, etc.pp. im Spiel...

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.