Gast
#166223
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
|
Anzeige
|
CAN Bus des TMS320F28xx
Gast
#166223
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
Gast
#166224
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
Gast
#166225
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... */
Gast
#166226
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
Gast
#166227
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.
Gast
#166228
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
Gast
#166229
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?
Gast
#166230
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
Gast
#166231
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
Gast
#166232
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?
Gast
#166233
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
Gast
#166234
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
Gast
#166235
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.
Gast
#166236
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
Gast
#166237
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.
Gast
#166238
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.
Gast
#166239
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
Gast
#166240
Werd jetzt mal mit der Programmierung beginnen. Sobald es funktioniert meld ich mich nochmal. Welches der Programme aus der AppNote hast du genau genommen?
Gast
#166241
Hi, das wäre super Ich hab von SPRA876A die Initialisierung "DSP28_Ecan.c" benutzt und zum senden TXLOOP.c benutzt. Danke Samuel
Gast
#166242
Hast du mal in die SPRU074 reingeschaut?
Gast
#166243
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
Gast
#166244
Das denke ich mir auch gerade... Gruss Sebastian
Gast
#166245
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.
Gast
#166246
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.
Gast
#166247
ok hab grad bei TI angerufen....ich bekomme die samples morgen, spätestens am Freitag. wie kommst du bei der Software weiter?
Gast
#166248
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?
Gast
#166249
was ich mit dem DSP ist leider geheim....ist ein Projekt für die Firma
Gast
#166250
hat noch jemand eine Idee zu dem Problem?, oder einen lauffähigen Code bezüglich senden von daten über CAN
Gast
#166251
Hat Texas Instruments keinen Support? Bei AD hat man immer innerhalb von 24-48h eine Rückmeldung, welche oft produktiv ist. Antwort schreibenBitte melde dich an, um einen Beitrag zu schreiben. |
Anzeige
|