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
So also mit:
1 | SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); |
2 | |
3 | GPIOPinConfigure(GPIO_PA6_CAN0RX); |
4 | |
5 | GPIOPinConfigure(GPIO_PA7_CAN0TX); |
6 | |
7 | GPIOPinTypeCAN(GPIO_PORTA_BASE, GPIO_PIN_6 | GPIO_PIN_7); |
8 | |
9 | SysCtlPeripheralEnable(SYSCTL_PERIPH_CAN0); |
10 | |
11 | CANInit(CAN0_BASE); |
12 | |
13 | CANBitRateSet(CAN0_BASE, SysCtlClockGet(), CAN_BITRATE); |
14 | |
15 | CANEnable(CAN0_BASE); |
geht es. (PA6 = RX, PA7 = TX)
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.
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.
