ich arbeite auf einem STM32L4 Mikrokontroller mit FreeRTOS. Bis anhin habe ich für die I2C-Schnittstelle die HAL Library verwendet. Nun musste ich aber feststellen, wenn ich viele Daten auslesen will z.B. von einem EEPROM werden nicht alle Daten korrekt geladen und die HAL-Funktion ergibt 1 zurück für HAL_ERROR.
Nun habe ich in mehreren Foren gelesen, dass dies der HAL-Library geschuldet ist, da diese nicht thread tauglich ist.
Nun habe ich versucht, die I2C Schnittstelle in LL-Library zu programmieren. Leider ohne Erfolg, ich habe nur Beispiele und Anleitungen für den STM32F4 gefunden. Da ST sich natürlich gedacht hat, beim STM32L4 soll alles besser gemacht werden, heissen gewisse Register anderst, Flags die es beim F4 gibt heissen beim L4 anderst und sind in anderen Registern...
Natürlich habe ich es auch selbst mit dem Datenblatt versucht aber da habe ich das Problem, dass beim Transmit keine Daten gesendet werden, die Funktion hängt beim Check start Bit flag.
Bis anhin
habe ich für die I2C-Schnittstelle die HAL Library verwendet. Nun musste
ich aber feststellen, wenn ich viele Daten auslesen will z.B. von einem
EEPROM werden nicht alle Daten korrekt geladen und die HAL-Funktion
ergibt 1 zurück für HAL_ERROR.
Da speziell die I²C-Master-Funktionen zu den meist genutzten und best erprobten Funktionen in HAL gehören, denke ich, daß das Problem mit an Sicherheit grenzender Wahrscheinlichkeit in deinem Code liegt.
Nun habe ich in mehreren Foren gelesen, dass dies der HAL-Library
geschuldet ist, da diese nicht thread tauglich ist.
Sorry, aber das ist vollkommener Blödsinn!
Wenn verschiedene Tasks die selbe I²C-Schnitstelle für unterschiedliche Peripherie nutzen, musst du die natürlich gegeneinander verriegeln.
Das hat aber rein gar nichts mit "Thread-safe" zu tun.
Die HAL-Library ist mit ihren unendlichen HAL Delays überhaupt nicht
RTOS tauglich.
Unfug!
In den HAL-Funktionen wird HAL_Delay praktisch nirgendwo verwendet.
Bei preemptiven FreeRTOS ist es zudem egal, und bei kooperativen RTOS nutzt man eben osDelay.
Unfug!
In den HAL-Funktionen wird HAL_Delay praktisch nirgendwo verwendet.
Bei preemptiven FreeRTOS ist es zudem egal, und bei kooperativen RTOS
nutzt man eben osDelay.
Ich glaube du hast dich noch nie mit der HAL-Library tiefer beschäftigt.
Nur schon die Init Funktion von I2C in HAL hat 8 Asserts, jedes assert braucht unnötig Speicher und Zeit. Hier ein Aussschnitt:
1
/**
2
* @brief Initializes the I2C according to the specified parameters
3
* in the I2C_InitTypeDef and initialize the associated handle.
4
* @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
5
* the configuration information for the specified I2C.
Nur schon die Init Funktion von I2C in HAL hat 8 Asserts, jedes assert
braucht unnötig Speicher und Zeit.
Ja und?
Zeit (wenige µs) braucht das genau 1 mal während der Initialisierung, und, wenn du die wenigen Byte Flash nicht hast, hast du eben den falschen Chip gewählt.
Ich möchte auf diese Tests jedenfalls nicht verzichten.
Was für eine blöde aussage... genau deswegen schriebe ich ja diesen
Beitrag!
Achso....und so glaubst du, das zu lernen?
Dazu gibts reichlich Doku von ST, aber, da du dich ja hier als absoluter "überflieger" präsentierst, gehe ich davon aus, daß du die auch selbst findest.
Ich hab jedenfalls keine Lust mehr, dir zu helfen.
Ja und?
Zeit (wenige µs) braucht das genau 1 mal während der Initialisierung,
und, wenn du die wenigen Byte Flash nicht hast, hast du eben den
falschen Chip gewählt.
Ich möchte auf diese Tests jedenfalls nicht verzichten.
Ja das ist im Init irrelevant das stimmt, aber nicht z.B. in der Transmit Funktion. Da werden aus diesen us schnell ms bis s die reichen das Timeouts überschritten werden. Wenn man die Funktion immer wieder aufrufen muss.
Wenn man im Speicher begrenzt ist, muss man halt sparen wo man kann. Gerade bei Bastel-Projekten wo man nicht einfach auf den nächst grösseren 256KB MCU wechseln kann.
Das schweift aber auch vom eigentlichen Problem ab...
Achso....und so glaubst du, das zu lernen?
Dazu gibts reichlich Doku von ST, aber, da du dich ja hier als absoluter
"überflieger" präsentierst, gehe ich davon aus, daß du die auch selbst
findest.
Als Überflieger würde ich mich nicht bezeichnen, aber +/- verstehe ich schon was ich machen möchte. Ich arbeite auch nicht seit gestern mit diesen Kontrollern. In 98 von 100 Projekten arbeite ich auch mit HAL. Hin und wieder gibt es aber Projekte wo es nicht passt wie hier mit dem RTOS.
Ich hab jedenfalls keine Lust mehr, dir zu helfen.
Geholfen hast du ja eh nicht, somit ist mir das eigentlich egal.
Meine Frage war ja eigentlich... Ich habe einen Code geschrieben mit Hilfe der Doku von ST, aber aus irgend einem Grund wird das BUSY Flag nicht gesetzt, bzw. ich habe nicht verstanden ob das BUSY flag das richtige ist, das ausgelesen werden muss nach dem erstellen der Start Condition...
aber nicht z.B. in der
Transmit Funktion. Da werden aus diesen us schnell ms bis s die reichen
das Timeouts überschritten werden. Wenn man die Funktion immer wieder
aufrufen muss.
Offenbar hast du dir stm32f4xx_hal_i2c.c noch nie im Detail angeschaut.
Deine Aussage ist einfach nicht wahr.
Und, wenn du die Funktion ständig aufrufen musst, so, daß sowas überhaupt einen nachweisbaren Effekt hätte, ist dein Konzept eben vollkommener Murks.
Dabei Sekunnden zusammen zu fantasieren zeugt nur von totalem Unverständnis dieses Codes.
Wenn man im Speicher begrenzt ist, muss man halt sparen wo man kann.
Gerade bei Bastel-Projekten wo man nicht einfach auf den nächst
grösseren 256KB MCU wechseln kann.
Wieder so eine typische Anfänger-Fehleinschätzung!
Wenn der Code aller Assert-Funktionen zusammen 200-300Byte belegt ist das bereits viel, und das fällt bei den Speichergrößen der üblichen L4-Chips absolut nicht ins Gewicht.
Für nicht genutzten Speicher gibts eben kein Geld zurück.