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