cancel
Showing results for 
Search instead for 
Did you mean: 

I want to make a delay between the slave address and the data in i2c communication.

JPark.20
Associate II

​I used HAL_I2C_MASTER_Transmit/Receive

The transmission function put a delay using the for statement as shown below.

HAL_StatusTypeDef HAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout)

{

 uint32_t tickstart;

 if (hi2c->State == HAL_I2C_STATE_READY)

 {

  /* Process Locked */

  __HAL_LOCK(hi2c);

  /* Init tickstart for timeout management*/

  tickstart = HAL_GetTick();

  if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY, tickstart) != HAL_OK)

  {

   return HAL_ERROR;

  }

  hi2c->State   = HAL_I2C_STATE_BUSY_TX;

  hi2c->Mode   = HAL_I2C_MODE_MASTER;

  hi2c->ErrorCode = HAL_I2C_ERROR_NONE;

  /* Prepare transfer parameters */

  hi2c->pBuffPtr = pData;

  hi2c->XferCount = Size;

  hi2c->XferISR  = NULL;

  /* Send Slave Address */

  /* Set NBYTES to write and reload if hi2c->XferCount > MAX_NBYTE_SIZE and generate RESTART */

  if (hi2c->XferCount > MAX_NBYTE_SIZE)

  {

   hi2c->XferSize = MAX_NBYTE_SIZE;

   I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_RELOAD_MODE, I2C_GENERATE_START_WRITE);

  }

  else

  {

   hi2c->XferSize = hi2c->XferCount;

   I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_AUTOEND_MODE, I2C_GENERATE_START_WRITE);

    

  }

for(volatile uint32_t i =0; i<1000; i++)

{

}

  while (hi2c->XferCount > 0U)

  {

for(volatile uint32_t i =0; i<1000; i++)

{

}

   /* Wait until TXIS flag is set */

   if (I2C_WaitOnTXISFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK)

   {

    return HAL_ERROR;

   }

   /* Write data to TXDR */

   hi2c->Instance->TXDR = *hi2c->pBuffPtr;

   /* Increment Buffer pointer */

   hi2c->pBuffPtr++;

   hi2c->XferCount--;

   hi2c->XferSize--;

   if ((hi2c->XferCount != 0U) && (hi2c->XferSize == 0U))

   {

    /* Wait until TCR flag is set */

    if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_TCR, RESET, Timeout, tickstart) != HAL_OK)

    {

     return HAL_ERROR;

    }

    if (hi2c->XferCount > MAX_NBYTE_SIZE)

    {

     hi2c->XferSize = MAX_NBYTE_SIZE;

     I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_RELOAD_MODE, I2C_NO_STARTSTOP);

    }

    else

    {

     hi2c->XferSize = hi2c->XferCount;

     I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_AUTOEND_MODE, I2C_NO_STARTSTOP);

    }

   }

 

 //osDelay(1);

  }

  /* No need to Check TC flag, with AUTOEND mode the stop is automatically generated */

  /* Wait until STOPF flag is set */

  if (I2C_WaitOnSTOPFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK)

  {

   return HAL_ERROR;

  }

  /* Clear STOP Flag */

  __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF);

  /* Clear Configuration Register 2 */

  I2C_RESET_CR2(hi2c);

  hi2c->State = HAL_I2C_STATE_READY;

  hi2c->Mode = HAL_I2C_MODE_NONE;

  /* Process Unlocked */

  __HAL_UNLOCK(hi2c);

  return HAL_OK;

 }

 else

 {

  return HAL_BUSY;

 }

}

However, receive function is not delayed in the same way.

 I checked with the oscilloscope, when the I2C_TransferConfig function is executed, the SLAVE address and data are taken before the FOR statement is executed.

The I2C_TransferConfig function is ambiguous to modify because it is a function that modify the CR2 register.​

Is there any way to apply the delay between the slave address and the data when receiving via i2c communication?

0 REPLIES 0