Hallo liebe µC Gemeinde,
hänge hier seit mehreren Tagen an einem Problem:
Auf einem Atmega8 läuft eine i2c EEPROM Emulation als Slave. Diese
sollte auch wunderbar funktionieren, da ich das mit einem Arduino
bereits erfolgreich testen konnte!
Für mein Projekt will ich aber keinen Arduino sondern das STM32F10X
Discovery Board verwenden. Also musste ein Master für den STM32 her.
Ich benutze dafür die Stdperiph stm32 lib.
In der Funktion I2C_start() bleibt er in der Zeile hängen:
1
while(!I2C_CheckEvent(I2Cx,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));// Here it hangs...
Slave hat die Adresse 0x50. Vor der Übergabe wird diese noch eins nach
links geshiftet.
Hardwaretechnisch habe ich 4,7k Pullups auf 5V! Eigentlich arbeitet der
STM32 ja mit 3,3V. Atmega8 arbeitet mit 5V. Das dürfte jedoch kein
Problem am i2c Bus sein, oder??
SCL hab ich jetzt auf 50kHz, da der Atmega8 nur mit internen 1MHz
arbeitet.
Ich muss sagen, das ist mein erstes Projekt mit einem ARM Controller.
Habe ich evtl bei der Initialisierung etwas falsch gemacht?
Als zip hängt noch mein komplettes Projekt an!
Gruß Julian
Hier meine wichtigsten Files:
main.c
Hallo Julian,
ich bin in einem Parallelthread (
Beitrag "STM32F10x : Fehler bei I2C" ) bei einer ähnlichen
Fragestellung, allerdings mit einem echten 24C02.
Ein paar Punkte kann ich schon ergänzen:
Julian S. schrieb:> Hardwaretechnisch habe ich 4,7k Pullups auf 5V! Eigentlich arbeitet der> STM32 ja mit 3,3V. Atmega8 arbeitet mit 5V. Das dürfte jedoch kein> Problem am i2c Bus sein, oder??
Das ist kein Problem, da genau diese Pins 5V-tolerant sind.
In die markierte Zeile gehört ein Timeout. Wenn der Slave kein "Ack"
sendet, wartet der Master sonst ewig.
Viele Grüße
W.T.
Hallo Walter,
jap, danke für den Hinweiß, habe jetzt überall timeouts mit reingebaut.
Macht die Sache an sich aber nicht besser ;)
Antwortet hier der Slave bereits aktiv?
1
// wait for I2C1 EV5 --> Slave has acknowledged start condition
Julian S. schrieb:> Antwortet hier der Slave bereits aktiv? // wait for I2C1 EV5 --> Slave> has acknowledged start condition> while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_MODE_SELECT));
Nein. Hier wird nur die STM32-interne State-Machine abgefragt.
Julian S. schrieb:> Wenn ja, frage ich mich warum es dann bei der Funktion // Send slave> Address for write> I2C_Send7bitAddress(I2Cx, address, direction);> nicht mehr klappt.!?
Hier ist die erste Stelle, wo der Slave etwas machen sollte.
Hast Du ein Oszilloskop?
Oszilloskop habe ich leider nicht zur Stelle, da müsste ich bis nächste
Woche warten, dann kann ich eines in der Uni benutzen..
Ich trau mich ja fast wetten, dass ich irrgentetwas in InitI2C() falsch
initialisiert habe.
Aber der Fehler kann natürlich auch wo ganz anders liegen :O
Gruß Julian
Dankeschön, ok, dann können wir ausschließen, dass die Init Funktion
irrgentwas dummes macht..
Funktioniert leider immer noch nicht.
Brauche ich den Aufruf der Funktion
1
SystemInit();
Ich bin mir nicht ganz im klaren was sie tut..
Gruß Julian
Hallo Community,
also mein Problem hat sich seit ein paar tagen gelöst.
Problem war, dass die Frequenz zu hoch eingestellt war.
Obwohl dem struct 50000 (Hz) übergeben wurde, war am Ausgang eine
Frequenz von 680kHz zu messen. Warum auch immmer. (Externer Quarz
16MHz??)
Das war aber viel zu hoch für den Atmega8.
Nachdem ich der init routine 5000 für die Frequenz übergeben habe, hat
es dann geklappt (Am Ausgang ca 78kHz).
Gruß Julian