Gast
#4379989
Hier sind zwei CAN-Knoten auf dem Steckbrett aufgebaut (geflasht mit der can-lib von Florian Greif) und 160m Kabel dazwischen geklemmt. Erste Tests. Beide Knoten (328p, MCP2515, MCP2561) sind über UART (Fleury) an je einen FTDI verbunden - beide USB gehen an denselben Rechner, auf dem zwei Konsolen offen sind - je eine verbunden an einen FTDI. So kann man in die eine Konsole tippen, in der anderen empfangen: int main(void) { cli(); uart_init(UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU)); io_init(); sei(); if ( can_init(4)) //10kBAUD @ 1MHz { PORT_DBGLED |= (1 << P_DBGLED1); // LED löschen // (some) filter is necessary! can_filter_t filter = { .id = 0, .mask = 0, .flags = { .rtr = 0, .extended = 0 } }; can_set_filter(0, &filter); } can_t msg; msg.id = 0x123456; msg.flags.rtr = 0; msg.flags.extended = 1; while(1) { c = uart_getc(); if (!(c & UART_NO_DATA)) { msg.length = 1; msg.data[0] = (char) c; can_send_message(&msg); } if (can_check_message()) { can_t rec_msg; // Try to read the message if (can_get_message(&rec_msg)) { uart_putc(rec_msg.data[0]); } } } } (tja, Formatierung verpfuscht, was solls) Beide CAN-Controller sind momentan nur mit 1 MHz Takt per CLKOUT vom Atmega versorgt, da (zumindest auf dem Steckbrett) der 16Mhz Kristall (zwar am Atmega, aber) nicht am MCP anschwingt. Quarz vorerst komplett entfernt und beide 328p mit 1 MHz getaktet per int. OSC 8MHz + CKDIV checked, der dann über CLKOUT den MCP2515 mit Takt versorgt. Baudraten: CAN: 10kBaud (konservativ, aber viel Spiel ist bei 1Mhz eh nicht) UART: 4800 Baud (passt nicht perfekt, aber mit 0,2% mismatch akzeptabel) Der Fleury UART hat 32 Byte Puffer (TX, und RX). Jetzt hab ich einen der zwei FTDI vom PC abgeklemmt, und in den Raspi gesteckt. Am Raspi die Baudrate eingestellt: sudo stty 4800 -F /dev/ttyUSB0 Kann man also jetzt auf der Raspi Konsole sowas eingeben wie: echo a >> /dev/ttyUSB0 und ein "a" erscheint auf der Konsole am PC, so wie gedacht. Beispielsweise ein echo abcdefghijklmn >> /dev/ttyUSB0 gibt aber perfekt reproduzierbar jedesmal nur: acbjnf aus. Nimmt man die 160m Kabel raus und verbindet direkt: dasselbe Ergebnis. Lässt man das CAN-Knäuel komplett raus und verbindet die beiden FTDIs (RX-TX) direkt, dann ist die Ausgabe korrekt. Also CAN das Problem (Firmware inklu, offensichtlich ;) ). Wenn der Raspi auf UART nur mit 4800 Baud darf, es zusätzlich FIFO Buffer mit 32 Byte für RX und TX bei Fleury gibt, und das bei (ja: ausreichend schnellem) 10kBaud CAN für dieses Szenario, dann liegt das Problem vermutlich doch nicht am CAN Layer, sondern in der Software? Die 10kBaud mögen nicht schnell genug sein, weil ein CAN Frame doch mehr aufträgt, als ein 4.8kBaud Uart Frame. Aber es sind ja nur 14 Bytes gesendet worden. Selbst beim Senden von "abc" gibt es schon "acb" in der Konsole. Ich kann vieles probieren, aber vielleicht hat jemand schon direkt Plan, was Phase ist?! (wer hier Schaltplan einfordert ist Troll)