Forum: Mikrocontroller und Digitale Elektronik Initialisierung CAN Interface AVR32


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Bruno K. (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hi alle miteinander,
ich versuche gerade das CAN Interface des AT32UC3C zu verwenden.
Das Problem ist, dass der Channel einfach nicht aktiviert wird!
Ich habe mich intensiv mit dem Datenblatt auseinandergesetzt und bin 
meines Erachtens genau so wie beschrieben vorgegangen.

Wie unten zu sehen ist, schreibe ich das CANCTRL Register in eine 
Variable (canctrl_status). Diese Variable hab ich mir während dem 
Debuggen angesehen und dort steht eine 2 drin, was auch richtig ist 
(Enable Bit = Bit 1 im CANCTRL Register). Anschließend frage ich in 
einer while-Schleife die Variable channel_status ab, in die ich das 
Channel Enable Status Flag (aus dem Status Register CANSR aus maskiert) 
geschrieben habe. Sobald das Channel Enable Status Flag gesetzt wird und 
somit signalisiert wird das der Channel aktiviert ist, sollte die 
Schleife verlassen werden. Soweit kommt es aber nicht.

Was hab ich vergessen bzw. was habe ich falsch gemacht?

Ich hoffe hier kennt sich jemand damit aus und kann mir helfen.
Danke schon mal an alle, die sich die Mühe machen! :-)
//----- Channel configuration (Bit time / SamplingMode / OperatingMode / OverrunMode / Memory pointer -----//  
  if(CANIF_channel_enable_status(ch1) == 1)        //If channel enabled
  {
    CANIF_disable(ch1)                  //Disable channel to write the CANCFG register (S. 764)
    while((AVR32_CANIF.channel[1].cansr & AVR32_CANIF_CANSR_CES_MASK) == 1);  //Wait until channel is disabled
  }
  
  CAN_clear_init(ch1)        //Clear INIT to write the CANCTRL register (S. 766)
  
  if(((&mobch0[63]) != mobch1) && (mobch0 != (&mobch1[63])))    //Assure that memory spaces do not overlap
  {
    CANIF_set_ram_add(ch1, (unsigned long) mobch1)        //Set start address of RAM for channel[1]
  }
  
  //For bit time=25*TQ -> baud rate=500kHz --> bit time is set to 17*TQ so baud rate is higher than 500kHz
  CANIF_conf_bt(ch1)
  CANIF_set_channel_mode(ch1, CANIF_CHANNEL_MODE_LOOPBACK)
  
  //----- Channel handling (Initialization / Enabling / Overload Frame / Errors / Wake-up mode) ----------//
  CAN_set_init(ch1)              //initialization request
  CAN_clear_init(ch1)            //release initialization
  CANIF_enable(ch1)              //Enable (restart) channel 1

canctrl_status = CAN_get_canctrl(ch1);
channel_status = CANIF_channel_enable_status(ch1);
while(CANIF_channel_enable_status(ch1)==0);

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.