www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik PIC24HJ256GP610 ECAN2


Autor: Christian Hellert (Firma: carhs.communication gmbh) (chris-carhs)
Datum:

Bewertung
0 lesenswert
nicht 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:
#include "ECan_Defs.h"

unsigned int ecanInitFlags = ECAN_CONFIG_SAMPLE_THRICE & // Form value to be used
                             ECAN_CONFIG_PHSEG2_PRG_ON & //  with CANInitialize
                             ECAN_CONFIG_STD_MSG &
                             ECAN_CONFIG_ALL_VALID_MSG &
                             ECAN_CONFIG_LINE_FILTER_OFF;

unsigned int ecanSendFlags = ECAN_TX_PRIORITY_0 &  // Form value to be used
                             ECAN_TX_STD_FRAME &   //  with CANSendMessage
                             ECAN_TX_NO_RTR_FRAME;

void main()
{
   unsigned char data[8] = {25,56};
   unsigned long id = 0x100;
   
   id = id << 18;
   // Set PLL: Fosc = ((Fin/PLLPRE)*PLLDIV)/PLLPOST = (((10MHz/2)*32)/2) = 80MHz
   CLKDIV &= 0xFF00; // set PLLPRE and PLLPOST to 0. Fcy (device clk) is Fosc/2 = 40Mhz   
   PLLFBD = 0x001E;  // set PLLDIV to 32

   AD1PCFGL = 0xFFFF; // Configure ADC inputs as digital inputs
   AD1PCFGH = 0xFFFF; //  for ADC1
   AD2PCFGL = 0xFFFF; // Configure ADC inputs as digital inputs for ADC2

   // Clear Interrupt Flags
   IFS0 = 0;
   IFS1 = 0;
   IFS2 = 0;
   IFS3 = 0;
   IFS4 = 0;

   // Enable ECAN2 Interrupt
   IEC3bits.C2IE   = 1; // enable ECAN2 interrupts
   C2INTEbits.TBIE = 1; // enable ECAN2 tx interrupt
   C2INTEbits.RBIE = 1; // enable ECAN2 rx interrupt

   // init dma channel 0 for dma to ecan peripheral data transfer
   ECAN2DmaChannelInit(0, 1, &ECAN2RxTxRAMBuffer); 
   // init dma channel 2 for ecan peripheral to dma data transfer
   ECAN2DmaChannelInit(2, 0, &ECAN2RxTxRAMBuffer);

   // setup ecan fifo
   C2FCTRLbits.DMABS = 0x6; // set fifo buffer size to 32
   C2FCTRLbits.FSA0 = 1; // set fifo start address to TRB5 buffer
   C2FCTRLbits.FSA1 = 0;
   C2FCTRLbits.FSA2 = 1;
   C2FCTRLbits.FSA3 = 0;
   C2FCTRLbits.FSA4 = 0;

   ECAN2Initialize(1, 8, 8, 8, 8, ecanInitFlags);

   ECAN2SetBufferSize(ECAN2RAMBUFFERSIZE);
   ECAN2SelectTxBuffers(0x0001); // set transmit buffer to a size of four
   ECAN2FilterEnable(0x0003);
   
   ECAN2SetOperationMode(ECAN_MODE_CONFIG, 0xFF); // enter config mode
   ECAN2SetBaudRate(1, 8, 8, 8, 8, ecanInitFlags); // set baudrate to 100kbaud
   ECAN2SetMask(ECAN_MASK_0, -1, ECAN_CONFIG_ALL_VALID_MSG); // set mask0
   ECAN2SetMask(ECAN_MASK_1, 0, ECAN_CONFIG_ALL_VALID_MSG); // set mask1 for capture all msg in fifo
   ECAN2SetMask(ECAN_MASK_2, 0, ECAN_CONFIG_ALL_VALID_MSG); // set mask2
   ECAN2SetFilter(ECAN_FILTER_1, 0, ECAN_MASK_0, ECAN_RX_BUFFER_15, ECAN_CONFIG_STD_MSG); // accept all msg
   ECAN2SetOperationMode(ECAN_MODE_NORMAL, 0xFF); // enter normal mode
   
   while(1) // endless loop
   {
      ECAN2Write(id,data,1,ecanSendFlags);
      Delay_ms(100);
   }
   
   return;
}

void C2Interrupt(void) org 0x0084 // ECAN event iterrupt
{
   IFS3bits.C2IF = 0;      // clear ECAN interrupt flag
   if(C2INTFbits.TBIF) {   // was it tx interrupt?
      C2INTFbits.TBIF = 0; // if yes clear tx interrupt flag
   }

   if(C2INTFbits.RBIF) {   // was it rx interrupt?
      C2INTFbits.RBIF = 0; // if yes clear rx interrupt flag
   }
}

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.