Hallo Ich habe kleines Problem mit dem CAN-BUS und mangels Erfahrung komme ich nicht auf die Lösung. Ich habe ein Ethernet CAN Koppler und möchte daran einige STM32F105 Module via CAN steuern. Um es einfach zu halten habe ich erstmal ein STM32F105 an den Ethernet CAN Koppler angeschlossen. Natürlich habe ich bim STM32 zwischen CANL und CANH einen 120 Ohm Widerstand. Wenn ich jetzt eine Message vom PC mittels Ethernet CAN Koppler sende tut sich gar nicht, ich messe einen konstanten High Pegel (Siehe Anhang CANL_mit_STM32.png). Im STM32 wird auch kein Interrupt ausgelöst. Nehme Ich jetzt aber das STM32 Modul raus und lasse nur den Widerstand dran, dann kann ich was auf dem Ozi sehen (Anhang CANL.png CANH.png). Weiß jemand woran das liegt?
wahrscheinlich sind die CAN Pins von deinem F105 falsch initialisiert und schliessen das CAN Signal kurz (Ausgang) anstelle es einzulesen. Sollte eigentlich tun, wenn du gar nix initialsierst weil die Pins dann auf Input stehen. Als Ausgang brauchst du natürlich einen Bus Tranceiver der auf der korrekten Richtung stehen muss
Im STM32F105 (72 MHz mit 25MHz Quarz) habe ich das ganze wie folgt gemacht:
1 | void HWinitCAN(void) |
2 | { |
3 | GPIO_InitTypeDef GPIO_InitStructure; |
4 | CAN_InitTypeDef CAN_InitStructure; |
5 | NVIC_InitTypeDef NVIC_InitStructure; |
6 | |
7 | // Initialisiert den RX Fifo Buffer |
8 | RingFifo_Init(&CAN1_RX_Fifo, CAN1_Rx_Buffer, CAN_RX_DATA_SIZE); |
9 | |
10 | // Aktiviert die Clocks für den CAN-Bus |
11 | RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_AFIO, ENABLE); |
12 | RCC_APB1PeriphClockCmd(CAN1_RCC, ENABLE); |
13 | |
14 | // CAN Configure pin RX |
15 | GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; // PD0 => CANRX |
16 | GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; |
17 | GPIO_Init(GPIOD, &GPIO_InitStructure); |
18 | |
19 | // CAN Configure pin TX |
20 | GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; // PD0 => CANTX |
21 | GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; |
22 | GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; |
23 | GPIO_Init(GPIOD, &GPIO_InitStructure); |
24 | |
25 | // CAN1 PD0 -> CAN1_RX, PD1 -> CAN1_TX |
26 | GPIO_PinRemapConfig(GPIO_Remap2_CAN1, ENABLE); |
27 | |
28 | // CAN register init |
29 | CAN_StructInit(&CAN_InitStructure); |
30 | CAN_DeInit(CAN1); |
31 | |
32 | // Enable or disable the time triggered communication mode. This parameter can be set either to ENABLE or DISABLE. |
33 | CAN_InitStructure.CAN_TTCM = DISABLE; |
34 | |
35 | // Enable or disable the automatic bus-off management. This parameter can be set either to ENABLE or DISABLE |
36 | CAN_InitStructure.CAN_ABOM = DISABLE; |
37 | |
38 | // Enable or disable the automatic wake-up mode. This parameter can be set either to ENABLE or DISABLE. |
39 | CAN_InitStructure.CAN_AWUM = DISABLE; |
40 | |
41 | // Enable or disable the no-automatic retransmission mode. This parameter can be set either to ENABLE or DISABLE. |
42 | CAN_InitStructure.CAN_NART = DISABLE; |
43 | |
44 | // Enable or disable the Receive FIFO Locked mode. This parameter can be set either to ENABLE or DISABLE. |
45 | CAN_InitStructure.CAN_RFLM = DISABLE; |
46 | |
47 | // Enable or disable the transmit FIFO priority. This parameter can be set either to ENABLE or DISABLE. |
48 | CAN_InitStructure.CAN_TXFP = DISABLE; |
49 | |
50 | // Specifies the CAN operating mode. This parameter can be a value of CAN_operating_mode. {CAN_Mode_Normal, CAN_Mode_LoopBack, CAN_Mode_Silent, CAN_Mode_Silent_LoopBack} |
51 | CAN_InitStructure.CAN_Mode = CAN_Mode_Normal; |
52 | |
53 | |
54 | // Konfiguriert die CAN Baudrate für eine 72MHz Clock |
55 | CAN_InitStructure.CAN_SJW = CAN_SJW_1tq; // SJW 1-4 Specifies the maximum number of time quanta the CAN hardware is allowed to lengthen or shorten a bit to perform resynchronization. This parameter can be a value of CAN_synchronisation_jump_width |
56 | |
57 | // Initialize the CAN_BS1 member |
58 | CAN_InitStructure.CAN_BS1 = CAN_BS1_3tq; |
59 | CAN_InitStructure.CAN_BS2 = CAN_BS2_5tq; |
60 | |
61 | // Specifies the length of a time quantum. It ranges from 1 to 1024. |
62 | //CAN_InitStructure.CAN_Prescaler = 2; // 1000 kbit/s = 1Mbit/s |
63 | //CAN_InitStructure.CAN_Prescaler = 16; // 250 kbit/s |
64 | CAN_InitStructure.CAN_Prescaler = 32; // 125 kbit/s |
65 | //CAN_InitStructure.CAN_Prescaler = 80; // 50 kbit/s |
66 | |
67 | // Initialize the CAN_BS2 member |
68 | CAN_Init(CAN1, &CAN_InitStructure); |
69 | |
70 | // CAN1 RX Interrupt |
71 | NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4); |
72 | NVIC_InitStructure.NVIC_IRQChannel = CAN1_RX0_IRQn; |
73 | NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; |
74 | NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; |
75 | NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; |
76 | NVIC_Init(&NVIC_InitStructure); |
77 | |
78 | |
79 | // IT Configuration for CAN1 |
80 | CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE); |
81 | |
82 | // CAN filter init |
83 | CAN1_UseFilterID(); |
84 | } |
85 | |
86 | void CAN1_UseFilterID(void) |
87 | { |
88 | CAN_FilterInitTypeDef CAN_FilterInitStructure; |
89 | |
90 | // Zum testen erstmal alles durchlassen |
91 | CAN_FilterInitStructure.CAN_FilterNumber = 0; |
92 | CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask; |
93 | CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit; |
94 | CAN_FilterInitStructure.CAN_FilterIdHigh = 0x0000; |
95 | CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000; |
96 | CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0000; |
97 | CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000; |
98 | CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_FIFO0; |
99 | CAN_FilterInitStructure.CAN_FilterActivation = ENABLE; |
100 | CAN_FilterInit(&CAN_FilterInitStructure); |
101 | } |
102 | |
103 | void CAN1_RX0_IRQHandler(void) |
104 | { |
105 | int i; |
106 | |
107 | CAN_Receive(CAN1, CAN_FIFO0, &RxMessage); |
108 | |
109 | // DEBUG |
110 | SetDigOutputLed2(TRUE); |
111 | |
112 | /* |
113 | if((RxMessage.StdId == Par4.CAN_ID || RxMessage.StdId == CAN1_STD_ID_TO_ALL) && |
114 | (RxMessage.IDE == CAN_ID_STD) && |
115 | (RxMessage.DLC > 0) && |
116 | (RxMessage.DLC < 8)) |
117 | */ |
118 | { |
119 | for(i=0; i<RxMessage.DLC; i++) |
120 | { |
121 | if(CAN1_RX_Fifo.Count < CAN1_RX_Fifo.Size) |
122 | { |
123 | RingFifo_Put(&CAN1_RX_Fifo, (RingFifoData_t)RxMessage.Data[i]); |
124 | } |
125 | else |
126 | { |
127 | // Fehler Buffer ist übergelaufen |
128 | break; |
129 | } |
130 | } |
131 | } |
132 | } |
kann zur Lösung leider nicht beitragen, habe aber eine Frage: Was für einen Ethernet-CAN-Koppler verwendest Du?
@J. V. Am Ausgang also CANL CANH ist ein CAN-Bus Tranceiver vorhanden. Den Code für die Initalisierung habe ich ja gerade gepostet, ich meine es richtig konfiguriert zu haben. Aber vieleicht sehe ich auch den Walt vor lauter Bäumen nicht.
@Neugieriger Den CAN-Ethernet Gateway V2 von Sys Tec (w w w [Punkt] systec-electronic [Punkt] com)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.