Hallo zusammen,
ich versuche seit mehreren Stunden, eine CAN-Übertragung zustande zu
bekommen, aber irgendwie kriege ich nur ACK-errors. Dummerweise kann ich
noch nichtmal sagen, ob's an der Hardware oder der Software hängt. Ich
vermute allerdings einen der folgenden Fehler:
- Pin-Remap klappt nicht
- Bit-Timing stimmt nicht (bin nicht ganz sicher, welche Frequenz am
APB1 anliegt)
- Can-Transceiver falsch verkabelt?
Ich poste hier mal meinen Code, vielleicht fällt ja jemandem direkt was
auf. Habe mich stark an der ST-Lib orientiert, vielleicht habe ich bei
den Änderungen einen Fehler gemacht oder sowas.
1
voidCAN_Config(void)
2
{
3
GPIO_InitTypeDefGPIO_InitStructure;
4
5
/* CAN GPIOs configuration **************************************************/
STM32F4 Discovery, MCP2551. Auf welcher Frequenz sollte der APB1 laufen?
Vielleicht hilft mir das ja direkt weiter...
Falls ihr für ne brauchbare Antwort noch mehr Code-Ausschnitte braucht
oder andere Fragen habt, werde ich das hier natürlich gerne noch
ergänzen. Bin nur leider mittlerweile echt am verzweifeln und für jede
Hilfe dankbar.
Besten Dank im Voraus!
Hast du deinen Sys Clock richtig konfiguriert?
Kennst du deinen Clock Speed und woher er kommt?
Hast du einen CAN Sender und CAN Empfänger gepaart (ev. mit CAN
Analyser)?
Tut sich was auf den CAN Pins wenn du sendest (Osci)?
Falls ja mit welcher Frequenz?
Welche Entwicklungsumgebung?
Ui, gleich so viele Fragen auf einmal...
SystemCoreClock steht auf 168 Mhz, zumindest wird mir das in meiner
Timer-Funktion so angezeigt, sollte also geklappt haben.
Wir basteln hier mit einer CANoe-Testumgebung rum, die Gegenstelle ist
also ein Vector CanCase XL.
Gesendet habe ich bis jetzt noch nichts, das könnte ich aber mal mit dem
Beispiel-Programm testen. Wäre wirklich mal ne gute Idee um zu gucken,
ob der Remap funktioniert hat. Werd ich nochmal flott ausprobieren, wenn
das sich nicht als zu aufwendig herausstellt (is ja kurz vor Feierabend
und so ;))
Ach ja, ich arbeite mit Atollic TrueStudio Lite.
Hi,
Im CANoe CAN - Treiber hast du ACK an? Standardmässig hört CANoe nämlich
nur am Bus, ohne den Empfang einer Botschaft zu bestätigen (das sollten
normal auch nur die anderen SG machen). Wenn du jetzt nur einen
Busteilnehmer zu deiner Schaltung hast, muss der (also dein CANoe) in
den ACK slot schreiben. Wenn nicht, bekommste einen ACK Fehler.
Grüßle
Andreas
Andreas Gassner schrieb:> Im CANoe CAN - Treiber hast du ACK an? Standardmässig hört CANoe nämlich> nur am Bus, ohne den Empfang einer Botschaft zu bestätigen (das sollten> normal auch nur die anderen SG machen). Wenn du jetzt nur einen> Busteilnehmer zu deiner Schaltung hast, muss der (also dein CANoe) in> den ACK slot schreiben. Wenn nicht, bekommste einen ACK Fehler.
Ich versuch's ja eigentlich genau andersherum... ich will über CANoe was
senden und mit dem uC empfangen. Und CANoe wirft ACK-Errors aus, weil
vom uC nix zurück kommt.
Hi,
Achso, sorum...
Ich geh mal davon aus, dass du einen Abschlusswiderstand hast? Ohne ist
der CAN manchmal bockig, wenn die Kablelängen recht lang werden...
Grüßle
Andreas
Andreas Gassner schrieb:> Hi,>> Achso, sorum...>> Ich geh mal davon aus, dass du einen Abschlusswiderstand hast? Ohne ist> der CAN manchmal bockig, wenn die Kablelängen recht lang werden...>> Grüßle> Andreas
Ja, vor dem MCP hängen zwischen CANH und CANL 120Ohm. Daran dürfte es
also eigentlich nicht hängen. Hab's im Grunde so verkabelt wie im Anhang
gezeigt.
Also R2 einfach komplett rausnehmen oder wie? Bin heute nicht vor Ort,
kann's deswegen also nicht ausprobieren, aber werd das bei nächster
Gelegenheit mal nachholen. Danke schonmal!
So, nur mal ein kleines Update hier:
habe R2 jetzt gebrückt, und noch schnell die Werte für's Bit-Timing
angepasst (läuft offensichtlich auf 42MHz), und jetzt klappt es. Vielen
Dank nochmal an alle für die Hilfe!
Okay, nächstes Problem:
Der Interrupt wird nicht ausgelöst, so dass zwar die Nachrichten
empfangen werden, ich aber nix damit machen kann.
Nach dem bereits oben aufgeführten Code folgt die
Der Interrupt wird aber nie aufgerufen, obwohl die CAN-Nachrichten
empfangen werden. Selbst bei offenem Filter passiert nix.
Jemand ne Idee, woran das liegen könnte?
Andreas W. schrieb:> beim stm32f10x machen ich immer noch folgendes:>> CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE);
Gute Idee, steht aber leider schon im Quelltext drin, siehe originales
Posting...
Sonst vielleicht noch jemand eine Idee?
Kris schrieb:> die Struktur der RxMessage muß im Interrupthandler natürlich auch> bekannt sein.
Hallo
Kannst Du bitte die Lösung posten, habe dasselbe Problem...
Hey, sehe leider jetzt erst, dass das Thema anscheinend wieder aktuell
ist.
Falls es dir nach fast einem Monat noch hilft, hier mal was zum
Interrupthandler:
1
voidCAN1_RX0_IRQHandler(void){
2
CanRxMsgRxMessage;
3
4
uint8_ti=0;
5
6
RxMessage.StdId=0x00;
7
RxMessage.ExtId=0x00;
8
RxMessage.IDE=0;
9
RxMessage.DLC=0;
10
RxMessage.FMI=0;
11
for(i=0;i<8;i++){
12
RxMessage.Data[i]=0x00;
13
}
14
15
CAN_Receive(CAN1,CAN_FIFO0,&RxMessage);
16
17
/* ... und dann natürlich noch eine Funktion, mit der du die Daten weiterverarbeitest...*/