Forum: Mikrocontroller und Digitale Elektronik STM32F091RC CAN funktioniert nur auf PortB nicht auf PortA


von mega_clever (Gast)


Lesenswert?

Hallo zusammen,

bin dabei einen CANopen-Stack auf dem Nucleo-64 091RC Board mit dem µC 
STM32F091RC in Betrieb zu nehmen. Laut Datenblatt sollte es möglich sein 
CAN_RX an Pin PA11 und PB8 und und CAN_TX an Pin PA12 und PB9 zu hängen.

Leider funktioniert es bei mir nur am Port B, wenn ich den 
CAN-Controller an Port A hänge werden keine CAN-Telegramme versendet. 
Hier der Code:

//#define CAN_PORT_A

#if defined( CAN_PORT_A )

  RCC_AHBPeriphClockCmd( RCC_AHBPeriph_GPIOA, ENABLE );

  GPIO_PinAFConfig( GPIOA, GPIO_PinSource11, GPIO_AF_4 ); /* see page 41 
in data sheet */
  GPIO_PinAFConfig( GPIOA, GPIO_PinSource12, GPIO_AF_4 );

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_12;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  GPIO_Init( GPIOA, &GPIO_InitStructure );

#else
  RCC_AHBPeriphClockCmd( RCC_AHBPeriph_GPIOB, ENABLE );

  GPIO_PinAFConfig( GPIOB, GPIO_PinSource8, GPIO_AF_4 ); /* see page 42 
in data sheet */
  GPIO_PinAFConfig( GPIOB, GPIO_PinSource9, GPIO_AF_4 );

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  GPIO_Init( GPIOB, &GPIO_InitStructure );
#endif

Wäre super, wenn mir jemand helfen könnte.

von mega_clever (Gast)


Angehängte Dateien:

Lesenswert?

Hier noch Auszüge aus dem Datenblatt.

von pegel (Gast)


Lesenswert?

Ich verstehe nicht ganz, wieso es an B funktioniert, oder hast Du noch 
irgendwo ein "RCC_APB1ENR_CANEN" versteckt?

von mega_clever (Gast)


Lesenswert?

pegel schrieb:
> Ich verstehe nicht ganz, wieso es an B funktioniert, oder hast Du noch
> irgendwo ein "RCC_APB1ENR_CANEN" versteckt?

Ich habe nur die Portpin-Initialierung veröffentlicht. Die 
Initialisierung vom CAN-Controller ist ja unabhängig von der 
Pin-Initialisierung.

von Guest (Gast)


Lesenswert?

Sicher das du an den richtigen Pins bist? An den Nucleos steckt man ja 
auch gern mal daneben.

Unabhängig davon wozu der Pull-Up?

von Jan H. (jan_h74) Flattr this


Lesenswert?

Beim Wechsel von pinconfig erst sysclock starten (hier für ein F3).
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);

von mega_clever (Gast)


Lesenswert?

Guest schrieb:
> Sicher das du an den richtigen Pins bist? An den Nucleos steckt man ja
> auch gern mal daneben.
>
> Unabhängig davon wozu der Pull-Up?

Ich habe auch mal versucht den Pin 11 und Pin 12 vom Port A als normale 
GPIO-Pins zu schalten. Das hat einwandfrei funktioniert. Also gesteckt 
ist alles richtig. Ich schaffe es nur nicht den CAN-Controller mit 
diesen Pins zu verbinden. Errata-Sheet habe ich auch schon 
durchgeschaut. Aber vielleicht ist es doch ein Bug im Silicium.

von mega_clever (Gast)


Lesenswert?

Jan H. schrieb:
> Beim Wechsel von pinconfig erst sysclock starten (hier für ein F3).
> RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);

Hallo Jan,
was soll das bringen? Bei mir ist generell eines der ersten Dinge die 
ich mache den Systemtakt richtig zu setzen also bevor ich mit der 
Initialisierung der Portpins starte.

von pegel (Gast)


Lesenswert?

mega_clever schrieb:
> Ich habe nur die Portpin-Initialierung veröffentlicht.

Wird es nicht Zeit, uns das komplette Projekt zu präsentieren?

von pegel (Gast)


Lesenswert?

mega_clever schrieb:
> #if defined( CAN_PORT_A )

Wenn Du so etwas öfter benutzt, sollte man genau nachsehen.

Da ist man gern mal falsch abgebogen.

von Johannes S. (Gast)


Lesenswert?

PA und PB sind auch elektrisch anders, PB ist lt. Datasheet als FTf 
gekennzeichnet. Wie ich das verstehe kann der mehr Strom treiben und 
kann höhere Taktraten. Wird der CAN Bus da am Limit betrieben?

von mega_clever (Gast)


Lesenswert?

pegel schrieb:
> mega_clever schrieb:
>> #if defined( CAN_PORT_A )
>
> Wenn Du so etwas öfter benutzt, sollte man genau nachsehen.
>
> Da ist man gern mal falsch abgebogen.

Nicht wenn man Atollic TrueStudio benutzt ;-). Hier werden die per 
Compilerswitch deaktivierten Bereiche automatisch "ausgegraut".

von pegel (Gast)


Lesenswert?

mega_clever schrieb:
> Nicht wenn man Atollic TrueStudio benutzt

Sehr gut. Dafür liebe ich CubeIDE auch.

von mega_clever (Gast)


Lesenswert?

Johannes S. schrieb:
> PA und PB sind auch elektrisch anders, PB ist lt. Datasheet als FTf
> gekennzeichnet. Wie ich das verstehe kann der mehr Strom treiben und
> kann höhere Taktraten. Wird der CAN Bus da am Limit betrieben?

Das habe ich auch schon gesehen. Der CAN-Bus wird nur mit 250kbit/s 
betrieben. Das sollte kein Problem sein. Ich  habe auch schon direkt mit 
dem Oszi am CAN_TX-Pin (PortA Pin12) gemessen. Hier ist keinerlei 
Aktivität zu messen.

von Pieter (Gast)


Lesenswert?

moin,

ich arbeite mit dem STM32F103.
Der hat ein CAN-Modul, diese kann auch zwischen 2 Portpins umgeschaltet 
werden.
Gibt es bei dem MC auch so etwas wie: AFIO MAPR CAN REMAP

VG
Pieter

von mega_clever (Gast)


Lesenswert?

Pieter schrieb:
> moin,
>
> ich arbeite mit dem STM32F103.
> Der hat ein CAN-Modul, diese kann auch zwischen 2 Portpins umgeschaltet
> werden.
> Gibt es bei dem MC auch so etwas wie: AFIO MAPR CAN REMAP
>
> VG
> Pieter

Hallo Pieter,
Remapping gibt es bei diesem µC nicht. Den Pins können nur die in der 
obigen Tabelle aufgelisteten Funktionen zugeordnet werden.

von Johannes S. (Gast)


Lesenswert?

Das Nucleo F091RC habe ich auch, ich habe da mal ein Testprogram mit 
Mbed reingeschoben. Die Daten kommen ordentlich auf PA oder PB raus, der 
Chip kann es also.
Was ich auf die Schnelle als Unterschied sehe ist, das in Mbed mit 
NoPullUp initialisiert wird.
Nachtrag:
Init mit PullUp macht hier aber auch keinen Unterschied, funktioniert. 
Ich habe allerdings keinen CAN Treiber/Bus dran.

von mega_clever (Gast)


Lesenswert?

Johannes S. schrieb:
> Das Nucleo F091RC habe ich auch, ich habe da mal ein Testprogram mit
> Mbed reingeschoben. Die Daten kommen ordentlich auf PA oder PB raus, der
> Chip kann es also.
> Was ich auf die Schnelle als Unterschied sehe ist, das in Mbed mit
> NoPullUp initialisiert wird.
> Nachtrag:
> Init mit PullUp macht hier aber auch keinen Unterschied, funktioniert.
> Ich habe allerdings keinen CAN Treiber/Bus dran.

Hallo Johannes,

seltsam. Und bei dir sieht der Code für die Pin-Initialisierung gleich 
aus wie bei mir? Ich mache am Montag mal einen Test mit einem anderen 
NUCLEO-Board. Eventuell ist irgend etwas defekt. Ohne CAN-Transceiver 
habe ich auch schon getestet.

Vielen Dank für deine Bemühungen. Schönes langes WE.

von Johannes S. (Gast)


Angehängte Dateien:

Lesenswert?

der Code sieht bei mir etwas einfacher aus:
1
//CAN can(PA_11, PA_12);
2
CAN can(PB_8, PB_9);

aber im Konstruktor passiert natürlich noch was. Für die STM Targets 
benutzt mbed auch LL/HAL, die Pins werden in einer Pinmap Liste gesucht 
und es wird eine einheitliche Routine zum initialisieren verwendent.
Die Parameter für CAN sind dann z.B.:
https://github.com/ARMmbed/mbed-os/blob/af4c8a94f3913ceda9069ec79cba81a793d695fe/targets/TARGET_STM/TARGET_STM32F0/TARGET_STM32F091xC/TARGET_NUCLEO_F091RC/PeripheralPins.c#L263-L274
GPIO_AF4_CAN = 0x4

habe gerade nochmal in 
https://github.com/ARMmbed/mbed-os/blob/master/targets/TARGET_STM/pinmap.c
nachgesehen, der OutputTyp müsste da auf OpenDrain gesetzt sein für die 
AlternateFunctions. Debuggen klappt mit dem Board gerade nicht, der 
pyOCD erkennt das nicht, sonst könnte ich noch durchsteppen.

CubeMX initialisiert auch mit AF_PP, ich habe noch mal angehängt wie 
CubeMX das initialisiert für PA/PB und die defines für den Mode.

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.