Forum: Mikrocontroller und Digitale Elektronik SAMC21J18A CAN-FD Registerbelegung, Hilfe


von Rupert B. (mr_dojo0)


Lesenswert?

Hallo Leute,

ich habe ein ATSAMC21J18A Xplained Pro Evaluierungsboard vorgelegt 
bekommen und soll ihn CAN-FD fähig machen.

Bewusst versuche ich auf ASF-Code zu verzichten und belege meine 
Register, schon allein aus verständnisgründen, am liebsten selbst.

Ich verwende als Clocksource für die CPU 48 Mhz ohne Prescaler und für 
den CAN 96Mhz dpll. Das empfangen der CAN und CAN-FD nachrichten war 
kein Problem und konnte schnell gelöst werden, somit ist die Baudrate 
richtig eingestellt(korrigiert mich wenn ich falsch liege :D). Das 
Acknowledge bit wird gesetzt und die PCAN-Software wirft keine Fehler 
aus

Normale Classic-Can botschaften kann ich versenden sowie CAN-FD 
Nachrichten ohne Bit-rate-switch(BRS). Auch CAN-FD Nachrichten bis zu 
einer Datenlänge von 8 Bytes kann mit BRS versendet werden. Jedoch kann 
ich keine 32-, 48- oder 64- Byte Nachrichten mit CAN-FD und BRS 
versenden.
PCAN-View zeigt als Fehler Stuff-bit und Formfehler an. Auch der CAN Bus 
wird auf Error-passiv-status gesetzt.


Hier die wichtigsten Registerbelegungen meiner INIT des CANs:
1
/*******************************************************************/
2
/* INITIALISIERUNG                                                 */
3
/*******************************************************************/
4
    /* Start manipulating CAN0 registrys */
5
    CAN0->CCCR.bit.INIT = 1;
6
    CAN0->CCCR.bit.CCE = 1;  
7
  
8
    /* MESSAGE RAM CONFIGURATION */
9
    // Tx Fifo and Buffer allocation
10
    CAN0->TXBC.bit.TBSA = (uint32_t) txBufferElem;
11
    CAN0->TXBC.bit.NDTB = 16;
12
    CAN0->TXBC.bit.TFQS = 16;
13
    CAN0->TXEFC.bit.EFSA = (uint32_t) txEvFivoElem;
14
    CAN0->TXEFC.bit.EFS = 32;
15
    
16
  
17
    // Size of Data reserved for Can Data messages
18
    CAN0->TXESC.bit.TBDS = 0x7; // 64-Byte data-length
19
  
20
    /* Set Configurations on Module */
21
      // Can nominal Prescaler:
22
      CAN0->NBTP.bit.NBRP = 11;//96Mhz / (11+1) = 8Mhz, 8Mhz/16 = 500kHz
23
      CAN0->NBTP.bit.NSJW = 3;
24
      CAN0->NBTP.bit.NTSEG1 = 10;
25
      CAN0->NBTP.bit.NTSEG2 = 3;
26
      // Can-fd databit Prescaler:
27
      CAN0->DBTP.bit.DBRP = 2; //96Mhz / (2+1) = 32Mhz, 32Mhz/16 = 2Mhz
28
      CAN0->DBTP.bit.DSJW = 3;
29
      CAN0->DBTP.bit.DTSEG1 = 10;
30
      CAN0->DBTP.bit.DTSEG2 = 3;
31
      CAN0->DBTP.bit.TDC = 0;
32
      
33
      /* CCCR - Can Configuration Control*/
34
      /* Transmit Pause */
35
      CAN0->CCCR.bit.TXP = 1; /* default: 0; The CAN pauses for two CAN bit times before starting next transmission 
36
                    after itself has successfully tramitted a frame. */
37
      /* Edge filtering during Bus Integration */
38
      CAN0->CCCR.bit.EFBI = 1; // default: 0; Two consecutive dominant tq required to detect an edge for hard synchronization
39
      /* Protocol Exception Handling Disabled*/
40
      CAN0->CCCR.bit.PXHD = 1; // default: 0;Protocol exception handling disabled.
41
      /* Enable CAN-FD */
42
      CAN0->CCCR.bit.FDOE = 1; // default: 0; Enable CAN-FD
43
      /* Bit Rate Switching Enable */
44
      CAN0->CCCR.bit.BRSE = 1; // default: 0; Enable Bit Rate Switching
45
      /* GFC- Global Filter Configuration */
46
      /* Accept non matching Frames standard */
47
      CAN0->GFC.bit.ANFS = 2; // default: 0; Reject non matching frames Standard
48
      /* Accept non matching Frames extended */
49
      CAN0->GFC.bit.ANFE = 2; // default: 0; Reject non matching frames Extended
50
      /* Reject Remote Frames Standard */
51
      CAN0->GFC.bit.RRFS = 1;  // default: 0; Reject all remote frames with 11-bit Standard IDs.
52
      /* Reject Remote Frames Extended */
53
      CAN0->GFC.bit.RRFE = 1;  // default: 0; Reject all remote frames with 29-bit Extended IDs.
54
      /* Rx FIFO 0 Configuration */
55
      /* Fifo 0 Operation Mode */
56
      CAN0->RXF0C.bit.F0OM = 0; // default: 0; FIFO 0 blocking mode(0), overwrite mode(1).
57
      /* Rx FIFO 1 Configuration */
58
      /* Fifo 1 Operation Mode */
59
      CAN0->RXF1C.bit.F1OM = 0; // default: 0; FIFO 1 blocking mode(0), overwrite mode(1).
60
    
61
    
62
  
63
  
64
    /* Finish Default Initialisation */
65
    CAN0->CCCR.bit.INIT = 0;
66
    while(CAN0->CCCR.bit.INIT);

Beim Versenden der CAN Nachricht lege ich die DLC auf 15 (das entspricht 
ebenfalls 64-bit) aktiviere das FDF, und BRS-bit und sende die 
Nachricht.

Wenn jemand einen Tipp hat wie ich 64 Byte Nachrichten per CAN-FD und 
BRS versenden kann würde ich mich sehr freuen.

Mit besten Grüßen,
Euer Dojo0

: Bearbeitet durch User
von VolkerQt (Gast)


Lesenswert?

Hallo Dojo0,
es gab mal eine spezifikation von Bosch die so nicht übernommen wurde.

https://can-newsletter.org/engineering/standardization/141209_iso-can-fd-or-non-iso-can-fd/

Es wurden ein paar Controller damit gebaut.

Bitte überprüfe ob alle Busteilnehmer die gleiche Norm haben.

Volker

von Rupert B. (mr_dojo0)


Lesenswert?

Hallo VolkerQt,
vielen Dank für deine Antwort und den verlinkten Artikel.

Laut folgenden Datenblattauszug:

The Control Area Network (CAN) performs communication according to ISO 
11898-1:2015 (Bosch CAN-specification 2.0 part A,B, ISO CAN FD).

• Conform with CAN protocol version 2.0 part A, B and ISO 11898-1:2015
• Up to two Controller Area Network CAN
– Supporting CAN2.0 A/B and CAN-FD (ISO 11898-1:2015)


.. unterstützt der Samc21 den ISO Standard. Der PCAN-View garantiert 
auch.


Also kann ein Hardware-Problem ausgeschlossen werden.

von Rupert B. (mr_dojo0)


Lesenswert?

Ok also ich habe die Register TXP, EFBI und PXHD einfach mal auf Default 
0 gelassen und es endet letztendlich ein einem reinen Stuffbitfehler. 
Auf dem Oszillator sieht man dass irgendwas am ende des Data fields 
nicht stimmt. Ich finde nur leider nicht heraus woran das liegt.

Mit 48 Bytes geht's überraschender Weise. Mit 64 Bytes allerdings immer 
noch nicht.

von Rupert B. (mr_dojo0)


Lesenswert?

Ich weiß nicht woran es lag aber auf einmal geht's.. hab nichts 
verändert und nicht umgesteckt oder angefasst aber auf einmal 
funktionierts.. vielleicht ist mein Restbus nicht so dolle.. trotzdem 
Danke :D

von Steffen R. (steffen_rose)


Lesenswert?

Bei CAN-FD kommt es auch stark auf den CAN Clock an. Üblich sind 40MHz 
oder 80MHz.

Das Bitrate switch wird am Samplepunkt mitten in der Bitzeit gemacht. 
Dies muss bei allen Geräten gleichzeitig passieren. Bereits kleinste 
Abweichungen durch einen unterschiedlichen Samplepunkt verursachen 
Störungen.
Das übereinstimmen der Timequanten (und daher des CAN clocks) ist wegen 
der Resynchronisation relevant, d.h. alle müssen die gleiche 
Verschiebung beim switch aufweisen.

Dies nur als Hinweis. Dein Problem läßt sich damit wohl nicht erklären.

von Rudolph R. (rudolph)


Lesenswert?

Deine Time-Quanten sind etwas knapp, für CAN-FD kenne ich >=20, Du hast 
aber nur 16.
Letztlich kommt das aber darauf an, welche Anforderungen man erfüllen 
muss.

Hast Du mal die Revision von dem C21 auf Deinem Xplained gecheckt?
Meiner war etwas angestaubt, den musste ich erstmal ersetzen.

Ich benutze einen 16MHz Quarz, daraus mache ich mit der DPLL96 erst 
2MHz, dann 48MHz.
Das gebe ich auf GCLK0, benutze die aber auch für den CAN.
Zumindest mit den Anforderungen die ich an das Timing erhalten habe geht 
das sauber auf.

Ein bisschen was mit dem C21 in Bare-Metall habe ich hier, aber ohne 
CAN:
https://github.com/RudolphRiedel/FT800-FT813/tree/4.x/example_projects/EVE_Test_SAMC21_FT813_EVE2-35G

Die Hardware dazu ist das hier:
https://github.com/RudolphRiedel/SAMC21_one

Yup, das Board hat CAN, das nutze ich auch, nur habe ich keinen Code 
dazu im Netz.

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.