Forum: Mikrocontroller und Digitale Elektronik UART-CAN mit Raspi Experiment


von can-lib (Gast)


Lesenswert?

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)

von juhu (Gast)


Lesenswert?

ein CAN Frame hat normalerweise "nur" 8 Byte Nutzdaten, könntes es damit 
ein zusammenhang haben ???

von can-lib (Gast)


Lesenswert?

Im Bespiel wird nur 1 Byte Nutzdaten verschickt, also jeder Charakter 
einzeln. Und es wird übrigends extended CAN-ID benutzt --> also 
maximaler Overhead. Aber ist ja nur ein Test.

Im Fall abc-->acb überholt das b also das c. Das ist ein Szenario, dass 
man sich bei CAN vorstellen kann (sende abcb, das erste b überträgt 
fehlerhaft und wird wiederholt gesendet?!). Ich probier später mal eine 
kleinere UART Baud.

von can-lib (Gast)


Lesenswert?

Eine Baud hatte ich vergessen: SPI zum MCP2515. Stand noch auf Prescaler 
32 (eben auch konservativ). Steht nun auf 2. Aber zu langsam für den 
UART war SPI dann wohl trotzdem nicht.

Glaub langsam, dass dieses hier das (oder ein) Problem ist, auf der 
Empfangsseite:

if (!(c & UART_NO_DATA))
{
   msg.data[0] = (char) c;
   can_send_message(&msg);
}

--> also UART füttert schneller, als CAN senden kann

Wahrscheinlich gibts deshalb auch das Protokoll im CAN Bootloader bei 
Kreatives Chaos (den ich noch verwenden will), das auf die Reihenfolge 
der zu sendenden/empfangenen Pakete Acht gibt. Gut, dann muss man wohl 
doch etwas weiter ausholen. Das schau ich mir mal an. Ja ok, bin 
geläutert. War wohl doch etwas schnell geschossen. Einziges Szenario für 
seriell über CAN-Tunnel wäre ja ohnehin das Übertragen des Hex-Files 
beim Flachen.

Ich weiss, die mickrigen Baudraten momentan sind noch nicht optimal. 
Aber funktionieren sollte es damit ja prinzipiell auch. Wenn mal der 
16MHz Quartz anschwiegen würde am MCP. Ich warte da noch auf die 
Platinen, um vom Steckbrett wegzukommen.

von can-lib (Gast)


Lesenswert?

Oha, habs per Hardware erstmal gelöst. Der Quarz schwingt wohl doch 
(warum auch nicht?) am MCP. Allein, ich konnte es nicht detektieren. Per 
Oszi gings nicht (Spieloszi am MCP CLKOUT), und can-lib wollte zu dem 
Zeitpunkt gleichzeitig auch noch debugged werden (nein, nicht die Lib 
selbst - meine Anwendung derselben).
Hab jetzt beide MCP mit 16 MHz getaktet und die beiden 328p mit 8 MHz 
vom internen RCO. CAN Baudrate auf 50Baud hochgesetzt (geht ja jetzt) 
und UART 9600 spendiert. Dann ist CAN schneller als UART, so dass nichts 
mehr verschluckt wird. Alphabete am Stück senden ist jetzt kein Thema 
mehr. Halleluja...

von H.Joachim S. (crazyhorse)


Lesenswert?

can-lib schrieb:
> CAN Baudrate auf 50Baud hochgesetzt (geht ja jetzt)
> und UART 9600 spendiert. Dann ist CAN schneller als UART,

ein k vergessen?

von can-lib (Gast)


Lesenswert?

:) ja.. 50kBaud

von can-lib (Gast)


Lesenswert?

noch Update:

momentan wieder beide FTDI am PC. Für 50kBaud CAN lassen sich prima 
Textfiles auf die Konsole übertragen. Aber nur in eine Richtung. In die 
andere hängt es deutlich. Auf 100kBaud gegangen. Erste Richtung 
immernoch perfekt. Andere Richtung nicht, aber hängt deutlich weniger. 
Immerhin komme ich jetzt auf Speed. CAN Verbindung von "direkt" (=10cm 
Leitung) wieder geändert und die 160m Leitung eingehängt. Alles 
identisch. Prima. Naja, in eine Richtung gehts super. Da kann ich mal 
beruhigt schlafen gehen. Die andere Richtung --> es ist immer noch 
Steckbrett... als nächstes kann es an den Bootloader gehen denke ich. 
Noch die 9600Baud für UART gecheckt: sollten auch 0,2% Fehler sein, also 
Ok.

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.