Forum: Mikrocontroller und Digitale Elektronik STM32 - I2C - Nur im Interrupt Betrieb geeignet?


von Uwe (Gast)


Lesenswert?

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

von Raphael (Gast)


Lesenswert?

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

von Uwe (Gast)


Lesenswert?

Hallo  Raphael,

super vielen Dank, das Manual kannte ich noch nicht.
Ich werds mal versuchen.

Mfg
Uwe

von Mitleser (Gast)


Lesenswert?

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).

von (prx) A. K. (prx)


Lesenswert?

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.

von Mitleser (Gast)


Lesenswert?

>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.

von Mitleser (Gast)


Lesenswert?

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.

von (prx) A. K. (prx)


Lesenswert?

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.

von Mitleser (Gast)


Lesenswert?

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.

von Jürgen (Gast)


Lesenswert?

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