Gast
#5700513
Guten Morgen, ich habe schon seit längerem ein Problem mit den I²C Funktionen aus der HAL für STM32. Vielleicht wisst ihr wie ich dieses Problem beheben kann denn sitze da schon seit Woche dran. bei der typischen HAL_I2C_Master_Transmit(); Funktion taucht eine weitere Funktion auf eine Abfrage für einen Timeout die in der Regel übersprungen werden sollte, die I2C_WaitOnFlagUntilTimeout(); Funktion. Das innere dieser Funktion sieht so aus: static HAL_StatusTypeDef I2C_WaitOnFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Flag, FlagStatus Status, uint32_t Timeout, uint32_t Tickstart) { /* Wait until flag is set */ while((__HAL_I2C_GET_FLAG(hi2c, Flag) ? SET : RESET) == Status) { //flagstatus von typ enum kann entweder set oder reset sein /* Check for the Timeout */ if(Timeout != HAL_MAX_DELAY) //springt immer in die if (timeout=25ms , hal_max_delay = 0xFFFFFFFF) { tickstart_g = Tickstart; gettick_g = HAL_GetTick(); if((Timeout == 0U)||((HAL_GetTick() - Tickstart ) > Timeout)) { hi2c->PreviousState = I2C_STATE_NONE; hi2c->State= HAL_I2C_STATE_READY; hi2c->Mode = HAL_I2C_MODE_NONE; /* Process Unlocked */ __HAL_UNLOCK(hi2c); return HAL_TIMEOUT; } } } return HAL_OK; } Diese Funktion prüft ob flag gesetzt ist oder nicht, bei set gibt es den rückgabewert HAL_TIMEOUT zurück, dadurch wird bestätigt das der bus beschäftigt ist und bei Reset gibt er den Rückgabewert HAL_OK. Und ich bekomme immer einen Timeot zurück egal was ich mache fehlt mir irgendwas grundlegendes dabei? Wie schaffe ich das mir dieser Ausdruck ((__HAL_I2C_GET_FLAG(hi2c, Flag) ? SET : RESET) == Status) den Rückgabewert HAL_OK liefert?