@@ -3980,6 +3980,7 @@ static HAL_StatusTypeDef I2C_MasterTransmit_BTF(I2C_HandleTypeDef *hi2c)
3980
3980
return HAL_OK ;
3981
3981
}
3982
3982
3983
+
3983
3984
/**
3984
3985
* @brief Handle RXNE flag for Master
3985
3986
* @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
@@ -3988,6 +3989,7 @@ static HAL_StatusTypeDef I2C_MasterTransmit_BTF(I2C_HandleTypeDef *hi2c)
3988
3989
*/
3989
3990
static HAL_StatusTypeDef I2C_MasterReceive_RXNE (I2C_HandleTypeDef * hi2c )
3990
3991
{
3992
+
3991
3993
if (hi2c -> State == HAL_I2C_STATE_BUSY_RX )
3992
3994
{
3993
3995
uint32_t tmp = 0U ;
@@ -4001,34 +4003,24 @@ static HAL_StatusTypeDef I2C_MasterReceive_RXNE(I2C_HandleTypeDef *hi2c)
4001
4003
}
4002
4004
else if ((tmp == 2U ) || (tmp == 3U ))
4003
4005
{
4004
- if (hi2c -> XferOptions != I2C_NEXT_FRAME )
4005
- {
4006
- /* Disable Acknowledge */
4007
- hi2c -> Instance -> CR1 &= ~I2C_CR1_ACK ;
4008
-
4009
- /* Enable Pos */
4010
- hi2c -> Instance -> CR1 |= I2C_CR1_POS ;
4011
- }
4012
- else
4013
- {
4014
- /* Enable Acknowledge */
4015
- hi2c -> Instance -> CR1 |= I2C_CR1_ACK ;
4016
- }
4006
+ /* Disable Acknowledge */
4007
+ hi2c -> Instance -> CR1 &= ~I2C_CR1_ACK ;
4008
+
4009
+ /* Enable Pos */
4010
+ hi2c -> Instance -> CR1 |= I2C_CR1_POS ;
4017
4011
4018
4012
/* Disable BUF interrupt */
4019
4013
__HAL_I2C_DISABLE_IT (hi2c , I2C_IT_BUF );
4020
4014
}
4021
4015
else
4022
4016
{
4023
- if (hi2c -> XferOptions != I2C_NEXT_FRAME )
4024
- {
4025
- /* Disable Acknowledge */
4026
- hi2c -> Instance -> CR1 &= ~I2C_CR1_ACK ;
4027
- }
4028
- else
4017
+ /* Disable Acknowledge */
4018
+ hi2c -> Instance -> CR1 &= ~I2C_CR1_ACK ;
4019
+
4020
+ if (hi2c -> XferOptions == I2C_NEXT_FRAME )
4029
4021
{
4030
- /* Enable Acknowledge */
4031
- hi2c -> Instance -> CR1 |= I2C_CR1_ACK ;
4022
+ /* Enable Pos */
4023
+ hi2c -> Instance -> CR1 |= I2C_CR1_POS ;
4032
4024
}
4033
4025
4034
4026
/* Disable EVT, BUF and ERR interrupt */
@@ -4038,17 +4030,17 @@ static HAL_StatusTypeDef I2C_MasterReceive_RXNE(I2C_HandleTypeDef *hi2c)
4038
4030
(* hi2c -> pBuffPtr ++ ) = hi2c -> Instance -> DR ;
4039
4031
hi2c -> XferCount -- ;
4040
4032
4033
+ tmp = (uint32_t )(hi2c -> State ) & I2C_STATE_MSK ;
4034
+ hi2c -> PreviousState = tmp | (uint32_t )(hi2c -> Mode );
4041
4035
hi2c -> State = HAL_I2C_STATE_READY ;
4042
4036
4043
4037
if (hi2c -> Mode == HAL_I2C_MODE_MEM )
4044
4038
{
4045
- hi2c -> PreviousState = I2C_STATE_NONE ;
4046
4039
hi2c -> Mode = HAL_I2C_MODE_NONE ;
4047
4040
HAL_I2C_MemRxCpltCallback (hi2c );
4048
4041
}
4049
4042
else
4050
4043
{
4051
- hi2c -> PreviousState = I2C_STATE_MASTER_BUSY_RX ;
4052
4044
hi2c -> Mode = HAL_I2C_MODE_NONE ;
4053
4045
HAL_I2C_MasterRxCpltCallback (hi2c );
4054
4046
}
@@ -4066,6 +4058,7 @@ static HAL_StatusTypeDef I2C_MasterReceive_RXNE(I2C_HandleTypeDef *hi2c)
4066
4058
static HAL_StatusTypeDef I2C_MasterReceive_BTF (I2C_HandleTypeDef * hi2c )
4067
4059
{
4068
4060
/* Declaration of temporary variables to prevent undefined behavior of volatile usage */
4061
+ uint32_t tmp ;
4069
4062
uint32_t CurrentXferOptions = hi2c -> XferOptions ;
4070
4063
4071
4064
if (hi2c -> XferCount == 3U )
@@ -4085,25 +4078,21 @@ static HAL_StatusTypeDef I2C_MasterReceive_BTF(I2C_HandleTypeDef *hi2c)
4085
4078
/* Prepare next transfer or stop current transfer */
4086
4079
if ((CurrentXferOptions != I2C_FIRST_AND_LAST_FRAME ) && (CurrentXferOptions != I2C_LAST_FRAME ) && (CurrentXferOptions != I2C_NO_OPTION_FRAME ))
4087
4080
{
4088
- if (CurrentXferOptions != I2C_NEXT_FRAME )
4089
- {
4090
- /* Disable Acknowledge */
4091
- hi2c -> Instance -> CR1 &= ~I2C_CR1_ACK ;
4092
- }
4093
- else
4081
+ /* Disable Acknowledge */
4082
+ hi2c -> Instance -> CR1 &= ~I2C_CR1_ACK ;
4083
+
4084
+ if ((CurrentXferOptions == I2C_NEXT_FRAME ) || (CurrentXferOptions == I2C_FIRST_FRAME ))
4094
4085
{
4095
- /* Enable Acknowledge */
4096
- hi2c -> Instance -> CR1 |= I2C_CR1_ACK ;
4086
+ /* Generate Start */
4087
+ hi2c -> Instance -> CR1 |= I2C_CR1_START ;
4097
4088
}
4098
-
4099
- /* Disable EVT and ERR interrupt */
4100
- __HAL_I2C_DISABLE_IT (hi2c , I2C_IT_EVT | I2C_IT_ERR );
4089
+ tmp = (uint32_t )(hi2c -> State ) & I2C_STATE_MSK ;
4090
+ hi2c -> PreviousState = tmp | (uint32_t )(hi2c -> Mode );
4101
4091
}
4102
4092
else
4103
4093
{
4104
- /* Disable EVT and ERR interrupt */
4105
- __HAL_I2C_DISABLE_IT (hi2c , I2C_IT_EVT | I2C_IT_ERR );
4106
-
4094
+ hi2c -> PreviousState = I2C_STATE_MASTER_BUSY_RX ;
4095
+
4107
4096
/* Generate Stop */
4108
4097
hi2c -> Instance -> CR1 |= I2C_CR1_STOP ;
4109
4098
}
@@ -4116,18 +4105,20 @@ static HAL_StatusTypeDef I2C_MasterReceive_BTF(I2C_HandleTypeDef *hi2c)
4116
4105
(* hi2c -> pBuffPtr ++ ) = hi2c -> Instance -> DR ;
4117
4106
hi2c -> XferCount -- ;
4118
4107
4108
+ /* Disable EVT and ERR interrupt */
4109
+ __HAL_I2C_DISABLE_IT (hi2c , I2C_IT_EVT | I2C_IT_ERR );
4110
+
4119
4111
hi2c -> State = HAL_I2C_STATE_READY ;
4120
-
4112
+ hi2c -> PreviousState = I2C_STATE_NONE ;
4113
+
4121
4114
if (hi2c -> Mode == HAL_I2C_MODE_MEM )
4122
4115
{
4123
- hi2c -> PreviousState = I2C_STATE_NONE ;
4124
4116
hi2c -> Mode = HAL_I2C_MODE_NONE ;
4125
4117
4126
4118
HAL_I2C_MemRxCpltCallback (hi2c );
4127
4119
}
4128
4120
else
4129
4121
{
4130
- hi2c -> PreviousState = I2C_STATE_MASTER_BUSY_RX ;
4131
4122
hi2c -> Mode = HAL_I2C_MODE_NONE ;
4132
4123
4133
4124
HAL_I2C_MasterRxCpltCallback (hi2c );
@@ -4142,6 +4133,7 @@ static HAL_StatusTypeDef I2C_MasterReceive_BTF(I2C_HandleTypeDef *hi2c)
4142
4133
return HAL_OK ;
4143
4134
}
4144
4135
4136
+
4145
4137
/**
4146
4138
* @brief Handle SB flag for Master
4147
4139
* @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
0 commit comments