Hallo Forum, ich verwende das Atmel Studio 7 um einen ATSAMC20J18 auf einer selbstdesingten Platine zu programmieren. Das Programm verwendet die Libs des ASF. Mein Problem ist, dass ich nicht verstehe, warum die ASF I2C Lib "plötzlich" seinen internen Callback Handler nicht mehr korrekt registriert. Ich hatte bereits diverse Peripherie Module (TC0, TC2, TCC0, TCC2, SERCOM3, EINT, DMA, usw) am laufen. Dann habe ich das Modul SERCOM0 als I2C ebenfalls zum Laufen gebracht. Ich konnte fehlerfrei die Zeit aus der angeschlossenen RTC DS1337 auslesen. Danach habe ich mit der Implementierung des Modules SERCOM2 weitergemacht und dabei ist das Problem aufgetreten. Beim Debuggen des SERCOM2 hängte sich plötzlich das ganzes Programm auf. Der CallStack hat gezeigt, dass das Modul SERCOM0 (das eigentlich schon funktionierende I2C) plötzlich den Dummy_Handler aus startup_samc20.c aufruft und dort hängen bleibt. Nachdem ich alle Implementierungen zum SERCOM2 wieder entfernt hatte, bliebt das Problem trotzdem bestehen. Dann habe ich alles aus dem Programm entfernt, was nicht unbedingt für die I2C RTC benötigt wird und das Problem bleibt trotzdem immernoch bestehen. Diese "minimal" main.c befindet sich im Anhang. Ich finde in meinem Programm nichts mehr, was dafür verantwortlich sein könnte, dass die I2C Lib ihre +internen+ Callbacks nicht mehr registriert. Diese Lib-interne Funktion hatte bereits funktioniert und ich habe in der Lib nichts verändert. Ich habe sogar ein neues Projekt erzeugt und lediglich die Inhalte von main.c dort hinein kopiert. Das Problem ist wieder aufgetreten. Daher vermute ich, dass ich irgendein Verhalten des ASF nicht verstehe. Hat jemand eine Idee oder einen Tip?
Ich schubs den Post mal nach oben. Ich habe zwar ein wenig weiter rumprobiert, aber noch nicht die zündende Idee oder das Problem gefunden. Eventuell findet sich ja noch jemand, der einen heißen Tip hat.
Ich habe das Problem gefunden. Als ich das Minimal-main.c langsam Schritt für Schritt ausgeführt habe, ist die Lib nicht mehr in den Dummy-Handler abgebogen. Die ASF I2C Lib scheint ein Timing Problem zu haben, in das ich beim Debuggen "reingerutscht" bin. Dieses Timing-Problem kommt dann zum Tragen, wenn man die Statusrückmeldung der "Job-Start-Methode" verwendet und gleichzeitig versucht einen neuen Job startet. Eigentlich sollte das der Beschreibung der "Job-Start-Methode" nach möglich sein. Dies führt zum Timing Fehler:
1 | if (i2c_master_read_packet_job(&i2c_master_inst_rtc, &i2c_master_read_packet_rtc_time) == STATUS_OK){ |
2 | iRTC_ControlStep = 3; |
3 | }
|
Dies funktioniert:
1 | if (i2c_master_get_job_status(&i2c_master_inst_rtc) == STATUS_OK){ |
2 | i2c_master_read_packet_job(&i2c_master_inst_rtc, &i2c_master_read_packet_rtc_time); |
3 | iRTC_ControlStep = 3; |
4 | }
|
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.