STM32 - I2C - Nur im Interrupt Betrieb geeignet?

Gast #1873408
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
Gast #1906590
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).
Gast #1906628
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.
Gast #1906635
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.
#1906640
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren