Hallo, ich lese einen I2C Sensor in main aus (einfache Polling Funktionen), für sich genommen funktioniert das ganze wunderbar. In der Zielapplikation (mit vielen Timer und langen Interrupts mit höher Prio in der NVIC) hängt sich das I2C Polling nach wenigen Sekunden auf. Vermutlich ein Timing-Problem. Soweit ich weiß kann man nur I2C Interrupts eine höhere Priorität in der NVIC zuweisen. Oder liege ich hier falsch? Hat jemand vielleicht ein ähnliches Problem mit I2C Polling gehabt, bzw. ist es allgemein bekannt, das I2C Polling vergleichsweise instabil ist? Mit I2C hab ich noch nicht viel gemacht ... Danke & Viele Grüße Uwe
Hi Aus meiner Erfahrung ist die I2C Peripheriy beim STM32 gewöhnungsbedürftig. Daher empfehle ich dir, dich an die App Note von ST zu halten. Weiter sind auf dem STM32 Forum bei ST diverse Einträge zum Thema I2C zu finden. http://www.st.com/stonline/products/literature/an/15021.pdf Gruss Raphael
Hallo Raphael, super vielen Dank, das Manual kannte ich noch nicht. Ich werds mal versuchen. Mfg Uwe
Habe mir die PDF angeschaut. Heißt es jetzt, dass DMA ungeeignet ist, wenn man nicht weiß wieviel Bytes empfangen/gesendet werden? Das ist doch Mist, warum lassen die nicht einfach DMA IR auslösen, wenn Nack oder Stop empfangen wurde (im Slave receive Modus).
Mitleser schrieb: > doch Mist, warum lassen die nicht einfach DMA IR auslösen, wenn Nack > oder Stop empfangen wurde (im Slave receive Modus). Woher soll denn der DMA-Kanal wissen wann I2C mit der Übertragung durch ist? Der weiss von der konfigurierten Anforderungsquelle nur, ob eine Anforderung ansteht, sonst überhaupt nichts.
>Remaining events (ADDR and STOPF) are managed by interrupts. Das ist ok, habe mich geirrt. Aber das: >● Slave receiver >DMA requests are generated only for data transfers. In reception, DMA >requests are generated by the Data Register becoming full (RXNE = 1). Data Register heißt wohl, das ein Byte im Register gelandet ist oder? Dann ist es ja wohl nicht anderes als das Ganze über Interrupt zu managen. Ich habe zwar noch nichts ausprobiert, lese mich gerade rein, aber als frischer Atmega Umsteiger erscheint es mir ein wenig zu kompliziert.
Dafür ist der Abschnitt sehr verwirrend: DMA requests are generated only for data transfers. In transmission, DMA requests are generated by the Data Register becoming empty (TXE = 1). All remaining events (ADDR and AF) are managed by interrupts. Provided that the slave doesn’t know in advance how many data bytes are to be received/transmitted to/from the master device, the DMA channel transmit/receive end of transfer cannot be detected. So, it’s not possible to know when to update the DMA channel counter and memory base address to prepare the next transmission or reception. In order to update the DMA channel counter, the DMA channel must be disabled and of course the DMA channel must not be disabled while the master device is transmitting/receiving data. The only period during which the slave has control of the line (master can not transmit neither receive) is the period between ADDR event (ADDR flag is set) and clearing the ADDR flag. For this purpose, in the provided slave examples using DMA, the DMA count and memory base address are initialized after ADDR flag is set and before ADDR flag is cleared.
Mitleser schrieb: > Dann ist es ja wohl nicht anderes als das Ganze über Interrupt zu > managen. Per Interrupt ist jedenfalls einfacher. DMA erscheint mir zumindest bei einem I2C-Slave eher zweifelhaft. Andere Leute scheinen das ähnlich zu sehen, denn ich habe mal ein paar andere Controller-Typen mit DMA-Controller durchforstet. Bei keinem davon ist I2C per DMA überhaupt vorgesehen.
Naja wäre ja schön die Daten als Slave zumindest über DMA bereitstelln zu können, da hätte man ja schon mit anderen Routinen anfangen könnne, wenn DMA die CPU nicht beansprucht.
Mal eine ganze blöde Frage, wo finde ich denn die in dem Dokument "AN2824" angesprochenen Examples?!
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.