Hallo, ich hab hier Probleme mit dem Can-Bus des TMS320F28xx. hat jemand Erfahrung damit. Bitte meldet ewuch, es sit sehr wichtig... grüsse samuel
Du Schnulli, dann schreib doch mal: 1. Warum ist es sehr wichtig, stirbt sonst Deine Oma oder ist nur Dein Lehrer sauer und gibt Dir eine 6? 2. Welche Probleme hast Du? Software? Hardware? An welcher Stelle? 3. Poste Schaltplan, Dein Programm 4. Genaue Beschreibung, an welcher Stelle Dein Programm die Probleme macht
Also, das ist ein wichtiges Projekt, was ich unbedingt bald zum laufen bekommen muss. Ich initialisiere den CAN-Bus nach dem manual SPRA876 von TI in der funktion InitECan (siehe unten). anschließend will ich Daten senden (siehe Code weiter unten). hier kommt er aber nur bis zu der Zeile "while(ECanaRegs.CANTA.bit.TA5 == 0 ) {}" und bleibt dort hängen. das Bit "ECanaRegs.CANTA.bit.TA5" geht auf 1, wenn die Daten korrekt gesendet wurden. was könnte hier die Ursache für den Fehler sein? Danke für eure Hilfe grüsse Samuel void InitECan(void) { long i; asm("EALLOW"); /* Disable Watchdog */ SysCtrlRegs.WDCR = 0x006F; /* Enable clock to CAN module */ SysCtrlRegs.PCLKCR.all = 0x4000; /* Set PLL multiplication factor */ SysCtrlRegs.PLLCR.bit.DIV = 0x000A; // Set PLL to x10 (/2). A CLKIN of 30 MHz would result in // 30 * 10 = 300 (/2) = 150 MHz SYSCLKOUT. for(i=0; i<100000; i++) // Delay for PLL to stabilize { asm("NOP"); } /* Configure eCAN pins using GPIO regs*/ GpioMuxRegs.GPFMUX.bit.CANTXA_GPIOF6 = 1; GpioMuxRegs.GPFMUX.bit.CANRXA_GPIOF7 = 1; /* Configure eCAN RX and TX pins for eCAN transmissions using eCAN regs*/ ECanaRegs.CANTIOC.bit.TXFUNC = 1; ECanaRegs.CANRIOC.bit.RXFUNC = 1; /* Configure eCAN for HECC mode – (reqd to access mailboxes 16 thru 31) */ // HECC mode also enables time–stamping feature ECanaRegs.CANMC.bit.SCB = 1; /* Initialize all bits of ’Master Control Field’ to zero */ // Some bits of MCF register come up in an unknown state. For proper operation, // all bits (including reserved bits) of MCF must be initialized to zero ECanaMboxes.MBOX0.MSGCTRL.all = 0x00000000; ECanaMboxes.MBOX1.MSGCTRL.all = 0x00000000; ECanaMboxes.MBOX2.MSGCTRL.all = 0x00000000; ECanaMboxes.MBOX3.MSGCTRL.all = 0x00000000; ECanaMboxes.MBOX4.MSGCTRL.all = 0x00000000; ECanaMboxes.MBOX5.MSGCTRL.all = 0x00000000; ECanaMboxes.MBOX6.MSGCTRL.all = 0x00000000; ECanaMboxes.MBOX7.MSGCTRL.all = 0x00000000; ECanaMboxes.MBOX8.MSGCTRL.all = 0x00000000; ECanaMboxes.MBOX9.MSGCTRL.all = 0x00000000; ECanaMboxes.MBOX10.MSGCTRL.all = 0x00000000; ECanaMboxes.MBOX11.MSGCTRL.all = 0x00000000; ECanaMboxes.MBOX12.MSGCTRL.all = 0x00000000; ECanaMboxes.MBOX13.MSGCTRL.all = 0x00000000; ECanaMboxes.MBOX14.MSGCTRL.all = 0x00000000; ECanaMboxes.MBOX15.MSGCTRL.all = 0x00000000; ECanaMboxes.MBOX16.MSGCTRL.all = 0x00000000; ECanaMboxes.MBOX17.MSGCTRL.all = 0x00000000; ECanaMboxes.MBOX18.MSGCTRL.all = 0x00000000; ECanaMboxes.MBOX19.MSGCTRL.all = 0x00000000; ECanaMboxes.MBOX20.MSGCTRL.all = 0x00000000; ECanaMboxes.MBOX21.MSGCTRL.all = 0x00000000; ECanaMboxes.MBOX22.MSGCTRL.all = 0x00000000; ECanaMboxes.MBOX23.MSGCTRL.all = 0x00000000; ECanaMboxes.MBOX24.MSGCTRL.all = 0x00000000; ECanaMboxes.MBOX25.MSGCTRL.all = 0x00000000; ECanaMboxes.MBOX26.MSGCTRL.all = 0x00000000; ECanaMboxes.MBOX27.MSGCTRL.all = 0x00000000; ECanaMboxes.MBOX28.MSGCTRL.all = 0x00000000; ECanaMboxes.MBOX29.MSGCTRL.all = 0x00000000; ECanaMboxes.MBOX30.MSGCTRL.all = 0x00000000; ECanaMboxes.MBOX31.MSGCTRL.all = 0x00000000; // TAn, RMPn, GIFn bits are all zero upon reset and are cleared again // as a matter of precaution. /* Clear all TAn bits */ ECanaRegs.CANTA.all = 0xFFFFFFFF; /* Clear all RMPn bits */ ECanaRegs.CANRMP.all = 0xFFFFFFFF; /* Clear all interrupt flag bits */ ECanaRegs.CANGIF0.all = 0xFFFFFFFF; ECanaRegs.CANGIF1.all = 0xFFFFFFFF; /* Configure bit timing parameters */ ECanaRegs.CANMC.bit.CCR = 1 ; // Set CCR = 1 while(ECanaRegs.CANES.bit.CCE != 1 ) {} // Wait for CCE bit to be set.. ECanaRegs.CANBTC.bit.BRPREG = 13; ECanaRegs.CANBTC.bit.TSEG2REG = 2; ECanaRegs.CANBTC.bit.TSEG1REG = 10; ECanaRegs.CANMC.bit.CCR = 0 ; // Set CCR = 0 while(ECanaRegs.CANES.bit.CCE == 0 ) {} // Wait for CCE bit to be cleared.. /* Disable all Mailboxes */ ECanaRegs.CANME.all = 0; // Required before writing the MSGIDs } /***************************************************/ /* Bit configuration parameters for 150 MHz SYSCLKOUT*/ /***************************************************/ /* The table below shows how BRP field must be changed to achieve different bit rates with a BT of 15, for a 80% SP: ––––––––––&# 8211;–––––––––R 11;–––––––––– ;––––––––––& #8211;––––––––– BT = 15, TSEG1 = 10, TSEG2 = 2, Sampling Point = 80% ––––––––––&# 8211;–––––––––R 11;–––––––––– ;––––––––––& #8211;––––––––– 1 Mbps : BRP+1 = 10 : CAN clock = 15 MHz 500 kbps : BRP+1 = 20 : CAN clock = 7.5 MHz 250 kbps : BRP+1 = 40 : CAN clock = 3.75 MHz 125 kbps : BRP+1 = 80 : CAN clock = 1.875 MHz 100 kbps : BRP+1 = 100 : CAN clock = 1.5 MHz 50 kbps : BRP+1 = 200 : CAN clock = 0.75 MHz The table below shows how to achieve different sampling points with a BT of 25: ––––––––––&# 8211;–––––––––R 11;–––––––––– ;––––––––––& #8211;––––––––– 211;––––––––– Achieving desired SP by changing TSEG1 & TSEG2 with BT = 25 ––––––––––&# 8211;–––––––––R 11;–––––––––– ;––––––––––& #8211;––––––––– 211;––––––––– TSEG1 = 18, TSEG2 = 4, SP = 80% TSEG1 = 17, TSEG2 = 5, SP = 76% TSEG1 = 16, TSEG2 = 6, SP = 72% TSEG1 = 15, TSEG2 = 7, SP = 68% TSEG1 = 14, TSEG2 = 8, SP = 64% The table below shows how BRP field must be changed to achieve different bit rates with a BT of 25, for the sampling points shown above: 1 Mbps : BRP+1 = 6 500 kbps : BRP+1 = 12 250 kbps : BRP+1 = 24 125 kbps : BRP+1 = 48 100 kbps : BRP+1 = 60 50 kbps : BRP+1 = 120 */ #include ”DSP28_Device.h” #define TXCOUNT 10000 // Transmission will take place (TXCOUNT) times.. long i; long loopcount = 0; void InitECan(void); main() { /* Create a shadow register structure for the CAN control registers. This is needed, since, only 32–bit access is allowed to these registers. 16–bit access to these registers could potentially corrupt the register contents. This is especially true while writing to a bit (or group of bits) among bits 16 – 31 */ struct ECAN_REGS ECanaShadow; /* Initialize the CAN module */ InitECan(); /* Write to the MSGID field */ ECanaMboxes.MBOX5.MSGID.all = 0x9FFFFFFF; // Extended Identifier /* Configure Mailbox under test as a Transmit mailbox */ ECanaShadow.CANMD.all = ECanaRegs.CANMD.all; ECanaShadow.CANMD.bit.MD5 = 0; ECanaRegs.CANMD.all = ECanaShadow.CANMD.all; /* Enable Mailbox under test */ ECanaShadow.CANME.all = ECanaRegs.CANME.all; ECanaShadow.CANME.bit.ME5 = 1; ECanaRegs.CANME.all = ECanaShadow.CANME.all; /* Write to DLC field in Master Control reg */ ECanaMboxes.MBOX5.MCF.bit.DLC = 8; /* Write to the mailbox RAM field */ ECanaMboxes.MBOX5.MDRL.all = 0x01234567; ECanaMboxes.MBOX5.MDRH.all = 0x89ABCDEF; /* Begin transmitting */ // while(1) // Uncomment this line for infinite transmissions for(i=0; i < TXCOUNT; i++) // Uncomment this line for finite transmissions { ECanaShadow.CANTRS.all = 0; ECanaShadow.CANTRS.bit.TRS5 = 1; // Set TRS for mailbox under test ECanaRegs.CANTRS.all = ECanaShadow.CANTRS.all; while(ECanaRegs.CANTA.bit.TA5 == 0 ) {} // Wait for TA5 bit to be set.. ECanaShadow.CANTA.all = 0; ECanaShadow.CANTA.bit.TA5 = 1; // Clear TA5 ECanaRegs.CANTA.all = ECanaShadow.CANTA.all; loopcount ++; } } /* CANalyzer configuration file: 1M80SPRX.cfg... */
Könnte mir noch jemand genau die Arbeitsweise der CAN-schnittstelle erklären, ich blick bei dem Manual nicht richtig durch wie die Arbeitet. grüsse Samuel
Die kannst du jedem Datenblatt eins CAN-fähigen Controllers entnehmen. Du kannst dir auch einfach die komplette Spezifikation per Google holen. Das CAN-Interface ist auf allen MC/DSP die ich kenne gleich, nur wenige Register haben mal andere Namen. Sorry für den Spruch, aber ich mache mich immer zuerst mit der Arbeitsweise vertraut und fange dann an zu tippen, spart ungemein Zeit.
gut, das meiste allegmeine zum CAN-Bus weiss ich schon, ich versteh nicht was an meiner Initialisierung falsch sein soll, dass er die Daten nicht senden kann. ich habe auch einen CAN-Bus tranceiver angschlossen, damit die Leitungen definierte Pegel haben, Samuel
Was hast Du denn für Hardware? Und welche Teilnehmer hängen am Bus? Und was ist das für ein Projekt und wann muss das laufen?
Ich benutze das Evaluation board von TI. Am Bus hängt nur der CAN-Bus tranceiver PCA82C251. das ist ein Projekt für meine Firma. Ich muss anschliessend mit einer anderen Elektronik kommunizieren, aber zuerst will ich den CAN Bus des TMS zum laufen bringen. ich sollte den CAN bus des TMs am besten noch heute zum laufen bringen samuel
sorry ich hab will mich noch etwas präzisieren. Am CAN Bus des TMS (an den Leitungen TxD und RxD hängt der tranceiver PCA82C251. Am Tranceiver hängt ein CAN-Bus Adapter der Firma IXXAT der an den USB Port zum PC führt. ich will also im Moment nur Faten vom TMS zum PC senden und die dort in einem Terminalfenster anzeigen lassen... Danke Samuel
Hmmm, das klärt aber immer noch nicht die Frage, ob Du das richtig verschaltet hast. Wie sieht es denn mit der Spannungsversorgung und den Widerständen aus?
die Spannungsversorgung ist ok. welche Widerstände meinst du denn?....für den Tranceiver brauch ich keine Widerstände. TxD und RxD gehe zum TMS. und CAN_L und CAN_H zum IXATT Interface. wo soll ich da Widerstände brauchen? gruss Samuel
Ich bin derzeit mit dem gleichen Problem beschäftig, bastel aber noch die Hardware. Ich war der Meinung das du einen 3,3V-Transceiver braucht, weil die Portpins nicht mit 5V beschaltet werden dürfen. Also nimm am besten einen SN65HVD23x. Ich verwende den SN65HVD233, wie empfohlen. Schau doch mal in das Datenblatt (gibts bei TI) von dem Transceiver. Dein Schaltplan wäre schon hilfreich! Gruss Sebastian
CAN ist ein Bussystem. Das braucht Abschlußwiderstände, damit keine störenden Reflexionen auftreten (Elektromagnetische Wellen auf den Leitern). Es kann sein, dass die schon in Deinem IXATT integriert sind. Wenn ja, dann schau mal, ob die aktiviert sind oder Du das erst noch machen musst.
Ja ich hatte mir auch das Datenblatt des PCA82C251. Laut datenblatt arbeitet der PCA82C251 zwischen 4,5 und 5,5 VCC. Da ich keinen anderen zur Verfügung hatte, habe ich ausprobiert ob er bei einer Spannungversorgung von 3,3 V auch noch korrekte Signale liefert, und das hat er gemacht. Mein Problem ist, dass ich direkt am TMS (also TxD) überhaupt kein Signal beim senden messe, wenn ich ein Oszilloskop anhänge. das müsste ich doch unabhängig davon ob der tranceiver korrekt arbeitet oder nicht oder? Selbst wenn ich keinen Tranceiver anhänge messe ich gar kein Signal an TxD sondern einen Dauerpegel von 3,3V. wie überprüft der TMS eigentlich ob die Daten korrekt gesendet wurden? Achso ja die Abschlusswiderstände sind schon am adapter beim IXXAT drauf. wie soll ich nun weiter vorgehen? samuel
Zum Erkennen des Empfangs gibt es ein ACK-Bit (Was glaubst du, wozu CANTA da ist?). Der Dauerpegel von 3,3V deutet auf einen Softwarefehler deinerseits hin.
Keine Ahnnung ob das was hilft, aber tausch mal die Zeilen aus! // Configure the eCAN RX and TX pins for eCAN transmissions EALLOW; ECanaShadow.CANTIOC.all = ECanaRegs.CANTIOC.all; ECanaShadow.CANTIOC.bit.TXFUNC = 1; ECanaRegs.CANTIOC.all = ECanaShadow.CANTIOC.all; ECanaShadow.CANRIOC.all = ECanaRegs.CANRIOC.all; ECanaShadow.CANRIOC.bit.RXFUNC = 1; ECanaRegs.CANRIOC.all = ECanaShadow.CANRIOC.all; EDIS; -> struct ECAN_REGS ECanaShadow; muß natürlich auch vorhanden sein! Das erzwingt einen 32-Bit-Zugriff, welcher für die eCAN Control Register benötigt wird.
struct ECAN_REGS ECanaShadow; hatte ich davor schon gemacht. Ne diese Änderung hilft leider auch nicht. hmmm....ich weiss nicht wo es sonst noch dran liegen könnte
Werd jetzt mal mit der Programmierung beginnen. Sobald es funktioniert meld ich mich nochmal. Welches der Programme aus der AppNote hast du genau genommen?
Hi, das wäre super Ich hab von SPRA876A die Initialisierung "DSP28_Ecan.c" benutzt und zum senden TXLOOP.c benutzt. Danke Samuel
ja klar hab ich. da muss ich aber sagen, dass die Initialisierung und transmit/receive in spru74 nicht richtig mit den Beispielen in spra876 übereinstimmt gruss Samuel
ich habe gerade bei mir festgestellt: wenn ich wie in "2.2 Steps to Configure eCAN" in spru 74 durchführe (was in spra 876 nicht gemacht ist), wurde nicht mal die Initialisierung korrekt abgeschlossen, da das CEE Bit bei mir am Ende der Initialisierung immer auf "1" ist. also irgendwie scheint nicht mal die Initialisierung korrekt zu funktionieren.
Vielleicht hast du ja mal ein paar Minuten Zeit um dich bei TI zu registrieren. Dann kannst du dir den Transceiver als Sample ordern. Ich glaub drei Stück waren das Maximum. Nimmst ihn halt in allen Versionen (SN65HVD23x) drei mal. Ist aber SMD.
ok hab grad bei TI angerufen....ich bekomme die samples morgen, spätestens am Freitag. wie kommst du bei der Software weiter?
Naja, eher schleppend... Ist schon ein ziemlicher Ack sich durch die ganzen Strukturen usw. durchzuwühlen. Schau mir grad die InitECan() genauer an. Was hast du denn mit dem DSP vor, wenn man fragen darf? BLDC?
hat noch jemand eine Idee zu dem Problem?, oder einen lauffähigen Code bezüglich senden von daten über CAN
Hat Texas Instruments keinen Support? Bei AD hat man immer innerhalb von 24-48h eine Rückmeldung, welche oft produktiv ist.
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.