STM32F103RB Fehler CAN - Frame

Gast #4008583
Lesenswert?

Hallo!

Ich nutze ein STM32F103 Nucleoboard, bei dem ich mich am CAN - Bus 
versuche.
Nur habe ich jetzt dass Problem, dass zwar die Id, Nutzdaten und CRC 
übertragen wird, jedoch fehlt danach der CDC + ACK bzw. EOF - Delimter.

Wenn ich mir das Bussignal mit dem Scope ansehe, erhalte ich nach der 
CRC einen Form - Fehler.

Hat jemand eine Ahnung, wo hier das Problem liegen könnten?

Danke schon mal!

Gruss
Gast #4008654
Lesenswert?

hier noch der verwendete Code:
1
#include "stm32f10x_conf.h"
2
#include "stm32f10x_rcc.h"
3
#include "stm32f10x_gpio.h"
4
#include "stm32f10x_spi.h"
5
#include "stm32f10x_can.h"
6
#include "stm32f10x_dma.h"
7
#include "misc.h"
8

9

10
int main(void)
11
{
12
  GPIO_InitTypeDef GPIO_InitStructure;
13
  CAN_InitTypeDef CAN_InitStructure;
14
  NVIC_InitTypeDef NVIC_InitStructure;
15

16

17
  SystemInit();
18

19
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);
20
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);
21

22

23
  // CAN RX
24
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
25
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
26
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
27
  GPIO_Init(GPIOB, &GPIO_InitStructure);
28

29
  // CAN TX
30
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
31
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
32
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
33
  GPIO_Init(GPIOB, &GPIO_InitStructure);
34

35
  GPIO_PinRemapConfig(GPIO_Remap1_CAN1, ENABLE);
36

37

38

39
  // CAN
40
  CAN_InitStructure.CAN_Prescaler = 4;
41
  CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;
42
  CAN_InitStructure.CAN_BS1 = CAN_BS1_12tq;
43
  CAN_InitStructure.CAN_BS2 = CAN_BS2_5tq;
44
  CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;
45
  CAN_InitStructure.CAN_TTCM = DISABLE;
46
  CAN_InitStructure.CAN_ABOM = DISABLE;
47
  CAN_InitStructure.CAN_AWUM = DISABLE;
48
  CAN_InitStructure.CAN_NART = ENABLE;
49
  CAN_InitStructure.CAN_RFLM = DISABLE;
50
  CAN_InitStructure.CAN_TXFP = DISABLE;
51
  CAN_Init(CAN1, &CAN_InitStructure);
52

53
  while(1)
54
  {
55
                 CanTxMsg canTxMessage;
56

57
        canTxMessage.StdId = 0x12;
58
      canTxMessage.ExtId = 0;
59
      canTxMessage.RTR = CAN_RTR_DATA;
60
      canTxMessage.IDE = CAN_ID_STD;
61
      canTxMessage.DLC = 8;
62

63
      canTxMessage.Data[0] = 0x34;
64
      canTxMessage.Data[1] = 0x35;
65
      canTxMessage.Data[2] = 0x36;
66
      canTxMessage.Data[3] = 0x37;
67
      canTxMessage.Data[4] = 0x38;
68
      canTxMessage.Data[5] = 0x36;
69
      canTxMessage.Data[6] = 0x37;
70
      canTxMessage.Data[7] = 0x38;
71

72
      while(!(CAN1 -> TSR & CAN_TSR_TME0 || CAN1 -> TSR & CAN_TSR_TME1 || CAN1 -> TSR & CAN_TSR_TME2 ));
73

74
      CAN_Transmit(CAN1, &canTxMessage);
75

76
  
77
  }
78
}

Das Board läuft mit einem 8 MHz externen Quarz und intern wird der 72 
MHz PLL - Takt verwendet.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren