Hallo ich habe ein kleines Problem mit meinem CAN-Bus. Ich habe folgendes aufgebaut: Einen Atmega32 mit MCP2515 und MCP2551 sowieo einen zweiten Knoten mit einem PCA82c250 (hatten keine zwei Gleichen). Die RS-Leitung des MCP2551 liegt mit 0 Ohm an , GND der Bus ist an beiden Knoten mit 120 Ohm terminiert. Kabellängen zwischen den Knoten habe ich schon verschiedene ausprobiert. Von 10cm bis 5m. Im Loopbackmodus funktioniert alles richtig. Der Knoten sendet und springt dann in seine Interrupt-Routine um das Empfangene wieder auszulesen. Die ID ist dabei auch richtig. Sodass ich erstmal davon ausgehe das meine Sende- und Empfangsfunktion richtig funktioniert. Nun aber zum Test mit zwei Knoten: Also ich hab dann einen Knoten auf Oneshotmodus gestellt, und schicke in einer schleife alle 5 Sekunden ein Paket raus. Sobald ich allerdings ein Paket losschicke, zeigt mit auf der Empfängerseite das CANINTF-Register ein MERRE an und der REC-Counter erhöht sich um 1. Wenn das Flag nun beim Empfänger lösche kommt nach den besagten 5 Sekunden wieder ein MERRE und der Zähler erhöht sich. Ich hab schon einiges ausprobiert, solangsam weiß ich nicht mehr weiter wo ich den Fehler noch suchen soll. Vielleicht hat ja jemand einen Tip für mich. Gruß Lars
Also, der MCP läuft mit 16MHz Quarz. Bei den Atmegas könntest du recht haben, der auf der eigentlichen Platine läuft mit 8MHz extern und der auf dem Testboard läuft mit 8MHz intern. Das werde ich nochmal probieren, dass ich beiden einen externen verpasse. Gruß Lars
Hallo zusammen, so ich habe es jetzt nochmal versucht. Jeder MCP2515 und jeder Atmega hat einen eigenen Quarz. der MCP2515 läuft mit 16MHz und der Atmega mit 8MHz. Kein Erfolg nur Bus Error. Wie gesagt der loopbackmodus funktioniert, sodass auch davon auszugehen ist dass der spi bus richtig funktioniert. Den MCP2515 initiere ich folgendermaßen:
1 | void mcp2515_init(void) |
2 | {
|
3 | PORTB &= ~(1<<PB4); |
4 | spi_put_char( SPI_RESET ); |
5 | _delay_ms(1); |
6 | PORTB |= (1<<PB4); |
7 | _delay_ms(10); |
8 | mcp2515_bit_modify(CANINTE,0b10100011,0xff); |
9 | |
10 | //Filter Buffer0 aus
|
11 | mcp2515_write_register( RXB0CTRL, (1<<RXM1)|(1<<RXM0) ); |
12 | |
13 | //Filter Buffer0 aus
|
14 | mcp2515_write_register( RXB1CTRL, (1<<RXM1)|(1<<RXM0) );; |
15 | |
16 | //LED als Interruptsignal
|
17 | mcp2515_bit_modify(BFPCTRL,0b00001111,0xFF); |
18 | |
19 | // BRP = 7
|
20 | mcp2515_write_register( CNF1, (1<<BRP0)|(1<<BRP1)|(1<<BRP2) ); |
21 | |
22 | // Prop Seg und Phase Seg1 einstellen
|
23 | mcp2515_write_register( CNF2, (1<<BTLMODE)|(1<<PHSEG11) ); |
24 | |
25 | // Wake-up Filter deaktivieren, Phase Seg2 einstellen
|
26 | mcp2515_write_register( CNF3, (1<<PHSEG21) ); |
27 | |
28 | // Normaler Modus + Oneshot
|
29 | mcp2515_bit_modify(CANCTRL,0b11101000,0b00001000); |
30 | |
31 | }
|
Gruß Lars
Hallo, ich habs hin. Als kleinen Tip für andere: Ein Widerstand am Rs kann Wunder bewirken. Gruß Lars
Mit dem Takt hatte ich etwas aus der Hüfte geschossen, nämlich wenn der MCP seinen Takt aus einem Taktausgang des AVR bezieht und dieser intern getaktet wird. Allerdings ein ziemlich seltenes Szenario. Wenn der MCP mit eigenem Quarz arbeitet reicht das, der AVR muss es nicht auch tun. Man kann allerdings den AVR mit einem Takt aus dem MCP versorgen. Nur muss man ein bischen aufpassen, dass man sich nicht aussperrt. Rs an GND (nicht:offen) ist durchaus gängig, nämlich bei hoher Bitrate. Was sauberen Abschluss und passable Kabel voraussetzt. Unklar warum das bei dir Probleme macht, denn bei mindestens einem Abschluss und 10cm kann da eigentlich nichts schiefgehen.
Hallo, es kann ja sein, dass es Probleme auf dem Steckbrett gibt, wenn RS an GND liegt und er damit Highspeed nutzt. Vielleicht liegt es auch an der Mischung zwischen MCP und PCA ich werde am Wochenende nochmal eine Platine ätzen, da hab ich dann den RS auch als 0 Ohm drauf bzw. kann ich da auch drauf tauschen und dann nutzte ich auch 2x dem mcp2551 vielleicht klappt es dann auch mit 0 Ohm. Werde ich dann berichten. Gruß Lars
Bittiming bei beiden richtig eingestellt? Mach aus den 10cm Leitung mal 10m, wenns dann wieder nicht mehr funktioniert würde ich in der Richtung nochmals suchen.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.