Skip to content

Commit 85a2f7a

Browse files
committed
[STM32] HAL L1: I2C fix btf / rxne cases
This is an alignement to F4 HAL as the same IP is used. Next official HAL delivery update hall will include the same alignement.
1 parent 77364f9 commit 85a2f7a

File tree

1 file changed

+40
-39
lines changed

1 file changed

+40
-39
lines changed

targets/TARGET_STM/TARGET_STM32L1/device/stm32l1xx_hal_i2c.c

Lines changed: 40 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -3799,44 +3799,38 @@ static HAL_StatusTypeDef I2C_MasterTransmit_BTF(I2C_HandleTypeDef *hi2c)
37993799
*/
38003800
static HAL_StatusTypeDef I2C_MasterReceive_RXNE(I2C_HandleTypeDef *hi2c)
38013801
{
3802+
38023803
if(hi2c->State == HAL_I2C_STATE_BUSY_RX)
38033804
{
3804-
if(hi2c->XferCount > 3U)
3805+
uint32_t tmp = 0U;
3806+
3807+
tmp = hi2c->XferCount;
3808+
if(tmp > 3U)
38053809
{
38063810
/* Read data from DR */
38073811
(*hi2c->pBuffPtr++) = hi2c->Instance->DR;
38083812
hi2c->XferCount--;
38093813
}
3810-
else if((hi2c->XferCount == 2U) || (hi2c->XferCount == 3U))
3814+
else if((tmp == 2U) || (tmp == 3U))
38113815
{
3812-
if(hi2c->XferOptions != I2C_NEXT_FRAME)
3813-
{
3814-
/* Disable Acknowledge */
3815-
CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
3816-
3817-
/* Enable Pos */
3818-
SET_BIT(hi2c->Instance->CR1, I2C_CR1_POS);
3819-
}
3820-
else
3821-
{
3822-
/* Enable Acknowledge */
3823-
SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
3824-
}
3816+
/* Disable Acknowledge */
3817+
hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
38253818

3819+
/* Enable Pos */
3820+
hi2c->Instance->CR1 |= I2C_CR1_POS;
3821+
38263822
/* Disable BUF interrupt */
38273823
__HAL_I2C_DISABLE_IT(hi2c, I2C_IT_BUF);
38283824
}
38293825
else
38303826
{
3831-
if(hi2c->XferOptions != I2C_NEXT_FRAME)
3832-
{
3833-
/* Disable Acknowledge */
3834-
CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
3835-
}
3836-
else
3827+
/* Disable Acknowledge */
3828+
hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
3829+
3830+
if(hi2c->XferOptions == I2C_NEXT_FRAME)
38373831
{
3838-
/* Enable Acknowledge */
3839-
SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
3832+
/* Enable Pos */
3833+
hi2c->Instance->CR1 |= I2C_CR1_POS;
38403834
}
38413835

38423836
/* Disable EVT, BUF and ERR interrupt */
@@ -3846,17 +3840,17 @@ static HAL_StatusTypeDef I2C_MasterReceive_RXNE(I2C_HandleTypeDef *hi2c)
38463840
(*hi2c->pBuffPtr++) = hi2c->Instance->DR;
38473841
hi2c->XferCount--;
38483842

3843+
tmp = (uint32_t)(hi2c->State) & I2C_STATE_MSK;
3844+
hi2c->PreviousState = tmp | (uint32_t)(hi2c->Mode);
38493845
hi2c->State = HAL_I2C_STATE_READY;
38503846

38513847
if(hi2c->Mode == HAL_I2C_MODE_MEM)
38523848
{
3853-
hi2c->PreviousState = I2C_STATE_NONE;
38543849
hi2c->Mode = HAL_I2C_MODE_NONE;
38553850
HAL_I2C_MemRxCpltCallback(hi2c);
38563851
}
38573852
else
38583853
{
3859-
hi2c->PreviousState = I2C_STATE_MASTER_BUSY_RX;
38603854
hi2c->Mode = HAL_I2C_MODE_NONE;
38613855
HAL_I2C_MasterRxCpltCallback(hi2c);
38623856
}
@@ -3873,12 +3867,16 @@ static HAL_StatusTypeDef I2C_MasterReceive_RXNE(I2C_HandleTypeDef *hi2c)
38733867
*/
38743868
static HAL_StatusTypeDef I2C_MasterReceive_BTF(I2C_HandleTypeDef *hi2c)
38753869
{
3870+
/* Declaration of temporary variables to prevent undefined behavior of volatile usage */
3871+
uint32_t tmp;
3872+
uint32_t CurrentXferOptions = hi2c->XferOptions;
3873+
38763874
if(hi2c->XferCount == 3U)
38773875
{
3878-
if((hi2c->XferOptions == I2C_FIRST_AND_LAST_FRAME) || (hi2c->XferOptions == I2C_LAST_FRAME) || (hi2c->XferOptions == I2C_NO_OPTION_FRAME))
3876+
if((CurrentXferOptions == I2C_FIRST_AND_LAST_FRAME) || (CurrentXferOptions == I2C_LAST_FRAME) || (CurrentXferOptions == I2C_NO_OPTION_FRAME))
38793877
{
38803878
/* Disable Acknowledge */
3881-
CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
3879+
hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
38823880
}
38833881

38843882
/* Read data from DR */
@@ -3888,23 +3886,25 @@ static HAL_StatusTypeDef I2C_MasterReceive_BTF(I2C_HandleTypeDef *hi2c)
38883886
else if(hi2c->XferCount == 2U)
38893887
{
38903888
/* Prepare next transfer or stop current transfer */
3891-
if((hi2c->XferOptions != I2C_FIRST_AND_LAST_FRAME) && (hi2c->XferOptions != I2C_LAST_FRAME) && (hi2c->XferOptions != I2C_NO_OPTION_FRAME))
3889+
if((CurrentXferOptions != I2C_FIRST_AND_LAST_FRAME) && (CurrentXferOptions != I2C_LAST_FRAME) && (CurrentXferOptions != I2C_NO_OPTION_FRAME))
38923890
{
3893-
if(hi2c->XferOptions != I2C_NEXT_FRAME)
3894-
{
3895-
/* Disable Acknowledge */
3896-
CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
3897-
}
3898-
else
3891+
/* Disable Acknowledge */
3892+
hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
3893+
3894+
if((CurrentXferOptions == I2C_NEXT_FRAME) || (CurrentXferOptions == I2C_FIRST_FRAME))
38993895
{
3900-
/* Enable Acknowledge */
3901-
SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
3896+
/* Generate Start */
3897+
hi2c->Instance->CR1 |= I2C_CR1_START;
39023898
}
3899+
tmp = (uint32_t)(hi2c->State) & I2C_STATE_MSK;
3900+
hi2c->PreviousState = tmp | (uint32_t)(hi2c->Mode);
39033901
}
39043902
else
39053903
{
3904+
hi2c->PreviousState = I2C_STATE_MASTER_BUSY_RX;
3905+
39063906
/* Generate Stop */
3907-
SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP);
3907+
hi2c->Instance->CR1 |= I2C_CR1_STOP;
39083908
}
39093909

39103910
/* Read data from DR */
@@ -3919,17 +3919,18 @@ static HAL_StatusTypeDef I2C_MasterReceive_BTF(I2C_HandleTypeDef *hi2c)
39193919
__HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR);
39203920

39213921
hi2c->State = HAL_I2C_STATE_READY;
3922+
hi2c->PreviousState = I2C_STATE_NONE;
39223923

39233924
if(hi2c->Mode == HAL_I2C_MODE_MEM)
39243925
{
3925-
hi2c->PreviousState = I2C_STATE_NONE;
39263926
hi2c->Mode = HAL_I2C_MODE_NONE;
3927+
39273928
HAL_I2C_MemRxCpltCallback(hi2c);
39283929
}
39293930
else
39303931
{
3931-
hi2c->PreviousState = I2C_STATE_MASTER_BUSY_RX;
39323932
hi2c->Mode = HAL_I2C_MODE_NONE;
3933+
39333934
HAL_I2C_MasterRxCpltCallback(hi2c);
39343935
}
39353936
}

0 commit comments

Comments
 (0)