HAL: Bin auch gerade auf die Schnauze gefallen.

Gast #5604102
Lesenswert?

Frischer Erfahrungsbericht: Um mal eben mit einem nRF24L01+ was 
auszuprobieren, etwas auf die Schnelle hingepfuscht. Mit der HAL und 
einem STM32F103C8T6 (Blue Pill). Lief natürlich nicht. Zum Schluß nur 
noch das STATUS-Register auslesen, mit HAL_SPI_TransmitReceive(). Ergab 
nach 8 clocks 0x1C! Also schon Fehler auf unterster SPI-Ebene. Dem 
HAL-Gedanken folgend blind weitervertraut und alles mögliche geprüft. 
Lief natürlich nicht.

Kurzum: Nach knapp 2 Stunden HAL-gespiele dann Schnauze voll und 
systematisch angefangen zu suchen. Irgendwann geschaut, ob die HAL denn 
das Peripheral auch selbst enabled, wie man es von Muddi erwartet: Klar; 
wird öfters in der Funktion gecheckt (z.B. in Zeile 888):
1
/* Check if the SPI is already enabled */
2
  if((hspi->Instance->CR1 &SPI_CR1_SPE) != SPI_CR1_SPE)
3
  {
4
    /* Enable SPI peripheral */
5
    __HAL_SPI_ENABLE(hspi);
6
  }

Dann in wenigen Minuten mit CMSIS die Funktion "ersetzt". Es lief...
Dann in dem HAL-code per CMSIS einfach nur das Peripheral enabled. Es 
lief...

Selber schuld.
Gast #5604144
Lesenswert?

Lutz schrieb:
> Selber schuld.

wenn man keine Doku liest.
1
==============================================================================
2
                        ##### How to use this driver #####
3
  ==============================================================================
4
    [..]
5
      The SPI HAL driver can be used as follows:
6

7
      (#) Declare a SPI_HandleTypeDef handle structure, for example:
8
          SPI_HandleTypeDef  hspi;
9

10
      (#)Initialize the SPI low level resources by implementing the HAL_SPI_MspInit() API:
11
          (##) Enable the SPIx interface clock
12
          (##) SPI pins configuration
13
              (+++) Enable the clock for the SPI GPIOs
14
              (+++) Configure these SPI pins as alternate function push-pull
Gast #5604156
Lesenswert?

Unterm Strich betrachtet kommt es mir so vor, als ob man mit Cube HAL 
mehr zusätzlichen Aufwand hat, als Nutzen.

So wirklich abstrahiert ist da auch nicht viel, man kann den Controller 
trotzdem nicht ohne erhebliche Quelltext-Änderungen wechseln.

Da arbeite ich lieber Copy/Paste Code-Schnipseln, die ich selbst 
erstellt oder wenigstens durchprobiert und nachvollzogen habe.
Gast #5604161
Lesenswert?

"So wirklich abstrahiert ist da auch nicht viel, man kann den Controller
trotzdem nicht ohne erhebliche Quelltext-Änderungen wechseln."
So bald man soetwas machen kann, wird der Code auch nicht mehr so 
Performant sein...
Gast #5604174
Lesenswert?

Aber beim Lesen der Doku fällt mir ganz stark auf, dass ich zusätzlich 
das Reference Manual, das Datasheet und das Errata lesen muss. Außerdem 
muss ich in die Sourcen der HAL schauen, um Dokumentationslücken zu 
schließen.

Da kann ich auch gleich ganz auf die HAL verzichten. Mir fällt es ohne 
HAL jedenfalls leichter.
#5604176
Lesenswert?

Stefanus F. schrieb:
> So wirklich abstrahiert ist da auch nicht viel, man kann den Controller
> trotzdem nicht ohne erhebliche Quelltext-Änderungen wechseln.

Das ist falsch. Habe persönlich ein umfangreiches Projekt, welches 
ursprünglich mit CubeMX für einen STM32F103 erstellt wurde, innerhalb 
von einem halben Tag auf einen STM32F302 portiert. Und das hat auch nur 
solange gedauert, weil für die USB Schnittstelle grosse Anpassungen 
gemacht wurden, damit man ein Kompositgerät mit 3 Endgeräten hat. Das 
ist so bei einem Cube HAL Projekt nicht vorgesehen sondern nur ein 
Endgerät.
Gast #5604180
Lesenswert?

Stefanus F. schrieb:
> Da kann ich auch gleich ganz auf die HAL verzichten. Mir fällt es ohne
> HAL jedenfalls leichter.

Volle Zustimmung. Gerade bei einem STM32F103 für den es vor der HAL ja 
schon die SPL oder so ähnlich gab. Und in  2 Jahren gibt es wieder was 
anderes. Dann lieber bei den Registern bleiben, die leben wenigstens so 
lange wie der Controller.
Gast #5604206
Lesenswert?

Stefanus F. schrieb:
> Unterm Strich betrachtet kommt es mir so vor, als ob man mit Cube HAL
> mehr zusätzlichen Aufwand hat, als Nutzen.

das sind aber zwei Dinge, die HAL und Cube. Aber der Zauberwürfel kennt 
die HAL und weiss was man implementieren muss. Insofern ist es schon 
sehr einfach ein kleines Projekt generieren zu lassen und zu schauen was 
nötig ist.

temp schrieb:
> Dann lieber bei den Registern bleiben, die leben wenigstens so
> lange wie der Controller.

gerade die Registerprogrammierung ändert sich von Controller zu 
Controller, auch innerhalb einer Familie gibt es mehr oder weniger 
moderne. Und da reicht ein nicht gesetztes Bit um zu verzweifeln.
(Firma: EleLa - www.elela.de) #5604259
Lesenswert?

Ich habe schon einige male die HAL verwendet, ich muss sagen, da hat ST 
im großen und ganzen sehr gute Arbeit geleistet und nimmt einem sehr 
viel ab.
Und wenn da mal an der ein oder anderen Stelle ein kleiner Bug drin ist, 
dann ist es natürlich hilfreich wenn man das Datasheet kennt.
Copy&Paste habe ich früher auch lieber gemocht, jetzt wo ich je Projekt 
den passenden STM32 auswähle nehme ich lieber die HAL & CubeMX.
Gast #5604339
Lesenswert?

Johannes S. schrieb:
> Lutz schrieb:
>> Selber schuld.
>
> wenn man keine Doku liest.
> ======================================================================== ======
>                         ##### How to use this driver #####
>   ======================================================================== 
======
>     [..]
>       The SPI HAL driver can be used as follows:
>
>       (#) Declare a SPI_HandleTypeDef handle structure, for example:
>           SPI_HandleTypeDef  hspi;
>
>       (#)Initialize the SPI low level resources by implementing the
> HAL_SPI_MspInit() API:
>           (##) Enable the SPIx interface clock
>           (##) SPI pins configuration
>               (+++) Enable the clock for the SPI GPIOs
>               (+++) Configure these SPI pins as alternate function
> push-pull

Natürlich ist es meine Schuld, ohne Zweifel. Und ehrlich gesagt habe ich 
auch nur die halbe Wahrheit geschrieben: Ich habe natürlich CubeMX zum 
Erstellen genutzt. Und da sind alle von dir zitierten Punkte automatisch 
drin! Das Interface wird nur nicht enabled. Ich dachte, daß wird in der 
Funktion HAL_Transmit_Receive() gemacht. Wird es irgendwie auch (siehe 
Eingangspost), es reicht nur anscheinend nicht. Und: Ich habe recht früh 
den LA angeschlossen und das in der Anlage gesehen. Da ging ich 
erstmal davon aus, daß das Peripheral auch läuft. Es clockt ja artig 
und MOSI stimmt auch immer. Es kommt aber nur beim ersten Byte das 
Register STATUS), und zwar inhaltlich fast richtig (STATUS << 1). Und 
dann keine Antwort mehr bei den nächsten clocks. Deshalb war ich erstmal 
"getäuscht".

Wie gesagt, ist meine Schuld und ich will HAL und CubeMX nicht schlecht 
machen. Alleine zum Initialisieren inkl. Takt ist das schon fein. Man 
muß das nur noch in ein "normales" Projekt extrahieren/exportieren. Da 
suche ich allerdings noch, wie ich das geschmeidig in eclipse mit MCU 
plugin importieren kann.
Angehängte Dateien:
Gast #5604915
Lesenswert?

Hm. Ich frage mich, woher denn der Slave weiß, ob der Master richtig 
konfiguriert ist. Schließlich wird aus Sicht des slaves sein CSN auf low 
gezogen und es kommen 8 clocks (mit richiger CPOL und CPHA). Zumindest 
hier müßte er doch dann noch korrekt sein Register STATUS ausgeben.
Um irgendwelche "Rückkopplungen" vom Master auf die MISO-Leitung 
auszuschließen, habe ich die gerade mal getrennt und den LA direkt an 
MISO des slaves gehängt. Er gibt 0x1C aus! Da komme ich gerade nicht 
mit. Hat jemand eine Idee?

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