mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik STM32F103CB CAN Problem


Autor: Markus Müller (mmvisual)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich bekomme den CAN einfach nicht zum laufen. Ich bin schon am 
verzweifeln. Kann bitte hier jemand einen Blick drauf werfen?

Diese Routine sollte Ports, Remap, Clocks und CAN initialisieren, zum 
Schluss sollte ein Telegramm geschickt werden.
Aber mit dem Oszi sehe ich keine Pulse am Ausgang.

CPU Läuft mit 8MHz ohne PLL HSI.

Vielen Dank für Ideen.
void CANInit(char bRefresh)
{
  if (!bRefresh)
  {
    CAN_DeInit();
  }

  RCC_AHBPeriphClockCmd(RCC_APB1Periph_CAN, ENABLE);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_AFIO, ENABLE);

//  GPIO_PinRemapConfig(GPIO_Remap_PD01, ENABLE);
  GPIO_PinRemapConfig(GPIO_Remap2_CAN, ENABLE);

  GPIO_InitTypeDef GPIO_InitStructure;
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  GPIO_Init(GPIOD, &GPIO_InitStructure);
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOD, &GPIO_InitStructure);

  CAN_InitTypeDef CAN_InitStructure;
  CAN_FilterInitTypeDef  CAN_FilterInitStructure;

  /* CAN register init */
  CAN_StructInit(&CAN_InitStructure);

  /* CAN cell init */
  CAN_InitStructure.CAN_TTCM = DISABLE;
  CAN_InitStructure.CAN_ABOM = DISABLE;
  CAN_InitStructure.CAN_AWUM = DISABLE;
  CAN_InitStructure.CAN_NART = DISABLE;
  CAN_InitStructure.CAN_RFLM = DISABLE;
  CAN_InitStructure.CAN_TXFP = DISABLE;
  CAN_InitStructure.CAN_Mode = CAN_Mode_Normal; // CAN_Mode_LoopBack CAN_Mode_Normal
  CAN_InitStructure.CAN_SJW = CAN_SJW_1tq; // 10 Teileinheiten = 20KBaud @200KHz
  CAN_InitStructure.CAN_BS1 = CAN_BS1_5tq;
  CAN_InitStructure.CAN_BS2 = CAN_BS2_4tq;
  CAN_InitStructure.CAN_Prescaler = 40; // Einstellung 8MHz/40 >> 200KHz
  CAN_Init(&CAN_InitStructure);

  /* CAN filter init */
  CAN_FilterInitStructure.CAN_FilterNumber=1;
  CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;
  CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;
  CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;
  CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;
  CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;
  CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;
  CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_FIFO0;
  CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;
  CAN_FilterInit(&CAN_FilterInitStructure);

  /* Enable CAN RX0 interrupt IRQ channel */
  NVIC_InitTypeDef NVIC_InitSt;
  NVIC_InitSt.NVIC_IRQChannel = USB_LP_CAN_RX0_IRQChannel;
  NVIC_InitSt.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitSt.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitSt.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitSt);

  /* CAN FIFO0 message pending interrupt enable */
  CAN_ITConfig(CAN_IT_FMP0, ENABLE);

  // Test
  CanTxMsg msg;
  msg.ExtId = 0x12345;
  msg.IDE = CAN_ID_EXT;
  msg.RTR = CAN_RTR_DATA;
  msg.DLC = 4;
  msg.Data[0] = 1;
  msg.Data[2] = 5;
  msg.Data[3] = 8;
  msg.Data[4] = 0;
  CAN_Transmit(&msg);
}

Autor: Christoph (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Remap funktioniert nicht, da du nur einen kleinen STM32F103 hast. 
Das Nutzen des Port D funktioniert erst bei den großen 100 + 144 pin 
Mikrokontrollern.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jedenfalls solange man an den beiden Pins den Quarz hängen hat. 
Andernfalls sollten diese Pins als GPIO oder CANRX/TX zur Verfügung 
stehen.

Autor: Markus Müller (mmvisual)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, Dank. Nach 11 Monaten hab ich das schon selbst heraus gefunden.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So schnell? ;-)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.