Merge pull request #4793 from jeromecoutant/PR_F4_I2C

STM32 I2C : correct async issue
pull/4803/head
Jimmy Brisson 2017-07-24 10:59:03 -05:00 committed by GitHub
commit f4de24bae1
4 changed files with 100 additions and 13 deletions

View File

@ -1462,7 +1462,7 @@ HAL_StatusTypeDef HAL_I2C_Master_Sequential_Transmit_IT(I2C_HandleTypeDef *hi2c,
/* Generate Start */ /* Generate Start */
hi2c->Instance->CR1 |= I2C_CR1_START; hi2c->Instance->CR1 |= I2C_CR1_START;
} }
else else if(Prev_State == I2C_STATE_MASTER_BUSY_RX) // MBED
{ {
/* Generate ReStart */ /* Generate ReStart */
hi2c->Instance->CR1 |= I2C_CR1_START; hi2c->Instance->CR1 |= I2C_CR1_START;
@ -1564,7 +1564,7 @@ HAL_StatusTypeDef HAL_I2C_Master_Sequential_Receive_IT(I2C_HandleTypeDef *hi2c,
/* Generate Start */ /* Generate Start */
hi2c->Instance->CR1 |= I2C_CR1_START; hi2c->Instance->CR1 |= I2C_CR1_START;
} }
else else if(hi2c->PreviousState == I2C_STATE_MASTER_BUSY_TX) // MBED
{ {
/* Enable Acknowledge */ /* Enable Acknowledge */
hi2c->Instance->CR1 |= I2C_CR1_ACK; hi2c->Instance->CR1 |= I2C_CR1_ACK;
@ -4078,6 +4078,12 @@ static HAL_StatusTypeDef I2C_MasterReceive_BTF(I2C_HandleTypeDef *hi2c)
{ {
/* Disable Acknowledge */ /* Disable Acknowledge */
hi2c->Instance->CR1 &= ~I2C_CR1_ACK; hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
if((CurrentXferOptions == I2C_NEXT_FRAME) || (CurrentXferOptions == I2C_FIRST_FRAME))
{
/* Generate ReStart */
hi2c->Instance->CR1 |= I2C_CR1_START;
}
} }
else else
{ {

View File

@ -1414,9 +1414,18 @@ HAL_StatusTypeDef HAL_I2C_Master_Sequential_Transmit_IT(I2C_HandleTypeDef *hi2c,
/* Generate Start */ /* Generate Start */
if((Prev_State == I2C_STATE_MASTER_BUSY_RX) || (Prev_State == I2C_STATE_NONE)) if((Prev_State == I2C_STATE_MASTER_BUSY_RX) || (Prev_State == I2C_STATE_NONE))
{ {
/* Generate Start or ReStart */ /* Generate Start condition if first transfer */
if((XferOptions == I2C_FIRST_AND_LAST_FRAME) || (XferOptions == I2C_FIRST_FRAME))
{
/* Generate Start */
hi2c->Instance->CR1 |= I2C_CR1_START; hi2c->Instance->CR1 |= I2C_CR1_START;
} }
else if(Prev_State == I2C_STATE_MASTER_BUSY_RX) // MBED
{
/* Generate ReStart */
hi2c->Instance->CR1 |= I2C_CR1_START;
}
}
/* Process Unlocked */ /* Process Unlocked */
__HAL_UNLOCK(hi2c); __HAL_UNLOCK(hi2c);
@ -1503,13 +1512,25 @@ HAL_StatusTypeDef HAL_I2C_Master_Sequential_Receive_IT(I2C_HandleTypeDef *hi2c,
hi2c->Devaddress = DevAddress; hi2c->Devaddress = DevAddress;
if((hi2c->PreviousState == I2C_STATE_MASTER_BUSY_TX) || (hi2c->PreviousState == I2C_STATE_NONE)) if((hi2c->PreviousState == I2C_STATE_MASTER_BUSY_TX) || (hi2c->PreviousState == I2C_STATE_NONE))
{
/* Generate Start condition if first transfer */
if((XferOptions == I2C_FIRST_AND_LAST_FRAME) || (XferOptions == I2C_FIRST_FRAME) || (XferOptions == I2C_NO_OPTION_FRAME))
{ {
/* Enable Acknowledge */ /* Enable Acknowledge */
hi2c->Instance->CR1 |= I2C_CR1_ACK; hi2c->Instance->CR1 |= I2C_CR1_ACK;
/* Generate Start or ReStart */ /* Generate Start */
hi2c->Instance->CR1 |= I2C_CR1_START; hi2c->Instance->CR1 |= I2C_CR1_START;
} }
else if(hi2c->PreviousState == I2C_STATE_MASTER_BUSY_TX)
{
/* Enable Acknowledge */
hi2c->Instance->CR1 |= I2C_CR1_ACK;
/* Generate ReStart */
hi2c->Instance->CR1 |= I2C_CR1_START;
}
}
/* Process Unlocked */ /* Process Unlocked */
__HAL_UNLOCK(hi2c); __HAL_UNLOCK(hi2c);
@ -3996,6 +4017,12 @@ static HAL_StatusTypeDef I2C_MasterReceive_BTF(I2C_HandleTypeDef *hi2c)
{ {
/* Disable Acknowledge */ /* Disable Acknowledge */
hi2c->Instance->CR1 &= ~I2C_CR1_ACK; hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
if((CurrentXferOptions == I2C_NEXT_FRAME) || (CurrentXferOptions == I2C_FIRST_FRAME))
{
/* Generate ReStart */
hi2c->Instance->CR1 |= I2C_CR1_START;
}
} }
else else
{ {

View File

@ -1413,9 +1413,18 @@ HAL_StatusTypeDef HAL_I2C_Master_Sequential_Transmit_IT(I2C_HandleTypeDef *hi2c,
/* Generate Start */ /* Generate Start */
if((Prev_State == I2C_STATE_MASTER_BUSY_RX) || (Prev_State == I2C_STATE_NONE)) if((Prev_State == I2C_STATE_MASTER_BUSY_RX) || (Prev_State == I2C_STATE_NONE))
{ {
/* Generate Start or ReStart */ /* Generate Start condition if first transfer */
if((XferOptions == I2C_FIRST_AND_LAST_FRAME) || (XferOptions == I2C_FIRST_FRAME))
{
/* Generate Start */
hi2c->Instance->CR1 |= I2C_CR1_START; hi2c->Instance->CR1 |= I2C_CR1_START;
} }
else if(Prev_State == I2C_STATE_MASTER_BUSY_RX) // MBED
{
/* Generate ReStart */
hi2c->Instance->CR1 |= I2C_CR1_START;
}
}
/* Process Unlocked */ /* Process Unlocked */
__HAL_UNLOCK(hi2c); __HAL_UNLOCK(hi2c);
@ -1502,12 +1511,25 @@ HAL_StatusTypeDef HAL_I2C_Master_Sequential_Receive_IT(I2C_HandleTypeDef *hi2c,
hi2c->Devaddress = DevAddress; hi2c->Devaddress = DevAddress;
if((hi2c->PreviousState == I2C_STATE_MASTER_BUSY_TX) || (hi2c->PreviousState == I2C_STATE_NONE)) if((hi2c->PreviousState == I2C_STATE_MASTER_BUSY_TX) || (hi2c->PreviousState == I2C_STATE_NONE))
{
/* Generate Start condition if first transfer */
if((XferOptions == I2C_FIRST_AND_LAST_FRAME) || (XferOptions == I2C_FIRST_FRAME) || (XferOptions == I2C_NO_OPTION_FRAME))
{ {
/* Enable Acknowledge */ /* Enable Acknowledge */
hi2c->Instance->CR1 |= I2C_CR1_ACK; hi2c->Instance->CR1 |= I2C_CR1_ACK;
/* Generate Start or ReStart */
/* Generate Start */
hi2c->Instance->CR1 |= I2C_CR1_START; hi2c->Instance->CR1 |= I2C_CR1_START;
} }
else if(hi2c->PreviousState == I2C_STATE_MASTER_BUSY_TX)
{
/* Enable Acknowledge */
hi2c->Instance->CR1 |= I2C_CR1_ACK;
/* Generate ReStart */
hi2c->Instance->CR1 |= I2C_CR1_START;
}
}
/* Process Unlocked */ /* Process Unlocked */
__HAL_UNLOCK(hi2c); __HAL_UNLOCK(hi2c);
@ -3993,6 +4015,12 @@ static HAL_StatusTypeDef I2C_MasterReceive_BTF(I2C_HandleTypeDef *hi2c)
{ {
/* Disable Acknowledge */ /* Disable Acknowledge */
hi2c->Instance->CR1 &= ~I2C_CR1_ACK; hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
if((CurrentXferOptions == I2C_NEXT_FRAME) || (CurrentXferOptions == I2C_FIRST_FRAME))
{
/* Generate ReStart */
hi2c->Instance->CR1 |= I2C_CR1_START;
}
} }
else else
{ {

View File

@ -1428,9 +1428,18 @@ HAL_StatusTypeDef HAL_I2C_Master_Sequential_Transmit_IT(I2C_HandleTypeDef *hi2c,
/* Generate Start */ /* Generate Start */
if((hi2c->PreviousState == I2C_STATE_MASTER_BUSY_RX) || (hi2c->PreviousState == I2C_STATE_NONE)) if((hi2c->PreviousState == I2C_STATE_MASTER_BUSY_RX) || (hi2c->PreviousState == I2C_STATE_NONE))
{ {
/* Generate Start or ReStart */ /* Generate Start condition if first transfer */
if((XferOptions == I2C_FIRST_AND_LAST_FRAME) || (XferOptions == I2C_FIRST_FRAME))
{
/* Generate Start */
SET_BIT(hi2c->Instance->CR1, I2C_CR1_START); SET_BIT(hi2c->Instance->CR1, I2C_CR1_START);
} }
else if(hi2c->PreviousState == I2C_STATE_MASTER_BUSY_RX)
{
/* Generate ReStart */
SET_BIT(hi2c->Instance->CR1, I2C_CR1_START);
}
}
/* Process Unlocked */ /* Process Unlocked */
__HAL_UNLOCK(hi2c); __HAL_UNLOCK(hi2c);
@ -1517,12 +1526,25 @@ HAL_StatusTypeDef HAL_I2C_Master_Sequential_Receive_IT(I2C_HandleTypeDef *hi2c,
hi2c->Devaddress = DevAddress; hi2c->Devaddress = DevAddress;
if((hi2c->PreviousState == I2C_STATE_MASTER_BUSY_TX) || (hi2c->PreviousState == I2C_STATE_NONE)) if((hi2c->PreviousState == I2C_STATE_MASTER_BUSY_TX) || (hi2c->PreviousState == I2C_STATE_NONE))
{
/* Generate Start condition if first transfer */
if((XferOptions == I2C_FIRST_AND_LAST_FRAME) || (XferOptions == I2C_FIRST_FRAME) || (XferOptions == I2C_NO_OPTION_FRAME))
{ {
/* Enable Acknowledge */ /* Enable Acknowledge */
SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
/* Generate Start or ReStart */
/* Generate Start */
SET_BIT(hi2c->Instance->CR1, I2C_CR1_START); SET_BIT(hi2c->Instance->CR1, I2C_CR1_START);
} }
else if(hi2c->PreviousState == I2C_STATE_MASTER_BUSY_TX)
{
/* Enable Acknowledge */
SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
/* Generate ReStart */
SET_BIT(hi2c->Instance->CR1, I2C_CR1_START);
}
}
/* Process Unlocked */ /* Process Unlocked */
__HAL_UNLOCK(hi2c); __HAL_UNLOCK(hi2c);
@ -3866,11 +3888,15 @@ static HAL_StatusTypeDef I2C_MasterReceive_BTF(I2C_HandleTypeDef *hi2c)
{ {
/* Disable Acknowledge */ /* Disable Acknowledge */
hi2c->Instance->CR1 &= ~I2C_CR1_ACK; hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
if((CurrentXferOptions == I2C_NEXT_FRAME) || (CurrentXferOptions == I2C_FIRST_FRAME))
{
/* Generate ReStart */
hi2c->Instance->CR1 |= I2C_CR1_START;
}
} }
else else
{ {
hi2c->PreviousState = I2C_STATE_MASTER_BUSY_RX;
/* Generate Stop */ /* Generate Stop */
hi2c->Instance->CR1 |= I2C_CR1_STOP; hi2c->Instance->CR1 |= I2C_CR1_STOP;
} }