PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] Kann Register nicht beschreiben - AFIO_MAPR - AF remap and debug I/O config register



arwar52
25.02.2019, 18:49
Hallo Kollegen,

hoffe es gibt genug Programmierer die keine Bibliotheken verwenden, sondern die Register direkt programmieren.

Bin dabei Programmteile eines auf STM3L2476RG funktionierenden CAN-Treibers auf den STM32F103RB anzupassen und . . . es will nicht.
Den Treiber für STM3L2476RG hab ich selbst programmiert und hoffte genug Kenntnisse dafür gesammelt zu haben.

Der Fehler ist auf den AFIO_MAP Register eingegrenzt.
Hier sollen die CAN Tx und Rx auf die Pins Port B, Pin 8(Rx) und 9(Tx) remapped werden.
AFIO_MAP, Bits [14:13] = 0xb10 setzten -> CAN_RX mapped to PB8, CAN_TX - to PB9.

Leider wird die Bitkombination NICHT in das Register übernommen. :( ????

Habe
- Takt auf AFIO geschaltet (RCC_APB2ENR, Bit 0 = 1).
Port B wird vom selben APB2 getaktet und die Register des Port B nehmen Änderungen an - > APB2 ist mit Takt versorgt.

- CAN Rx und Tx, Pins B8, B9 eingestellt und erst dann remapped. Hab es auch anders rum versucht . . .

- Die Register Adressen und Offsetzs mehr Malls geprüft.

Unten der Code und . . . Danke für jeden Hinweis:

++++++++++++++++++++++++++++++++++++++++++++++++++
void GpioInit(void) {

#define CNF_MODE_INPUT_ANALOG 0x00
#define CNF_MODE_INPUT_FLOATING 0x04 /* reset value */
#define CNF_MODE_INPUT_PU_PD 0x08
#define CNF_MODE_OUTPUT_PP_10MHz 0x01
#define CNF_MODE_OUTPUT_OD_10MHz 0x05
#define CNF_MODE_OUTPUT_AF_PP_10MHz 0x09
#define CNF_MODE_OUTPUT_AF_OD_10MHz 0x0D

uGPIO_CRH * pGpioBCrH = (uGPIO_CRH *)0x40010C04;
uGPIO_CRH GpioBCrH;
uGPIOx_ODR * pGpioBOdr = (uGPIOx_ODR *)0x40010C0C;
uGPIOx_ODR GpioBOdr;
uAFIO_MAPR * pAfioMap = (uAFIO_MAPR *)0x40010004;
uAFIO_MAPR AfioMap;

GpioBCrH.All = 0;
GpioBCrH.Bit.CnfMode08 = CNF_MODE_INPUT_PU_PD; //CAN_Rx
GpioBCrH.Bit.CnfMode09 = CNF_MODE_OUTPUT_AF_PP_10MHz; //CAN_Tx
pGpioBCrH->All = GpioBCrH.All;

GpioBOdr.All = 0;
GpioBOdr.Bit.ODR08 = 1; //pull-up for CAN_Rx
pGpioBOdr->All = GpioBOdr.All;

AfioMap.All = 0;
AfioMap.Bit.CAN_REMAP = 2; //2: CAN remapping to PB8-Rx, PB9-Tx - AN DIESEM BEFEHL SCHEITERT ES
pAfioMap->All = AfioMap.All;

}


++++++++++++++++++++++
Die Bitfelder sehen so oder änlich aus:

typedef struct {
unsigned long CnfMode08 : 4;
unsigned long CnfMode09 : 4;
unsigned long CnfMode10 : 4;
unsigned long CnfMode11 : 4;
unsigned long CnfMode12 : 4;
unsigned long CnfMode13 : 4;
unsigned long CnfMode14 : 4;
unsigned long CnfMode15 : 4;
} tGPIO_CRH;

typedef union {
tGPIO_CRH Bit;
unsigned long All;
} uGPIO_CRH;

+++++++++++++++++++++++++++++++++++++++++++

Ceos
26.02.2019, 06:50
Die Doku sagt


•For alternate function outputs, the port must be configured in Alternate Function Output mode (Push-Pull or Open-Drain).
•For bidirectional Alternate Functions, the port bit must be configured in Alternate Function Output mode (Push-Pull or Open-Drain). In this case the input driver is configured in input floating mode

Wenn ich deinen Code + Kommentare gerade richtig deute sind deine Pins aber im Pull-Up, oder ist das eine Zusatzfunktion bei STM?!

Was für eine Variante des Chips hast du, die Doku sagt die Variante mit 36 Pins hat dieses Remap nicht

10: CAN_RX mapped to PB8, CAN_TX mapped to PB9 (not available on 36-pin package)

Siro
26.02.2019, 17:43
Du must das Bit AFIOEN Bit 0 im RCC_APB2ENR erst setzen
APB2 peripheral clock enable register (RCC_APB2ENR)

Bit 0 AFIOEN: Alternate function IO clock enable
Set and cleared by software.
0: Alternate Function IO clock disabled
1: Alternate Function IO clock enabled

Siro

Ceos
26.02.2019, 18:19
- Takt auf AFIO geschaltet (RCC_APB2ENR, Bit 0 = 1).

hat er doch meinte er!?

Siro
26.02.2019, 18:53
@Ceos:
Okay, sorry, das habe ich jetzt im Code nicht gesehen.

evtl. muss er auch noch den IOPBEN: IO port B clock enable einschalten ? da bin ich mir aber nicht sicher.
Ich hab das bei meinen LPC Cortex Controllern auch,
dass da etliche von Clocks erstmal eingeschaltet werden müssen,
damit man auf die Register überhaupt zugreifen kann.

Siro

arwar52
26.02.2019, 19:50
Hallo und schönen Abend allerseits

DANKE erstmal für die Antworten.

. . . der Chip hat 64 Pins - also sollte der Remapp eigentlich funktionieren.
. . . Takt für Port B und auch für AFIO ist AN.
. . . CAN Rx -PB8 wurde auch schon mal ins input floating gesetzt - ohne Erfolg.

In mehreren C-Codes mit Librarys wird der Rx Pin in GPIO_Mode_IPU = Input, Pull Up gesetzt. So habe ich es auch gemacht. Das ist aber erst für den CAN Daten Transfer wichtig, so weit ist es leider noch nicht.

Die Frage ist eigentlich - wie kriegt man die AFIO zum laufen?
Warum werden die Bits im AFIO_MAPR Register nicht gesetzt? Jedes Bit steht auf 0 und reagiert auf nichts.

Die GPIO Register für Port B kann ich sogar in Eclipse in der View "Variable" mit neuen Werten belegen. Es geht.
Das AFIO_MAPR reagiert auf gar nichts, kein Bit - so als ob das Register defekt ist oder keinen Takt bekommt.
Ich meine - theoretisch kann natürlich schon mal was zu Bruch gehen aber - die Dinge sind ja fast unkaputbar, oder . . . ???

Ceos
27.02.2019, 07:02
Ein defektes Register ist quasi ausgeschlossen, aber ich habe über die Suche nach ähnlichen Problemen 2 Dinge gefunden

Zum einen scheint das Register WriteOnly zu sein, jedes zurücklesen wird also sinnlos sein. Wie sich das mit dem debug monitor verhält kann ich dir nicht sagen.

Zum anderen lese ich immer weider von einem gelösten Issue mit der library aber keine konkreten Hinweise oder tiefer gehende Links, aber es hört sich so an als ob du mal deine Libarys und die IDE/Compiler auf Aktualisierungen prüfen solltest

Siro
27.02.2019, 07:44
Ich hab hier auch noch was gefunden:
Ob das weiterhilft weis ich aber nicht

34032
Siro

arwar52
27.02.2019, 10:09
. . . @ Siro
Alle andere Schnittstellen habe ich schon ausgeschaltet - kein Takt, keine Aktivierung.
Remapp muss, leider, sein da nur über PB8 und PB9 CAN mit dem auf Board verhandenen CAN Transiver connected ist.

Aus RM0008 - Reference manual, Seite 184 - 185
++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++
Bits 14:13 CAN_REMAP[1:0]: CAN alternate function remapping
These bits are set and cleared by software. They control the mapping of alternate functions
CAN_RX and CAN_TX in devices with a single CAN interface.
00: CAN_RX mapped to PA11, CAN_TX mapped to PA12
01: Not used
10: CAN_RX mapped to PB8, CAN_TX mapped to PB9 (not available on 36-pin package)
++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++

- - - Aktualisiert - - -

@ Ceos " . . . Zum einen scheint das Register WriteOnly zu sein, jedes zurücklesen wird also sinnlos sein."

Laut "RM0008 - Reference manual, Seite 184 - 185" " . . . STM32F103xx, . . ." ist der Register "ReadWrite".

NUR Read - hat Sinn aus meiner Sicht, . . . was für ein Sinn steckt daninter ein Register NUR Writable zu machen???
Obwohl auch in diesem Reg. sind die SWJCFG Bits NUR Writable ???:confused:

34033

Ceos
27.02.2019, 10:18
Die Gründe sind sicher mannigfaltig, aber ja, es scheinen tatsächlich nur die Bits zu sein, also unwichtig für dein Problem ...

bietet STM nicht üblicherweise auch ein Tool an mit dem man die Peripherie vorkonfigurieren kann?! Vielleicht findest du den notwendigen Trick in dem generierten Code?

arwar52
27.02.2019, 10:21
Hab gerade noch was gefunden zu den SWJ_CFG . . .

++++++++++++++++++++

Bits 26:24 SWJ_CFG[2:0]: Serial wire JTAG configuration
These bits are write-only (when read, the value is undefined). They are used to configure the
SWJ and trace alternate function I/Os. The SWJ (Serial Wire JTAG) supports JTAG or SWD
access to the Cortex® debug port. The default state after reset is SWJ ON without trace.
This allows JTAG or SW mode to be enabled by sending a specific sequence on the JTMS /
JTCK pin.
000: Full SWJ (JTAG-DP + SW-DP): Reset State
001: Full SWJ (JTAG-DP + SW-DP) but without NJTRST
010: JTAG-DP Disabled and SW-DP Enabled
100: JTAG-DP Disabled and SW-DP Disabled
Other combinations: no effect
++++++++++++++++++++

Kann die Einstellung dieser Bits was bewirken?

ARetobor
27.02.2019, 10:39
Nur Schreiben macht wohl Sinn.
zB Reset

Gruß

arwar52
27.02.2019, 10:56
. . . meinte - Nur Schreiben OHNE Lesen zu können ???
Man kan schlecht Fehler im späteren Verlauf des Programms finden wenn man nicht weisst das die Befehle davor sauber funktionieren?

Werd' mal davon ausgehen müssen das der ganzer AFIO_MAPR Register NUR Writable ist und versuche weiter zu gehen.

Werde berichten wenn sich was ergibt.

arwar52
27.02.2019, 21:56
. . . komme in der Sache nicht weiter.
Im nächsten Schritt muss CAN initialisiert werden. Die notwendigen Register lassen sich beschreiben aber, die endgültige Initialisierung bleibt aus.
Das Bit INAK (Initialization acknowledge) im Register ACAN_MCR muss von der Soft- und dann von Hardware = 0 gesetzt werden, tut es aber nicht.

Bei Initialisierung "hört" CAN auf den Bus und muss sich synchronisieren.
Ich glaube:
- da die Rx und Tx NICH auf den Transmitter (PB8, PB9) umgeschaltet sind
- und der CAN Transmitter an die CAN Hardware des Chips nicht angebunden ist
kann CAN sich nicht "hören" und auch nicht synchronisieren.

+++++++++++++++++++++++
Bit 0 INAK: Initialization acknowledge
This bit is set by hardware and indicates to the software that the CAN hardware is now in
initialization mode. This bit acknowledges the initialization request from the software (set
INRQ bit in CAN_MCR register).
This bit is cleared by hardware when the CAN hardware has left the initialization mode (to
be synchronized on the CAN bus). To be synchronized the hardware has to monitor a
sequence of 11 consecutive recessive bits on the CAN RX signal.
+++++++++++++++++++++++

Also vermute ich mal - es ist quasi ein Folgefehler der AFIO-Geschichte . . .

arwar52
10.05.2019, 14:28
Also - die Ursache war --- der veralteter Dibagger.
Ein Arbeitskollege hat mir geholfen den GDB OpenOCD debugger zu installieren - jetzt läuft alles.