mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Luminary - CAN auf LM3S9B90


Autor: carsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo *,

ich bin gerade dabei das CAN-Interface auf dem LM3S9B90 EvalBoard zum 
laufen zu bekommen.

Mein Problem ist, dass ich beim senden von Daten immer den Fehler 
CAN_Status_LEC_Bit0 aus dem Controlregister lese. Es wird also zu lange 
ein Low-Pegel auf dem Bus gelesen.

Auf dem Oszi sehe ich zwar, dass etwas gesendet wird, es ist allerdings 
definitv kein vollständiges CAN Telegramm. Ausserdem habe ich die 
Übertragungsrate auf 125 kb/s gesetzt, sehe aber das allein das ziehen 
der Leitung auf einen Low-Pegel 20 us benötigt.

Habe ich vielleicht ein Verdrahtungsproblem? Habe einfach je eine 
Stichleitung vom CAN-Pin zu meiner Hauptleitung gezogen, die an beiden 
seiten mit einem 120 Ohm Widerstand terminiert ist.

Mein Code ist meiner Meinung nach richtig, allerdings wäre es trotzdem 
toll, wenn mal jemand drübergucken würde!

[c]
// Meine Transmitter Funktion (aus dem Luminary-Forum):
void
fCAN_send(unsigned char *str)
{
  sMsgObjectTx.ulMsgID = 0x401;
  sMsgObjectTx.ulMsgIDMask = 0x7ff;
  sMsgObjectTx.ulFlags = 0;
  sMsgObjectTx.ulMsgLen = 8;
  sMsgObjectTx.pucMsgData = str;

  CANMessageSet(CAN0_BASE, 2, &sMsgObjectTx,    MSG_OBJ_TYPE_TX);

  GPIO_PORTD_DATA_R |= GPIO_PIN_1;
}


// Meine Receiver Funktion (auch aus dem Luminary-Forum):
void
fCAN_recv(unsigned char *str)
{

  sMsgObjectRx.ulMsgID = 0x400;
  sMsgObjectRx.ulMsgIDMask = 0x7ff;
  sMsgObjectRx.ulFlags = 0;
  sMsgObjectRx.ulMsgLen = 8;
  sMsgObjectRx.pucMsgData = str;

  CANMessageSet(CAN1_BASE, 1, &sMsgObjectRx, MSG_OBJ_TYPE_RX);
}

// Und meine Main Funktion:
int
main(void)
{
  SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN | 
SYSCTL_XTAL_16MHZ);

  SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);  // CAN0
  SysCtlPeripheralEnable(SYSCTL_PERIPH_CAN0);
  SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);  // CAN1
  SysCtlPeripheralEnable(SYSCTL_PERIPH_CAN1);

  GPIOPinTypeCAN(GPIO_PORTA_BASE, GPIO_PIN_6 | GPIO_PIN_7);  // CAN0 rx 
& tx
  HWREG(GPIO_PORTA_BASE + GPIO_O_PCTL) = GPIO_PCTL_PA0_U0RX | 
GPIO_PCTL_PA1_U0TX |
GPIO_PCTL_PA2_SSI0CLK | GPIO_PCTL_PA3_SSI0FSS |
GPIO_PCTL_PA4_SSI0RX | GPIO_PCTL_PA5_SSI0TX |
GPIO_PCTL_PA6_CAN0RX | GPIO_PCTL_PA7_CAN0TX; // ...because of 
multiplexing

GPIOPinTypeCAN(GPIO_PORTF_BASE, GPIO_PIN_0 | GPIO_PIN_1);  // CAN1 rx & 
tx
HWREG(GPIO_PORTF_BASE + GPIO_O_PCTL) = GPIO_PCTL_PF0_CAN1RX | 
GPIO_PCTL_PF1_CAN1TX; // ...because of multiplexing

  CANInit(CAN0_BASE);  // my transmitter
  CANInit(CAN1_BASE);  // my receiver

  CANBitRateSet(CAN0_BASE, SysCtlClockGet(), 125000); // run at 125 kHz
  CANBitRateSet(CAN1_BASE, SysCtlClockGet(), 125000); // run at 125 kHz

  CANEnable(CAN0_BASE);
  CANEnable(CAN1_BASE);

  fCAN_recv(rData);
  fCAN_send(tData);

  while((CANStatusGet(CAN1_BASE, CAN_STS_NEWDAT) & 1) == 0){
  }
  printString("received...\n\r);
  CANMessageGet(CAN1_BASE, 1, &sMsgObjectRx, true);



  while(1){}
}
[\c]

Vielen Dank,
Carsten

Autor: Stefan Arnold (king-crash)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe das gleiche Problem, hast du schon eine Lösung?

Autor: Stefan Arnold (king-crash)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So also mit:
  SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);

  GPIOPinConfigure(GPIO_PA6_CAN0RX);

  GPIOPinConfigure(GPIO_PA7_CAN0TX);

  GPIOPinTypeCAN(GPIO_PORTA_BASE, GPIO_PIN_6 | GPIO_PIN_7);

  SysCtlPeripheralEnable(SYSCTL_PERIPH_CAN0);

  CANInit(CAN0_BASE);

  CANBitRateSet(CAN0_BASE, SysCtlClockGet(), CAN_BITRATE);

  CANEnable(CAN0_BASE);


geht es. (PA6 = RX, PA7 = TX)

Autor: carsten (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Sorry, hab den thread hiert total vergessen. Also es kan bei dem 
LM3S9B90 ohne zusätzliche Hardware nicht funktionieren. Man benötigt 
zusatzlich noch einen CAN-Transceiver (kostet ca. 1,20) der wie im 
Anhang dargestellt angeschlossen wird.
Danach funktionierte der code von mir einwandfrei.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.