Forum: Mikrocontroller und Digitale Elektronik STM32F103 CAN will nicht


von Martin K. (dschadu)


Angehängte Dateien:

Lesenswert?

Hi,

ich habe aktuell ein Problem mit CAN.
Ich habe ein simples Testprogramm geschrieben, um die Kommunikation erst 
einmal prinzipiell zu testen. Dieses Programm habe ich auf das 
Olimex-STM32 und das Olimex STM-P103 geladen.
Senden und Empfangen geht mit diesen beiden Boards problemlos.

Jetzt habe ich das STM-P103 an eine eigene Platine gehangen und leider 
tut sich... nichts.
Gesendet werden die Daten vom Olimex Board, es kommt auch ein sauberes 
Signal am µC an (mit Oszi gemessen). Leider wird kein receive interrupt 
ausgelöst.

Das Programm unterscheidet sich nur in den Pins - auf den Olimex Boards 
ist der CAN Remapped auf Port B, Pin 9 und 10.
Auf meiner Platine ist es Port A, Pin 11+12.
Auf den Olimexboards sind STM32F103RBT6, mein µC ist ein STM32F103CBT6. 
Also nur ein anderes Gehäuse.

Leider weiß ich jetzt nicht mehr weiter.
Ich vermute dass im Init was verkehrt ist, bzw. etwas fehlt.
Eine andere Möglichkeit ist, dass RX<->TX auf der Platine falsch sind, 
meiner Meinung nach passt das aber (Schaltplan im Anhang).
Hat jemand eine Idee worans hängt? Vielen dank schon mal.

Hier der CAN-Init:
1
void CAN_Init()
2
{
3
  GPIO_InitTypeDef GPIO_InitStructure;
4
  CAN_InitTypeDef CAN_InitStructure;
5
  NVIC_InitTypeDef NVIC_InitStructure;
6
  CAN_FilterInitTypeDef CAN_FilterInitStructure;
7
8
  //Init clock
9
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);
10
11
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
12
13
  //For Olimex boards
14
  //RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);
15
16
  //Init GPIO Pins
17
  //For Olimex boards
18
  /*GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
19
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
20
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
21
  GPIO_Init(GPIOB, &GPIO_InitStructure);
22
23
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
24
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
25
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
26
  GPIO_Init(GPIOB, &GPIO_InitStructure);
27
  
28
  GPIO_PinRemapConfig(GPIO_Remap1_CAN1, ENABLE);*/
29
  
30
  //CAN RX
31
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
32
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
33
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
34
  GPIO_Init(GPIOA, &GPIO_InitStructure);
35
36
  //CAN TX
37
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
38
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
39
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
40
  GPIO_Init(GPIOA, &GPIO_InitStructure);
41
  
42
  //Init CAN
43
  CAN_InitStructure.CAN_Prescaler = 2;
44
  CAN_InitStructure.CAN_SJW = CAN_SJW_2tq;
45
  CAN_InitStructure.CAN_BS1 = CAN_BS1_11tq;
46
  CAN_InitStructure.CAN_BS2 = CAN_BS2_4tq;
47
  CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;
48
  CAN_InitStructure.CAN_TTCM = DISABLE;
49
  CAN_InitStructure.CAN_ABOM = DISABLE;
50
  CAN_InitStructure.CAN_AWUM = DISABLE;
51
  CAN_InitStructure.CAN_NART = ENABLE;
52
  CAN_InitStructure.CAN_RFLM = DISABLE;
53
  CAN_InitStructure.CAN_TXFP = DISABLE;
54
  CAN_Init(CAN1, &CAN_InitStructure);
55
56
  //Init NVIC
57
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
58
59
  NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn;
60
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
61
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
62
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
63
  NVIC_Init(&NVIC_InitStructure);
64
65
  CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE);
66
67
  CAN_AddFilter_16(0x0000, 0x0000, 0);
68
69
  //Init Vars
70
  memset(CanOutData, '\0', 8);
71
}

Und der Interrupt Handler
1
extern "C" void USB_LP_CAN1_RX0_IRQHandler(void)
2
{
3
  CAN_Receive(CAN1, CAN_FIFO0, &CanRxMessage[CanRX_Tail]);
4
}

Den Breakpoint habe ich im Interrupt Handler auf CAN_Receive() gesetzt.

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.