Forum: Mikrocontroller und Digitale Elektronik CAN Bus des TMS320F28xx


von samuel (Gast)


Lesenswert?

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

von Sepp (Gast)


Lesenswert?

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

von samuel (Gast)


Lesenswert?

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 &#8211; (reqd to access mailboxes 16
thru 31) */
// HECC mode also enables time&#8211;stamping feature
ECanaRegs.CANMC.bit.SCB = 1;
/* Initialize all bits of &#8217;Master Control Field&#8217; 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;&#8211;&#8211;&#8211;&#8211;&#8211;&#8211;&#8211;&#8211;&#8211;&# 
8211;&#8211;&#8211;&#8211;&#8211;&#8211;&#8211;&#8211;&#8211;&#8211;&#82 
11;&#8211;&#8211;&#8211;&#8211;&#8211;&#8211;&#8211;&#8211;&#8211;&#8211 
;&#8211;&#8211;&#8211;&#8211;&#8211;&#8211;&#8211;&#8211;&#8211;&#8211;& 
#8211;&#8211;&#8211;&#8211;&#8211;&#8211;&#8211;&#8211;&#8211;&#8211;
BT = 15, TSEG1 = 10, TSEG2 = 2, Sampling Point = 80%
&#8211;&#8211;&#8211;&#8211;&#8211;&#8211;&#8211;&#8211;&#8211;&#8211;&# 
8211;&#8211;&#8211;&#8211;&#8211;&#8211;&#8211;&#8211;&#8211;&#8211;&#82 
11;&#8211;&#8211;&#8211;&#8211;&#8211;&#8211;&#8211;&#8211;&#8211;&#8211 
;&#8211;&#8211;&#8211;&#8211;&#8211;&#8211;&#8211;&#8211;&#8211;&#8211;& 
#8211;&#8211;&#8211;&#8211;&#8211;&#8211;&#8211;&#8211;&#8211;&#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;&#8211;&#8211;&#8211;&#8211;&#8211;&#8211;&#8211;&#8211;&#8211;&# 
8211;&#8211;&#8211;&#8211;&#8211;&#8211;&#8211;&#8211;&#8211;&#8211;&#82 
11;&#8211;&#8211;&#8211;&#8211;&#8211;&#8211;&#8211;&#8211;&#8211;&#8211 
;&#8211;&#8211;&#8211;&#8211;&#8211;&#8211;&#8211;&#8211;&#8211;&#8211;& 
#8211;&#8211;&#8211;&#8211;&#8211;&#8211;&#8211;&#8211;&#8211;&#8211;&#8 
211;&#8211;&#8211;&#8211;&#8211;&#8211;&#8211;&#8211;&#8211;&#8211;
Achieving desired SP by changing TSEG1 & TSEG2 with BT = 25
&#8211;&#8211;&#8211;&#8211;&#8211;&#8211;&#8211;&#8211;&#8211;&#8211;&# 
8211;&#8211;&#8211;&#8211;&#8211;&#8211;&#8211;&#8211;&#8211;&#8211;&#82 
11;&#8211;&#8211;&#8211;&#8211;&#8211;&#8211;&#8211;&#8211;&#8211;&#8211 
;&#8211;&#8211;&#8211;&#8211;&#8211;&#8211;&#8211;&#8211;&#8211;&#8211;& 
#8211;&#8211;&#8211;&#8211;&#8211;&#8211;&#8211;&#8211;&#8211;&#8211;&#8 
211;&#8211;&#8211;&#8211;&#8211;&#8211;&#8211;&#8211;&#8211;&#8211;
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 &#8221;DSP28_Device.h&#8221;
#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&#8211;bit access is allowed to these registers.
16&#8211;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
&#8211; 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... */

von samuel (Gast)


Lesenswert?

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

von Alex (Gast)


Lesenswert?

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.

von samuel (Gast)


Lesenswert?

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

von Sepp (Gast)


Lesenswert?

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?

von samuel (Gast)


Lesenswert?

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

von samuel (Gast)


Lesenswert?

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

von Sepp (Gast)


Lesenswert?

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?

von samuel (Gast)


Lesenswert?

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

von Sebastian (Gast)


Lesenswert?

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

von Sepp (Gast)


Lesenswert?

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.

von samuel (Gast)


Lesenswert?

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

von Alex (Gast)


Lesenswert?

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.

von Sebastian (Gast)


Lesenswert?

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.

von samuel (Gast)


Lesenswert?

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

von Sebastian (Gast)


Lesenswert?

Werd jetzt mal mit der Programmierung beginnen. Sobald es funktioniert
meld ich mich nochmal. Welches der Programme aus der AppNote hast du
genau genommen?

von samuel (Gast)


Lesenswert?

Hi, das wäre super
Ich hab von SPRA876A die Initialisierung "DSP28_Ecan.c" benutzt
und zum senden TXLOOP.c benutzt.
Danke
Samuel

von Sebastian (Gast)


Lesenswert?

Hast du mal in die SPRU074 reingeschaut?

von samuel (Gast)


Lesenswert?

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

von Sebastian (Gast)


Lesenswert?

Das denke ich mir auch gerade...

Gruss Sebastian

von samuel (Gast)


Lesenswert?

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.

von Sebastian (Gast)


Lesenswert?

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.

von samuel (Gast)


Lesenswert?

ok hab grad bei TI angerufen....ich bekomme die samples morgen,
spätestens am Freitag.
wie kommst du bei der Software weiter?

von Sebastian (Gast)


Lesenswert?

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?

von samuel (Gast)


Lesenswert?

was ich mit dem DSP ist leider geheim....ist ein Projekt für die Firma

von samuel (Gast)


Lesenswert?

hat noch jemand eine Idee zu dem Problem?, oder einen lauffähigen Code
bezüglich senden von daten über CAN

von Alex (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.