www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik FIFO Struktur für 5 CAN Frames


Autor: König (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Ich bin auf dem Wege ein CAN-Gateway zu entwickeln. Ich weis das gibts 
zu kaufen, aber keiner weis wie es technisch funktioniert. Deswegen mal 
die Eigenentwicklung.
Bin gerade am konzipieren des Puffers (FIFO Ringpuffer).
Das Ganze läuft so, dass höchstens 5 CAN Frames gesammelt werden müssen, 
bevor sie weiterverarbeitet werden.

Also muss erstmal der FIFO her. Verwendet: nur Standard ID. Das heisst, 
ein einzelner FIFO eintrag sieht so aus:

[11-Bit ID][RTR-Bit][4-Bit DLC][Data0][Data1][Data2][Data3]...[Data7]

Macht insgesamt 80 Bit = 10 Byte

Den FIFO Puffer wollte ich als Array programmieren:
[Eintrag1]
[Eintrag2]
[Eintrag3]
[Eintrag4]
[Eintrag5]

bzw:
[Byte0][Byte1][Byte2]...[Byte9]
[Byte0][Byte1][Byte2]...[Byte9]
[Byte0][Byte1][Byte2]...[Byte9]
[Byte0][Byte1][Byte2]...[Byte9]
[Byte0][Byte1][Byte2]...[Byte9]

D.h. die Definition des Array ist so:
uint8_t FIFO[5][80];

Ich greife also immer 8-Bit weise auf das Array zu (schreiben/lesen).

Ist das bis hier erstmal vom Ansatz richtig? Im Anschluss folgt dann die 
Sache mit dem Schreiben / Lesen (Ringpuffer-Zeuch).


grüßle
König






Autor: Weisnix (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich wurde möglichst eine Puffertiefge von 2^x nehmen, läst sich schöner 
Programmieren.
uint8_t FIFO[5][80]; ist mit Sicherheit falsch.

Autor: König (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
warum soll das mit Sicherheit falsch sein?

Autor: Weisnix (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das sind 400 Bytes 5 * 80!!!

Autor: König (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ahjo... das stimmt

pro Eintrag in der Matrix sind ja 8 Bit reserviert, wenn ich uint8 
nehme. Dann also besser so:

uint8_t FIFO[5][10];

Hast recht.

Autor: Christian Gärtner (christiang)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

die ID, das RTR-Bit und auch noch die Datenlänge in zwei Bytes zu 
quetschen ist zwar machbar aber unschön.
Lege dir doch eine Struktur an, z.B.

typedef struct
{
  uint16_t  id;
  uint8_t   length;
  uint8_t   data[8];
} CanStruct;

damit kannst du ein Array aufstellen (CanStruct CANBuffer[5]) und 
mittels Pointer auf die StructMember zugreifen und den Ringbuffer 
realisieren.
Das RTR-Bit läßt sich auch noch bei der ID oder der Länge unterbringen.
Das ganze ist pro Ringbuffereintrag nur ein Byte größer und 
übersichtlicher.

Autor: Dietmar (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@König:

Schau dir mal das FullCAN-Beispiel für ARM7/LPC2000-Serien von der 
Keil-Homepage an. Dort wird eine Struktur "MsgBuf" aus 3 Int-Variablen 
verwendet, um eine komplette CAN-Message aus dem CAN-Controller ein- 
oder auszulesen.

Diese Struktur bietet sich ebenfalls, da sie ja schon vorgegeben ist, 
gut dazu an, 2 FIFOs zu erstellen, eines für Rx- und eines für Tx-Daten.

Dietmar

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.