Skip to content

Commit d27e6de

Browse files
author
Erwan GOURIOU
committed
[dev_asynch_i2c] HAL Fix to support Master Rx w/ repeated start
As per reference manual, closing communication for master receiver with repeated start requires, after reading second last data byte (after second last RxNE event): -Clearing ACK bit (same as non repeated start case) -Set START bit (instead of STOP bit in non repeated start case) This is valid for I2C_FIRST_FRAME and I2C_NEXT_FRAME conditions
1 parent 72b863f commit d27e6de

File tree

1 file changed

+21
-32
lines changed

1 file changed

+21
-32
lines changed

hal/targets/cmsis/TARGET_STM/TARGET_STM32F4/stm32f4xx_hal_i2c.c

Lines changed: 21 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1297,7 +1297,7 @@ HAL_StatusTypeDef HAL_I2C_Master_Sequential_Transmit_IT(I2C_HandleTypeDef *hi2c,
12971297

12981298
/* Process Unlocked */
12991299
__HAL_UNLOCK(hi2c);
1300-
1300+
13011301
return HAL_TIMEOUT;
13021302
}
13031303
}
@@ -1321,7 +1321,7 @@ HAL_StatusTypeDef HAL_I2C_Master_Sequential_Transmit_IT(I2C_HandleTypeDef *hi2c,
13211321
hi2c->Devaddress = DevAddress;
13221322

13231323
Prev_State = hi2c->PreviousState;
1324-
1324+
13251325
/* Generate Start */
13261326
if((Prev_State == I2C_STATE_MASTER_BUSY_RX) || (Prev_State == I2C_STATE_NONE))
13271327
{
@@ -3689,7 +3689,7 @@ static HAL_StatusTypeDef I2C_MasterTransmit_TXE(I2C_HandleTypeDef *hi2c)
36893689

36903690
/* Generate Stop */
36913691
hi2c->Instance->CR1 |= I2C_CR1_STOP;
3692-
3692+
36933693
hi2c->PreviousState = I2C_STATE_NONE;
36943694
hi2c->State = HAL_I2C_STATE_READY;
36953695

@@ -3840,6 +3840,7 @@ static HAL_StatusTypeDef I2C_MasterTransmit_BTF(I2C_HandleTypeDef *hi2c)
38403840
*/
38413841
static HAL_StatusTypeDef I2C_MasterReceive_RXNE(I2C_HandleTypeDef *hi2c)
38423842
{
3843+
38433844
if(hi2c->State == HAL_I2C_STATE_BUSY_RX)
38443845
{
38453846
uint32_t tmp = 0U;
@@ -3853,34 +3854,24 @@ static HAL_StatusTypeDef I2C_MasterReceive_RXNE(I2C_HandleTypeDef *hi2c)
38533854
}
38543855
else if((tmp == 2U) || (tmp == 3U))
38553856
{
3856-
if(hi2c->XferOptions != I2C_NEXT_FRAME)
3857-
{
3858-
/* Disable Acknowledge */
3859-
hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
3860-
3861-
/* Enable Pos */
3862-
hi2c->Instance->CR1 |= I2C_CR1_POS;
3863-
}
3864-
else
3865-
{
3866-
/* Enable Acknowledge */
3867-
hi2c->Instance->CR1 |= I2C_CR1_ACK;
3868-
}
3857+
/* Disable Acknowledge */
3858+
hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
3859+
3860+
/* Enable Pos */
3861+
hi2c->Instance->CR1 |= I2C_CR1_POS;
38693862

38703863
/* Disable BUF interrupt */
38713864
__HAL_I2C_DISABLE_IT(hi2c, I2C_IT_BUF);
38723865
}
38733866
else
38743867
{
3875-
if(hi2c->XferOptions != I2C_NEXT_FRAME)
3876-
{
3877-
/* Disable Acknowledge */
3878-
hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
3879-
}
3880-
else
3868+
/* Disable Acknowledge */
3869+
hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
3870+
3871+
if(hi2c->XferOptions == I2C_NEXT_FRAME)
38813872
{
3882-
/* Enable Acknowledge */
3883-
hi2c->Instance->CR1 |= I2C_CR1_ACK;
3873+
/* Enable Pos */
3874+
hi2c->Instance->CR1 |= I2C_CR1_POS;
38843875
}
38853876

38863877
/* Disable EVT, BUF and ERR interrupt */
@@ -3938,15 +3929,13 @@ static HAL_StatusTypeDef I2C_MasterReceive_BTF(I2C_HandleTypeDef *hi2c)
39383929
/* Prepare next transfer or stop current transfer */
39393930
if((CurrentXferOptions != I2C_FIRST_AND_LAST_FRAME) && (CurrentXferOptions != I2C_LAST_FRAME) && (CurrentXferOptions != I2C_NO_OPTION_FRAME))
39403931
{
3941-
if(CurrentXferOptions != I2C_NEXT_FRAME)
3942-
{
3943-
/* Disable Acknowledge */
3944-
hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
3945-
}
3946-
else
3932+
/* Disable Acknowledge */
3933+
hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
3934+
3935+
if((CurrentXferOptions == I2C_NEXT_FRAME) || (CurrentXferOptions == I2C_FIRST_FRAME))
39473936
{
3948-
/* Enable Acknowledge */
3949-
hi2c->Instance->CR1 |= I2C_CR1_ACK;
3937+
/* Generate Start */
3938+
hi2c->Instance->CR1 |= I2C_CR1_START;
39503939
}
39513940
tmp = (uint32_t)(hi2c->State) & I2C_STATE_MSK;
39523941
hi2c->PreviousState = tmp | (uint32_t)(hi2c->Mode);

0 commit comments

Comments
 (0)