PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : CAN mit AT90CAN128 und SN65HVD232D



Christoph2
17.07.2012, 15:56
Hallo,

ich habe diesen Beitrag schon in "AVR Programmierung" gepostet, aber da der Fehler auch an der Elektronik liegen kann, poste ich es hier nochmal.

ich versuche gerade, mit einem AT90CAN128 Mikrocontroller CAN Nachrichten zu verschicken.
Da ich mit 3,3V arbeite, verwende ich den CAN Transceiver SN65HVD232D von TI. Der arbeitet laut Datenblatt mit 5V CAN Systemen zusammen.

In meinem Programm verwende ich die CAN Library von Kreatives Chaos (http://www.kreatives-chaos.com/artikel/universelle-can-bibliothek). Das Programm ist im Anhang.

Mein CAN Netzwerk besteht aus dem AT90CAN128, der im 500ms Abstand Sensorwerte versenden soll, und einem CANUSB (http://www.canusb.com/), der die Daten empfangen soll. Zwischen CANH und CANL ist auf beiden Seiten ein Abschlusswiderstand von 120 Ohm.

Mein Problem ist, dass die Pegel am CAN Bus nicht stimmen, sobald ich mein Programm auf den AVR Flashe.
Ich habe zwar kein Oszilloskop da (bin in einem Segelschiff an der Ostsee...), aber ich habe die Spannungspegel mit dem Multimeter gemessen, und bin der Meinung dass da was nicht passt.

Die uC Ausgänge (zwischen uC und CAN Treiber) sind zwar beide konstant auf 1,6V, was passen würde, aber die Ausgänge des CAN Treibers (also direkt am Bus) sind 1,8V und 2,7V.
Dadurch leuchtet am CANUSB die rote ERROR Led und er empfängt natürlich nichts.
Sollten die beiden CAN Bus Pegel nicht auch gleich hoch sein, wenn sie direkt am uC gleich hoch sind??

Wenn ich die Zeile "can_send_message(&msg);" auskommentiere, oder in AVR Studio auf "Erase Device" drücke, sind auf beiden Busleitungen 2,2V, so wie es glaube ich sein sollte...

Woran kann das liegen?? Den Can Transceiver habe ich schon ausgetauscht, das hat nichts verändert.

Ich sende mal mein Programm mit, vielleicht erkennt jemand die Fehlerursache.
Vielen Dank schon mal.

lg

Christoph

sero_77
17.07.2012, 17:56
Hallo Christoph,

ich würde vorschlagen, dass Du zuerst versuchst, das Problem ein zu grenzen.
Sprich ob Dein Problem von Deiner Hardware und von der Software kommt.

Verfügst Du über einen Debugger für den AT90...oder nur ein Dongle zum Programmieren ?

Wenn Du einen Debugger für den AT90... hast würde ich über die I/O Ansicht die beiden Ports manuell in
die verschiedenen Zustände bringen und im Datenblatt schauen, wie sich CAN Low und CAN High verhalten müssen.
Im Datenblatt habe ich eine Logic Tabelle gefunden in den elektrischen Eigenschaften kannst Du die Pegel nachsehen.

Wenn Du keinen Debugger hast kannst Du Dir ja ein kleinen Code zusammen schreiben.

Wichtig wäre noch zu wissen, wie lange Deine CAN Verbindung ist, an welchen Punkt Du die Bus-Abschlußwiederstände gesetzt hast
und mit welcher Baudrate du die Datenüberträgst.


Viele Grüße
Stefan

wkrug
18.07.2012, 09:50
In meinem CAN Buch steht folgendes:
Der rezessive Pegel also die 1, in einem 5V Sytem sollte 2,5V betragen. Wichtig ist hierbei nicht die absolute Spannung, sondern lediglich, das der Spannungsunterschied zwischen CANH und CANL idealerweise 0V ist. In der Praxis liegen hier maximale Spannungsunterschiede von 0,05V an.

Der dominante Pegel, also die 0 wäre ein Unterschied von 2V zwischen CANH und CANL. Er hat üblicherweise in der Praxis zwischen 1,5 und 3V.

Ohne Oszi wirst Du das aber nur schwerlich kontrollieren können. Für ein Multimeter sind die Signale viel zu schnell.
Eine Möglichkeit wäre den Controller vom Bustreiber abzuhängen und dann definierte Pegel auf den Eingang des CAN Transceivers zu legen.

Ist dein Empfänger auch als vollwertiger CAN Empfänger geschaltet?
Wenn nicht bekommt dein CAN Sender kein Acknowledge und schaltet spätestens nach 256 Nachrichten ab.

Eine weitere Fehlerquelle wäre die Konfiguration des Bus Timings, das von der Geschwindigkeit und den physikalischen Eigenschaften der Leitung abhängig sind.
Sync_Seg, Prop_Seg, Phase_Seg1, Phase_Seg2.

Ein weiteres Problem könnte der Input Filter auf Deiner PC Seite sein. Wenn der nicht für die ankommenden Adressen konfiguriert ist wird er eine ankommende Nachricht zwar Quittieren, aber nicht an den PC weitergeben.

Lies mal die Transmit und Receive Error Counter auf der Controllerseite aus und gib die Werte aus ( Display, USART ) .
Wenn tatsächlich Nachrichten gesendet werden und diese Counter nicht hochzählen funktioniert schon mal der Quittierungskreislauf.

Christoph2
18.07.2012, 18:44
Danke für die Tipps, ich werde das am Wochenende ausprobieren wenn ich wieder zuhause bin und ein Oszi habe. Die Schaltung ist schon am Weg nach Hause.

Ich melde mich dann wieder.

lg
Christoph

Christoph2
20.08.2012, 15:48
Hallo,

sorry dass ich mich so lange nicht gemeldet habe, ich war lange auf Urlaub.

Ich habe jetzt bei den Projekt weitergemacht, und mal mit dem Oszi gemessen.

Das Programm am Controller sendet alle 500ms eine Message mit 4 Byte Länge bei 125kBaud.
Die Lib die ich verwende ist von Kreatives Chaos: http://www.kreatives-chaos.com/artikel/universelle-can-bibliothek



#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>

#include "can.h"

#define SUPPORT_EXTENDED_CANID 1

/* Select if you want to use timestamps.
* Timestamps are sourced from a register internal to the AT90CAN.
* Selecting them on any other controller will have no effect, they will
* be 0 all the time.
*/
#define SUPPORT_TIMESTAMPS 0


int main(void)
{
DDRA&=~(1<<5);

can_init(BITRATE_125_KBPS);

sei();

// erzeuge eine Testnachricht
can_t msg;

msg.id = 0x123456;
msg.flags.rtr = 0;
msg.flags.extended = 1;

msg.length = 4;
msg.data[0] = 0xaa;
msg.data[1] = 0xbb;
msg.data[0] = 0xcc;
msg.data[1] = 0xdd;


while(1)
{
// Nachricht verschicken
can_send_message(&msg);
_delay_ms(500);
}

return 0;
}

Wenn ich mit dem Oszi direkt am AT90CAN128 zwischen CANRX und GND bzw. zwischen CANTX und GND messe habe ich ein Rechtecksignal mit 3,3V Pegel. Das sollte passen.

Danach habe ich noch zwei Messungen zwischen den Ausgängen CANH und CANL des SN65HVD232D gemacht:

1. SN65HVD232D mit dem CANUSB verbunden, aber CANUSB nicht aktiviert.
Das Oszibild sieht so aus:
23073
Bei einer 0 sind CANH und CANL beide auf 2,5V. Bei einer 1 ist CANH auf 3V und CANL auf 1V.
Also 2V Differenz. Das sollte alles passen.

2. SN65HVD232D mit dem CANUSB verbunden, und CANUSB aktiviert.
Sobald man den CANUSB aktiviert leuchtet die Rote Error LED am CANUSB. Den Fehlercode kann man über ein Terminal auslesen, der ist 0x80, das bedeutet laut Datenblatt: "Bus Error (BEI), see SJA1000 datasheet". Im Datenblatt des SJA1000 hab ich aber nichts dazu gefunden.
So sieht jedenfalls das Oszibild aus:
23074
Hier sieht man, dass CANH bei einer 1 kurzzeitig auf 3,5V gezogen wird, anstatt wie vorher auf 3V.
CANL ist auch nicht mehr so glatt wie vorher, aber noch immer bei 1V.
Das hat wahrscheinlich damit zu tun, dass der SN65HVD232D mit 3,3V läuft, und der CANUSB mit 5V. Aber kann darin der Fehler liegen?


Was mir noch aufgefallen ist: Ich sende ja nur alle 500ms. Der Bus ist aber dauernd belegt. Das Rechtecksignal, das auf den Oszibildern zu sehen ist, läuft kontinuierlich weiter - es gibt keine Sendepausen.

Ich habe das Kabel jetzt auf 20cm verkürzt, und die CANH und CANL Adern verdrillt. Das hat leider nichts gebracht. Langsam gehen mir die Ideen aus...
Habt ihr vielleicht noch welche?

lg
Christoph


EDIT:
Ich habe hier einen Forenthread gefunden, da hat der Ersteller das gleiche Problem wie ich: http://www.mikrocontroller.net/topic/166158
Bei ihm arbeiten aber Sender und Empfänger mit 5V.
Er hat das Problem dadurch gelöst, dass er die Spannung auf 5,3V erhöht hat, dann hat auf einmal alles funktioniert.
Ich habe aber genau 3,3V, und der Transceiver funktioniert bis 3V laut Datenblatt...

EDIT 2: Ich habe die Spannung bei meiner Schaltung auf 3,5V erhöht - das hat aber nichts gebracht. Weiter kann ich sie nicht mehr erhöhen, manche Bauteile halten nur 3,6V aus.

Christoph2
27.08.2012, 10:57
Hallo!

Ich habe das Problem endlich gefunden!!

Aus irgendeinem Grund war die brown out detection fuse aktiviert (die ist doch standardmäßig deaktiviert oder?), und auf 4V eingestellt.

Da ich den uC aber nur mit 3,3V betreibe, hat er anscheinend dauernd resettet.
Jetzt ist sie auf 2,7V eingestellt, und alles funktioniert bestens.

Vielen Dank für eure Hilfe!

lg
Christoph