Forum: Mikrocontroller und Digitale Elektronik Initialisierung CAN Interface AVR32


von Bruno K. (Gast)


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! :-)
1
//----- Channel configuration (Bit time / SamplingMode / OperatingMode / OverrunMode / Memory pointer -----//  
2
  if(CANIF_channel_enable_status(ch1) == 1)        //If channel enabled
3
  {
4
    CANIF_disable(ch1)                  //Disable channel to write the CANCFG register (S. 764)
5
    while((AVR32_CANIF.channel[1].cansr & AVR32_CANIF_CANSR_CES_MASK) == 1);  //Wait until channel is disabled
6
  }
7
  
8
  CAN_clear_init(ch1)        //Clear INIT to write the CANCTRL register (S. 766)
9
  
10
  if(((&mobch0[63]) != mobch1) && (mobch0 != (&mobch1[63])))    //Assure that memory spaces do not overlap
11
  {
12
    CANIF_set_ram_add(ch1, (unsigned long) mobch1)        //Set start address of RAM for channel[1]
13
  }
14
  
15
  //For bit time=25*TQ -> baud rate=500kHz --> bit time is set to 17*TQ so baud rate is higher than 500kHz
16
  CANIF_conf_bt(ch1)
17
  CANIF_set_channel_mode(ch1, CANIF_CHANNEL_MODE_LOOPBACK)
18
  
19
  //----- Channel handling (Initialization / Enabling / Overload Frame / Errors / Wake-up mode) ----------//
20
  CAN_set_init(ch1)              //initialization request
21
  CAN_clear_init(ch1)            //release initialization
22
  CANIF_enable(ch1)              //Enable (restart) channel 1
23
24
canctrl_status = CAN_get_canctrl(ch1);
25
channel_status = CANIF_channel_enable_status(ch1);
26
while(CANIF_channel_enable_status(ch1)==0);

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.