FIFO Struktur für 5 CAN Frames

Gast #514733
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:
1
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





#515168
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.
Gast #515235
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

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.