Forum: Mikrocontroller und Digitale Elektronik PIC24HJ256GP610 ECAN2


von Christian H. (Firma: carhs.communication gmbh) (chris-carhs)


Lesenswert?

Hallo,

ich versuche momentan auf dem PIC24HJ256GP610 das ECAN2 Modul zum laufen 
zu bringen. Ich verwende ein Development Board von mikroElektronika (LV 
24-33A) und einen C-Compiler (mikroC). mikroElektronika liefert mit dem 
Compiler schon Libraries für die ECAN Module mit. Das ECAN1 Modul habe 
ich schon zum laufen gebracht mit DMA Transfer.
Das ECAN2 Modul will aber nicht so richtig. Momentan funktioniert nicht 
einmal ein simples senden von Nachrichten.

Ich weiß, dass es ein sehr spezielles Problem ist. Aber ich habe die 
Vermutung, dass evtl. am ECAN2 Modul im PIC was nicht stimmt. Vielleicht 
konnte jemand schon Erfahrungen im Bezug auf das ECAN2 Modul sammeln.

Wäre super, wenn Ihr Tipps für mich habt.
Zur Sicherheit mein C-Code hier, falls sich jemand mit dem mikroC 
Compiler auskennt:
1
#include "ECan_Defs.h"
2
3
unsigned int ecanInitFlags = ECAN_CONFIG_SAMPLE_THRICE & // Form value to be used
4
                             ECAN_CONFIG_PHSEG2_PRG_ON & //  with CANInitialize
5
                             ECAN_CONFIG_STD_MSG &
6
                             ECAN_CONFIG_ALL_VALID_MSG &
7
                             ECAN_CONFIG_LINE_FILTER_OFF;
8
9
unsigned int ecanSendFlags = ECAN_TX_PRIORITY_0 &  // Form value to be used
10
                             ECAN_TX_STD_FRAME &   //  with CANSendMessage
11
                             ECAN_TX_NO_RTR_FRAME;
12
13
void main()
14
{
15
   unsigned char data[8] = {25,56};
16
   unsigned long id = 0x100;
17
   
18
   id = id << 18;
19
   // Set PLL: Fosc = ((Fin/PLLPRE)*PLLDIV)/PLLPOST = (((10MHz/2)*32)/2) = 80MHz
20
   CLKDIV &= 0xFF00; // set PLLPRE and PLLPOST to 0. Fcy (device clk) is Fosc/2 = 40Mhz   
21
   PLLFBD = 0x001E;  // set PLLDIV to 32
22
23
   AD1PCFGL = 0xFFFF; // Configure ADC inputs as digital inputs
24
   AD1PCFGH = 0xFFFF; //  for ADC1
25
   AD2PCFGL = 0xFFFF; // Configure ADC inputs as digital inputs for ADC2
26
27
   // Clear Interrupt Flags
28
   IFS0 = 0;
29
   IFS1 = 0;
30
   IFS2 = 0;
31
   IFS3 = 0;
32
   IFS4 = 0;
33
34
   // Enable ECAN2 Interrupt
35
   IEC3bits.C2IE   = 1; // enable ECAN2 interrupts
36
   C2INTEbits.TBIE = 1; // enable ECAN2 tx interrupt
37
   C2INTEbits.RBIE = 1; // enable ECAN2 rx interrupt
38
39
   // init dma channel 0 for dma to ecan peripheral data transfer
40
   ECAN2DmaChannelInit(0, 1, &ECAN2RxTxRAMBuffer); 
41
   // init dma channel 2 for ecan peripheral to dma data transfer
42
   ECAN2DmaChannelInit(2, 0, &ECAN2RxTxRAMBuffer);
43
44
   // setup ecan fifo
45
   C2FCTRLbits.DMABS = 0x6; // set fifo buffer size to 32
46
   C2FCTRLbits.FSA0 = 1; // set fifo start address to TRB5 buffer
47
   C2FCTRLbits.FSA1 = 0;
48
   C2FCTRLbits.FSA2 = 1;
49
   C2FCTRLbits.FSA3 = 0;
50
   C2FCTRLbits.FSA4 = 0;
51
52
   ECAN2Initialize(1, 8, 8, 8, 8, ecanInitFlags);
53
54
   ECAN2SetBufferSize(ECAN2RAMBUFFERSIZE);
55
   ECAN2SelectTxBuffers(0x0001); // set transmit buffer to a size of four
56
   ECAN2FilterEnable(0x0003);
57
   
58
   ECAN2SetOperationMode(ECAN_MODE_CONFIG, 0xFF); // enter config mode
59
   ECAN2SetBaudRate(1, 8, 8, 8, 8, ecanInitFlags); // set baudrate to 100kbaud
60
   ECAN2SetMask(ECAN_MASK_0, -1, ECAN_CONFIG_ALL_VALID_MSG); // set mask0
61
   ECAN2SetMask(ECAN_MASK_1, 0, ECAN_CONFIG_ALL_VALID_MSG); // set mask1 for capture all msg in fifo
62
   ECAN2SetMask(ECAN_MASK_2, 0, ECAN_CONFIG_ALL_VALID_MSG); // set mask2
63
   ECAN2SetFilter(ECAN_FILTER_1, 0, ECAN_MASK_0, ECAN_RX_BUFFER_15, ECAN_CONFIG_STD_MSG); // accept all msg
64
   ECAN2SetOperationMode(ECAN_MODE_NORMAL, 0xFF); // enter normal mode
65
   
66
   while(1) // endless loop
67
   {
68
      ECAN2Write(id,data,1,ecanSendFlags);
69
      Delay_ms(100);
70
   }
71
   
72
   return;
73
}
74
75
void C2Interrupt(void) org 0x0084 // ECAN event iterrupt
76
{
77
   IFS3bits.C2IF = 0;      // clear ECAN interrupt flag
78
   if(C2INTFbits.TBIF) {   // was it tx interrupt?
79
      C2INTFbits.TBIF = 0; // if yes clear tx interrupt flag
80
   }
81
82
   if(C2INTFbits.RBIF) {   // was it rx interrupt?
83
      C2INTFbits.RBIF = 0; // if yes clear rx interrupt flag
84
   }
85
}

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.