@@ -3925,6 +3925,7 @@ static HAL_StatusTypeDef I2C_MasterTransmit_BTF(I2C_HandleTypeDef *hi2c)
3925
3925
*/
3926
3926
static HAL_StatusTypeDef I2C_MasterReceive_RXNE (I2C_HandleTypeDef * hi2c )
3927
3927
{
3928
+
3928
3929
if (hi2c -> State == HAL_I2C_STATE_BUSY_RX )
3929
3930
{
3930
3931
uint32_t tmp = 0U ;
@@ -3938,34 +3939,24 @@ static HAL_StatusTypeDef I2C_MasterReceive_RXNE(I2C_HandleTypeDef *hi2c)
3938
3939
}
3939
3940
else if ((tmp == 2U ) || (tmp == 3U ))
3940
3941
{
3941
- if (hi2c -> XferOptions != I2C_NEXT_FRAME )
3942
- {
3943
- /* Disable Acknowledge */
3944
- hi2c -> Instance -> CR1 &= ~I2C_CR1_ACK ;
3945
-
3946
- /* Enable Pos */
3947
- hi2c -> Instance -> CR1 |= I2C_CR1_POS ;
3948
- }
3949
- else
3950
- {
3951
- /* Enable Acknowledge */
3952
- hi2c -> Instance -> CR1 |= I2C_CR1_ACK ;
3953
- }
3942
+ /* Disable Acknowledge */
3943
+ hi2c -> Instance -> CR1 &= ~I2C_CR1_ACK ;
3944
+
3945
+ /* Enable Pos */
3946
+ hi2c -> Instance -> CR1 |= I2C_CR1_POS ;
3954
3947
3955
3948
/* Disable BUF interrupt */
3956
3949
__HAL_I2C_DISABLE_IT (hi2c , I2C_IT_BUF );
3957
3950
}
3958
3951
else
3959
3952
{
3960
- if (hi2c -> XferOptions != I2C_NEXT_FRAME )
3961
- {
3962
- /* Disable Acknowledge */
3963
- hi2c -> Instance -> CR1 &= ~I2C_CR1_ACK ;
3964
- }
3965
- else
3953
+ /* Disable Acknowledge */
3954
+ hi2c -> Instance -> CR1 &= ~I2C_CR1_ACK ;
3955
+
3956
+ if (hi2c -> XferOptions == I2C_NEXT_FRAME )
3966
3957
{
3967
- /* Enable Acknowledge */
3968
- hi2c -> Instance -> CR1 |= I2C_CR1_ACK ;
3958
+ /* Enable Pos */
3959
+ hi2c -> Instance -> CR1 |= I2C_CR1_POS ;
3969
3960
}
3970
3961
3971
3962
/* Disable EVT, BUF and ERR interrupt */
@@ -3975,17 +3966,17 @@ static HAL_StatusTypeDef I2C_MasterReceive_RXNE(I2C_HandleTypeDef *hi2c)
3975
3966
(* hi2c -> pBuffPtr ++ ) = hi2c -> Instance -> DR ;
3976
3967
hi2c -> XferCount -- ;
3977
3968
3969
+ tmp = (uint32_t )(hi2c -> State ) & I2C_STATE_MSK ;
3970
+ hi2c -> PreviousState = tmp | (uint32_t )(hi2c -> Mode );
3978
3971
hi2c -> State = HAL_I2C_STATE_READY ;
3979
3972
3980
3973
if (hi2c -> Mode == HAL_I2C_MODE_MEM )
3981
3974
{
3982
- hi2c -> PreviousState = I2C_STATE_NONE ;
3983
3975
hi2c -> Mode = HAL_I2C_MODE_NONE ;
3984
3976
HAL_I2C_MemRxCpltCallback (hi2c );
3985
3977
}
3986
3978
else
3987
3979
{
3988
- hi2c -> PreviousState = I2C_STATE_MASTER_BUSY_RX ;
3989
3980
hi2c -> Mode = HAL_I2C_MODE_NONE ;
3990
3981
HAL_I2C_MasterRxCpltCallback (hi2c );
3991
3982
}
@@ -4003,6 +3994,7 @@ static HAL_StatusTypeDef I2C_MasterReceive_RXNE(I2C_HandleTypeDef *hi2c)
4003
3994
static HAL_StatusTypeDef I2C_MasterReceive_BTF (I2C_HandleTypeDef * hi2c )
4004
3995
{
4005
3996
/* Declaration of temporary variables to prevent undefined behavior of volatile usage */
3997
+ uint32_t tmp ;
4006
3998
uint32_t CurrentXferOptions = hi2c -> XferOptions ;
4007
3999
4008
4000
if (hi2c -> XferCount == 3U )
@@ -4022,19 +4014,21 @@ static HAL_StatusTypeDef I2C_MasterReceive_BTF(I2C_HandleTypeDef *hi2c)
4022
4014
/* Prepare next transfer or stop current transfer */
4023
4015
if ((CurrentXferOptions != I2C_FIRST_AND_LAST_FRAME ) && (CurrentXferOptions != I2C_LAST_FRAME ) && (CurrentXferOptions != I2C_NO_OPTION_FRAME ))
4024
4016
{
4025
- if (CurrentXferOptions != I2C_NEXT_FRAME )
4026
- {
4027
- /* Disable Acknowledge */
4028
- hi2c -> Instance -> CR1 &= ~I2C_CR1_ACK ;
4029
- }
4030
- else
4017
+ /* Disable Acknowledge */
4018
+ hi2c -> Instance -> CR1 &= ~I2C_CR1_ACK ;
4019
+
4020
+ if ((CurrentXferOptions == I2C_NEXT_FRAME ) || (CurrentXferOptions == I2C_FIRST_FRAME ))
4031
4021
{
4032
- /* Enable Acknowledge */
4033
- hi2c -> Instance -> CR1 |= I2C_CR1_ACK ;
4022
+ /* Generate Start */
4023
+ hi2c -> Instance -> CR1 |= I2C_CR1_START ;
4034
4024
}
4025
+ tmp = (uint32_t )(hi2c -> State ) & I2C_STATE_MSK ;
4026
+ hi2c -> PreviousState = tmp | (uint32_t )(hi2c -> Mode );
4035
4027
}
4036
4028
else
4037
4029
{
4030
+ hi2c -> PreviousState = I2C_STATE_MASTER_BUSY_RX ;
4031
+
4038
4032
/* Generate Stop */
4039
4033
hi2c -> Instance -> CR1 |= I2C_CR1_STOP ;
4040
4034
}
@@ -4051,17 +4045,16 @@ static HAL_StatusTypeDef I2C_MasterReceive_BTF(I2C_HandleTypeDef *hi2c)
4051
4045
__HAL_I2C_DISABLE_IT (hi2c , I2C_IT_EVT | I2C_IT_ERR );
4052
4046
4053
4047
hi2c -> State = HAL_I2C_STATE_READY ;
4054
-
4048
+ hi2c -> PreviousState = I2C_STATE_NONE ;
4049
+
4055
4050
if (hi2c -> Mode == HAL_I2C_MODE_MEM )
4056
4051
{
4057
- hi2c -> PreviousState = I2C_STATE_NONE ;
4058
4052
hi2c -> Mode = HAL_I2C_MODE_NONE ;
4059
4053
4060
4054
HAL_I2C_MemRxCpltCallback (hi2c );
4061
4055
}
4062
4056
else
4063
4057
{
4064
- hi2c -> PreviousState = I2C_STATE_MASTER_BUSY_RX ;
4065
4058
hi2c -> Mode = HAL_I2C_MODE_NONE ;
4066
4059
4067
4060
HAL_I2C_MasterRxCpltCallback (hi2c );
@@ -4076,6 +4069,7 @@ static HAL_StatusTypeDef I2C_MasterReceive_BTF(I2C_HandleTypeDef *hi2c)
4076
4069
return HAL_OK ;
4077
4070
}
4078
4071
4072
+
4079
4073
/**
4080
4074
* @brief Handle SB flag for Master
4081
4075
* @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
0 commit comments