www.mikrocontroller.net

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


Autor: Uwe (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Raphael (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Uwe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo  Raphael,

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

Mfg
Uwe

Autor: Mitleser (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Mitleser (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Mitleser (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Mitleser (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jürgen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mal eine ganze blöde Frage, wo finde ich denn die in dem Dokument 
"AN2824" angesprochenen Examples?!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.