Forum: Mikrocontroller und Digitale Elektronik dsPIC33E mit ECAN - Geht es auch ohne DMA?


von Robert Meier (Gast)


Lesenswert?

Hallo,

von Microchip gibt es ein paar Beispiele zum ECAN des dsPIC33E.
Alle recht ähnlich und leider (?) alle mit DMA.

Kann man den ECAN auch ohne DMA betreiben
oder geht das nicht ohne?

Hat/kennt jemand vielleicht ein Beispiel für ECAN ohne DMA?

Schöne Grüße,

Robert

von old man (Gast)


Lesenswert?

Hatte ich neulich auch mal kurz probiert. So wie ich das sehe hat das 
ECAN Modul keine Register über die CAN-Msg's ausgetauscht werden können. 
Es wird wohl nur über DMA gehen.
Nachdem ich mich aber eine Weile über das schnarchlangsame Debugging 
geärgert habe, ist der dsPIC wieder in die Kiste gewandert. Ich verwende 
schon ein IDC3. Wenn man nie was anderes gekannt hat mag das ja gehen. 
Normalerweise arbeite ich mit Crossworks und jlink. Den dsPic habe ich 
durch einen LPC11C14 ersetzt und gut. Niewieder zurück war mein Fazit.
Trotzdem interessiert es mich auch ob DMA bein dsPIC33E zwingend ist.

von Markus (Gast)


Lesenswert?

Hi,

ich glaube das ist nicht wirklich vorgesehen.
Und warum sollte man das tun? was habt ihr gegen DMA?

Gruß

von old man (Gast)


Lesenswert?

Markus schrieb:
> ich glaube das ist nicht wirklich vorgesehen.
> Und warum sollte man das tun? was habt ihr gegen DMA?

Eigentlich nichts. Ist bei mir nur das erste mal, dass mir das in der 
Form zwingend untergekommen ist. Die 10 Zeilen Code um die DMA Kanäle zu 
initialisieren sind nicht weiter schlimm. Deshalb ist die Frage auch ehr 
akademischer Art.

von Markus (Gast)


Lesenswert?

aah, ok

ich hatte das mal länger versucht, ohne Erfolg, da die älteren 
Revisionen von dem von uns verwendeteten Typ hier einen Fehler hatte.

Hatte dann einen anderen Workaround gefunden.

von Robert Meier (Gast)


Lesenswert?

Wenn ich eines der Beispiel-Projekte für den dsPIC33EP256MC506
übersetzen möchte, erhalte ich folgende Fehlermeldungen:
(ich habe bereits #include "p33exxxx.h" in ECAN1Config.c ergänzt,
ist scheinbar original nur für PIC24 und PIC33F verwendbar)

In file included from ECAN1Config.C:59:
../h/ECAN1Config.h:66: warning: space(dma) not supported on this target, 
ignoring
ECAN1Config.C: In function 'dma0init':
ECAN1Config.C:65: error: 'DMACS0' undeclared (first use in this 
function)
ECAN1Config.C:65: error: (Each undeclared identifier is reported only 
once
ECAN1Config.C:65: error: for each function it appears in.)
ECAN1Config.C:66: error: 'DMA0CON' undeclared (first use in this 
function)
ECAN1Config.C:67: error: 'DMA0PAD' undeclared (first use in this 
function)
ECAN1Config.C:68: error: 'DMA0CNT' undeclared (first use in this 
function)
ECAN1Config.C:69: error: 'DMA0REQ' undeclared (first use in this 
function)
ECAN1Config.C:70: error: 'DMA0STA' undeclared (first use in this 
function)
ECAN1Config.C:71: error: 'DMA0CONbits' undeclared (first use in this 
function)
ECAN1Config.C: In function 'dma2init':
ECAN1Config.C:79: error: 'DMACS0' undeclared (first use in this 
function)
ECAN1Config.C:80: error: 'DMA2CON' undeclared (first use in this 
function)
ECAN1Config.C:81: error: 'DMA2PAD' undeclared (first use in this 
function)
ECAN1Config.C:82: error: 'DMA2CNT' undeclared (first use in this 
function)
ECAN1Config.C:83: error: 'DMA2REQ' undeclared (first use in this 
function)
ECAN1Config.C:84: error: 'DMA2STA' undeclared (first use in this 
function)
ECAN1Config.C:85: error: 'DMA2CONbits' undeclared (first use in this 
function)
ECAN1Config.C: In function 'ecan1ClkInit':
ECAN1Config.C:95: error: 'C1CTRL1bits' undeclared (first use in this 
function)
ECAN1Config.C:107: error: 'C1CFG1bits' undeclared (first use in this 
function)
ECAN1Config.C:113: error: 'C1CFG2bits' undeclared (first use in this 
function)
ECAN1Config.C: In function 'ecan1Init':
ECAN1Config.C:132: error: 'C1CTRL1bits' undeclared (first use in this 
function)
ECAN1Config.C:137: error: 'C1FCTRLbits' undeclared (first use in this 
function)
ECAN1Config.C:189: error: 'C1RXFUL1' undeclared (first use in this 
function)
ECAN1Config.C:189: error: 'C1RXFUL2' undeclared (first use in this 
function)
ECAN1Config.C:189: error: 'C1RXOVF1' undeclared (first use in this 
function)
ECAN1Config.C:189: error: 'C1RXOVF2' undeclared (first use in this 
function)
ECAN1Config.C:190: error: 'C1TR01CONbits' undeclared (first use in this 
function)
ECAN1Config.C:192: error: 'C1TR23CONbits' undeclared (first use in this 
function)
ECAN1Config.C:194: error: 'C1TR45CONbits' undeclared (first use in this 
function)

Manche der Register (wie DMACS0) finde ich nicht einmal
im Datasheet
( http://ww1.microchip.com/downloads/en/DeviceDoc/70000657H.pdf ),
manche (wie C1RXFUL1) scheint es zu geben,
aber der C Compiler kennt sie nicht...
Und dann noch die Meldung
"space(dma) not supported on this target",
wobei der dsPIC33EP256MC506 aber DMA können sollte?

Hat vielleicht jemand einen Tipp?

von Chris B. (dekatz)


Lesenswert?

"p33exxxx.h".....ist für den C30 Compiler.
Falls du den XC16 verwendest ist es "xc.h"

von Robert Meier (Gast)


Lesenswert?

Ich verwende noch die alte IDE mit dem alten Compiler
...\mplabc30\v3.31\bin\pic30-gcc.exe

von Frank K. (fchk)


Lesenswert?

Robert Meier schrieb:
> Ich verwende noch die alte IDE mit dem alten Compiler
> ...\mplabc30\v3.31\bin\pic30-gcc.exe

Dann solltest Du mal updaten.

von Robert Meier (Gast)


Lesenswert?

Kann ich leider derzeit nicht...
Alter Compiler mit alter bezahlter Lizenz
und Lib, die mit neuer Compiler-Version nicht kompatibel ist...

Ist das mit dem alten Compiler ein Problem?

von Frank K. (fchk)


Lesenswert?

Robert Meier schrieb:
> Kann ich leider derzeit nicht...
> Alter Compiler mit alter bezahlter Lizenz
> und Lib, die mit neuer Compiler-Version nicht kompatibel ist...
>
> Ist das mit dem alten Compiler ein Problem?

Ich weiß nicht, wie vollständig der Support für PIC24EP und dsPIC33EP im 
C30 ist. Ein paar kleine Unterschiede gibts da ja doch.

fchk

von Chris B. (dekatz)


Lesenswert?

Robert Meier schrieb:
> Ist das mit dem alten Compiler ein Problem?

Möglich.
Die letzte Version des C30 ist 3.31 und die stammt von Jänner 2012.

von Robert Meier (Gast)


Lesenswert?

Ok, ich hab jetzt mal MPLAB-X installiert, XC16
und das Projekt ohne Library übersetzt, oder zumindest versucht.

Folgendes habe ich (in allen Files) angepasst:

#if 0
#if defined(_dsPIC33F_)
#include "p33fxxxx.h"
#elif defined(_PIC33E_)
#include "p33exxxx.h"
#elif defined(_PIC24H_)
#include "p24hxxxx.h"
#endif
#endif // 0

#include <xc.h>

Die beiden folgenden Register will er trotzdem noch nicht:

DMACS0=0;
...
DMA2STA= __builtin_dmaoffset(ecan1msgBuf);

DMACS0 finde ich auch im Datasheet des dsPIC33EP256MC506 nicht.

DMACS0 scheint Collision Flags zu beinhalten.
Vielleicht folgender Ersatz:

    // DMACS0=0;
    DMAPWC=0;
    DMARQC=0;

DMA2STA finde ich auch im Datasheet des dsPIC33EP256MC506 nicht.
Es gibt aber die folgenden 2 Register: DMA2STAL und DMA2STAH.
Ich vermute, dass DMA2STAx jetzt einen erweiterten Adressbereich
abdeckt? Ob das Makro jetzt auch eine größere Adresse meldet?

Ich habe folgendes gefunden:
( http://ww1.microchip.com/downloads/en/DeviceDoc/70348C.pdf
Seite 26)

    // DMA2STA= __builtin_dmaoffset(ecan1msgBuf);
    DMA2STAH= 0x0000;
    DMA2STAL= __builtin_dmaoffset(ecan1msgBuf);

Die anderen DMA-Register und ECAN-Register scheint er jetzt zu kennen.

Wenn ich die obigen Stellen verändere,
dann gibt es nur noch diesen Fehler:

Link Error: The used device does not support DPSRAM
build/default/production/_ext/1472/main.o: Link Error: Could not 
allocate section _03E9F2A053396484, size = 512 bytes, attributes = bss 
dma
Link Error: Could not allocate data memory

DPSRAM scheint Dual Ported SRAM zu sein, was er für DMA braucht.

Jemand eine Idee? Muss man da noch etwas im LinkerScript eintragen?

von Anton (Gast)


Lesenswert?

Hallo Robert,

hast du das Problem gelöst?
bin jetzt auch drauf gestossen beim Portieren von dsPIC33F auf dsPIC33E

von Robert Meier (Gast)


Lesenswert?

Wenn man auf

http://www.microchip.com/TechDoc.aspx?type=CodeExamples

nach "ECAN" (im Document Title) sucht,
bekommt man auch dsPIC33E Beispiele:

dsPIC33EPxxxGMxxx_ce427_ecan_crosswire  15 Oct 2013
dsPIC33EPxxxGMxxx_ce428_ecan_fifo  15 Oct 2013
dsPIC33EPxxxGMxxx_ce429_ecan_rtr  15 Oct 2013

Vielleicht hilft dir dies weiter...

von Salman (Gast)


Lesenswert?

Hi,

ist das Problem schon gelöst bei euch.

bei läuft schon mit dspic33F aber mit dspic33EP hat diese gleiche Error 
getroffen.

"The used device does not support DPSRAM "

ich habe alle Register schon angepasst ging aber nicht.
habe zwei ECAN.

also wenn irgendjemand weis der Grund, bitte melden

Danke

von Robert Meier (Gast)


Lesenswert?

@Salman

Wenn man auf

http://www.microchip.com/TechDoc.aspx?type=CodeExamples

nach "ECAN" (im Document Title) sucht,
bekommt man auch dsPIC33E Beispiele:

dsPIC33EPxxxGMxxx_ce427_ecan_crosswire  15 Oct 2013
dsPIC33EPxxxGMxxx_ce428_ecan_fifo  15 Oct 2013
dsPIC33EPxxxGMxxx_ce429_ecan_rtr  15 Oct 2013

Vielleicht hilft dir dies weiter...

von Salman (Gast)


Lesenswert?

hab schon verglichen

von Robert Meier (Gast)


Lesenswert?

Dann such mal nach "dma" oder "space(dma)" in deinen Sourcen,
das sollten die Problemstellen sein (war das nicht in main,
ist schon lange her...).
Evt. "space(dma)" mal auskommentieren?

von Thomas T. (warhammerth)


Lesenswert?

Auch wenn der Beitrag schon älter ich, ich hatte gerade das selbe 
Problem.

Falls das gleiche Problem nochmal jemand hat, mit
...
    unsigned int ecan1msgBuf[32*8];

...
    DMA2STAH= 0x0000;
    DMA2STAL= &ecan1msgBuf;

geht es

von Willivonbienemaya .. (willivonbienemaya)


Angehängte Dateien:

Lesenswert?

Ich habe ein ähnliches Problem.
Hatte lauffähigen Code vom 33F, den hab ich aber nicht zum laufen 
bekommen. Das TXREQ Bit wurde nie zurückgesetzt und es kam nichts aus 
dem Pin.
Mitterweile habe ich umgebaut auf den Beispielcode aus dem Datenblatt. 
Leider mit dem gleichen Ergebnis.

Hat jemand eine Idee?

von Steffen R. (steffen_rose)


Lesenswert?

Datenblatt von 33E oder vom 33F?

Ich verwende andere Attribute für den RAM Bereich für die EP Familie:
1
__eds__ ECAN_MSGBUF_T ecanMsgBuf __attribute__((eds,space(dma),aligned(ECAN_MSG_BUF_LENGTH*16)));

Diese Zeile unterscheidet sich von Familie zu Familie.

von Willivonbienemaya .. (willivonbienemaya)


Lesenswert?

Steffen R. schrieb:
> Datenblatt von 33E oder vom 33F?

24E/33E
http://ww1.microchip.com/downloads/en/DeviceDoc/70353C.pdf
S. 35

Aber das ist wohl für den C30, ich verwende den XC16.
Und Microchip ist leider nicht für Fehlerfreie Beispielcodes bekannt.

Ich versuch das mit dem Attribut mal, vielleicht bringt es ja was.

von Steffen R. (steffen_rose)


Lesenswert?

Und unbedingt auch die angrenzenden Kapitel lesen, wie DMA und RAM
(natürlich von verwendeten Controller!)

z.B.:
--------------
4.2.6 DMA RAM
Each dsPIC33EPXXX(GP/MC/MU)806/810/814 and
PIC24EPXXX(GP/GU)810/814 device contains
4 Kbytes of dual ported DMA RAM located at the end
of Y data RAM and is part of Y data space. Memory
locations in the DMA RAM space are accessible simultaneously
by the CPU and the DMA Controller module.
--------------

Die Beispiele von einem "ähnlichen" Controller können als Anhaltspunkt 
dienen. Müssen aber ggf. an den eigenen Controller angepasst werden.

von Willivonbienemaya .. (willivonbienemaya)


Lesenswert?

Ich weiss nicht ob es da einen Unterschied zwischen EP und dem Ev gibt?
Bei mir wird der 33EV256GM104 verwendet.

Die Deklaration habe ich umgebaut auf:
_eds_ unsigned int ecan1MsgBuf[NUM_OF_ECAN_BUFFERS][8] 
_attribute__((eds,space(dma),aligned(NUM_OF_ECAN_BUFFERS * 16)));

Der Puffer wird bei Adresse 0x4C00 angelegt, das klingt erstmal nicht 
falsch.

Ich habe sicherheitshalber auch schon einen anderen Pin verwendet, aber 
denke nicht dass es daran liegt. Mit C1CTRL1bits.REQOP = 0; geht der Pin 
hoch, scheinbar wird der Pin also vom Modul übernommen.

Der Errorcounter (C1EC) zeigt 0 an.
Die Interrupts (C1INTF) sind auch auf 0.

Empfangen geht übrigens auch nicht.

Für weitere Ideen wäre ich dankbar.

von temp (Gast)


Lesenswert?

Ich habe hier einen wenigstens 1 Jahr alten Test mit einem 
dsPIC33EP64MC502. Der ist sicher nur ähnlich aber der ECAN Teil ist 
gelaufen mit XC16 und C30. Da ich selber nichts mehr mit PICs mache (das 
debuggen nervt einfach nur wenn man cortexe gewohnt ist) kann ich dir 
aber keine weitere Unterstützung mehr geben. Die Kommentaren im Code 
müssen auch nicht stimmen, es war hier auch viel Probiererei angesagt.
Ich habe es eben nochmal probiert. Es geht jedenfalls und sendet die 
Message 0x1D3. Nachdem 0x1D0 durch den Messagefilter ging, wird wieder 
0x1D3 gesendet.
Vielleicht hilft dir das irgendwie.
1
#include <p33Exxxx.h>
2
3
#define FCY 60000000
4
#include <libpic30.h>
5
#include <stdint.h>
6
7
#define Delay_us __delay_us
8
9
_FOSCSEL(FNOSC_FRC)
10
11
// Enable clock switching and fail safe clock monitor disabled
12
_FOSC(FCKSM_CSECMD & OSCIOFNC_ON & IOL1WAY_OFF)
13
14
// Watchdog aus
15
_FWDT(FWDTEN_OFF)
16
17
_FICD(ICS_PGD2 & JTAGEN_OFF)
18
19
void SysInit()
20
{
21
  // Configure Oscillator to operate the device at 60Mhz
22
  // Fosc= Fin*M/(N1*N2), Fcy=Fosc/2
23
  // Fosc= 7.37*(65)/(2*2)=120Mhz for Fosc, Fcy = 60Mhz
24
25
  // Configure PLL prescaler, PLL postscaler, PLL divisor
26
  PLLFBD = 63; // M = PLLFBD + 2
27
  CLKDIVbits.PLLPOST = 0; // N1 = 2
28
  CLKDIVbits.PLLPRE = 0; // N2 = 2
29
30
  __builtin_write_OSCCONH(0x01); // New Oscillator selection FRC w/ PLL
31
  __builtin_write_OSCCONL(0x01); // Enable Switch
32
33
  while (OSCCONbits.COSC != 0b001); // Wait for Oscillator to switch to FRC w/ PLL
34
  while (OSCCONbits.LOCK != 1); // Wait for Pll to Lock
35
  Delay_us(200);
36
}
37
38
39
#define CAN_OPMODE_CONFIG   0x4
40
#define CAN_OPMODE_LOOPBACK 0x2
41
#define CAN_OPMODE_NORMAL   0x0
42
#define NUM_OF_ECAN_BUFFERS  32
43
44
uint16_t m_Can_ECanTXRXMsgBuf[NUM_OF_ECAN_BUFFERS][8] __attribute__((aligned(NUM_OF_ECAN_BUFFERS * 16)));
45
46
void Can_Init()
47
{
48
  // Can Rx/Tx den Pins zuweisen
49
  // Unlock Registers
50
  __builtin_write_OSCCONL(OSCCON & 0xbf);
51
  
52
  // IO Register initialisieren RPINR26 = RP39 0x27
53
  RPINR26 = 0x27;
54
  // Output RP41 to C1TX (0xE oder 14) setzen
55
  RPOR3bits.RP41R = 0xE;
56
57
  // Lock Registers
58
  __builtin_write_OSCCONL(OSCCON | 0x40);
59
60
61
  // Can Baustein in Konfigurationsmode versetzen
62
  C1CTRL1bits.REQOP = CAN_OPMODE_CONFIG;
63
  while(C1CTRL1bits.OPMODE != CAN_OPMODE_CONFIG)
64
    ;
65
66
  C1CTRL1bits.CANCKS = 0;
67
  C1CTRL1bits.CSIDL = 0;
68
  C1CTRL1bits.CANCAP = 0;
69
   
70
  // ermittelt mit dem bittime calc Plugin
71
  C1CFG1=0x001A;
72
  C1CFG2=0x0059;
73
74
  C1FCTRL = 0xC01F;
75
76
  /* DMA Config Channel 0 for TX IRQ = 70 */
77
  DMA0CON  = 0x2020;
78
  DMA0REQ  = 70;
79
  DMA0CNT  = 7;
80
  DMA0PAD  = (volatile unsigned int)&C1TXD;
81
  DMA0STAL = (unsigned int) &m_Can_ECanTXRXMsgBuf;
82
  DMA0STAH = 0;
83
  DMA0CONbits.CHEN = 0x1;
84
85
  DMA2CON  = 0x0020;
86
  DMA2REQ  = 34;
87
  DMA2CNT  = 7;
88
  DMA2PAD  = (volatile unsigned int) &C1RXD;
89
  DMA2STAL = (unsigned int) &m_Can_ECanTXRXMsgBuf;
90
  DMA2STAH = 0;
91
  DMA2CONbits.CHEN=1;
92
93
  //IEC0bits.DMA1IE = 1;
94
95
  /* Set SFR Window to Buffer register in RAM */
96
  C1CTRL1bits.WIN = 1;
97
  /* RX Filter */
98
  /* Select Acceptance Filter Mask 0 for Acceptance Filter 0 */
99
  C1FMSKSEL1bits.F0MSK = 0x0;
100
  /* Configure Acceptance Filter Mask 0 register to mask SID<2:0>
101
   * Mask Bits (11-bits) : 0b111 1111 1000 */
102
  C1RXM0SIDbits.SID = 0x7F8;
103
  // C1RXM0SIDbits.SID = 0x000;
104
105
  /* Configure Acceptance Filter 0 to match standard identifier
106
  Filter Bits (11-bits): 0b011 1010 xxx with the mask setting, message with SID
107
    range 0x1D0-0x1D7 will be accepted by the ECAN module. */
108
    C1RXF0SIDbits.SID = 0x01D0;
109
    /* Acceptance Filter 0 to check for Standard Identifier */
110
    C1RXM0SIDbits.MIDE = 0x1;
111
//    C1RXM0SIDbits.MIDE = 0x0;
112
    C1RXF0SIDbits.EXIDE = 0x0;
113
    /* Acceptance Filter 0 to use Message Buffer 10 to store message */
114
    C1BUFPNT1bits.F0BP = 0xA;
115
    /* Filter 0 enabled for Identifier match with incoming message */
116
    C1FEN1 = 0x0;
117
    C1FEN1bits.FLTEN0 = 0x1;
118
119
    /* Set SFR Window to Control register in RAM */
120
    C1CTRL1bits.WIN = 0;
121
122
    
123
    // Configure Message Buffer 0 for Transmission and assign priority
124
    C1TR01CONbits.TXEN0 = 0x1;
125
    C1TR01CONbits.TX0PRI = 0x3;
126
127
    //    C1TR01CONbits.TXEN1 = 0x0;
128
    //    C1TR01CONbits.TX1PRI = 0x3;
129
130
131
   // start Can
132
   C1CTRL1bits.REQOP = CAN_OPMODE_NORMAL;
133
   while(C1CTRL1bits.OPMODE != CAN_OPMODE_NORMAL)
134
     ;
135
136
   //C1CTRL1bits.REQOP = CAN_OPMODE_LOOPBACK;
137
   //while(C1CTRL1bits.OPMODE != CAN_OPMODE_LOOPBACK)
138
   //  ;
139
140
    m_Can_ECanTXRXMsgBuf[0][0] = 0x01D3 << 2;   // IDE, SRR = 0 SID = 1D2
141
    m_Can_ECanTXRXMsgBuf[0][1] = 0x0000;        // EID = 0
142
    m_Can_ECanTXRXMsgBuf[0][2] = 0x0008;        // RTR = 0, DLC = Data Length counter = 8 = 8 Wörter sollen übertragen werden
143
    m_Can_ECanTXRXMsgBuf[0][3] = 0xabcd;
144
    m_Can_ECanTXRXMsgBuf[0][4] = 0xabcd;
145
    m_Can_ECanTXRXMsgBuf[0][5] = 0xabcd;
146
    m_Can_ECanTXRXMsgBuf[0][6] = 0xabcd;
147
148
    // Empfangspuffer leer setzen
149
    C1RXFUL1 = 0;
150
151
152
    while (1)
153
    {
154
    // Request sende Nachricht
155
    C1TR01CONbits.TXREQ0 = 0x1;
156
    
157
    // Warte auf gesendet
158
    while(C1TR01CONbits.TXREQ0 == 1);
159
    
160
    Delay_us(100000);
161
    
162
    // Message was received.
163
    while (C1RXFUL1bits.RXFUL10 == 0);
164
    C1RXFUL1bits.RXFUL10 = 0;
165
    uint16_t test = m_Can_ECanTXRXMsgBuf[10][0];
166
    test = test >> 2;
167
    }
168
}
169
170
int main()
171
{
172
173
  SysInit();
174
  Can_Init();
175
}

von Willivonbienemaya .. (willivonbienemaya)


Lesenswert?

Danke temp für den Code.
Ich habe ihn 1:1 kopiert, gleiches Ergebnis, bleibt beim TXREQ0 hängen 
und es kommt nichts raus.

Hat es schon mal jemand geschafft auf nem 33EV den CAN zum laufen zu 
bekommen?

von Peter P. (Gast)


Lesenswert?

Hast du außer dem PIC noch etwas am CAN-Bus hängen?
Einen CAN-Analyzer? Andere Nodes?
Wie misst du, dass nichts raus kommt? Mit dem Oszi o.ä.?
Welcher CAN-Transceiver?
Hast du den Bus terminiert bzw. weißt du, dass der Bus
sonst funktioniert?

von Willivonbienemaya .. (willivonbienemaya)


Lesenswert?

Wird das TXREQ Bit erst gelöscht wenn das ACK Bit erkannt wurde?
Würde er auf das ACK Bit warten hätte ich das am error counter sehen 
müssen, der bleibt auf 0.

Ich habe direkt am TX Pin mit dem Oszi gemessen.
Mit und ohne CAN Analyser (der würde auch das ACK Bit setzen).
Auch mit und ohne Terminierung.
Transceiver ist der MCP2551.

von Steffen R. (steffen_rose)


Lesenswert?

Hat der RX Pin High Pegel (== Rezessiv)?

von Willivonbienemaya .. (willivonbienemaya)


Lesenswert?

Mit diesen DMA Einstellungen gehts jetzt:
1
DMA0CON = 0x2020;               //DIR: DMA RAM -> Peripheral adress 0x0442
2
DMA0PAD = (volatile unsigned int)&C1TXD;              //Adress of C1TX
3
DMA0CNT = 7;               
4
DMA0REQ = 0x0046;               //C1TX - ECAN1 Transmit Data Request
5
DMA0STAH = 0x0000;               //Primary DMA write Start Adress
6
DMA0STAL = (unsigned int) &CAN1_txMsgBox; 
7
DMA0CONbits.CHEN = 1;           //Channel 0 Enabled
8
9
DMA2CON = 0x0000;               //DIR: Peripheral adress -> DMA RAM 0x0440
10
DMA2PAD = (volatile unsigned int) &C1RXD;               //Adress of C1RX
11
DMA2CNT = 7;               
12
DMA2REQ = 0x0022;               //C1RX - ECAN1 Receive Data Request
13
DMA2STAL = (unsigned int) &CAN1_rxMsgBox;               //Primary DMA read Start Adress
14
DMA2STAH = 0x0000;  
15
DMA2CONbits.CHEN = 1;           //Channel 2 Enabled

Die eine Richtung müsste jetzt im Ping-Pong laufen, die andere nicht. 
Warum das so funktioniert kann ich leider nicht erklären.

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.