Hallo,
ich habe ein Problem mit dem Versenden von CAN-Nachrichten.
Ich nutze das Olimex Board LPC-L2294 mit dem Controller LPC2294.
Ich habe ein Programm geschrieben welches CAN-Nachrichten in TCP-Paketen
bekommt, diese im ext. Ram ablegt und der Reihe nach auf den CAN-Bus
rausschickt.
Jetzt habe ich das ganze mal getestet. Ich sende immer wieder eine
CAN-Nachricht mit gleicher ID und einem Datenbyte auf CAN-Kanal 2 raus.
Das funktioniert soweit ganz gut, bis irgendwann am Empfänger (Laptop
mit CAN-Card) eine CAN-Nachricht mit ID 0 und DLC 0 ankommt. Wie die
entsteht kann ich nicht nachvollziehen.
Nun werden keine CAN-Nachrichten mehr gesendet. Beim debuggen habe ich
festgestellt, dass der Tx-Buffer des Kanal 2 (ich nutze nur Tx-Buffer 1)
nicht mehr als frei markiert wird. D.h. die Bits TBS1 und TCS1 im CANSR
Register bleiben 0.
Hat jemand eine Idee, was der Grund dafür sein könnte? Das Problem tritt
ganz sporadisch aus. Mal nach wenigen 100 Nachrichten, mal erst nach
2500 Nachrichten.
Danke!
Gruß,
Norman
Deine Bemerkung über die TX Buffer lässt mich vermuten, dass du das
Erratasheet des LPC nicht gelesen hast.
Das ist bei 32bit Controllern schon generell sträflicher Leichtsinn.
Ganz besonders aber beim CAN Controller der LP2100/2200.
Da steht drin, dass man nur einen der 3 TX-Buffer verwenden möge. Weil's
sonst nicht sauber funktioniert. Du hast zwar nur einen verwendet, dich
aber über das Verhalten eines der anderen Buffer gewundert.
Hast du die notwendigen Workarounds berücksichtigt?
Oh ich sehe,
da habe ich tatsächlich etwas falsch verstanden. Ich dachte wenn ich nur
einen Tx-Buffer verwende bin ich fein raus, aber die Bits TBS und TCS
sind ja von allen Tx-Buffern abhängig, oder?
Ich schau mir die Workarrounds gleich nochmal an.
Ich würde mich aber auch freuen, wenn du mir erklären könntest was ich
tun muss.
Danke!
Norman
Also ich stehe immernoch aufm Schlauch.
Im Erratasheet finde ich folgendes:
CAN.4 Triple Transmit Buffer function not working correctly
Introduction: The CAN block provides three transmit buffers. Each of
them has a length of four 32-bit words and is able to store one complete
CAN message
Problem:The Triple Transmit Buffer function cannot be used.
Work-around:Use any one Transmit buffer only (Use either Transmit Buffer
1, Transmit Buffer 2 or Transmit Buffer 3 exclusively). The buffer you
decided to use should be loaded only when there is no pending
transmission.
Deswegen dachte ich, es reicht nur einen Tx-Buffer zu verweden.
Oder ist dieser Punkt der Grund des Übels:
CAN.5 Handling Reset Mode and Abort Transmission
Introduction:In Reset Mode, the CAN operations are disabled and writable
registers can be written. If an Abort Transmission command is issued
then a pending transmission request is cancelled if not already in
progress.
Problem:Normal operation cannot be resumed after reset or abort
transmission without using one of the workarounds below.
Work-around:Two possible workarounds are possible.
1. After exiting the Reset Mode, before sending the first actual
message, a dummy message should be transmitted with identifier 0x0
(Standard Frame Format). This message should be transmitted by setting
both the Self Reception Request bit and the Abort Transmission bit in
the Command register simultaneously. (Note: CAN Identifier 0x0 should
not be used in the application)
Gruß,
Norman
Da niemand ausser dir weiss, was du eigentlich gemacht hast, ist deine
Aussage richtig. Ja, so kann dir niemand helfen.
Ich habe den CAN Controller des LPC2119 in einem Hausnetz mit 2 weiteren
MCP2515/AVR Stationen bereits verwendet. Das Resultat ist seit einiger
Zeit produktiv und bleibt auch nicht hängen.
Ich hatte dabei die Erratas und Workarounds berücksicktigt, die oben
erwähnte Dummy-Message eingeschlossen.
Hm sorry,
welche Infos bräuchtest du denn noch?
Das Erratasheet habe ich schon beachtet, aber ich habe halt nur nur den
Punkt mit den Tx-Buffern als für mich relevant verstanden. Deswegen
verwende ich auch nur einen.
Das mit der Dummynachricht könnte vielleicht auch noch relevant sein,
nur verstehe ich überhaupt nicht den Sinn dahinter.
Wann genau muss diese Dummynachricht denn gesendet werden? Nur wenn ich
nach der Konfiguration des CAN-Controllers vom Reset Mode in den z.B.
Operating Mode wechsle? Oder wann? Und was bewirkt das?
Sag mir bitte was du wissen musst, dann poste ich die Infos.
Danke!
Norman
Norman M. wrote:
> Das mit der Dummynachricht könnte vielleicht auch noch relevant sein,> nur verstehe ich überhaupt nicht den Sinn dahinter.
Zitat NXP: "Normal operation cannot be resumed after reset or abort
transmission without using one of the workarounds below."
> Wann genau muss diese Dummynachricht denn gesendet werden?
Zitat NXP: "After exiting the Reset Mode, before sending the first
actual message"
Das müsste Basic CAN sein, denn der SJA1000 ist ein Basic CAN
Controller.
Adressfilter habe ich ausgeschaltet.
Also ist es so wie ich es geschrieben habe? Ich muss diese
Dummynachricht nur einmal am Anfang als allererste Nachricht quasi
schicken?
Kannst du auch den Sinn dahinter erklären? Mir fehlt da irgendwie der
Zusammenhang...
Gruß,
Norman
Eine eigene Frage?
Dieser Thread ist über 18 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.