Twin-CAN-Controller SAK82C900 von Infineon

F

Florian Schenk

Guest
Hallo!

Wir möchten gerne bei einem Projekt von 2 Phillips SJA1000 auf einen
82C900 von Infineon umsteigen. Die Testplatine (82C900@16MHz und Atmel
MEGA163, www.schema2000.de/can/can.pdf) ist soweit fertig und die
Kommunikation zwischen MEGA163 und 82C900 funktioniert auch (Register
lassen sich beschreiben und lesen). Leider sehe ich im Moment noch
kein Licht bei der Konfiguration des 82C900. Im Moment teste ich mit
folgender Initialisierung des 82C900:

Initialisierung der Nodes A und B:

// Enter Init-State
ControlRegister = C900_CCE | C900_INIT;

// Set Timing-Register (div8x=1, tseg2=2, tseg1=3, sjw=2, brp=19)
BTR = (1 << 15) + (2 << 12) + (3<< 8) + (2 << 6) + ( 19 ), 4);

// Framecounter aktivieren
FCR = 0x0007000;

// Exit Init-State
ControlRegister = 0;

Müsste zum jetzigen Zeitpunkt nicht schon der Framecounter bei richtig
empfangenen Pakten hochzählen (tut er bei mir nicht!) ?

Danach: Initialisierung von einem Message-Objekt (31) als Shared
Gateway:

// MSGVAL auf invalid -- Beginn der Initialisierung f. MO31
CTR31 = 0x00005555;

// Source auf Node A setzen ==> Destination ist dann Node B
CFG31 = 0x00000000;

// FGCR passend für Shared-Gateway setzen, NODEPTR = 31
FGCR31 = 0x051F0100;

// Message Identifier auf 0 setzen (Alle Pakete)
AR31 = 0x0;

// Message Acceptance Mask auf 0 setzen (Alle Pakete)
AMR31 = 0x0;

// MSGVAL auf valid -- Ende der Initialisierung f. Messageobject 30
CTR31 = 0x00005595;

Das Problem ist, dass weder der Framecounter hochzählt noch Pakete
weitergeleitet werden. Das Statusregister und das ECNT zeigen auch
nichts besonderes. Nach ca. 30s bekomme ich aber seltsame Werte aus
diesen Registern zurück (0x20202020 oder 0x00000000).

Alles in allem suche ich nach irgendwelchen Beispielen, damit ich die
Schaltung bestätigen und prinzipiell mal die Funktionen des 82C900
testen kann!

Wenn jemand schonmal mit diesem Chip gearbeitet hat wäre ich über
Infos und Tips dankbar!

Gruss,
Florian
 
"Florian Schenk" <schenk@schema2000.de> schrieb im Newsbeitrag

Hallo!

Wir möchten gerne bei einem Projekt von 2 Phillips SJA1000 auf einen
82C900 von Infineon umsteigen. Die Testplatine (82C900@16MHz und Atmel
MEGA163, www.schema2000.de/can/can.pdf) ist soweit fertig und die
Kommunikation zwischen MEGA163 und 82C900 funktioniert auch (Register
lassen sich beschreiben und lesen). Leider sehe ich im Moment noch
kein Licht bei der Konfiguration des 82C900. Im Moment teste ich mit
folgender Initialisierung des 82C900:
Vorab, ich kenne mich mit diesem CAN-Controller nicht aus, wußte bislang
gar nicht, daß es eine Art CAN-Gateway auf Hardware-Ebene gibt.

Initialisierung der Nodes A und B:

// Enter Init-State
ControlRegister = C900_CCE | C900_INIT;

// Set Timing-Register (div8x=1, tseg2=2, tseg1=3, sjw=2, brp=19)
BTR = (1 << 15) + (2 << 12) + (3<< 8) + (2 << 6) + ( 19 ), 4);

// Framecounter aktivieren
FCR = 0x0007000;

// Exit Init-State
ControlRegister = 0;

Müsste zum jetzigen Zeitpunkt nicht schon der Framecounter bei richtig
empfangenen Pakten hochzählen (tut er bei mir nicht!) ?
Du setzt zwar oben Deine Timing-Register, hast Du aber die Baudrate richtig
eingestellt? Alleine der BRP macht das nicht, sondern die Kombination Quarz
und BRP! Was für einen Restbus betreibst Du und vorallem wie?!? In Deinem
gelinkten Schematic sind am RS-Pin des PCA82C250 47 kOhm Widerstände eingetragen,
für High-Speed-CAN Anwendungen solltest Du dort 0 Ohm-Brücken einbauen, die
Flanken sind ansonsten zu flach. Du solltest auf jeden Fall die Busphysik
(Terminierung) checken, vorallem wenn man "Plug&Play-CAN" betreibt.

Das alles kann erklären wieso der Frame-Counter nicht hochzählt.

Danach: Initialisierung von einem Message-Objekt (31) als Shared
Gateway:

// MSGVAL auf invalid -- Beginn der Initialisierung f. MO31
CTR31 = 0x00005555;

// Source auf Node A setzen ==> Destination ist dann Node B
CFG31 = 0x00000000;

// FGCR passend für Shared-Gateway setzen, NODEPTR = 31
FGCR31 = 0x051F0100;

// Message Identifier auf 0 setzen (Alle Pakete)
AR31 = 0x0;

// Message Acceptance Mask auf 0 setzen (Alle Pakete)
AMR31 = 0x0;

// MSGVAL auf valid -- Ende der Initialisierung f. Messageobject 30
CTR31 = 0x00005595;

Das Problem ist, dass weder der Framecounter hochzählt noch Pakete
weitergeleitet werden. Das Statusregister und das ECNT zeigen auch
nichts besonderes. Nach ca. 30s bekomme ich aber seltsame Werte aus
diesen Registern zurück (0x20202020 oder 0x00000000).
Hast Du das Errata-Sheet angeschaut? Es gibt dort einige Probleme bzgl.
Nicht-Senden von Botschaften und Canceln von Sendeaufträgen, d.h. evtl.
steht dann hinterher Schmarrn in den Buffern drin.

Alles in allem suche ich nach irgendwelchen Beispielen, damit ich die
Schaltung bestätigen und prinzipiell mal die Funktionen des 82C900
testen kann!
Ich bin zwar kein Experte was Platinenlayout angeht aber für CAN-Anwendungen
kenne ich mich ein wenig aus. Das von Dir gelinkte Schematic sagt imho
nicht viel aus, es sind zwei Transceiver eingezeichnet und der ľC, die
OP's etc. kann ich nicht ganz einordnen. Was soll CAN_CS denn sein?!?
Von der Beschaltung der Transceiver ist - evtl. bis auf den RS-Pin -
alles korrekt.

Wenn jemand schonmal mit diesem Chip gearbeitet hat wäre ich über
Infos und Tips dankbar!
Leider nein, deswegen kann ich Dir auch keinen Tip bzgl. Initialisierung
und Konfiguration des Twin-CAN-Controllers geben. Hoffe trotzdem, daß
irgendein Denkanstoß dabei ist.

Gruß,
Taso
 
"Anastasios Tsitlakidis" <mylittletrashcan@unicum.de> schrieb:

Du setzt zwar oben Deine Timing-Register, hast Du aber die Baudrate richtig
eingestellt? Alleine der BRP macht das nicht, sondern die Kombination Quarz
und BRP! Was für einen Restbus betreibst Du und vorallem wie?!? In Deinem
Also die Frequenz ist 16MHz, wonach der Teiler:
16.000.000 / 100.000 / 8 (wg. DIVX8) - 1 (s.Datenblatt) = 19 sein
müsste. Oder ist da ein grober Denkfehler eingebaut?

gelinkten Schematic sind am RS-Pin des PCA82C250 47 kOhm Widerstände eingetragen,
für High-Speed-CAN Anwendungen solltest Du dort 0 Ohm-Brücken einbauen, die
Ich bin bisher davon ausgegangen, dass 100kBaud kein High-Speed ist
:) Nee, Spaß beiseite... die 47kOhm-Widerstände funktionieren mit dem
SJA1000 einwandfrei!

Flanken sind ansonsten zu flach. Du solltest auf jeden Fall die Busphysik
(Terminierung) checken, vorallem wenn man "Plug&Play-CAN" betreibt.
Externe Beschaltung ist EXAKT gleich wie bei meiner SJA1000-Platine,
d.h. so sollte das eigentlich funktionieren. Oder gibts bei den
CAN-Transceivern irgendwelche Unterschiede, welche es mir u.U.
verbieten den PCF82C250 mit diesem Controller zu verwenden?

Gruss,
Florian Schenk
 
"Florian Schenk" <schenk@schema2000.de> schrieb im Newsbeitrag:

Du setzt zwar oben Deine Timing-Register, hast Du aber die Baudrate richtig
eingestellt? Alleine der BRP macht das nicht, sondern die Kombination Quarz
und BRP! Was für einen Restbus betreibst Du und vorallem wie?!? In Deinem

Also die Frequenz ist 16MHz, wonach der Teiler:
16.000.000 / 100.000 / 8 (wg. DIVX8) - 1 (s.Datenblatt) = 19 sein
müsste. Oder ist da ein grober Denkfehler eingebaut?
Bei 100 kBaud ist ein BRP nominell (nicht programmiert) von 20 iO, d.h. es
sind genau 8 BTL-Cycles.

gelinkten Schematic sind am RS-Pin des PCA82C250 47 kOhm Widerstände eingetragen,
für High-Speed-CAN Anwendungen solltest Du dort 0 Ohm-Brücken einbauen, die

Ich bin bisher davon ausgegangen, dass 100kBaud kein High-Speed ist
:) Nee, Spaß beiseite... die 47kOhm-Widerstände funktionieren mit dem
SJA1000 einwandfrei!
Hast Du ein EMV-Problem? Wenn nein, dann entfernen, der PCA macht bei großen
Netzwerken (10-20 m Leitung) bei schlechter Bittiming-Programmierung Probleme,
das ist so meine praktische Erfahrung.

Flanken sind ansonsten zu flach. Du solltest auf jeden Fall die Busphysik
(Terminierung) checken, vorallem wenn man "Plug&Play-CAN" betreibt.

Externe Beschaltung ist EXAKT gleich wie bei meiner SJA1000-Platine,
d.h. so sollte das eigentlich funktionieren. Oder gibts bei den
CAN-Transceivern irgendwelche Unterschiede, welche es mir u.U.
verbieten den PCF82C250 mit diesem Controller zu verwenden?
OK, ich gehe nicht davon aus, daß das ein Problem ist. Um weiterzukommen, kannst
Du über Deine Applikation die CAN-Fehlerlevels abfragen? Dann kannst Du prüfen,
ob der CAN-Controller physikalische Fehler erkennt. Nur so um die Ursache
auszuschließen.

Kannst Du ein paar Details über Deine Applikation geben, Netzwerkgröße, Ausdehnung
und Anzahl der Knoten? Ich kann mir nichts darunter vorstellen.

Btw, kannst Du beim Twin-CAN das ACK ein- und ausschalten? Vielleicht ist
es ausgeschaltet, und bei einem Netzwerk mit zwei Knoten (der andere war der
Atmel) fehlt dann das ACK auf dem CAN, welches u.U. die fehlenden Botschaften
erklärt.

Der Listen-Only-Mode ist generell OK, bei einem CAN-p2p muß man das ACK
verwenden.

Gruß,
Taso
 
"Anastasios Tsitlakidis" <mylittletrashcan@unicum.de> schrieb:

gelinkten Schematic sind am RS-Pin des PCA82C250 47 kOhm Widerstände eingetragen,
für High-Speed-CAN Anwendungen solltest Du dort 0 Ohm-Brücken einbauen, die

Ich bin bisher davon ausgegangen, dass 100kBaud kein High-Speed ist
:) Nee, Spaß beiseite... die 47kOhm-Widerstände funktionieren mit dem
SJA1000 einwandfrei!

Hast Du ein EMV-Problem? Wenn nein, dann entfernen, der PCA macht bei großen
Netzwerken (10-20 m Leitung) bei schlechter Bittiming-Programmierung Probleme,
das ist so meine praktische Erfahrung.
Flanken sind ansonsten zu flach. Du solltest auf jeden Fall die Busphysik
(Terminierung) checken, vorallem wenn man "Plug&Play-CAN" betreibt.

Externe Beschaltung ist EXAKT gleich wie bei meiner SJA1000-Platine,
d.h. so sollte das eigentlich funktionieren. Oder gibts bei den
CAN-Transceivern irgendwelche Unterschiede, welche es mir u.U.
verbieten den PCF82C250 mit diesem Controller zu verwenden?

OK, ich gehe nicht davon aus, daß das ein Problem ist. Um weiterzukommen, kannst
Du über Deine Applikation die CAN-Fehlerlevels abfragen? Dann kannst Du prüfen,
ob der CAN-Controller physikalische Fehler erkennt. Nur so um die Ursache
auszuschließen.
Ja, man kann Fehlerlevels abfragen, allerdings kommt dabei nichts
brauchbares zurück. Wenn ich ein anderes Timing einstelle bekomme ich
Fehler zurück.

Kannst Du ein paar Details über Deine Applikation geben, Netzwerkgröße, Ausdehnung
und Anzahl der Knoten? Ich kann mir nichts darunter vorstellen.

Also das Netzwerk besteht jeweils aus 3 Teilnehmern, wovon zwei auch
miteinander kommunizieren können, der 3. ist meine Applikation. Die
Abstände zwischen den Teilnehmern sind ca. 30cm.

Btw, kannst Du beim Twin-CAN das ACK ein- und ausschalten? Vielleicht ist
es ausgeschaltet, und bei einem Netzwerk mit zwei Knoten (der andere war der
Atmel) fehlt dann das ACK auf dem CAN, welches u.U. die fehlenden Botschaften
erklärt.
Gruss,
Florian
 
"Florian Schenk" <schenk@schema2000.de> schrieb im Newsbeitrag

Flanken sind ansonsten zu flach. Du solltest auf jeden Fall die Busphysik
(Terminierung) checken, vorallem wenn man "Plug&Play-CAN" betreibt.

Externe Beschaltung ist EXAKT gleich wie bei meiner SJA1000-Platine,
d.h. so sollte das eigentlich funktionieren. Oder gibts bei den
CAN-Transceivern irgendwelche Unterschiede, welche es mir u.U.
verbieten den PCF82C250 mit diesem Controller zu verwenden?

OK, ich gehe nicht davon aus, daß das ein Problem ist. Um weiterzukommen, kannst
Du über Deine Applikation die CAN-Fehlerlevels abfragen? Dann kannst Du prüfen,
ob der CAN-Controller physikalische Fehler erkennt. Nur so um die Ursache
auszuschließen.

Ja, man kann Fehlerlevels abfragen, allerdings kommt dabei nichts
brauchbares zurück. Wenn ich ein anderes Timing einstelle bekomme ich
Fehler zurück.
Wieso? Wenn das Warning-Level- oder Error-Passive-Bit != 0 ist dann ist es
ein physikalisches Problem.

Kannst Du ein paar Details über Deine Applikation geben, Netzwerkgröße, Ausdehnung
und Anzahl der Knoten? Ich kann mir nichts darunter vorstellen.


Also das Netzwerk besteht jeweils aus 3 Teilnehmern, wovon zwei auch
miteinander kommunizieren können, der 3. ist meine Applikation. Die
Abstände zwischen den Teilnehmern sind ca. 30cm.
Also, die Physik scheint nicht das Problem zu sein. Ich denke, daß Du die CANLIST
konsultieren, CAN-Controller-Themen werden dort oft erörtert:

Archives and useful links: http://groups.yahoo.com/group/CANbus
Subscribe and unsubscribe at www.vector-informatik.com/canlist/
Report any problems to <canlist-owner@vector-informatik.de>

Es gibt einen Kollegen, der sich auch mit CAN-Controllern sehr gut auskennt und
in comp.arch.embedded mitliest und auch in CANLIST aktiv ist.

Einfach einen Repost machen, dort wird Dich geholfen! >;)

Gruß,
Taso
 

Welcome to EDABoard.com

Sponsor

Back
Top