@@ -3799,44 +3799,38 @@ static HAL_StatusTypeDef I2C_MasterTransmit_BTF(I2C_HandleTypeDef *hi2c)
3799
3799
*/
3800
3800
static HAL_StatusTypeDef I2C_MasterReceive_RXNE (I2C_HandleTypeDef * hi2c )
3801
3801
{
3802
+
3802
3803
if (hi2c -> State == HAL_I2C_STATE_BUSY_RX )
3803
3804
{
3804
- if (hi2c -> XferCount > 3U )
3805
+ uint32_t tmp = 0U ;
3806
+
3807
+ tmp = hi2c -> XferCount ;
3808
+ if (tmp > 3U )
3805
3809
{
3806
3810
/* Read data from DR */
3807
3811
(* hi2c -> pBuffPtr ++ ) = hi2c -> Instance -> DR ;
3808
3812
hi2c -> XferCount -- ;
3809
3813
}
3810
- else if ((hi2c -> XferCount == 2U ) || (hi2c -> XferCount == 3U ))
3814
+ else if ((tmp == 2U ) || (tmp == 3U ))
3811
3815
{
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 ;
3825
3818
3819
+ /* Enable Pos */
3820
+ hi2c -> Instance -> CR1 |= I2C_CR1_POS ;
3821
+
3826
3822
/* Disable BUF interrupt */
3827
3823
__HAL_I2C_DISABLE_IT (hi2c , I2C_IT_BUF );
3828
3824
}
3829
3825
else
3830
3826
{
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 )
3837
3831
{
3838
- /* Enable Acknowledge */
3839
- SET_BIT ( hi2c -> Instance -> CR1 , I2C_CR1_ACK ) ;
3832
+ /* Enable Pos */
3833
+ hi2c -> Instance -> CR1 |= I2C_CR1_POS ;
3840
3834
}
3841
3835
3842
3836
/* Disable EVT, BUF and ERR interrupt */
@@ -3846,17 +3840,17 @@ static HAL_StatusTypeDef I2C_MasterReceive_RXNE(I2C_HandleTypeDef *hi2c)
3846
3840
(* hi2c -> pBuffPtr ++ ) = hi2c -> Instance -> DR ;
3847
3841
hi2c -> XferCount -- ;
3848
3842
3843
+ tmp = (uint32_t )(hi2c -> State ) & I2C_STATE_MSK ;
3844
+ hi2c -> PreviousState = tmp | (uint32_t )(hi2c -> Mode );
3849
3845
hi2c -> State = HAL_I2C_STATE_READY ;
3850
3846
3851
3847
if (hi2c -> Mode == HAL_I2C_MODE_MEM )
3852
3848
{
3853
- hi2c -> PreviousState = I2C_STATE_NONE ;
3854
3849
hi2c -> Mode = HAL_I2C_MODE_NONE ;
3855
3850
HAL_I2C_MemRxCpltCallback (hi2c );
3856
3851
}
3857
3852
else
3858
3853
{
3859
- hi2c -> PreviousState = I2C_STATE_MASTER_BUSY_RX ;
3860
3854
hi2c -> Mode = HAL_I2C_MODE_NONE ;
3861
3855
HAL_I2C_MasterRxCpltCallback (hi2c );
3862
3856
}
@@ -3873,12 +3867,16 @@ static HAL_StatusTypeDef I2C_MasterReceive_RXNE(I2C_HandleTypeDef *hi2c)
3873
3867
*/
3874
3868
static HAL_StatusTypeDef I2C_MasterReceive_BTF (I2C_HandleTypeDef * hi2c )
3875
3869
{
3870
+ /* Declaration of temporary variables to prevent undefined behavior of volatile usage */
3871
+ uint32_t tmp ;
3872
+ uint32_t CurrentXferOptions = hi2c -> XferOptions ;
3873
+
3876
3874
if (hi2c -> XferCount == 3U )
3877
3875
{
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 ))
3879
3877
{
3880
3878
/* Disable Acknowledge */
3881
- CLEAR_BIT ( hi2c -> Instance -> CR1 , I2C_CR1_ACK ) ;
3879
+ hi2c -> Instance -> CR1 &= ~ I2C_CR1_ACK ;
3882
3880
}
3883
3881
3884
3882
/* Read data from DR */
@@ -3888,23 +3886,25 @@ static HAL_StatusTypeDef I2C_MasterReceive_BTF(I2C_HandleTypeDef *hi2c)
3888
3886
else if (hi2c -> XferCount == 2U )
3889
3887
{
3890
3888
/* 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 ))
3892
3890
{
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 ))
3899
3895
{
3900
- /* Enable Acknowledge */
3901
- SET_BIT ( hi2c -> Instance -> CR1 , I2C_CR1_ACK ) ;
3896
+ /* Generate Start */
3897
+ hi2c -> Instance -> CR1 |= I2C_CR1_START ;
3902
3898
}
3899
+ tmp = (uint32_t )(hi2c -> State ) & I2C_STATE_MSK ;
3900
+ hi2c -> PreviousState = tmp | (uint32_t )(hi2c -> Mode );
3903
3901
}
3904
3902
else
3905
3903
{
3904
+ hi2c -> PreviousState = I2C_STATE_MASTER_BUSY_RX ;
3905
+
3906
3906
/* Generate Stop */
3907
- SET_BIT ( hi2c -> Instance -> CR1 , I2C_CR1_STOP ) ;
3907
+ hi2c -> Instance -> CR1 |= I2C_CR1_STOP ;
3908
3908
}
3909
3909
3910
3910
/* Read data from DR */
@@ -3919,17 +3919,18 @@ static HAL_StatusTypeDef I2C_MasterReceive_BTF(I2C_HandleTypeDef *hi2c)
3919
3919
__HAL_I2C_DISABLE_IT (hi2c , I2C_IT_EVT | I2C_IT_ERR );
3920
3920
3921
3921
hi2c -> State = HAL_I2C_STATE_READY ;
3922
+ hi2c -> PreviousState = I2C_STATE_NONE ;
3922
3923
3923
3924
if (hi2c -> Mode == HAL_I2C_MODE_MEM )
3924
3925
{
3925
- hi2c -> PreviousState = I2C_STATE_NONE ;
3926
3926
hi2c -> Mode = HAL_I2C_MODE_NONE ;
3927
+
3927
3928
HAL_I2C_MemRxCpltCallback (hi2c );
3928
3929
}
3929
3930
else
3930
3931
{
3931
- hi2c -> PreviousState = I2C_STATE_MASTER_BUSY_RX ;
3932
3932
hi2c -> Mode = HAL_I2C_MODE_NONE ;
3933
+
3933
3934
HAL_I2C_MasterRxCpltCallback (hi2c );
3934
3935
}
3935
3936
}
0 commit comments