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);
|