STM32L4xx_HAL_Driver  1.14.0
Input and Output operation functions

Data transfers functions. More...

Functions

HAL_StatusTypeDef HAL_I2C_Master_Transmit (I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout)
 Transmits in master mode an amount of data in blocking mode. More...
 
HAL_StatusTypeDef HAL_I2C_Master_Receive (I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout)
 Receives in master mode an amount of data in blocking mode. More...
 
HAL_StatusTypeDef HAL_I2C_Slave_Transmit (I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t Timeout)
 Transmits in slave mode an amount of data in blocking mode. More...
 
HAL_StatusTypeDef HAL_I2C_Slave_Receive (I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t Timeout)
 Receive in slave mode an amount of data in blocking mode. More...
 
HAL_StatusTypeDef HAL_I2C_Mem_Write (I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout)
 Write an amount of data in blocking mode to a specific memory address. More...
 
HAL_StatusTypeDef HAL_I2C_Mem_Read (I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout)
 Read an amount of data in blocking mode from a specific memory address. More...
 
HAL_StatusTypeDef HAL_I2C_IsDeviceReady (I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint32_t Trials, uint32_t Timeout)
 Checks if target device is ready for communication. More...
 
HAL_StatusTypeDef HAL_I2C_Master_Transmit_IT (I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size)
 Transmit in master mode an amount of data in non-blocking mode with Interrupt. More...
 
HAL_StatusTypeDef HAL_I2C_Master_Receive_IT (I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size)
 Receive in master mode an amount of data in non-blocking mode with Interrupt. More...
 
HAL_StatusTypeDef HAL_I2C_Slave_Transmit_IT (I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size)
 Transmit in slave mode an amount of data in non-blocking mode with Interrupt. More...
 
HAL_StatusTypeDef HAL_I2C_Slave_Receive_IT (I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size)
 Receive in slave mode an amount of data in non-blocking mode with Interrupt. More...
 
HAL_StatusTypeDef HAL_I2C_Mem_Write_IT (I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size)
 Write an amount of data in non-blocking mode with Interrupt to a specific memory address. More...
 
HAL_StatusTypeDef HAL_I2C_Mem_Read_IT (I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size)
 Read an amount of data in non-blocking mode with Interrupt from a specific memory address. More...
 
HAL_StatusTypeDef HAL_I2C_Master_Seq_Transmit_IT (I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t XferOptions)
 Sequential transmit in master I2C mode an amount of data in non-blocking mode with Interrupt. More...
 
HAL_StatusTypeDef HAL_I2C_Master_Seq_Receive_IT (I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t XferOptions)
 Sequential receive in master I2C mode an amount of data in non-blocking mode with Interrupt. More...
 
HAL_StatusTypeDef HAL_I2C_Slave_Seq_Transmit_IT (I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t XferOptions)
 Sequential transmit in slave/device I2C mode an amount of data in non-blocking mode with Interrupt. More...
 
HAL_StatusTypeDef HAL_I2C_Slave_Seq_Receive_IT (I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t XferOptions)
 Sequential receive in slave/device I2C mode an amount of data in non-blocking mode with Interrupt. More...
 
HAL_StatusTypeDef HAL_I2C_EnableListen_IT (I2C_HandleTypeDef *hi2c)
 Enable the Address listen mode with Interrupt. More...
 
HAL_StatusTypeDef HAL_I2C_DisableListen_IT (I2C_HandleTypeDef *hi2c)
 Disable the Address listen mode with Interrupt. More...
 
HAL_StatusTypeDef HAL_I2C_Master_Abort_IT (I2C_HandleTypeDef *hi2c, uint16_t DevAddress)
 Abort a master I2C IT or DMA process communication with Interrupt. More...
 
HAL_StatusTypeDef HAL_I2C_Master_Transmit_DMA (I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size)
 Transmit in master mode an amount of data in non-blocking mode with DMA. More...
 
HAL_StatusTypeDef HAL_I2C_Master_Receive_DMA (I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size)
 Receive in master mode an amount of data in non-blocking mode with DMA. More...
 
HAL_StatusTypeDef HAL_I2C_Slave_Transmit_DMA (I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size)
 Transmit in slave mode an amount of data in non-blocking mode with DMA. More...
 
HAL_StatusTypeDef HAL_I2C_Slave_Receive_DMA (I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size)
 Receive in slave mode an amount of data in non-blocking mode with DMA. More...
 
HAL_StatusTypeDef HAL_I2C_Mem_Write_DMA (I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size)
 Write an amount of data in non-blocking mode with DMA to a specific memory address. More...
 
HAL_StatusTypeDef HAL_I2C_Mem_Read_DMA (I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size)
 Reads an amount of data in non-blocking mode with DMA from a specific memory address. More...
 
HAL_StatusTypeDef HAL_I2C_Master_Seq_Transmit_DMA (I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t XferOptions)
 Sequential transmit in master I2C mode an amount of data in non-blocking mode with DMA. More...
 
HAL_StatusTypeDef HAL_I2C_Master_Seq_Receive_DMA (I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t XferOptions)
 Sequential receive in master I2C mode an amount of data in non-blocking mode with DMA. More...
 
HAL_StatusTypeDef HAL_I2C_Slave_Seq_Transmit_DMA (I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t XferOptions)
 Sequential transmit in slave/device I2C mode an amount of data in non-blocking mode with DMA. More...
 
HAL_StatusTypeDef HAL_I2C_Slave_Seq_Receive_DMA (I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t XferOptions)
 Sequential receive in slave/device I2C mode an amount of data in non-blocking mode with DMA. More...
 

Detailed Description

Data transfers functions.

 ===============================================================================
                      ##### IO operation functions #####
 ===============================================================================
    [..]
    This subsection provides a set of functions allowing to manage the I2C data
    transfers.

    (#) There are two modes of transfer:
       (++) Blocking mode : The communication is performed in the polling mode.
            The status of all data processing is returned by the same function
            after finishing transfer.
       (++) No-Blocking mode : The communication is performed using Interrupts
            or DMA. These functions return the status of the transfer startup.
            The end of the data processing will be indicated through the
            dedicated I2C IRQ when using Interrupt mode or the DMA IRQ when
            using DMA mode.

    (#) Blocking mode functions are :
        (++) HAL_I2C_Master_Transmit()
        (++) HAL_I2C_Master_Receive()
        (++) HAL_I2C_Slave_Transmit()
        (++) HAL_I2C_Slave_Receive()
        (++) HAL_I2C_Mem_Write()
        (++) HAL_I2C_Mem_Read()
        (++) HAL_I2C_IsDeviceReady()

    (#) No-Blocking mode functions with Interrupt are :
        (++) HAL_I2C_Master_Transmit_IT()
        (++) HAL_I2C_Master_Receive_IT()
        (++) HAL_I2C_Slave_Transmit_IT()
        (++) HAL_I2C_Slave_Receive_IT()
        (++) HAL_I2C_Mem_Write_IT()
        (++) HAL_I2C_Mem_Read_IT()
        (++) HAL_I2C_Master_Seq_Transmit_IT()
        (++) HAL_I2C_Master_Seq_Receive_IT()
        (++) HAL_I2C_Slave_Seq_Transmit_IT()
        (++) HAL_I2C_Slave_Seq_Receive_IT()
        (++) HAL_I2C_EnableListen_IT()
        (++) HAL_I2C_DisableListen_IT()
        (++) HAL_I2C_Master_Abort_IT()

    (#) No-Blocking mode functions with DMA are :
        (++) HAL_I2C_Master_Transmit_DMA()
        (++) HAL_I2C_Master_Receive_DMA()
        (++) HAL_I2C_Slave_Transmit_DMA()
        (++) HAL_I2C_Slave_Receive_DMA()
        (++) HAL_I2C_Mem_Write_DMA()
        (++) HAL_I2C_Mem_Read_DMA()
        (++) HAL_I2C_Master_Seq_Transmit_DMA()
        (++) HAL_I2C_Master_Seq_Receive_DMA()
        (++) HAL_I2C_Slave_Seq_Transmit_DMA()
        (++) HAL_I2C_Slave_Seq_Receive_DMA()

    (#) A set of Transfer Complete Callbacks are provided in non Blocking mode:
        (++) HAL_I2C_MasterTxCpltCallback()
        (++) HAL_I2C_MasterRxCpltCallback()
        (++) HAL_I2C_SlaveTxCpltCallback()
        (++) HAL_I2C_SlaveRxCpltCallback()
        (++) HAL_I2C_MemTxCpltCallback()
        (++) HAL_I2C_MemRxCpltCallback()
        (++) HAL_I2C_AddrCallback()
        (++) HAL_I2C_ListenCpltCallback()
        (++) HAL_I2C_ErrorCallback()
        (++) HAL_I2C_AbortCpltCallback()

Function Documentation

◆ HAL_I2C_DisableListen_IT()

HAL_StatusTypeDef HAL_I2C_DisableListen_IT ( I2C_HandleTypeDef hi2c)

Disable the Address listen mode with Interrupt.

Parameters
hi2cPointer to a I2C_HandleTypeDef structure that contains the configuration information for the specified I2C
Return values
HALstatus

Definition at line 4214 of file stm32l4xx_hal_i2c.c.

4215 {
4216  /* Declaration of tmp to prevent undefined behavior of volatile usage */
4217  uint32_t tmp;
4218 
4219  /* Disable Address listen mode only if a transfer is not ongoing */
4220  if (hi2c->State == HAL_I2C_STATE_LISTEN)
4221  {
4222  tmp = (uint32_t)(hi2c->State) & I2C_STATE_MSK;
4223  hi2c->PreviousState = tmp | (uint32_t)(hi2c->Mode);
4224  hi2c->State = HAL_I2C_STATE_READY;
4225  hi2c->Mode = HAL_I2C_MODE_NONE;
4226  hi2c->XferISR = NULL;
4227 
4228  /* Disable the Address Match interrupt */
4229  I2C_Disable_IRQ(hi2c, I2C_XFER_LISTEN_IT);
4230 
4231  return HAL_OK;
4232  }
4233  else
4234  {
4235  return HAL_BUSY;
4236  }
4237 }
return HAL_OK
__IO HAL_I2C_ModeTypeDef Mode
__IO uint32_t PreviousState
static void I2C_Disable_IRQ(I2C_HandleTypeDef *hi2c, uint16_t InterruptRequest)
Manage the disabling of Interrupts.
HAL_StatusTypeDef(* XferISR)(struct __I2C_HandleTypeDef *hi2c, uint32_t ITFlags, uint32_t ITSources)
__IO HAL_I2C_StateTypeDef State

◆ HAL_I2C_EnableListen_IT()

HAL_StatusTypeDef HAL_I2C_EnableListen_IT ( I2C_HandleTypeDef hi2c)

Enable the Address listen mode with Interrupt.

Parameters
hi2cPointer to a I2C_HandleTypeDef structure that contains the configuration information for the specified I2C.
Return values
HALstatus

Definition at line 4190 of file stm32l4xx_hal_i2c.c.

4191 {
4192  if (hi2c->State == HAL_I2C_STATE_READY)
4193  {
4194  hi2c->State = HAL_I2C_STATE_LISTEN;
4195  hi2c->XferISR = I2C_Slave_ISR_IT;
4196 
4197  /* Enable the Address Match interrupt */
4198  I2C_Enable_IRQ(hi2c, I2C_XFER_LISTEN_IT);
4199 
4200  return HAL_OK;
4201  }
4202  else
4203  {
4204  return HAL_BUSY;
4205  }
4206 }
static void I2C_Enable_IRQ(I2C_HandleTypeDef *hi2c, uint16_t InterruptRequest)
Manage the enabling of Interrupts.
static HAL_StatusTypeDef I2C_Slave_ISR_IT(struct __I2C_HandleTypeDef *hi2c, uint32_t ITFlags, uint32_t ITSources)
Interrupt Sub-Routine which handle the Interrupt Flags Slave Mode with Interrupt. ...
return HAL_OK
HAL_StatusTypeDef(* XferISR)(struct __I2C_HandleTypeDef *hi2c, uint32_t ITFlags, uint32_t ITSources)
__IO HAL_I2C_StateTypeDef State

◆ HAL_I2C_IsDeviceReady()

HAL_StatusTypeDef HAL_I2C_IsDeviceReady ( I2C_HandleTypeDef hi2c,
uint16_t  DevAddress,
uint32_t  Trials,
uint32_t  Timeout 
)

Checks if target device is ready for communication.

Note
This function is used with Memory devices
Parameters
hi2cPointer to a I2C_HandleTypeDef structure that contains the configuration information for the specified I2C.
DevAddressTarget device address: The device 7 bits address value in datasheet must be shifted to the left before calling the interface
TrialsNumber of trials
TimeoutTimeout duration
Return values
HALstatus

Definition at line 3014 of file stm32l4xx_hal_i2c.c.

3015 {
3016  uint32_t tickstart;
3017 
3018  __IO uint32_t I2C_Trials = 0UL;
3019 
3020  FlagStatus tmp1;
3021  FlagStatus tmp2;
3022 
3023  if (hi2c->State == HAL_I2C_STATE_READY)
3024  {
3025  if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) == SET)
3026  {
3027  return HAL_BUSY;
3028  }
3029 
3030  /* Process Locked */
3031  __HAL_LOCK(hi2c);
3032 
3033  hi2c->State = HAL_I2C_STATE_BUSY;
3034  hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
3035 
3036  do
3037  {
3038  /* Generate Start */
3039  hi2c->Instance->CR2 = I2C_GENERATE_START(hi2c->Init.AddressingMode, DevAddress);
3040 
3041  /* No need to Check TC flag, with AUTOEND mode the stop is automatically generated */
3042  /* Wait until STOPF flag is set or a NACK flag is set*/
3043  tickstart = HAL_GetTick();
3044 
3045  tmp1 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_STOPF);
3046  tmp2 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_AF);
3047 
3048  while ((tmp1 == RESET) && (tmp2 == RESET))
3049  {
3050  if (Timeout != HAL_MAX_DELAY)
3051  {
3052  if (((HAL_GetTick() - tickstart) > Timeout) || (Timeout == 0U))
3053  {
3054  /* Update I2C state */
3055  hi2c->State = HAL_I2C_STATE_READY;
3056 
3057  /* Update I2C error code */
3058  hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;
3059 
3060  /* Process Unlocked */
3061  __HAL_UNLOCK(hi2c);
3062 
3063  return HAL_ERROR;
3064  }
3065  }
3066 
3067  tmp1 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_STOPF);
3068  tmp2 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_AF);
3069  }
3070 
3071  /* Check if the NACKF flag has not been set */
3072  if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_AF) == RESET)
3073  {
3074  /* Wait until STOPF flag is reset */
3075  if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_STOPF, RESET, Timeout, tickstart) != HAL_OK)
3076  {
3077  return HAL_ERROR;
3078  }
3079 
3080  /* Clear STOP Flag */
3081  __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF);
3082 
3083  /* Device is ready */
3084  hi2c->State = HAL_I2C_STATE_READY;
3085 
3086  /* Process Unlocked */
3087  __HAL_UNLOCK(hi2c);
3088 
3089  return HAL_OK;
3090  }
3091  else
3092  {
3093  /* Wait until STOPF flag is reset */
3094  if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_STOPF, RESET, Timeout, tickstart) != HAL_OK)
3095  {
3096  return HAL_ERROR;
3097  }
3098 
3099  /* Clear NACK Flag */
3100  __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF);
3101 
3102  /* Clear STOP Flag, auto generated with autoend*/
3103  __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF);
3104  }
3105 
3106  /* Check if the maximum allowed number of trials has been reached */
3107  if (I2C_Trials == Trials)
3108  {
3109  /* Generate Stop */
3110  hi2c->Instance->CR2 |= I2C_CR2_STOP;
3111 
3112  /* Wait until STOPF flag is reset */
3113  if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_STOPF, RESET, Timeout, tickstart) != HAL_OK)
3114  {
3115  return HAL_ERROR;
3116  }
3117 
3118  /* Clear STOP Flag */
3119  __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF);
3120  }
3121 
3122  /* Increment Trials */
3123  I2C_Trials++;
3124  }
3125  while (I2C_Trials < Trials);
3126 
3127  /* Update I2C state */
3128  hi2c->State = HAL_I2C_STATE_READY;
3129 
3130  /* Update I2C error code */
3131  hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;
3132 
3133  /* Process Unlocked */
3134  __HAL_UNLOCK(hi2c);
3135 
3136  return HAL_ERROR;
3137  }
3138  else
3139  {
3140  return HAL_BUSY;
3141  }
3142 }
uint32_t HAL_GetTick(void)
Provide a tick value in millisecond.
__HAL_UNLOCK(hrtc)
I2C_InitTypeDef Init
__HAL_LOCK(hrtc)
return HAL_OK
__IO HAL_I2C_StateTypeDef State
static HAL_StatusTypeDef I2C_WaitOnFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Flag, FlagStatus Status, uint32_t Timeout, uint32_t Tickstart)
This function handles I2C Communication Timeout.

◆ HAL_I2C_Master_Abort_IT()

HAL_StatusTypeDef HAL_I2C_Master_Abort_IT ( I2C_HandleTypeDef hi2c,
uint16_t  DevAddress 
)

Abort a master I2C IT or DMA process communication with Interrupt.

Parameters
hi2cPointer to a I2C_HandleTypeDef structure that contains the configuration information for the specified I2C.
DevAddressTarget device address: The device 7 bits address value in datasheet must be shifted to the left before calling the interface
Return values
HALstatus

Definition at line 4247 of file stm32l4xx_hal_i2c.c.

4248 {
4249  if (hi2c->Mode == HAL_I2C_MODE_MASTER)
4250  {
4251  /* Process Locked */
4252  __HAL_LOCK(hi2c);
4253 
4254  /* Disable Interrupts */
4255  I2C_Disable_IRQ(hi2c, I2C_XFER_RX_IT);
4256  I2C_Disable_IRQ(hi2c, I2C_XFER_TX_IT);
4257 
4258  /* Set State at HAL_I2C_STATE_ABORT */
4259  hi2c->State = HAL_I2C_STATE_ABORT;
4260 
4261  /* Set NBYTES to 1 to generate a dummy read on I2C peripheral */
4262  /* Set AUTOEND mode, this will generate a NACK then STOP condition to abort the current transfer */
4263  I2C_TransferConfig(hi2c, DevAddress, 1, I2C_AUTOEND_MODE, I2C_GENERATE_STOP);
4264 
4265  /* Process Unlocked */
4266  __HAL_UNLOCK(hi2c);
4267 
4268  /* Note : The I2C interrupts must be enabled after unlocking current process
4269  to avoid the risk of I2C interrupt handle execution before current
4270  process unlock */
4271  I2C_Enable_IRQ(hi2c, I2C_XFER_CPLT_IT);
4272 
4273  return HAL_OK;
4274  }
4275  else
4276  {
4277  /* Wrong usage of abort function */
4278  /* This function should be used only in case of abort monitored by master device */
4279  return HAL_ERROR;
4280  }
4281 }
static void I2C_Enable_IRQ(I2C_HandleTypeDef *hi2c, uint16_t InterruptRequest)
Manage the enabling of Interrupts.
__HAL_UNLOCK(hrtc)
__HAL_LOCK(hrtc)
return HAL_OK
__IO HAL_I2C_ModeTypeDef Mode
static void I2C_Disable_IRQ(I2C_HandleTypeDef *hi2c, uint16_t InterruptRequest)
Manage the disabling of Interrupts.
static void I2C_TransferConfig(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t Size, uint32_t Mode, uint32_t Request)
Handles I2Cx communication when starting transfer or during transfer (TC or TCR flag are set)...
__IO HAL_I2C_StateTypeDef State

◆ HAL_I2C_Master_Receive()

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

Receives in master mode an amount of data in blocking mode.

Parameters
hi2cPointer to a I2C_HandleTypeDef structure that contains the configuration information for the specified I2C.
DevAddressTarget device address: The device 7 bits address value in datasheet must be shifted to the left before calling the interface
pDataPointer to data buffer
SizeAmount of data to be sent
TimeoutTimeout duration
Return values
HALstatus

Definition at line 1174 of file stm32l4xx_hal_i2c.c.

1175 {
1176  uint32_t tickstart;
1177 
1178  if (hi2c->State == HAL_I2C_STATE_READY)
1179  {
1180  /* Process Locked */
1181  __HAL_LOCK(hi2c);
1182 
1183  /* Init tickstart for timeout management*/
1184  tickstart = HAL_GetTick();
1185 
1186  if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY, tickstart) != HAL_OK)
1187  {
1188  return HAL_ERROR;
1189  }
1190 
1191  hi2c->State = HAL_I2C_STATE_BUSY_RX;
1192  hi2c->Mode = HAL_I2C_MODE_MASTER;
1193  hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
1194 
1195  /* Prepare transfer parameters */
1196  hi2c->pBuffPtr = pData;
1197  hi2c->XferCount = Size;
1198  hi2c->XferISR = NULL;
1199 
1200  /* Send Slave Address */
1201  /* Set NBYTES to write and reload if hi2c->XferCount > MAX_NBYTE_SIZE and generate RESTART */
1202  if (hi2c->XferCount > MAX_NBYTE_SIZE)
1203  {
1204  hi2c->XferSize = MAX_NBYTE_SIZE;
1205  I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_RELOAD_MODE, I2C_GENERATE_START_READ);
1206  }
1207  else
1208  {
1209  hi2c->XferSize = hi2c->XferCount;
1210  I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_AUTOEND_MODE, I2C_GENERATE_START_READ);
1211  }
1212 
1213  while (hi2c->XferCount > 0U)
1214  {
1215  /* Wait until RXNE flag is set */
1216  if (I2C_WaitOnRXNEFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK)
1217  {
1218  return HAL_ERROR;
1219  }
1220 
1221  /* Read data from RXDR */
1222  *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->RXDR;
1223 
1224  /* Increment Buffer pointer */
1225  hi2c->pBuffPtr++;
1226 
1227  hi2c->XferSize--;
1228  hi2c->XferCount--;
1229 
1230  if ((hi2c->XferCount != 0U) && (hi2c->XferSize == 0U))
1231  {
1232  /* Wait until TCR flag is set */
1233  if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_TCR, RESET, Timeout, tickstart) != HAL_OK)
1234  {
1235  return HAL_ERROR;
1236  }
1237 
1238  if (hi2c->XferCount > MAX_NBYTE_SIZE)
1239  {
1240  hi2c->XferSize = MAX_NBYTE_SIZE;
1241  I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_RELOAD_MODE, I2C_NO_STARTSTOP);
1242  }
1243  else
1244  {
1245  hi2c->XferSize = hi2c->XferCount;
1246  I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_AUTOEND_MODE, I2C_NO_STARTSTOP);
1247  }
1248  }
1249  }
1250 
1251  /* No need to Check TC flag, with AUTOEND mode the stop is automatically generated */
1252  /* Wait until STOPF flag is set */
1253  if (I2C_WaitOnSTOPFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK)
1254  {
1255  return HAL_ERROR;
1256  }
1257 
1258  /* Clear STOP Flag */
1259  __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF);
1260 
1261  /* Clear Configuration Register 2 */
1262  I2C_RESET_CR2(hi2c);
1263 
1264  hi2c->State = HAL_I2C_STATE_READY;
1265  hi2c->Mode = HAL_I2C_MODE_NONE;
1266 
1267  /* Process Unlocked */
1268  __HAL_UNLOCK(hi2c);
1269 
1270  return HAL_OK;
1271  }
1272  else
1273  {
1274  return HAL_BUSY;
1275  }
1276 }
if(lpuartdiv >=LPUART_BRR_MIN_VALUE)
uint32_t HAL_GetTick(void)
Provide a tick value in millisecond.
__HAL_UNLOCK(hrtc)
static HAL_StatusTypeDef I2C_WaitOnRXNEFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Timeout, uint32_t Tickstart)
This function handles I2C Communication Timeout for specific usage of RXNE flag.
__HAL_LOCK(hrtc)
static HAL_StatusTypeDef I2C_WaitOnSTOPFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Timeout, uint32_t Tickstart)
This function handles I2C Communication Timeout for specific usage of STOP flag.
return HAL_OK
__IO HAL_I2C_ModeTypeDef Mode
static void I2C_TransferConfig(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t Size, uint32_t Mode, uint32_t Request)
Handles I2Cx communication when starting transfer or during transfer (TC or TCR flag are set)...
HAL_StatusTypeDef(* XferISR)(struct __I2C_HandleTypeDef *hi2c, uint32_t ITFlags, uint32_t ITSources)
__IO HAL_I2C_StateTypeDef State
static HAL_StatusTypeDef I2C_WaitOnFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Flag, FlagStatus Status, uint32_t Timeout, uint32_t Tickstart)
This function handles I2C Communication Timeout.

◆ HAL_I2C_Master_Receive_DMA()

HAL_StatusTypeDef HAL_I2C_Master_Receive_DMA ( I2C_HandleTypeDef hi2c,
uint16_t  DevAddress,
uint8_t *  pData,
uint16_t  Size 
)

Receive in master mode an amount of data in non-blocking mode with DMA.

Parameters
hi2cPointer to a I2C_HandleTypeDef structure that contains the configuration information for the specified I2C.
DevAddressTarget device address: The device 7 bits address value in datasheet must be shifted to the left before calling the interface
pDataPointer to data buffer
SizeAmount of data to be sent
Return values
HALstatus

Definition at line 1929 of file stm32l4xx_hal_i2c.c.

1930 {
1931  uint32_t xfermode;
1932  HAL_StatusTypeDef dmaxferstatus;
1933 
1934  if (hi2c->State == HAL_I2C_STATE_READY)
1935  {
1936  if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) == SET)
1937  {
1938  return HAL_BUSY;
1939  }
1940 
1941  /* Process Locked */
1942  __HAL_LOCK(hi2c);
1943 
1944  hi2c->State = HAL_I2C_STATE_BUSY_RX;
1945  hi2c->Mode = HAL_I2C_MODE_MASTER;
1946  hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
1947 
1948  /* Prepare transfer parameters */
1949  hi2c->pBuffPtr = pData;
1950  hi2c->XferCount = Size;
1951  hi2c->XferOptions = I2C_NO_OPTION_FRAME;
1952  hi2c->XferISR = I2C_Master_ISR_DMA;
1953 
1954  if (hi2c->XferCount > MAX_NBYTE_SIZE)
1955  {
1956  hi2c->XferSize = MAX_NBYTE_SIZE;
1957  xfermode = I2C_RELOAD_MODE;
1958  }
1959  else
1960  {
1961  hi2c->XferSize = hi2c->XferCount;
1962  xfermode = I2C_AUTOEND_MODE;
1963  }
1964 
1965  if (hi2c->XferSize > 0U)
1966  {
1967  if (hi2c->hdmarx != NULL)
1968  {
1969  /* Set the I2C DMA transfer complete callback */
1971 
1972  /* Set the DMA error callback */
1974 
1975  /* Set the unused DMA callbacks to NULL */
1976  hi2c->hdmarx->XferHalfCpltCallback = NULL;
1977  hi2c->hdmarx->XferAbortCallback = NULL;
1978 
1979  /* Enable the DMA channel */
1980  dmaxferstatus = HAL_DMA_Start_IT(hi2c->hdmarx, (uint32_t)&hi2c->Instance->RXDR, (uint32_t)pData, hi2c->XferSize);
1981  }
1982  else
1983  {
1984  /* Update I2C state */
1985  hi2c->State = HAL_I2C_STATE_READY;
1986  hi2c->Mode = HAL_I2C_MODE_NONE;
1987 
1988  /* Update I2C error code */
1989  hi2c->ErrorCode |= HAL_I2C_ERROR_DMA_PARAM;
1990 
1991  /* Process Unlocked */
1992  __HAL_UNLOCK(hi2c);
1993 
1994  return HAL_ERROR;
1995  }
1996 
1997  if (dmaxferstatus == HAL_OK)
1998  {
1999  /* Send Slave Address */
2000  /* Set NBYTES to read and reload if hi2c->XferCount > MAX_NBYTE_SIZE and generate RESTART */
2001  I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, xfermode, I2C_GENERATE_START_READ);
2002 
2003  /* Update XferCount value */
2004  hi2c->XferCount -= hi2c->XferSize;
2005 
2006  /* Process Unlocked */
2007  __HAL_UNLOCK(hi2c);
2008 
2009  /* Note : The I2C interrupts must be enabled after unlocking current process
2010  to avoid the risk of I2C interrupt handle execution before current
2011  process unlock */
2012  /* Enable ERR and NACK interrupts */
2013  I2C_Enable_IRQ(hi2c, I2C_XFER_ERROR_IT);
2014 
2015  /* Enable DMA Request */
2016  hi2c->Instance->CR1 |= I2C_CR1_RXDMAEN;
2017  }
2018  else
2019  {
2020  /* Update I2C state */
2021  hi2c->State = HAL_I2C_STATE_READY;
2022  hi2c->Mode = HAL_I2C_MODE_NONE;
2023 
2024  /* Update I2C error code */
2025  hi2c->ErrorCode |= HAL_I2C_ERROR_DMA;
2026 
2027  /* Process Unlocked */
2028  __HAL_UNLOCK(hi2c);
2029 
2030  return HAL_ERROR;
2031  }
2032  }
2033  else
2034  {
2035  /* Update Transfer ISR function pointer */
2036  hi2c->XferISR = I2C_Master_ISR_IT;
2037 
2038  /* Send Slave Address */
2039  /* Set NBYTES to read and generate START condition */
2040  I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_AUTOEND_MODE, I2C_GENERATE_START_READ);
2041 
2042  /* Process Unlocked */
2043  __HAL_UNLOCK(hi2c);
2044 
2045  /* Note : The I2C interrupts must be enabled after unlocking current process
2046  to avoid the risk of I2C interrupt handle execution before current
2047  process unlock */
2048  /* Enable ERR, TC, STOP, NACK, TXI interrupt */
2049  /* possible to enable all of these */
2050  /* I2C_IT_ERRI | I2C_IT_TCI| I2C_IT_STOPI| I2C_IT_NACKI | I2C_IT_ADDRI | I2C_IT_RXI | I2C_IT_TXI */
2051  I2C_Enable_IRQ(hi2c, I2C_XFER_TX_IT);
2052  }
2053 
2054  return HAL_OK;
2055  }
2056  else
2057  {
2058  return HAL_BUSY;
2059  }
2060 }
DMA_HandleTypeDef * hdmarx
void(* XferAbortCallback)(struct __DMA_HandleTypeDef *hdma)
static void I2C_Enable_IRQ(I2C_HandleTypeDef *hi2c, uint16_t InterruptRequest)
Manage the enabling of Interrupts.
void(* XferCpltCallback)(struct __DMA_HandleTypeDef *hdma)
static void I2C_DMAMasterReceiveCplt(DMA_HandleTypeDef *hdma)
DMA I2C master receive process complete callback.
void(* XferErrorCallback)(struct __DMA_HandleTypeDef *hdma)
__HAL_UNLOCK(hrtc)
void(* XferHalfCpltCallback)(struct __DMA_HandleTypeDef *hdma)
static void I2C_DMAError(DMA_HandleTypeDef *hdma)
DMA I2C communication error callback.
HAL_StatusTypeDef HAL_DMA_Start_IT(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength)
Start the DMA Transfer with interrupt enabled.
__HAL_LOCK(hrtc)
return HAL_OK
static HAL_StatusTypeDef I2C_Master_ISR_IT(struct __I2C_HandleTypeDef *hi2c, uint32_t ITFlags, uint32_t ITSources)
Interrupt Sub-Routine which handle the Interrupt Flags Master Mode with Interrupt.
__IO HAL_I2C_ModeTypeDef Mode
static void I2C_TransferConfig(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t Size, uint32_t Mode, uint32_t Request)
Handles I2Cx communication when starting transfer or during transfer (TC or TCR flag are set)...
HAL_StatusTypeDef(* XferISR)(struct __I2C_HandleTypeDef *hi2c, uint32_t ITFlags, uint32_t ITSources)
__IO HAL_I2C_StateTypeDef State
__IO uint32_t XferOptions
static HAL_StatusTypeDef I2C_Master_ISR_DMA(struct __I2C_HandleTypeDef *hi2c, uint32_t ITFlags, uint32_t ITSources)
Interrupt Sub-Routine which handle the Interrupt Flags Master Mode with DMA.

◆ HAL_I2C_Master_Receive_IT()

HAL_StatusTypeDef HAL_I2C_Master_Receive_IT ( I2C_HandleTypeDef hi2c,
uint16_t  DevAddress,
uint8_t *  pData,
uint16_t  Size 
)

Receive in master mode an amount of data in non-blocking mode with Interrupt.

Parameters
hi2cPointer to a I2C_HandleTypeDef structure that contains the configuration information for the specified I2C.
DevAddressTarget device address: The device 7 bits address value in datasheet must be shifted to the left before calling the interface
pDataPointer to data buffer
SizeAmount of data to be sent
Return values
HALstatus

Definition at line 1619 of file stm32l4xx_hal_i2c.c.

1620 {
1621  uint32_t xfermode;
1622 
1623  if (hi2c->State == HAL_I2C_STATE_READY)
1624  {
1625  if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) == SET)
1626  {
1627  return HAL_BUSY;
1628  }
1629 
1630  /* Process Locked */
1631  __HAL_LOCK(hi2c);
1632 
1633  hi2c->State = HAL_I2C_STATE_BUSY_RX;
1634  hi2c->Mode = HAL_I2C_MODE_MASTER;
1635  hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
1636 
1637  /* Prepare transfer parameters */
1638  hi2c->pBuffPtr = pData;
1639  hi2c->XferCount = Size;
1640  hi2c->XferOptions = I2C_NO_OPTION_FRAME;
1641  hi2c->XferISR = I2C_Master_ISR_IT;
1642 
1643  if (hi2c->XferCount > MAX_NBYTE_SIZE)
1644  {
1645  hi2c->XferSize = MAX_NBYTE_SIZE;
1646  xfermode = I2C_RELOAD_MODE;
1647  }
1648  else
1649  {
1650  hi2c->XferSize = hi2c->XferCount;
1651  xfermode = I2C_AUTOEND_MODE;
1652  }
1653 
1654  /* Send Slave Address */
1655  /* Set NBYTES to write and reload if hi2c->XferCount > MAX_NBYTE_SIZE */
1656  I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, xfermode, I2C_GENERATE_START_READ);
1657 
1658  /* Process Unlocked */
1659  __HAL_UNLOCK(hi2c);
1660 
1661  /* Note : The I2C interrupts must be enabled after unlocking current process
1662  to avoid the risk of I2C interrupt handle execution before current
1663  process unlock */
1664 
1665  /* Enable ERR, TC, STOP, NACK, RXI interrupt */
1666  /* possible to enable all of these */
1667  /* I2C_IT_ERRI | I2C_IT_TCI| I2C_IT_STOPI| I2C_IT_NACKI | I2C_IT_ADDRI | I2C_IT_RXI | I2C_IT_TXI */
1668  I2C_Enable_IRQ(hi2c, I2C_XFER_RX_IT);
1669 
1670  return HAL_OK;
1671  }
1672  else
1673  {
1674  return HAL_BUSY;
1675  }
1676 }
static void I2C_Enable_IRQ(I2C_HandleTypeDef *hi2c, uint16_t InterruptRequest)
Manage the enabling of Interrupts.
__HAL_UNLOCK(hrtc)
__HAL_LOCK(hrtc)
return HAL_OK
static HAL_StatusTypeDef I2C_Master_ISR_IT(struct __I2C_HandleTypeDef *hi2c, uint32_t ITFlags, uint32_t ITSources)
Interrupt Sub-Routine which handle the Interrupt Flags Master Mode with Interrupt.
__IO HAL_I2C_ModeTypeDef Mode
static void I2C_TransferConfig(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t Size, uint32_t Mode, uint32_t Request)
Handles I2Cx communication when starting transfer or during transfer (TC or TCR flag are set)...
HAL_StatusTypeDef(* XferISR)(struct __I2C_HandleTypeDef *hi2c, uint32_t ITFlags, uint32_t ITSources)
__IO HAL_I2C_StateTypeDef State
__IO uint32_t XferOptions

◆ HAL_I2C_Master_Seq_Receive_DMA()

HAL_StatusTypeDef HAL_I2C_Master_Seq_Receive_DMA ( I2C_HandleTypeDef hi2c,
uint16_t  DevAddress,
uint8_t *  pData,
uint16_t  Size,
uint32_t  XferOptions 
)

Sequential receive in master I2C mode an amount of data in non-blocking mode with DMA.

Note
This interface allow to manage repeated start condition when a direction change during transfer
Parameters
hi2cPointer to a I2C_HandleTypeDef structure that contains the configuration information for the specified I2C.
DevAddressTarget device address: The device 7 bits address value in datasheet must be shifted to the left before calling the interface
pDataPointer to data buffer
SizeAmount of data to be sent
XferOptionsOptions of Transfer, value of I2C Sequential Transfer Options
Return values
HALstatus

Definition at line 3486 of file stm32l4xx_hal_i2c.c.

3487 {
3488  uint32_t xfermode;
3489  uint32_t xferrequest = I2C_GENERATE_START_READ;
3490  HAL_StatusTypeDef dmaxferstatus;
3491 
3492  /* Check the parameters */
3493  assert_param(IS_I2C_TRANSFER_OPTIONS_REQUEST(XferOptions));
3494 
3495  if (hi2c->State == HAL_I2C_STATE_READY)
3496  {
3497  /* Process Locked */
3498  __HAL_LOCK(hi2c);
3499 
3500  hi2c->State = HAL_I2C_STATE_BUSY_RX;
3501  hi2c->Mode = HAL_I2C_MODE_MASTER;
3502  hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
3503 
3504  /* Prepare transfer parameters */
3505  hi2c->pBuffPtr = pData;
3506  hi2c->XferCount = Size;
3507  hi2c->XferOptions = XferOptions;
3508  hi2c->XferISR = I2C_Master_ISR_DMA;
3509 
3510  /* If hi2c->XferCount > MAX_NBYTE_SIZE, use reload mode */
3511  if (hi2c->XferCount > MAX_NBYTE_SIZE)
3512  {
3513  hi2c->XferSize = MAX_NBYTE_SIZE;
3514  xfermode = I2C_RELOAD_MODE;
3515  }
3516  else
3517  {
3518  hi2c->XferSize = hi2c->XferCount;
3519  xfermode = hi2c->XferOptions;
3520  }
3521 
3522  /* If transfer direction not change and there is no request to start another frame, do not generate Restart Condition */
3523  /* Mean Previous state is same as current state */
3524  if ((hi2c->PreviousState == I2C_STATE_MASTER_BUSY_RX) && (IS_I2C_TRANSFER_OTHER_OPTIONS_REQUEST(XferOptions) == 0))
3525  {
3526  xferrequest = I2C_NO_STARTSTOP;
3527  }
3528  else
3529  {
3530  /* Convert OTHER_xxx XferOptions if any */
3532 
3533  /* Update xfermode accordingly if no reload is necessary */
3534  if (hi2c->XferCount < MAX_NBYTE_SIZE)
3535  {
3536  xfermode = hi2c->XferOptions;
3537  }
3538  }
3539 
3540  if (hi2c->XferSize > 0U)
3541  {
3542  if (hi2c->hdmarx != NULL)
3543  {
3544  /* Set the I2C DMA transfer complete callback */
3546 
3547  /* Set the DMA error callback */
3549 
3550  /* Set the unused DMA callbacks to NULL */
3551  hi2c->hdmarx->XferHalfCpltCallback = NULL;
3552  hi2c->hdmarx->XferAbortCallback = NULL;
3553 
3554  /* Enable the DMA channel */
3555  dmaxferstatus = HAL_DMA_Start_IT(hi2c->hdmarx, (uint32_t)&hi2c->Instance->RXDR, (uint32_t)pData, hi2c->XferSize);
3556  }
3557  else
3558  {
3559  /* Update I2C state */
3560  hi2c->State = HAL_I2C_STATE_READY;
3561  hi2c->Mode = HAL_I2C_MODE_NONE;
3562 
3563  /* Update I2C error code */
3564  hi2c->ErrorCode |= HAL_I2C_ERROR_DMA_PARAM;
3565 
3566  /* Process Unlocked */
3567  __HAL_UNLOCK(hi2c);
3568 
3569  return HAL_ERROR;
3570  }
3571 
3572  if (dmaxferstatus == HAL_OK)
3573  {
3574  /* Send Slave Address and set NBYTES to read */
3575  I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, xfermode, xferrequest);
3576 
3577  /* Update XferCount value */
3578  hi2c->XferCount -= hi2c->XferSize;
3579 
3580  /* Process Unlocked */
3581  __HAL_UNLOCK(hi2c);
3582 
3583  /* Note : The I2C interrupts must be enabled after unlocking current process
3584  to avoid the risk of I2C interrupt handle execution before current
3585  process unlock */
3586  /* Enable ERR and NACK interrupts */
3587  I2C_Enable_IRQ(hi2c, I2C_XFER_ERROR_IT);
3588 
3589  /* Enable DMA Request */
3590  hi2c->Instance->CR1 |= I2C_CR1_RXDMAEN;
3591  }
3592  else
3593  {
3594  /* Update I2C state */
3595  hi2c->State = HAL_I2C_STATE_READY;
3596  hi2c->Mode = HAL_I2C_MODE_NONE;
3597 
3598  /* Update I2C error code */
3599  hi2c->ErrorCode |= HAL_I2C_ERROR_DMA;
3600 
3601  /* Process Unlocked */
3602  __HAL_UNLOCK(hi2c);
3603 
3604  return HAL_ERROR;
3605  }
3606  }
3607  else
3608  {
3609  /* Update Transfer ISR function pointer */
3610  hi2c->XferISR = I2C_Master_ISR_IT;
3611 
3612  /* Send Slave Address */
3613  /* Set NBYTES to read and generate START condition */
3614  I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_AUTOEND_MODE, I2C_GENERATE_START_READ);
3615 
3616  /* Process Unlocked */
3617  __HAL_UNLOCK(hi2c);
3618 
3619  /* Note : The I2C interrupts must be enabled after unlocking current process
3620  to avoid the risk of I2C interrupt handle execution before current
3621  process unlock */
3622  /* Enable ERR, TC, STOP, NACK, TXI interrupt */
3623  /* possible to enable all of these */
3624  /* I2C_IT_ERRI | I2C_IT_TCI| I2C_IT_STOPI| I2C_IT_NACKI | I2C_IT_ADDRI | I2C_IT_RXI | I2C_IT_TXI */
3625  I2C_Enable_IRQ(hi2c, I2C_XFER_TX_IT);
3626  }
3627 
3628  return HAL_OK;
3629  }
3630  else
3631  {
3632  return HAL_BUSY;
3633  }
3634 }
DMA_HandleTypeDef * hdmarx
void(* XferAbortCallback)(struct __DMA_HandleTypeDef *hdma)
static void I2C_Enable_IRQ(I2C_HandleTypeDef *hi2c, uint16_t InterruptRequest)
Manage the enabling of Interrupts.
void(* XferCpltCallback)(struct __DMA_HandleTypeDef *hdma)
static void I2C_DMAMasterReceiveCplt(DMA_HandleTypeDef *hdma)
DMA I2C master receive process complete callback.
void(* XferErrorCallback)(struct __DMA_HandleTypeDef *hdma)
__HAL_UNLOCK(hrtc)
void(* XferHalfCpltCallback)(struct __DMA_HandleTypeDef *hdma)
static void I2C_DMAError(DMA_HandleTypeDef *hdma)
DMA I2C communication error callback.
HAL_StatusTypeDef HAL_DMA_Start_IT(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength)
Start the DMA Transfer with interrupt enabled.
__HAL_LOCK(hrtc)
return HAL_OK
static HAL_StatusTypeDef I2C_Master_ISR_IT(struct __I2C_HandleTypeDef *hi2c, uint32_t ITFlags, uint32_t ITSources)
Interrupt Sub-Routine which handle the Interrupt Flags Master Mode with Interrupt.
__IO HAL_I2C_ModeTypeDef Mode
__IO uint32_t PreviousState
static void I2C_TransferConfig(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t Size, uint32_t Mode, uint32_t Request)
Handles I2Cx communication when starting transfer or during transfer (TC or TCR flag are set)...
HAL_StatusTypeDef(* XferISR)(struct __I2C_HandleTypeDef *hi2c, uint32_t ITFlags, uint32_t ITSources)
__IO HAL_I2C_StateTypeDef State
__IO uint32_t XferOptions
static HAL_StatusTypeDef I2C_Master_ISR_DMA(struct __I2C_HandleTypeDef *hi2c, uint32_t ITFlags, uint32_t ITSources)
Interrupt Sub-Routine which handle the Interrupt Flags Master Mode with DMA.
static void I2C_ConvertOtherXferOptions(I2C_HandleTypeDef *hi2c)
Convert I2Cx OTHER_xxx XferOptions to functionnal XferOptions.
assert_param(IS_RTC_WAKEUP_CLOCK(WakeUpClock))

◆ HAL_I2C_Master_Seq_Receive_IT()

HAL_StatusTypeDef HAL_I2C_Master_Seq_Receive_IT ( I2C_HandleTypeDef hi2c,
uint16_t  DevAddress,
uint8_t *  pData,
uint16_t  Size,
uint32_t  XferOptions 
)

Sequential receive in master I2C mode an amount of data in non-blocking mode with Interrupt.

Note
This interface allow to manage repeated start condition when a direction change during transfer
Parameters
hi2cPointer to a I2C_HandleTypeDef structure that contains the configuration information for the specified I2C.
DevAddressTarget device address: The device 7 bits address value in datasheet must be shifted to the left before calling the interface
pDataPointer to data buffer
SizeAmount of data to be sent
XferOptionsOptions of Transfer, value of I2C Sequential Transfer Options
Return values
HALstatus

Definition at line 3402 of file stm32l4xx_hal_i2c.c.

3403 {
3404  uint32_t xfermode;
3405  uint32_t xferrequest = I2C_GENERATE_START_READ;
3406 
3407  /* Check the parameters */
3408  assert_param(IS_I2C_TRANSFER_OPTIONS_REQUEST(XferOptions));
3409 
3410  if (hi2c->State == HAL_I2C_STATE_READY)
3411  {
3412  /* Process Locked */
3413  __HAL_LOCK(hi2c);
3414 
3415  hi2c->State = HAL_I2C_STATE_BUSY_RX;
3416  hi2c->Mode = HAL_I2C_MODE_MASTER;
3417  hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
3418 
3419  /* Prepare transfer parameters */
3420  hi2c->pBuffPtr = pData;
3421  hi2c->XferCount = Size;
3422  hi2c->XferOptions = XferOptions;
3423  hi2c->XferISR = I2C_Master_ISR_IT;
3424 
3425  /* If hi2c->XferCount > MAX_NBYTE_SIZE, use reload mode */
3426  if (hi2c->XferCount > MAX_NBYTE_SIZE)
3427  {
3428  hi2c->XferSize = MAX_NBYTE_SIZE;
3429  xfermode = I2C_RELOAD_MODE;
3430  }
3431  else
3432  {
3433  hi2c->XferSize = hi2c->XferCount;
3434  xfermode = hi2c->XferOptions;
3435  }
3436 
3437  /* If transfer direction not change and there is no request to start another frame, do not generate Restart Condition */
3438  /* Mean Previous state is same as current state */
3439  if ((hi2c->PreviousState == I2C_STATE_MASTER_BUSY_RX) && (IS_I2C_TRANSFER_OTHER_OPTIONS_REQUEST(XferOptions) == 0))
3440  {
3441  xferrequest = I2C_NO_STARTSTOP;
3442  }
3443  else
3444  {
3445  /* Convert OTHER_xxx XferOptions if any */
3447 
3448  /* Update xfermode accordingly if no reload is necessary */
3449  if (hi2c->XferCount < MAX_NBYTE_SIZE)
3450  {
3451  xfermode = hi2c->XferOptions;
3452  }
3453  }
3454 
3455  /* Send Slave Address and set NBYTES to read */
3456  I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, xfermode, xferrequest);
3457 
3458  /* Process Unlocked */
3459  __HAL_UNLOCK(hi2c);
3460 
3461  /* Note : The I2C interrupts must be enabled after unlocking current process
3462  to avoid the risk of I2C interrupt handle execution before current
3463  process unlock */
3464  I2C_Enable_IRQ(hi2c, I2C_XFER_RX_IT);
3465 
3466  return HAL_OK;
3467  }
3468  else
3469  {
3470  return HAL_BUSY;
3471  }
3472 }
static void I2C_Enable_IRQ(I2C_HandleTypeDef *hi2c, uint16_t InterruptRequest)
Manage the enabling of Interrupts.
__HAL_UNLOCK(hrtc)
__HAL_LOCK(hrtc)
return HAL_OK
static HAL_StatusTypeDef I2C_Master_ISR_IT(struct __I2C_HandleTypeDef *hi2c, uint32_t ITFlags, uint32_t ITSources)
Interrupt Sub-Routine which handle the Interrupt Flags Master Mode with Interrupt.
__IO HAL_I2C_ModeTypeDef Mode
__IO uint32_t PreviousState
static void I2C_TransferConfig(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t Size, uint32_t Mode, uint32_t Request)
Handles I2Cx communication when starting transfer or during transfer (TC or TCR flag are set)...
HAL_StatusTypeDef(* XferISR)(struct __I2C_HandleTypeDef *hi2c, uint32_t ITFlags, uint32_t ITSources)
__IO HAL_I2C_StateTypeDef State
__IO uint32_t XferOptions
static void I2C_ConvertOtherXferOptions(I2C_HandleTypeDef *hi2c)
Convert I2Cx OTHER_xxx XferOptions to functionnal XferOptions.
assert_param(IS_RTC_WAKEUP_CLOCK(WakeUpClock))

◆ HAL_I2C_Master_Seq_Transmit_DMA()

HAL_StatusTypeDef HAL_I2C_Master_Seq_Transmit_DMA ( I2C_HandleTypeDef hi2c,
uint16_t  DevAddress,
uint8_t *  pData,
uint16_t  Size,
uint32_t  XferOptions 
)

Sequential transmit in master I2C mode an amount of data in non-blocking mode with DMA.

Note
This interface allow to manage repeated start condition when a direction change during transfer
Parameters
hi2cPointer to a I2C_HandleTypeDef structure that contains the configuration information for the specified I2C.
DevAddressTarget device address: The device 7 bits address value in datasheet must be shifted to the left before calling the interface
pDataPointer to data buffer
SizeAmount of data to be sent
XferOptionsOptions of Transfer, value of I2C Sequential Transfer Options
Return values
HALstatus

Definition at line 3240 of file stm32l4xx_hal_i2c.c.

3241 {
3242  uint32_t xfermode;
3243  uint32_t xferrequest = I2C_GENERATE_START_WRITE;
3244  HAL_StatusTypeDef dmaxferstatus;
3245 
3246  /* Check the parameters */
3247  assert_param(IS_I2C_TRANSFER_OPTIONS_REQUEST(XferOptions));
3248 
3249  if (hi2c->State == HAL_I2C_STATE_READY)
3250  {
3251  /* Process Locked */
3252  __HAL_LOCK(hi2c);
3253 
3254  hi2c->State = HAL_I2C_STATE_BUSY_TX;
3255  hi2c->Mode = HAL_I2C_MODE_MASTER;
3256  hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
3257 
3258  /* Prepare transfer parameters */
3259  hi2c->pBuffPtr = pData;
3260  hi2c->XferCount = Size;
3261  hi2c->XferOptions = XferOptions;
3262  hi2c->XferISR = I2C_Master_ISR_DMA;
3263 
3264  /* If hi2c->XferCount > MAX_NBYTE_SIZE, use reload mode */
3265  if (hi2c->XferCount > MAX_NBYTE_SIZE)
3266  {
3267  hi2c->XferSize = MAX_NBYTE_SIZE;
3268  xfermode = I2C_RELOAD_MODE;
3269  }
3270  else
3271  {
3272  hi2c->XferSize = hi2c->XferCount;
3273  xfermode = hi2c->XferOptions;
3274  }
3275 
3276  /* If transfer direction not change and there is no request to start another frame, do not generate Restart Condition */
3277  /* Mean Previous state is same as current state */
3278  if ((hi2c->PreviousState == I2C_STATE_MASTER_BUSY_TX) && (IS_I2C_TRANSFER_OTHER_OPTIONS_REQUEST(XferOptions) == 0))
3279  {
3280  xferrequest = I2C_NO_STARTSTOP;
3281  }
3282  else
3283  {
3284  /* Convert OTHER_xxx XferOptions if any */
3286 
3287  /* Update xfermode accordingly if no reload is necessary */
3288  if (hi2c->XferCount < MAX_NBYTE_SIZE)
3289  {
3290  xfermode = hi2c->XferOptions;
3291  }
3292  }
3293 
3294  if (hi2c->XferSize > 0U)
3295  {
3296  if (hi2c->hdmatx != NULL)
3297  {
3298  /* Set the I2C DMA transfer complete callback */
3300 
3301  /* Set the DMA error callback */
3303 
3304  /* Set the unused DMA callbacks to NULL */
3305  hi2c->hdmatx->XferHalfCpltCallback = NULL;
3306  hi2c->hdmatx->XferAbortCallback = NULL;
3307 
3308  /* Enable the DMA channel */
3309  dmaxferstatus = HAL_DMA_Start_IT(hi2c->hdmatx, (uint32_t)pData, (uint32_t)&hi2c->Instance->TXDR, hi2c->XferSize);
3310  }
3311  else
3312  {
3313  /* Update I2C state */
3314  hi2c->State = HAL_I2C_STATE_READY;
3315  hi2c->Mode = HAL_I2C_MODE_NONE;
3316 
3317  /* Update I2C error code */
3318  hi2c->ErrorCode |= HAL_I2C_ERROR_DMA_PARAM;
3319 
3320  /* Process Unlocked */
3321  __HAL_UNLOCK(hi2c);
3322 
3323  return HAL_ERROR;
3324  }
3325 
3326  if (dmaxferstatus == HAL_OK)
3327  {
3328  /* Send Slave Address and set NBYTES to write */
3329  I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, xfermode, xferrequest);
3330 
3331  /* Update XferCount value */
3332  hi2c->XferCount -= hi2c->XferSize;
3333 
3334  /* Process Unlocked */
3335  __HAL_UNLOCK(hi2c);
3336 
3337  /* Note : The I2C interrupts must be enabled after unlocking current process
3338  to avoid the risk of I2C interrupt handle execution before current
3339  process unlock */
3340  /* Enable ERR and NACK interrupts */
3341  I2C_Enable_IRQ(hi2c, I2C_XFER_ERROR_IT);
3342 
3343  /* Enable DMA Request */
3344  hi2c->Instance->CR1 |= I2C_CR1_TXDMAEN;
3345  }
3346  else
3347  {
3348  /* Update I2C state */
3349  hi2c->State = HAL_I2C_STATE_READY;
3350  hi2c->Mode = HAL_I2C_MODE_NONE;
3351 
3352  /* Update I2C error code */
3353  hi2c->ErrorCode |= HAL_I2C_ERROR_DMA;
3354 
3355  /* Process Unlocked */
3356  __HAL_UNLOCK(hi2c);
3357 
3358  return HAL_ERROR;
3359  }
3360  }
3361  else
3362  {
3363  /* Update Transfer ISR function pointer */
3364  hi2c->XferISR = I2C_Master_ISR_IT;
3365 
3366  /* Send Slave Address */
3367  /* Set NBYTES to write and generate START condition */
3368  I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_AUTOEND_MODE, I2C_GENERATE_START_WRITE);
3369 
3370  /* Process Unlocked */
3371  __HAL_UNLOCK(hi2c);
3372 
3373  /* Note : The I2C interrupts must be enabled after unlocking current process
3374  to avoid the risk of I2C interrupt handle execution before current
3375  process unlock */
3376  /* Enable ERR, TC, STOP, NACK, TXI interrupt */
3377  /* possible to enable all of these */
3378  /* I2C_IT_ERRI | I2C_IT_TCI| I2C_IT_STOPI| I2C_IT_NACKI | I2C_IT_ADDRI | I2C_IT_RXI | I2C_IT_TXI */
3379  I2C_Enable_IRQ(hi2c, I2C_XFER_TX_IT);
3380  }
3381 
3382  return HAL_OK;
3383  }
3384  else
3385  {
3386  return HAL_BUSY;
3387  }
3388 }
void(* XferAbortCallback)(struct __DMA_HandleTypeDef *hdma)
static void I2C_Enable_IRQ(I2C_HandleTypeDef *hi2c, uint16_t InterruptRequest)
Manage the enabling of Interrupts.
void(* XferCpltCallback)(struct __DMA_HandleTypeDef *hdma)
void(* XferErrorCallback)(struct __DMA_HandleTypeDef *hdma)
__HAL_UNLOCK(hrtc)
void(* XferHalfCpltCallback)(struct __DMA_HandleTypeDef *hdma)
static void I2C_DMAError(DMA_HandleTypeDef *hdma)
DMA I2C communication error callback.
HAL_StatusTypeDef HAL_DMA_Start_IT(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength)
Start the DMA Transfer with interrupt enabled.
__HAL_LOCK(hrtc)
return HAL_OK
static HAL_StatusTypeDef I2C_Master_ISR_IT(struct __I2C_HandleTypeDef *hi2c, uint32_t ITFlags, uint32_t ITSources)
Interrupt Sub-Routine which handle the Interrupt Flags Master Mode with Interrupt.
static void I2C_DMAMasterTransmitCplt(DMA_HandleTypeDef *hdma)
DMA I2C master transmit process complete callback.
__IO HAL_I2C_ModeTypeDef Mode
__IO uint32_t PreviousState
DMA_HandleTypeDef * hdmatx
static void I2C_TransferConfig(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t Size, uint32_t Mode, uint32_t Request)
Handles I2Cx communication when starting transfer or during transfer (TC or TCR flag are set)...
HAL_StatusTypeDef(* XferISR)(struct __I2C_HandleTypeDef *hi2c, uint32_t ITFlags, uint32_t ITSources)
__IO HAL_I2C_StateTypeDef State
__IO uint32_t XferOptions
static HAL_StatusTypeDef I2C_Master_ISR_DMA(struct __I2C_HandleTypeDef *hi2c, uint32_t ITFlags, uint32_t ITSources)
Interrupt Sub-Routine which handle the Interrupt Flags Master Mode with DMA.
static void I2C_ConvertOtherXferOptions(I2C_HandleTypeDef *hi2c)
Convert I2Cx OTHER_xxx XferOptions to functionnal XferOptions.
assert_param(IS_RTC_WAKEUP_CLOCK(WakeUpClock))

◆ HAL_I2C_Master_Seq_Transmit_IT()

HAL_StatusTypeDef HAL_I2C_Master_Seq_Transmit_IT ( I2C_HandleTypeDef hi2c,
uint16_t  DevAddress,
uint8_t *  pData,
uint16_t  Size,
uint32_t  XferOptions 
)

Sequential transmit in master I2C mode an amount of data in non-blocking mode with Interrupt.

Note
This interface allow to manage repeated start condition when a direction change during transfer
Parameters
hi2cPointer to a I2C_HandleTypeDef structure that contains the configuration information for the specified I2C.
DevAddressTarget device address: The device 7 bits address value in datasheet must be shifted to the left before calling the interface
pDataPointer to data buffer
SizeAmount of data to be sent
XferOptionsOptions of Transfer, value of I2C Sequential Transfer Options
Return values
HALstatus

Definition at line 3156 of file stm32l4xx_hal_i2c.c.

3157 {
3158  uint32_t xfermode;
3159  uint32_t xferrequest = I2C_GENERATE_START_WRITE;
3160 
3161  /* Check the parameters */
3162  assert_param(IS_I2C_TRANSFER_OPTIONS_REQUEST(XferOptions));
3163 
3164  if (hi2c->State == HAL_I2C_STATE_READY)
3165  {
3166  /* Process Locked */
3167  __HAL_LOCK(hi2c);
3168 
3169  hi2c->State = HAL_I2C_STATE_BUSY_TX;
3170  hi2c->Mode = HAL_I2C_MODE_MASTER;
3171  hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
3172 
3173  /* Prepare transfer parameters */
3174  hi2c->pBuffPtr = pData;
3175  hi2c->XferCount = Size;
3176  hi2c->XferOptions = XferOptions;
3177  hi2c->XferISR = I2C_Master_ISR_IT;
3178 
3179  /* If hi2c->XferCount > MAX_NBYTE_SIZE, use reload mode */
3180  if (hi2c->XferCount > MAX_NBYTE_SIZE)
3181  {
3182  hi2c->XferSize = MAX_NBYTE_SIZE;
3183  xfermode = I2C_RELOAD_MODE;
3184  }
3185  else
3186  {
3187  hi2c->XferSize = hi2c->XferCount;
3188  xfermode = hi2c->XferOptions;
3189  }
3190 
3191  /* If transfer direction not change and there is no request to start another frame, do not generate Restart Condition */
3192  /* Mean Previous state is same as current state */
3193  if ((hi2c->PreviousState == I2C_STATE_MASTER_BUSY_TX) && (IS_I2C_TRANSFER_OTHER_OPTIONS_REQUEST(XferOptions) == 0))
3194  {
3195  xferrequest = I2C_NO_STARTSTOP;
3196  }
3197  else
3198  {
3199  /* Convert OTHER_xxx XferOptions if any */
3201 
3202  /* Update xfermode accordingly if no reload is necessary */
3203  if (hi2c->XferCount < MAX_NBYTE_SIZE)
3204  {
3205  xfermode = hi2c->XferOptions;
3206  }
3207  }
3208 
3209  /* Send Slave Address and set NBYTES to write */
3210  I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, xfermode, xferrequest);
3211 
3212  /* Process Unlocked */
3213  __HAL_UNLOCK(hi2c);
3214 
3215  /* Note : The I2C interrupts must be enabled after unlocking current process
3216  to avoid the risk of I2C interrupt handle execution before current
3217  process unlock */
3218  I2C_Enable_IRQ(hi2c, I2C_XFER_TX_IT);
3219 
3220  return HAL_OK;
3221  }
3222  else
3223  {
3224  return HAL_BUSY;
3225  }
3226 }
static void I2C_Enable_IRQ(I2C_HandleTypeDef *hi2c, uint16_t InterruptRequest)
Manage the enabling of Interrupts.
__HAL_UNLOCK(hrtc)
__HAL_LOCK(hrtc)
return HAL_OK
static HAL_StatusTypeDef I2C_Master_ISR_IT(struct __I2C_HandleTypeDef *hi2c, uint32_t ITFlags, uint32_t ITSources)
Interrupt Sub-Routine which handle the Interrupt Flags Master Mode with Interrupt.
__IO HAL_I2C_ModeTypeDef Mode
__IO uint32_t PreviousState
static void I2C_TransferConfig(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t Size, uint32_t Mode, uint32_t Request)
Handles I2Cx communication when starting transfer or during transfer (TC or TCR flag are set)...
HAL_StatusTypeDef(* XferISR)(struct __I2C_HandleTypeDef *hi2c, uint32_t ITFlags, uint32_t ITSources)
__IO HAL_I2C_StateTypeDef State
__IO uint32_t XferOptions
static void I2C_ConvertOtherXferOptions(I2C_HandleTypeDef *hi2c)
Convert I2Cx OTHER_xxx XferOptions to functionnal XferOptions.
assert_param(IS_RTC_WAKEUP_CLOCK(WakeUpClock))

◆ HAL_I2C_Master_Transmit()

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

Transmits in master mode an amount of data in blocking mode.

Parameters
hi2cPointer to a I2C_HandleTypeDef structure that contains the configuration information for the specified I2C.
DevAddressTarget device address: The device 7 bits address value in datasheet must be shifted to the left before calling the interface
pDataPointer to data buffer
SizeAmount of data to be sent
TimeoutTimeout duration
Return values
HALstatus

Definition at line 1060 of file stm32l4xx_hal_i2c.c.

1061 {
1062  uint32_t tickstart;
1063 
1064  if (hi2c->State == HAL_I2C_STATE_READY)
1065  {
1066  /* Process Locked */
1067  __HAL_LOCK(hi2c);
1068 
1069  /* Init tickstart for timeout management*/
1070  tickstart = HAL_GetTick();
1071 
1072  if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY, tickstart) != HAL_OK)
1073  {
1074  return HAL_ERROR;
1075  }
1076 
1077  hi2c->State = HAL_I2C_STATE_BUSY_TX;
1078  hi2c->Mode = HAL_I2C_MODE_MASTER;
1079  hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
1080 
1081  /* Prepare transfer parameters */
1082  hi2c->pBuffPtr = pData;
1083  hi2c->XferCount = Size;
1084  hi2c->XferISR = NULL;
1085 
1086  /* Send Slave Address */
1087  /* Set NBYTES to write and reload if hi2c->XferCount > MAX_NBYTE_SIZE and generate RESTART */
1088  if (hi2c->XferCount > MAX_NBYTE_SIZE)
1089  {
1090  hi2c->XferSize = MAX_NBYTE_SIZE;
1091  I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_RELOAD_MODE, I2C_GENERATE_START_WRITE);
1092  }
1093  else
1094  {
1095  hi2c->XferSize = hi2c->XferCount;
1096  I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_AUTOEND_MODE, I2C_GENERATE_START_WRITE);
1097  }
1098 
1099  while (hi2c->XferCount > 0U)
1100  {
1101  /* Wait until TXIS flag is set */
1102  if (I2C_WaitOnTXISFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK)
1103  {
1104  return HAL_ERROR;
1105  }
1106  /* Write data to TXDR */
1107  hi2c->Instance->TXDR = *hi2c->pBuffPtr;
1108 
1109  /* Increment Buffer pointer */
1110  hi2c->pBuffPtr++;
1111 
1112  hi2c->XferCount--;
1113  hi2c->XferSize--;
1114 
1115  if ((hi2c->XferCount != 0U) && (hi2c->XferSize == 0U))
1116  {
1117  /* Wait until TCR flag is set */
1118  if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_TCR, RESET, Timeout, tickstart) != HAL_OK)
1119  {
1120  return HAL_ERROR;
1121  }
1122 
1123  if (hi2c->XferCount > MAX_NBYTE_SIZE)
1124  {
1125  hi2c->XferSize = MAX_NBYTE_SIZE;
1126  I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_RELOAD_MODE, I2C_NO_STARTSTOP);
1127  }
1128  else
1129  {
1130  hi2c->XferSize = hi2c->XferCount;
1131  I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_AUTOEND_MODE, I2C_NO_STARTSTOP);
1132  }
1133  }
1134  }
1135 
1136  /* No need to Check TC flag, with AUTOEND mode the stop is automatically generated */
1137  /* Wait until STOPF flag is set */
1138  if (I2C_WaitOnSTOPFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK)
1139  {
1140  return HAL_ERROR;
1141  }
1142 
1143  /* Clear STOP Flag */
1144  __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF);
1145 
1146  /* Clear Configuration Register 2 */
1147  I2C_RESET_CR2(hi2c);
1148 
1149  hi2c->State = HAL_I2C_STATE_READY;
1150  hi2c->Mode = HAL_I2C_MODE_NONE;
1151 
1152  /* Process Unlocked */
1153  __HAL_UNLOCK(hi2c);
1154 
1155  return HAL_OK;
1156  }
1157  else
1158  {
1159  return HAL_BUSY;
1160  }
1161 }
static HAL_StatusTypeDef I2C_WaitOnTXISFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Timeout, uint32_t Tickstart)
This function handles I2C Communication Timeout for specific usage of TXIS flag.
uint32_t HAL_GetTick(void)
Provide a tick value in millisecond.
__HAL_UNLOCK(hrtc)
__HAL_LOCK(hrtc)
static HAL_StatusTypeDef I2C_WaitOnSTOPFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Timeout, uint32_t Tickstart)
This function handles I2C Communication Timeout for specific usage of STOP flag.
return HAL_OK
__IO HAL_I2C_ModeTypeDef Mode
static void I2C_TransferConfig(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t Size, uint32_t Mode, uint32_t Request)
Handles I2Cx communication when starting transfer or during transfer (TC or TCR flag are set)...
HAL_StatusTypeDef(* XferISR)(struct __I2C_HandleTypeDef *hi2c, uint32_t ITFlags, uint32_t ITSources)
__IO HAL_I2C_StateTypeDef State
static HAL_StatusTypeDef I2C_WaitOnFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Flag, FlagStatus Status, uint32_t Timeout, uint32_t Tickstart)
This function handles I2C Communication Timeout.

◆ HAL_I2C_Master_Transmit_DMA()

HAL_StatusTypeDef HAL_I2C_Master_Transmit_DMA ( I2C_HandleTypeDef hi2c,
uint16_t  DevAddress,
uint8_t *  pData,
uint16_t  Size 
)

Transmit in master mode an amount of data in non-blocking mode with DMA.

Parameters
hi2cPointer to a I2C_HandleTypeDef structure that contains the configuration information for the specified I2C.
DevAddressTarget device address: The device 7 bits address value in datasheet must be shifted to the left before calling the interface
pDataPointer to data buffer
SizeAmount of data to be sent
Return values
HALstatus

Definition at line 1786 of file stm32l4xx_hal_i2c.c.

1787 {
1788  uint32_t xfermode;
1789  HAL_StatusTypeDef dmaxferstatus;
1790 
1791  if (hi2c->State == HAL_I2C_STATE_READY)
1792  {
1793  if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) == SET)
1794  {
1795  return HAL_BUSY;
1796  }
1797 
1798  /* Process Locked */
1799  __HAL_LOCK(hi2c);
1800 
1801  hi2c->State = HAL_I2C_STATE_BUSY_TX;
1802  hi2c->Mode = HAL_I2C_MODE_MASTER;
1803  hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
1804 
1805  /* Prepare transfer parameters */
1806  hi2c->pBuffPtr = pData;
1807  hi2c->XferCount = Size;
1808  hi2c->XferOptions = I2C_NO_OPTION_FRAME;
1809  hi2c->XferISR = I2C_Master_ISR_DMA;
1810 
1811  if (hi2c->XferCount > MAX_NBYTE_SIZE)
1812  {
1813  hi2c->XferSize = MAX_NBYTE_SIZE;
1814  xfermode = I2C_RELOAD_MODE;
1815  }
1816  else
1817  {
1818  hi2c->XferSize = hi2c->XferCount;
1819  xfermode = I2C_AUTOEND_MODE;
1820  }
1821 
1822  if (hi2c->XferSize > 0U)
1823  {
1824  if (hi2c->hdmatx != NULL)
1825  {
1826  /* Set the I2C DMA transfer complete callback */
1828 
1829  /* Set the DMA error callback */
1831 
1832  /* Set the unused DMA callbacks to NULL */
1833  hi2c->hdmatx->XferHalfCpltCallback = NULL;
1834  hi2c->hdmatx->XferAbortCallback = NULL;
1835 
1836  /* Enable the DMA channel */
1837  dmaxferstatus = HAL_DMA_Start_IT(hi2c->hdmatx, (uint32_t)pData, (uint32_t)&hi2c->Instance->TXDR, hi2c->XferSize);
1838  }
1839  else
1840  {
1841  /* Update I2C state */
1842  hi2c->State = HAL_I2C_STATE_READY;
1843  hi2c->Mode = HAL_I2C_MODE_NONE;
1844 
1845  /* Update I2C error code */
1846  hi2c->ErrorCode |= HAL_I2C_ERROR_DMA_PARAM;
1847 
1848  /* Process Unlocked */
1849  __HAL_UNLOCK(hi2c);
1850 
1851  return HAL_ERROR;
1852  }
1853 
1854  if (dmaxferstatus == HAL_OK)
1855  {
1856  /* Send Slave Address */
1857  /* Set NBYTES to write and reload if hi2c->XferCount > MAX_NBYTE_SIZE and generate RESTART */
1858  I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, xfermode, I2C_GENERATE_START_WRITE);
1859 
1860  /* Update XferCount value */
1861  hi2c->XferCount -= hi2c->XferSize;
1862 
1863  /* Process Unlocked */
1864  __HAL_UNLOCK(hi2c);
1865 
1866  /* Note : The I2C interrupts must be enabled after unlocking current process
1867  to avoid the risk of I2C interrupt handle execution before current
1868  process unlock */
1869  /* Enable ERR and NACK interrupts */
1870  I2C_Enable_IRQ(hi2c, I2C_XFER_ERROR_IT);
1871 
1872  /* Enable DMA Request */
1873  hi2c->Instance->CR1 |= I2C_CR1_TXDMAEN;
1874  }
1875  else
1876  {
1877  /* Update I2C state */
1878  hi2c->State = HAL_I2C_STATE_READY;
1879  hi2c->Mode = HAL_I2C_MODE_NONE;
1880 
1881  /* Update I2C error code */
1882  hi2c->ErrorCode |= HAL_I2C_ERROR_DMA;
1883 
1884  /* Process Unlocked */
1885  __HAL_UNLOCK(hi2c);
1886 
1887  return HAL_ERROR;
1888  }
1889  }
1890  else
1891  {
1892  /* Update Transfer ISR function pointer */
1893  hi2c->XferISR = I2C_Master_ISR_IT;
1894 
1895  /* Send Slave Address */
1896  /* Set NBYTES to write and generate START condition */
1897  I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_AUTOEND_MODE, I2C_GENERATE_START_WRITE);
1898 
1899  /* Process Unlocked */
1900  __HAL_UNLOCK(hi2c);
1901 
1902  /* Note : The I2C interrupts must be enabled after unlocking current process
1903  to avoid the risk of I2C interrupt handle execution before current
1904  process unlock */
1905  /* Enable ERR, TC, STOP, NACK, TXI interrupt */
1906  /* possible to enable all of these */
1907  /* I2C_IT_ERRI | I2C_IT_TCI| I2C_IT_STOPI| I2C_IT_NACKI | I2C_IT_ADDRI | I2C_IT_RXI | I2C_IT_TXI */
1908  I2C_Enable_IRQ(hi2c, I2C_XFER_TX_IT);
1909  }
1910 
1911  return HAL_OK;
1912  }
1913  else
1914  {
1915  return HAL_BUSY;
1916  }
1917 }
void(* XferAbortCallback)(struct __DMA_HandleTypeDef *hdma)
static void I2C_Enable_IRQ(I2C_HandleTypeDef *hi2c, uint16_t InterruptRequest)
Manage the enabling of Interrupts.
void(* XferCpltCallback)(struct __DMA_HandleTypeDef *hdma)
void(* XferErrorCallback)(struct __DMA_HandleTypeDef *hdma)
__HAL_UNLOCK(hrtc)
void(* XferHalfCpltCallback)(struct __DMA_HandleTypeDef *hdma)
static void I2C_DMAError(DMA_HandleTypeDef *hdma)
DMA I2C communication error callback.
HAL_StatusTypeDef HAL_DMA_Start_IT(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength)
Start the DMA Transfer with interrupt enabled.
__HAL_LOCK(hrtc)
return HAL_OK
static HAL_StatusTypeDef I2C_Master_ISR_IT(struct __I2C_HandleTypeDef *hi2c, uint32_t ITFlags, uint32_t ITSources)
Interrupt Sub-Routine which handle the Interrupt Flags Master Mode with Interrupt.
static void I2C_DMAMasterTransmitCplt(DMA_HandleTypeDef *hdma)
DMA I2C master transmit process complete callback.
__IO HAL_I2C_ModeTypeDef Mode
DMA_HandleTypeDef * hdmatx
static void I2C_TransferConfig(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t Size, uint32_t Mode, uint32_t Request)
Handles I2Cx communication when starting transfer or during transfer (TC or TCR flag are set)...
HAL_StatusTypeDef(* XferISR)(struct __I2C_HandleTypeDef *hi2c, uint32_t ITFlags, uint32_t ITSources)
__IO HAL_I2C_StateTypeDef State
__IO uint32_t XferOptions
static HAL_StatusTypeDef I2C_Master_ISR_DMA(struct __I2C_HandleTypeDef *hi2c, uint32_t ITFlags, uint32_t ITSources)
Interrupt Sub-Routine which handle the Interrupt Flags Master Mode with DMA.

◆ HAL_I2C_Master_Transmit_IT()

HAL_StatusTypeDef HAL_I2C_Master_Transmit_IT ( I2C_HandleTypeDef hi2c,
uint16_t  DevAddress,
uint8_t *  pData,
uint16_t  Size 
)

Transmit in master mode an amount of data in non-blocking mode with Interrupt.

Parameters
hi2cPointer to a I2C_HandleTypeDef structure that contains the configuration information for the specified I2C.
DevAddressTarget device address: The device 7 bits address value in datasheet must be shifted to the left before calling the interface
pDataPointer to data buffer
SizeAmount of data to be sent
Return values
HALstatus

Definition at line 1550 of file stm32l4xx_hal_i2c.c.

1551 {
1552  uint32_t xfermode;
1553 
1554  if (hi2c->State == HAL_I2C_STATE_READY)
1555  {
1556  if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) == SET)
1557  {
1558  return HAL_BUSY;
1559  }
1560 
1561  /* Process Locked */
1562  __HAL_LOCK(hi2c);
1563 
1564  hi2c->State = HAL_I2C_STATE_BUSY_TX;
1565  hi2c->Mode = HAL_I2C_MODE_MASTER;
1566  hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
1567 
1568  /* Prepare transfer parameters */
1569  hi2c->pBuffPtr = pData;
1570  hi2c->XferCount = Size;
1571  hi2c->XferOptions = I2C_NO_OPTION_FRAME;
1572  hi2c->XferISR = I2C_Master_ISR_IT;
1573 
1574  if (hi2c->XferCount > MAX_NBYTE_SIZE)
1575  {
1576  hi2c->XferSize = MAX_NBYTE_SIZE;
1577  xfermode = I2C_RELOAD_MODE;
1578  }
1579  else
1580  {
1581  hi2c->XferSize = hi2c->XferCount;
1582  xfermode = I2C_AUTOEND_MODE;
1583  }
1584 
1585  /* Send Slave Address */
1586  /* Set NBYTES to write and reload if hi2c->XferCount > MAX_NBYTE_SIZE */
1587  I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, xfermode, I2C_GENERATE_START_WRITE);
1588 
1589  /* Process Unlocked */
1590  __HAL_UNLOCK(hi2c);
1591 
1592  /* Note : The I2C interrupts must be enabled after unlocking current process
1593  to avoid the risk of I2C interrupt handle execution before current
1594  process unlock */
1595 
1596  /* Enable ERR, TC, STOP, NACK, TXI interrupt */
1597  /* possible to enable all of these */
1598  /* I2C_IT_ERRI | I2C_IT_TCI| I2C_IT_STOPI| I2C_IT_NACKI | I2C_IT_ADDRI | I2C_IT_RXI | I2C_IT_TXI */
1599  I2C_Enable_IRQ(hi2c, I2C_XFER_TX_IT);
1600 
1601  return HAL_OK;
1602  }
1603  else
1604  {
1605  return HAL_BUSY;
1606  }
1607 }
static void I2C_Enable_IRQ(I2C_HandleTypeDef *hi2c, uint16_t InterruptRequest)
Manage the enabling of Interrupts.
__HAL_UNLOCK(hrtc)
__HAL_LOCK(hrtc)
return HAL_OK
static HAL_StatusTypeDef I2C_Master_ISR_IT(struct __I2C_HandleTypeDef *hi2c, uint32_t ITFlags, uint32_t ITSources)
Interrupt Sub-Routine which handle the Interrupt Flags Master Mode with Interrupt.
__IO HAL_I2C_ModeTypeDef Mode
static void I2C_TransferConfig(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t Size, uint32_t Mode, uint32_t Request)
Handles I2Cx communication when starting transfer or during transfer (TC or TCR flag are set)...
HAL_StatusTypeDef(* XferISR)(struct __I2C_HandleTypeDef *hi2c, uint32_t ITFlags, uint32_t ITSources)
__IO HAL_I2C_StateTypeDef State
__IO uint32_t XferOptions

◆ HAL_I2C_Mem_Read()

HAL_StatusTypeDef HAL_I2C_Mem_Read ( I2C_HandleTypeDef hi2c,
uint16_t  DevAddress,
uint16_t  MemAddress,
uint16_t  MemAddSize,
uint8_t *  pData,
uint16_t  Size,
uint32_t  Timeout 
)

Read an amount of data in blocking mode from a specific memory address.

Parameters
hi2cPointer to a I2C_HandleTypeDef structure that contains the configuration information for the specified I2C.
DevAddressTarget device address: The device 7 bits address value in datasheet must be shifted to the left before calling the interface
MemAddressInternal memory address
MemAddSizeSize of internal memory address
pDataPointer to data buffer
SizeAmount of data to be sent
TimeoutTimeout duration
Return values
HALstatus

Definition at line 2415 of file stm32l4xx_hal_i2c.c.

2416 {
2417  uint32_t tickstart;
2418 
2419  /* Check the parameters */
2420  assert_param(IS_I2C_MEMADD_SIZE(MemAddSize));
2421 
2422  if (hi2c->State == HAL_I2C_STATE_READY)
2423  {
2424  if ((pData == NULL) || (Size == 0U))
2425  {
2426  hi2c->ErrorCode = HAL_I2C_ERROR_INVALID_PARAM;
2427  return HAL_ERROR;
2428  }
2429 
2430  /* Process Locked */
2431  __HAL_LOCK(hi2c);
2432 
2433  /* Init tickstart for timeout management*/
2434  tickstart = HAL_GetTick();
2435 
2436  if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY, tickstart) != HAL_OK)
2437  {
2438  return HAL_ERROR;
2439  }
2440 
2441  hi2c->State = HAL_I2C_STATE_BUSY_RX;
2442  hi2c->Mode = HAL_I2C_MODE_MEM;
2443  hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
2444 
2445  /* Prepare transfer parameters */
2446  hi2c->pBuffPtr = pData;
2447  hi2c->XferCount = Size;
2448  hi2c->XferISR = NULL;
2449 
2450  /* Send Slave Address and Memory Address */
2451  if (I2C_RequestMemoryRead(hi2c, DevAddress, MemAddress, MemAddSize, Timeout, tickstart) != HAL_OK)
2452  {
2453  /* Process Unlocked */
2454  __HAL_UNLOCK(hi2c);
2455  return HAL_ERROR;
2456  }
2457 
2458  /* Send Slave Address */
2459  /* Set NBYTES to write and reload if hi2c->XferCount > MAX_NBYTE_SIZE and generate RESTART */
2460  if (hi2c->XferCount > MAX_NBYTE_SIZE)
2461  {
2462  hi2c->XferSize = MAX_NBYTE_SIZE;
2463  I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_RELOAD_MODE, I2C_GENERATE_START_READ);
2464  }
2465  else
2466  {
2467  hi2c->XferSize = hi2c->XferCount;
2468  I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_AUTOEND_MODE, I2C_GENERATE_START_READ);
2469  }
2470 
2471  do
2472  {
2473  /* Wait until RXNE flag is set */
2474  if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_RXNE, RESET, Timeout, tickstart) != HAL_OK)
2475  {
2476  return HAL_ERROR;
2477  }
2478 
2479  /* Read data from RXDR */
2480  *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->RXDR;
2481 
2482  /* Increment Buffer pointer */
2483  hi2c->pBuffPtr++;
2484 
2485  hi2c->XferSize--;
2486  hi2c->XferCount--;
2487 
2488  if ((hi2c->XferCount != 0U) && (hi2c->XferSize == 0U))
2489  {
2490  /* Wait until TCR flag is set */
2491  if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_TCR, RESET, Timeout, tickstart) != HAL_OK)
2492  {
2493  return HAL_ERROR;
2494  }
2495 
2496  if (hi2c->XferCount > MAX_NBYTE_SIZE)
2497  {
2498  hi2c->XferSize = MAX_NBYTE_SIZE;
2499  I2C_TransferConfig(hi2c, DevAddress, (uint8_t) hi2c->XferSize, I2C_RELOAD_MODE, I2C_NO_STARTSTOP);
2500  }
2501  else
2502  {
2503  hi2c->XferSize = hi2c->XferCount;
2504  I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_AUTOEND_MODE, I2C_NO_STARTSTOP);
2505  }
2506  }
2507  }
2508  while (hi2c->XferCount > 0U);
2509 
2510  /* No need to Check TC flag, with AUTOEND mode the stop is automatically generated */
2511  /* Wait until STOPF flag is reset */
2512  if (I2C_WaitOnSTOPFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK)
2513  {
2514  return HAL_ERROR;
2515  }
2516 
2517  /* Clear STOP Flag */
2518  __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF);
2519 
2520  /* Clear Configuration Register 2 */
2521  I2C_RESET_CR2(hi2c);
2522 
2523  hi2c->State = HAL_I2C_STATE_READY;
2524  hi2c->Mode = HAL_I2C_MODE_NONE;
2525 
2526  /* Process Unlocked */
2527  __HAL_UNLOCK(hi2c);
2528 
2529  return HAL_OK;
2530  }
2531  else
2532  {
2533  return HAL_BUSY;
2534  }
2535 }
if(lpuartdiv >=LPUART_BRR_MIN_VALUE)
uint32_t HAL_GetTick(void)
Provide a tick value in millisecond.
__HAL_UNLOCK(hrtc)
__HAL_LOCK(hrtc)
static HAL_StatusTypeDef I2C_WaitOnSTOPFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Timeout, uint32_t Tickstart)
This function handles I2C Communication Timeout for specific usage of STOP flag.
return HAL_OK
__IO HAL_I2C_ModeTypeDef Mode
static void I2C_TransferConfig(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t Size, uint32_t Mode, uint32_t Request)
Handles I2Cx communication when starting transfer or during transfer (TC or TCR flag are set)...
HAL_StatusTypeDef(* XferISR)(struct __I2C_HandleTypeDef *hi2c, uint32_t ITFlags, uint32_t ITSources)
__IO HAL_I2C_StateTypeDef State
static HAL_StatusTypeDef I2C_RequestMemoryRead(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint32_t Timeout, uint32_t Tickstart)
Master sends target device address followed by internal memory address for read request.
assert_param(IS_RTC_WAKEUP_CLOCK(WakeUpClock))
static HAL_StatusTypeDef I2C_WaitOnFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Flag, FlagStatus Status, uint32_t Timeout, uint32_t Tickstart)
This function handles I2C Communication Timeout.

◆ HAL_I2C_Mem_Read_DMA()

HAL_StatusTypeDef HAL_I2C_Mem_Read_DMA ( I2C_HandleTypeDef hi2c,
uint16_t  DevAddress,
uint16_t  MemAddress,
uint16_t  MemAddSize,
uint8_t *  pData,
uint16_t  Size 
)

Reads an amount of data in non-blocking mode with DMA from a specific memory address.

Parameters
hi2cPointer to a I2C_HandleTypeDef structure that contains the configuration information for the specified I2C.
DevAddressTarget device address: The device 7 bits address value in datasheet must be shifted to the left before calling the interface
MemAddressInternal memory address
MemAddSizeSize of internal memory address
pDataPointer to data buffer
SizeAmount of data to be read
Return values
HALstatus

Definition at line 2873 of file stm32l4xx_hal_i2c.c.

2874 {
2875  uint32_t tickstart;
2876  uint32_t xfermode;
2877  HAL_StatusTypeDef dmaxferstatus;
2878 
2879  /* Check the parameters */
2880  assert_param(IS_I2C_MEMADD_SIZE(MemAddSize));
2881 
2882  if (hi2c->State == HAL_I2C_STATE_READY)
2883  {
2884  if ((pData == NULL) || (Size == 0U))
2885  {
2886  hi2c->ErrorCode = HAL_I2C_ERROR_INVALID_PARAM;
2887  return HAL_ERROR;
2888  }
2889 
2890  if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) == SET)
2891  {
2892  return HAL_BUSY;
2893  }
2894 
2895  /* Process Locked */
2896  __HAL_LOCK(hi2c);
2897 
2898  /* Init tickstart for timeout management*/
2899  tickstart = HAL_GetTick();
2900 
2901  hi2c->State = HAL_I2C_STATE_BUSY_RX;
2902  hi2c->Mode = HAL_I2C_MODE_MEM;
2903  hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
2904 
2905  /* Prepare transfer parameters */
2906  hi2c->pBuffPtr = pData;
2907  hi2c->XferCount = Size;
2908  hi2c->XferOptions = I2C_NO_OPTION_FRAME;
2909  hi2c->XferISR = I2C_Master_ISR_DMA;
2910 
2911  if (hi2c->XferCount > MAX_NBYTE_SIZE)
2912  {
2913  hi2c->XferSize = MAX_NBYTE_SIZE;
2914  xfermode = I2C_RELOAD_MODE;
2915  }
2916  else
2917  {
2918  hi2c->XferSize = hi2c->XferCount;
2919  xfermode = I2C_AUTOEND_MODE;
2920  }
2921 
2922  /* Send Slave Address and Memory Address */
2923  if (I2C_RequestMemoryRead(hi2c, DevAddress, MemAddress, MemAddSize, I2C_TIMEOUT_FLAG, tickstart) != HAL_OK)
2924  {
2925  /* Process Unlocked */
2926  __HAL_UNLOCK(hi2c);
2927  return HAL_ERROR;
2928  }
2929 
2930  if (hi2c->hdmarx != NULL)
2931  {
2932  /* Set the I2C DMA transfer complete callback */
2934 
2935  /* Set the DMA error callback */
2937 
2938  /* Set the unused DMA callbacks to NULL */
2939  hi2c->hdmarx->XferHalfCpltCallback = NULL;
2940  hi2c->hdmarx->XferAbortCallback = NULL;
2941 
2942  /* Enable the DMA channel */
2943  dmaxferstatus = HAL_DMA_Start_IT(hi2c->hdmarx, (uint32_t)&hi2c->Instance->RXDR, (uint32_t)pData, hi2c->XferSize);
2944  }
2945  else
2946  {
2947  /* Update I2C state */
2948  hi2c->State = HAL_I2C_STATE_READY;
2949  hi2c->Mode = HAL_I2C_MODE_NONE;
2950 
2951  /* Update I2C error code */
2952  hi2c->ErrorCode |= HAL_I2C_ERROR_DMA_PARAM;
2953 
2954  /* Process Unlocked */
2955  __HAL_UNLOCK(hi2c);
2956 
2957  return HAL_ERROR;
2958  }
2959 
2960  if (dmaxferstatus == HAL_OK)
2961  {
2962  /* Set NBYTES to write and reload if hi2c->XferCount > MAX_NBYTE_SIZE and generate RESTART */
2963  I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, xfermode, I2C_GENERATE_START_READ);
2964 
2965  /* Update XferCount value */
2966  hi2c->XferCount -= hi2c->XferSize;
2967 
2968  /* Process Unlocked */
2969  __HAL_UNLOCK(hi2c);
2970 
2971  /* Note : The I2C interrupts must be enabled after unlocking current process
2972  to avoid the risk of I2C interrupt handle execution before current
2973  process unlock */
2974  /* Enable ERR and NACK interrupts */
2975  I2C_Enable_IRQ(hi2c, I2C_XFER_ERROR_IT);
2976 
2977  /* Enable DMA Request */
2978  hi2c->Instance->CR1 |= I2C_CR1_RXDMAEN;
2979  }
2980  else
2981  {
2982  /* Update I2C state */
2983  hi2c->State = HAL_I2C_STATE_READY;
2984  hi2c->Mode = HAL_I2C_MODE_NONE;
2985 
2986  /* Update I2C error code */
2987  hi2c->ErrorCode |= HAL_I2C_ERROR_DMA;
2988 
2989  /* Process Unlocked */
2990  __HAL_UNLOCK(hi2c);
2991 
2992  return HAL_ERROR;
2993  }
2994 
2995  return HAL_OK;
2996  }
2997  else
2998  {
2999  return HAL_BUSY;
3000  }
3001 }
DMA_HandleTypeDef * hdmarx
void(* XferAbortCallback)(struct __DMA_HandleTypeDef *hdma)
static void I2C_Enable_IRQ(I2C_HandleTypeDef *hi2c, uint16_t InterruptRequest)
Manage the enabling of Interrupts.
void(* XferCpltCallback)(struct __DMA_HandleTypeDef *hdma)
static void I2C_DMAMasterReceiveCplt(DMA_HandleTypeDef *hdma)
DMA I2C master receive process complete callback.
uint32_t HAL_GetTick(void)
Provide a tick value in millisecond.
void(* XferErrorCallback)(struct __DMA_HandleTypeDef *hdma)
__HAL_UNLOCK(hrtc)
void(* XferHalfCpltCallback)(struct __DMA_HandleTypeDef *hdma)
static void I2C_DMAError(DMA_HandleTypeDef *hdma)
DMA I2C communication error callback.
HAL_StatusTypeDef HAL_DMA_Start_IT(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength)
Start the DMA Transfer with interrupt enabled.
__HAL_LOCK(hrtc)
return HAL_OK
__IO HAL_I2C_ModeTypeDef Mode
static void I2C_TransferConfig(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t Size, uint32_t Mode, uint32_t Request)
Handles I2Cx communication when starting transfer or during transfer (TC or TCR flag are set)...
HAL_StatusTypeDef(* XferISR)(struct __I2C_HandleTypeDef *hi2c, uint32_t ITFlags, uint32_t ITSources)
__IO HAL_I2C_StateTypeDef State
__IO uint32_t XferOptions
static HAL_StatusTypeDef I2C_Master_ISR_DMA(struct __I2C_HandleTypeDef *hi2c, uint32_t ITFlags, uint32_t ITSources)
Interrupt Sub-Routine which handle the Interrupt Flags Master Mode with DMA.
static HAL_StatusTypeDef I2C_RequestMemoryRead(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint32_t Timeout, uint32_t Tickstart)
Master sends target device address followed by internal memory address for read request.
assert_param(IS_RTC_WAKEUP_CLOCK(WakeUpClock))

◆ HAL_I2C_Mem_Read_IT()

HAL_StatusTypeDef HAL_I2C_Mem_Read_IT ( I2C_HandleTypeDef hi2c,
uint16_t  DevAddress,
uint16_t  MemAddress,
uint16_t  MemAddSize,
uint8_t *  pData,
uint16_t  Size 
)

Read an amount of data in non-blocking mode with Interrupt from a specific memory address.

Parameters
hi2cPointer to a I2C_HandleTypeDef structure that contains the configuration information for the specified I2C.
DevAddressTarget device address: The device 7 bits address value in datasheet must be shifted to the left before calling the interface
MemAddressInternal memory address
MemAddSizeSize of internal memory address
pDataPointer to data buffer
SizeAmount of data to be sent
Return values
HALstatus

Definition at line 2639 of file stm32l4xx_hal_i2c.c.

2640 {
2641  uint32_t tickstart;
2642  uint32_t xfermode;
2643 
2644  /* Check the parameters */
2645  assert_param(IS_I2C_MEMADD_SIZE(MemAddSize));
2646 
2647  if (hi2c->State == HAL_I2C_STATE_READY)
2648  {
2649  if ((pData == NULL) || (Size == 0U))
2650  {
2651  hi2c->ErrorCode = HAL_I2C_ERROR_INVALID_PARAM;
2652  return HAL_ERROR;
2653  }
2654 
2655  if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) == SET)
2656  {
2657  return HAL_BUSY;
2658  }
2659 
2660  /* Process Locked */
2661  __HAL_LOCK(hi2c);
2662 
2663  /* Init tickstart for timeout management*/
2664  tickstart = HAL_GetTick();
2665 
2666  hi2c->State = HAL_I2C_STATE_BUSY_RX;
2667  hi2c->Mode = HAL_I2C_MODE_MEM;
2668  hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
2669 
2670  /* Prepare transfer parameters */
2671  hi2c->pBuffPtr = pData;
2672  hi2c->XferCount = Size;
2673  hi2c->XferOptions = I2C_NO_OPTION_FRAME;
2674  hi2c->XferISR = I2C_Master_ISR_IT;
2675 
2676  if (hi2c->XferCount > MAX_NBYTE_SIZE)
2677  {
2678  hi2c->XferSize = MAX_NBYTE_SIZE;
2679  xfermode = I2C_RELOAD_MODE;
2680  }
2681  else
2682  {
2683  hi2c->XferSize = hi2c->XferCount;
2684  xfermode = I2C_AUTOEND_MODE;
2685  }
2686 
2687  /* Send Slave Address and Memory Address */
2688  if (I2C_RequestMemoryRead(hi2c, DevAddress, MemAddress, MemAddSize, I2C_TIMEOUT_FLAG, tickstart) != HAL_OK)
2689  {
2690  /* Process Unlocked */
2691  __HAL_UNLOCK(hi2c);
2692  return HAL_ERROR;
2693  }
2694 
2695  /* Set NBYTES to write and reload if hi2c->XferCount > MAX_NBYTE_SIZE and generate RESTART */
2696  I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, xfermode, I2C_GENERATE_START_READ);
2697 
2698  /* Process Unlocked */
2699  __HAL_UNLOCK(hi2c);
2700 
2701  /* Note : The I2C interrupts must be enabled after unlocking current process
2702  to avoid the risk of I2C interrupt handle execution before current
2703  process unlock */
2704 
2705  /* Enable ERR, TC, STOP, NACK, RXI interrupt */
2706  /* possible to enable all of these */
2707  /* I2C_IT_ERRI | I2C_IT_TCI| I2C_IT_STOPI| I2C_IT_NACKI | I2C_IT_ADDRI | I2C_IT_RXI | I2C_IT_TXI */
2708  I2C_Enable_IRQ(hi2c, I2C_XFER_RX_IT);
2709 
2710  return HAL_OK;
2711  }
2712  else
2713  {
2714  return HAL_BUSY;
2715  }
2716 }
static void I2C_Enable_IRQ(I2C_HandleTypeDef *hi2c, uint16_t InterruptRequest)
Manage the enabling of Interrupts.
uint32_t HAL_GetTick(void)
Provide a tick value in millisecond.
__HAL_UNLOCK(hrtc)
__HAL_LOCK(hrtc)
return HAL_OK
static HAL_StatusTypeDef I2C_Master_ISR_IT(struct __I2C_HandleTypeDef *hi2c, uint32_t ITFlags, uint32_t ITSources)
Interrupt Sub-Routine which handle the Interrupt Flags Master Mode with Interrupt.
__IO HAL_I2C_ModeTypeDef Mode
static void I2C_TransferConfig(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t Size, uint32_t Mode, uint32_t Request)
Handles I2Cx communication when starting transfer or during transfer (TC or TCR flag are set)...
HAL_StatusTypeDef(* XferISR)(struct __I2C_HandleTypeDef *hi2c, uint32_t ITFlags, uint32_t ITSources)
__IO HAL_I2C_StateTypeDef State
__IO uint32_t XferOptions
static HAL_StatusTypeDef I2C_RequestMemoryRead(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint32_t Timeout, uint32_t Tickstart)
Master sends target device address followed by internal memory address for read request.
assert_param(IS_RTC_WAKEUP_CLOCK(WakeUpClock))

◆ HAL_I2C_Mem_Write()

HAL_StatusTypeDef HAL_I2C_Mem_Write ( I2C_HandleTypeDef hi2c,
uint16_t  DevAddress,
uint16_t  MemAddress,
uint16_t  MemAddSize,
uint8_t *  pData,
uint16_t  Size,
uint32_t  Timeout 
)

Write an amount of data in blocking mode to a specific memory address.

Parameters
hi2cPointer to a I2C_HandleTypeDef structure that contains the configuration information for the specified I2C.
DevAddressTarget device address: The device 7 bits address value in datasheet must be shifted to the left before calling the interface
MemAddressInternal memory address
MemAddSizeSize of internal memory address
pDataPointer to data buffer
SizeAmount of data to be sent
TimeoutTimeout duration
Return values
HALstatus

Definition at line 2280 of file stm32l4xx_hal_i2c.c.

2281 {
2282  uint32_t tickstart;
2283 
2284  /* Check the parameters */
2285  assert_param(IS_I2C_MEMADD_SIZE(MemAddSize));
2286 
2287  if (hi2c->State == HAL_I2C_STATE_READY)
2288  {
2289  if ((pData == NULL) || (Size == 0U))
2290  {
2291  hi2c->ErrorCode = HAL_I2C_ERROR_INVALID_PARAM;
2292  return HAL_ERROR;
2293  }
2294 
2295  /* Process Locked */
2296  __HAL_LOCK(hi2c);
2297 
2298  /* Init tickstart for timeout management*/
2299  tickstart = HAL_GetTick();
2300 
2301  if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY, tickstart) != HAL_OK)
2302  {
2303  return HAL_ERROR;
2304  }
2305 
2306  hi2c->State = HAL_I2C_STATE_BUSY_TX;
2307  hi2c->Mode = HAL_I2C_MODE_MEM;
2308  hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
2309 
2310  /* Prepare transfer parameters */
2311  hi2c->pBuffPtr = pData;
2312  hi2c->XferCount = Size;
2313  hi2c->XferISR = NULL;
2314 
2315  /* Send Slave Address and Memory Address */
2316  if (I2C_RequestMemoryWrite(hi2c, DevAddress, MemAddress, MemAddSize, Timeout, tickstart) != HAL_OK)
2317  {
2318  /* Process Unlocked */
2319  __HAL_UNLOCK(hi2c);
2320  return HAL_ERROR;
2321  }
2322 
2323  /* Set NBYTES to write and reload if hi2c->XferCount > MAX_NBYTE_SIZE */
2324  if (hi2c->XferCount > MAX_NBYTE_SIZE)
2325  {
2326  hi2c->XferSize = MAX_NBYTE_SIZE;
2327  I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_RELOAD_MODE, I2C_NO_STARTSTOP);
2328  }
2329  else
2330  {
2331  hi2c->XferSize = hi2c->XferCount;
2332  I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_AUTOEND_MODE, I2C_NO_STARTSTOP);
2333  }
2334 
2335  do
2336  {
2337  /* Wait until TXIS flag is set */
2338  if (I2C_WaitOnTXISFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK)
2339  {
2340  return HAL_ERROR;
2341  }
2342 
2343  /* Write data to TXDR */
2344  hi2c->Instance->TXDR = *hi2c->pBuffPtr;
2345 
2346  /* Increment Buffer pointer */
2347  hi2c->pBuffPtr++;
2348 
2349  hi2c->XferCount--;
2350  hi2c->XferSize--;
2351 
2352  if ((hi2c->XferCount != 0U) && (hi2c->XferSize == 0U))
2353  {
2354  /* Wait until TCR flag is set */
2355  if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_TCR, RESET, Timeout, tickstart) != HAL_OK)
2356  {
2357  return HAL_ERROR;
2358  }
2359 
2360  if (hi2c->XferCount > MAX_NBYTE_SIZE)
2361  {
2362  hi2c->XferSize = MAX_NBYTE_SIZE;
2363  I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_RELOAD_MODE, I2C_NO_STARTSTOP);
2364  }
2365  else
2366  {
2367  hi2c->XferSize = hi2c->XferCount;
2368  I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_AUTOEND_MODE, I2C_NO_STARTSTOP);
2369  }
2370  }
2371 
2372  }
2373  while (hi2c->XferCount > 0U);
2374 
2375  /* No need to Check TC flag, with AUTOEND mode the stop is automatically generated */
2376  /* Wait until STOPF flag is reset */
2377  if (I2C_WaitOnSTOPFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK)
2378  {
2379  return HAL_ERROR;
2380  }
2381 
2382  /* Clear STOP Flag */
2383  __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF);
2384 
2385  /* Clear Configuration Register 2 */
2386  I2C_RESET_CR2(hi2c);
2387 
2388  hi2c->State = HAL_I2C_STATE_READY;
2389  hi2c->Mode = HAL_I2C_MODE_NONE;
2390 
2391  /* Process Unlocked */
2392  __HAL_UNLOCK(hi2c);
2393 
2394  return HAL_OK;
2395  }
2396  else
2397  {
2398  return HAL_BUSY;
2399  }
2400 }
static HAL_StatusTypeDef I2C_WaitOnTXISFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Timeout, uint32_t Tickstart)
This function handles I2C Communication Timeout for specific usage of TXIS flag.
uint32_t HAL_GetTick(void)
Provide a tick value in millisecond.
__HAL_UNLOCK(hrtc)
__HAL_LOCK(hrtc)
static HAL_StatusTypeDef I2C_WaitOnSTOPFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Timeout, uint32_t Tickstart)
This function handles I2C Communication Timeout for specific usage of STOP flag.
return HAL_OK
static HAL_StatusTypeDef I2C_RequestMemoryWrite(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint32_t Timeout, uint32_t Tickstart)
Master sends target device address followed by internal memory address for write request.
__IO HAL_I2C_ModeTypeDef Mode
static void I2C_TransferConfig(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t Size, uint32_t Mode, uint32_t Request)
Handles I2Cx communication when starting transfer or during transfer (TC or TCR flag are set)...
HAL_StatusTypeDef(* XferISR)(struct __I2C_HandleTypeDef *hi2c, uint32_t ITFlags, uint32_t ITSources)
__IO HAL_I2C_StateTypeDef State
assert_param(IS_RTC_WAKEUP_CLOCK(WakeUpClock))
static HAL_StatusTypeDef I2C_WaitOnFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Flag, FlagStatus Status, uint32_t Timeout, uint32_t Tickstart)
This function handles I2C Communication Timeout.

◆ HAL_I2C_Mem_Write_DMA()

HAL_StatusTypeDef HAL_I2C_Mem_Write_DMA ( I2C_HandleTypeDef hi2c,
uint16_t  DevAddress,
uint16_t  MemAddress,
uint16_t  MemAddSize,
uint8_t *  pData,
uint16_t  Size 
)

Write an amount of data in non-blocking mode with DMA to a specific memory address.

Parameters
hi2cPointer to a I2C_HandleTypeDef structure that contains the configuration information for the specified I2C.
DevAddressTarget device address: The device 7 bits address value in datasheet must be shifted to the left before calling the interface
MemAddressInternal memory address
MemAddSizeSize of internal memory address
pDataPointer to data buffer
SizeAmount of data to be sent
Return values
HALstatus

Definition at line 2729 of file stm32l4xx_hal_i2c.c.

2730 {
2731  uint32_t tickstart;
2732  uint32_t xfermode;
2733  HAL_StatusTypeDef dmaxferstatus;
2734 
2735  /* Check the parameters */
2736  assert_param(IS_I2C_MEMADD_SIZE(MemAddSize));
2737 
2738  if (hi2c->State == HAL_I2C_STATE_READY)
2739  {
2740  if ((pData == NULL) || (Size == 0U))
2741  {
2742  hi2c->ErrorCode = HAL_I2C_ERROR_INVALID_PARAM;
2743  return HAL_ERROR;
2744  }
2745 
2746  if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) == SET)
2747  {
2748  return HAL_BUSY;
2749  }
2750 
2751  /* Process Locked */
2752  __HAL_LOCK(hi2c);
2753 
2754  /* Init tickstart for timeout management*/
2755  tickstart = HAL_GetTick();
2756 
2757  hi2c->State = HAL_I2C_STATE_BUSY_TX;
2758  hi2c->Mode = HAL_I2C_MODE_MEM;
2759  hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
2760 
2761  /* Prepare transfer parameters */
2762  hi2c->pBuffPtr = pData;
2763  hi2c->XferCount = Size;
2764  hi2c->XferOptions = I2C_NO_OPTION_FRAME;
2765  hi2c->XferISR = I2C_Master_ISR_DMA;
2766 
2767  if (hi2c->XferCount > MAX_NBYTE_SIZE)
2768  {
2769  hi2c->XferSize = MAX_NBYTE_SIZE;
2770  xfermode = I2C_RELOAD_MODE;
2771  }
2772  else
2773  {
2774  hi2c->XferSize = hi2c->XferCount;
2775  xfermode = I2C_AUTOEND_MODE;
2776  }
2777 
2778  /* Send Slave Address and Memory Address */
2779  if (I2C_RequestMemoryWrite(hi2c, DevAddress, MemAddress, MemAddSize, I2C_TIMEOUT_FLAG, tickstart) != HAL_OK)
2780  {
2781  /* Process Unlocked */
2782  __HAL_UNLOCK(hi2c);
2783  return HAL_ERROR;
2784  }
2785 
2786 
2787  if (hi2c->hdmatx != NULL)
2788  {
2789  /* Set the I2C DMA transfer complete callback */
2791 
2792  /* Set the DMA error callback */
2794 
2795  /* Set the unused DMA callbacks to NULL */
2796  hi2c->hdmatx->XferHalfCpltCallback = NULL;
2797  hi2c->hdmatx->XferAbortCallback = NULL;
2798 
2799  /* Enable the DMA channel */
2800  dmaxferstatus = HAL_DMA_Start_IT(hi2c->hdmatx, (uint32_t)pData, (uint32_t)&hi2c->Instance->TXDR, hi2c->XferSize);
2801  }
2802  else
2803  {
2804  /* Update I2C state */
2805  hi2c->State = HAL_I2C_STATE_READY;
2806  hi2c->Mode = HAL_I2C_MODE_NONE;
2807 
2808  /* Update I2C error code */
2809  hi2c->ErrorCode |= HAL_I2C_ERROR_DMA_PARAM;
2810 
2811  /* Process Unlocked */
2812  __HAL_UNLOCK(hi2c);
2813 
2814  return HAL_ERROR;
2815  }
2816 
2817  if (dmaxferstatus == HAL_OK)
2818  {
2819  /* Send Slave Address */
2820  /* Set NBYTES to write and reload if hi2c->XferCount > MAX_NBYTE_SIZE and generate RESTART */
2821  I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, xfermode, I2C_NO_STARTSTOP);
2822 
2823  /* Update XferCount value */
2824  hi2c->XferCount -= hi2c->XferSize;
2825 
2826  /* Process Unlocked */
2827  __HAL_UNLOCK(hi2c);
2828 
2829  /* Note : The I2C interrupts must be enabled after unlocking current process
2830  to avoid the risk of I2C interrupt handle execution before current
2831  process unlock */
2832  /* Enable ERR and NACK interrupts */
2833  I2C_Enable_IRQ(hi2c, I2C_XFER_ERROR_IT);
2834 
2835  /* Enable DMA Request */
2836  hi2c->Instance->CR1 |= I2C_CR1_TXDMAEN;
2837  }
2838  else
2839  {
2840  /* Update I2C state */
2841  hi2c->State = HAL_I2C_STATE_READY;
2842  hi2c->Mode = HAL_I2C_MODE_NONE;
2843 
2844  /* Update I2C error code */
2845  hi2c->ErrorCode |= HAL_I2C_ERROR_DMA;
2846 
2847  /* Process Unlocked */
2848  __HAL_UNLOCK(hi2c);
2849 
2850  return HAL_ERROR;
2851  }
2852 
2853  return HAL_OK;
2854  }
2855  else
2856  {
2857  return HAL_BUSY;
2858  }
2859 }
void(* XferAbortCallback)(struct __DMA_HandleTypeDef *hdma)
static void I2C_Enable_IRQ(I2C_HandleTypeDef *hi2c, uint16_t InterruptRequest)
Manage the enabling of Interrupts.
void(* XferCpltCallback)(struct __DMA_HandleTypeDef *hdma)
uint32_t HAL_GetTick(void)
Provide a tick value in millisecond.
void(* XferErrorCallback)(struct __DMA_HandleTypeDef *hdma)
__HAL_UNLOCK(hrtc)
void(* XferHalfCpltCallback)(struct __DMA_HandleTypeDef *hdma)
static void I2C_DMAError(DMA_HandleTypeDef *hdma)
DMA I2C communication error callback.
HAL_StatusTypeDef HAL_DMA_Start_IT(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength)
Start the DMA Transfer with interrupt enabled.
__HAL_LOCK(hrtc)
return HAL_OK
static HAL_StatusTypeDef I2C_RequestMemoryWrite(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint32_t Timeout, uint32_t Tickstart)
Master sends target device address followed by internal memory address for write request.
static void I2C_DMAMasterTransmitCplt(DMA_HandleTypeDef *hdma)
DMA I2C master transmit process complete callback.
__IO HAL_I2C_ModeTypeDef Mode
DMA_HandleTypeDef * hdmatx
static void I2C_TransferConfig(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t Size, uint32_t Mode, uint32_t Request)
Handles I2Cx communication when starting transfer or during transfer (TC or TCR flag are set)...
HAL_StatusTypeDef(* XferISR)(struct __I2C_HandleTypeDef *hi2c, uint32_t ITFlags, uint32_t ITSources)
__IO HAL_I2C_StateTypeDef State
__IO uint32_t XferOptions
static HAL_StatusTypeDef I2C_Master_ISR_DMA(struct __I2C_HandleTypeDef *hi2c, uint32_t ITFlags, uint32_t ITSources)
Interrupt Sub-Routine which handle the Interrupt Flags Master Mode with DMA.
assert_param(IS_RTC_WAKEUP_CLOCK(WakeUpClock))

◆ HAL_I2C_Mem_Write_IT()

HAL_StatusTypeDef HAL_I2C_Mem_Write_IT ( I2C_HandleTypeDef hi2c,
uint16_t  DevAddress,
uint16_t  MemAddress,
uint16_t  MemAddSize,
uint8_t *  pData,
uint16_t  Size 
)

Write an amount of data in non-blocking mode with Interrupt to a specific memory address.

Parameters
hi2cPointer to a I2C_HandleTypeDef structure that contains the configuration information for the specified I2C.
DevAddressTarget device address: The device 7 bits address value in datasheet must be shifted to the left before calling the interface
MemAddressInternal memory address
MemAddSizeSize of internal memory address
pDataPointer to data buffer
SizeAmount of data to be sent
Return values
HALstatus

Definition at line 2548 of file stm32l4xx_hal_i2c.c.

2549 {
2550  uint32_t tickstart;
2551  uint32_t xfermode;
2552 
2553  /* Check the parameters */
2554  assert_param(IS_I2C_MEMADD_SIZE(MemAddSize));
2555 
2556  if (hi2c->State == HAL_I2C_STATE_READY)
2557  {
2558  if ((pData == NULL) || (Size == 0U))
2559  {
2560  hi2c->ErrorCode = HAL_I2C_ERROR_INVALID_PARAM;
2561  return HAL_ERROR;
2562  }
2563 
2564  if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) == SET)
2565  {
2566  return HAL_BUSY;
2567  }
2568 
2569  /* Process Locked */
2570  __HAL_LOCK(hi2c);
2571 
2572  /* Init tickstart for timeout management*/
2573  tickstart = HAL_GetTick();
2574 
2575  hi2c->State = HAL_I2C_STATE_BUSY_TX;
2576  hi2c->Mode = HAL_I2C_MODE_MEM;
2577  hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
2578 
2579  /* Prepare transfer parameters */
2580  hi2c->pBuffPtr = pData;
2581  hi2c->XferCount = Size;
2582  hi2c->XferOptions = I2C_NO_OPTION_FRAME;
2583  hi2c->XferISR = I2C_Master_ISR_IT;
2584 
2585  if (hi2c->XferCount > MAX_NBYTE_SIZE)
2586  {
2587  hi2c->XferSize = MAX_NBYTE_SIZE;
2588  xfermode = I2C_RELOAD_MODE;
2589  }
2590  else
2591  {
2592  hi2c->XferSize = hi2c->XferCount;
2593  xfermode = I2C_AUTOEND_MODE;
2594  }
2595 
2596  /* Send Slave Address and Memory Address */
2597  if (I2C_RequestMemoryWrite(hi2c, DevAddress, MemAddress, MemAddSize, I2C_TIMEOUT_FLAG, tickstart) != HAL_OK)
2598  {
2599  /* Process Unlocked */
2600  __HAL_UNLOCK(hi2c);
2601  return HAL_ERROR;
2602  }
2603 
2604  /* Set NBYTES to write and reload if hi2c->XferCount > MAX_NBYTE_SIZE and generate RESTART */
2605  I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, xfermode, I2C_NO_STARTSTOP);
2606 
2607  /* Process Unlocked */
2608  __HAL_UNLOCK(hi2c);
2609 
2610  /* Note : The I2C interrupts must be enabled after unlocking current process
2611  to avoid the risk of I2C interrupt handle execution before current
2612  process unlock */
2613 
2614  /* Enable ERR, TC, STOP, NACK, TXI interrupt */
2615  /* possible to enable all of these */
2616  /* I2C_IT_ERRI | I2C_IT_TCI| I2C_IT_STOPI| I2C_IT_NACKI | I2C_IT_ADDRI | I2C_IT_RXI | I2C_IT_TXI */
2617  I2C_Enable_IRQ(hi2c, I2C_XFER_TX_IT);
2618 
2619  return HAL_OK;
2620  }
2621  else
2622  {
2623  return HAL_BUSY;
2624  }
2625 }
static void I2C_Enable_IRQ(I2C_HandleTypeDef *hi2c, uint16_t InterruptRequest)
Manage the enabling of Interrupts.
uint32_t HAL_GetTick(void)
Provide a tick value in millisecond.
__HAL_UNLOCK(hrtc)
__HAL_LOCK(hrtc)
return HAL_OK
static HAL_StatusTypeDef I2C_RequestMemoryWrite(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint32_t Timeout, uint32_t Tickstart)
Master sends target device address followed by internal memory address for write request.
static HAL_StatusTypeDef I2C_Master_ISR_IT(struct __I2C_HandleTypeDef *hi2c, uint32_t ITFlags, uint32_t ITSources)
Interrupt Sub-Routine which handle the Interrupt Flags Master Mode with Interrupt.
__IO HAL_I2C_ModeTypeDef Mode
static void I2C_TransferConfig(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t Size, uint32_t Mode, uint32_t Request)
Handles I2Cx communication when starting transfer or during transfer (TC or TCR flag are set)...
HAL_StatusTypeDef(* XferISR)(struct __I2C_HandleTypeDef *hi2c, uint32_t ITFlags, uint32_t ITSources)
__IO HAL_I2C_StateTypeDef State
__IO uint32_t XferOptions
assert_param(IS_RTC_WAKEUP_CLOCK(WakeUpClock))

◆ HAL_I2C_Slave_Receive()

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

Receive in slave mode an amount of data in blocking mode.

Parameters
hi2cPointer to a I2C_HandleTypeDef structure that contains the configuration information for the specified I2C.
pDataPointer to data buffer
SizeAmount of data to be sent
TimeoutTimeout duration
Return values
HALstatus

Definition at line 1424 of file stm32l4xx_hal_i2c.c.

1425 {
1426  uint32_t tickstart;
1427 
1428  if (hi2c->State == HAL_I2C_STATE_READY)
1429  {
1430  if ((pData == NULL) || (Size == 0U))
1431  {
1432  hi2c->ErrorCode = HAL_I2C_ERROR_INVALID_PARAM;
1433  return HAL_ERROR;
1434  }
1435  /* Process Locked */
1436  __HAL_LOCK(hi2c);
1437 
1438  /* Init tickstart for timeout management*/
1439  tickstart = HAL_GetTick();
1440 
1441  hi2c->State = HAL_I2C_STATE_BUSY_RX;
1442  hi2c->Mode = HAL_I2C_MODE_SLAVE;
1443  hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
1444 
1445  /* Prepare transfer parameters */
1446  hi2c->pBuffPtr = pData;
1447  hi2c->XferCount = Size;
1448  hi2c->XferISR = NULL;
1449 
1450  /* Enable Address Acknowledge */
1451  hi2c->Instance->CR2 &= ~I2C_CR2_NACK;
1452 
1453  /* Wait until ADDR flag is set */
1454  if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, RESET, Timeout, tickstart) != HAL_OK)
1455  {
1456  /* Disable Address Acknowledge */
1457  hi2c->Instance->CR2 |= I2C_CR2_NACK;
1458  return HAL_ERROR;
1459  }
1460 
1461  /* Clear ADDR flag */
1462  __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_ADDR);
1463 
1464  /* Wait until DIR flag is reset Receiver mode */
1465  if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_DIR, SET, Timeout, tickstart) != HAL_OK)
1466  {
1467  /* Disable Address Acknowledge */
1468  hi2c->Instance->CR2 |= I2C_CR2_NACK;
1469  return HAL_ERROR;
1470  }
1471 
1472  while (hi2c->XferCount > 0U)
1473  {
1474  /* Wait until RXNE flag is set */
1475  if (I2C_WaitOnRXNEFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK)
1476  {
1477  /* Disable Address Acknowledge */
1478  hi2c->Instance->CR2 |= I2C_CR2_NACK;
1479 
1480  /* Store Last receive data if any */
1481  if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_RXNE) == SET)
1482  {
1483  /* Read data from RXDR */
1484  *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->RXDR;
1485 
1486  /* Increment Buffer pointer */
1487  hi2c->pBuffPtr++;
1488 
1489  hi2c->XferCount--;
1490  }
1491 
1492  return HAL_ERROR;
1493  }
1494 
1495  /* Read data from RXDR */
1496  *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->RXDR;
1497 
1498  /* Increment Buffer pointer */
1499  hi2c->pBuffPtr++;
1500 
1501  hi2c->XferCount--;
1502  }
1503 
1504  /* Wait until STOP flag is set */
1505  if (I2C_WaitOnSTOPFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK)
1506  {
1507  /* Disable Address Acknowledge */
1508  hi2c->Instance->CR2 |= I2C_CR2_NACK;
1509  return HAL_ERROR;
1510  }
1511 
1512  /* Clear STOP flag */
1513  __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF);
1514 
1515  /* Wait until BUSY flag is reset */
1516  if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, Timeout, tickstart) != HAL_OK)
1517  {
1518  /* Disable Address Acknowledge */
1519  hi2c->Instance->CR2 |= I2C_CR2_NACK;
1520  return HAL_ERROR;
1521  }
1522 
1523  /* Disable Address Acknowledge */
1524  hi2c->Instance->CR2 |= I2C_CR2_NACK;
1525 
1526  hi2c->State = HAL_I2C_STATE_READY;
1527  hi2c->Mode = HAL_I2C_MODE_NONE;
1528 
1529  /* Process Unlocked */
1530  __HAL_UNLOCK(hi2c);
1531 
1532  return HAL_OK;
1533  }
1534  else
1535  {
1536  return HAL_BUSY;
1537  }
1538 }
uint32_t HAL_GetTick(void)
Provide a tick value in millisecond.
__HAL_UNLOCK(hrtc)
static HAL_StatusTypeDef I2C_WaitOnRXNEFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Timeout, uint32_t Tickstart)
This function handles I2C Communication Timeout for specific usage of RXNE flag.
__HAL_LOCK(hrtc)
static HAL_StatusTypeDef I2C_WaitOnSTOPFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Timeout, uint32_t Tickstart)
This function handles I2C Communication Timeout for specific usage of STOP flag.
return HAL_OK
__IO HAL_I2C_ModeTypeDef Mode
HAL_StatusTypeDef(* XferISR)(struct __I2C_HandleTypeDef *hi2c, uint32_t ITFlags, uint32_t ITSources)
__IO HAL_I2C_StateTypeDef State
static HAL_StatusTypeDef I2C_WaitOnFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Flag, FlagStatus Status, uint32_t Timeout, uint32_t Tickstart)
This function handles I2C Communication Timeout.

◆ HAL_I2C_Slave_Receive_DMA()

HAL_StatusTypeDef HAL_I2C_Slave_Receive_DMA ( I2C_HandleTypeDef hi2c,
uint8_t *  pData,
uint16_t  Size 
)

Receive in slave mode an amount of data in non-blocking mode with DMA.

Parameters
hi2cPointer to a I2C_HandleTypeDef structure that contains the configuration information for the specified I2C.
pDataPointer to data buffer
SizeAmount of data to be sent
Return values
HALstatus

Definition at line 2173 of file stm32l4xx_hal_i2c.c.

2174 {
2175  HAL_StatusTypeDef dmaxferstatus;
2176 
2177  if (hi2c->State == HAL_I2C_STATE_READY)
2178  {
2179  if ((pData == NULL) || (Size == 0U))
2180  {
2181  hi2c->ErrorCode = HAL_I2C_ERROR_INVALID_PARAM;
2182  return HAL_ERROR;
2183  }
2184  /* Process Locked */
2185  __HAL_LOCK(hi2c);
2186 
2187  hi2c->State = HAL_I2C_STATE_BUSY_RX;
2188  hi2c->Mode = HAL_I2C_MODE_SLAVE;
2189  hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
2190 
2191  /* Prepare transfer parameters */
2192  hi2c->pBuffPtr = pData;
2193  hi2c->XferCount = Size;
2194  hi2c->XferSize = hi2c->XferCount;
2195  hi2c->XferOptions = I2C_NO_OPTION_FRAME;
2196  hi2c->XferISR = I2C_Slave_ISR_DMA;
2197 
2198  if (hi2c->hdmarx != NULL)
2199  {
2200  /* Set the I2C DMA transfer complete callback */
2202 
2203  /* Set the DMA error callback */
2205 
2206  /* Set the unused DMA callbacks to NULL */
2207  hi2c->hdmarx->XferHalfCpltCallback = NULL;
2208  hi2c->hdmarx->XferAbortCallback = NULL;
2209 
2210  /* Enable the DMA channel */
2211  dmaxferstatus = HAL_DMA_Start_IT(hi2c->hdmarx, (uint32_t)&hi2c->Instance->RXDR, (uint32_t)pData, hi2c->XferSize);
2212  }
2213  else
2214  {
2215  /* Update I2C state */
2216  hi2c->State = HAL_I2C_STATE_LISTEN;
2217  hi2c->Mode = HAL_I2C_MODE_NONE;
2218 
2219  /* Update I2C error code */
2220  hi2c->ErrorCode |= HAL_I2C_ERROR_DMA_PARAM;
2221 
2222  /* Process Unlocked */
2223  __HAL_UNLOCK(hi2c);
2224 
2225  return HAL_ERROR;
2226  }
2227 
2228  if (dmaxferstatus == HAL_OK)
2229  {
2230  /* Enable Address Acknowledge */
2231  hi2c->Instance->CR2 &= ~I2C_CR2_NACK;
2232 
2233  /* Process Unlocked */
2234  __HAL_UNLOCK(hi2c);
2235 
2236  /* Note : The I2C interrupts must be enabled after unlocking current process
2237  to avoid the risk of I2C interrupt handle execution before current
2238  process unlock */
2239  /* Enable ERR, STOP, NACK, ADDR interrupts */
2240  I2C_Enable_IRQ(hi2c, I2C_XFER_LISTEN_IT);
2241 
2242  /* Enable DMA Request */
2243  hi2c->Instance->CR1 |= I2C_CR1_RXDMAEN;
2244  }
2245  else
2246  {
2247  /* Update I2C state */
2248  hi2c->State = HAL_I2C_STATE_LISTEN;
2249  hi2c->Mode = HAL_I2C_MODE_NONE;
2250 
2251  /* Update I2C error code */
2252  hi2c->ErrorCode |= HAL_I2C_ERROR_DMA;
2253 
2254  /* Process Unlocked */
2255  __HAL_UNLOCK(hi2c);
2256 
2257  return HAL_ERROR;
2258  }
2259 
2260  return HAL_OK;
2261  }
2262  else
2263  {
2264  return HAL_BUSY;
2265  }
2266 }
DMA_HandleTypeDef * hdmarx
void(* XferAbortCallback)(struct __DMA_HandleTypeDef *hdma)
static HAL_StatusTypeDef I2C_Slave_ISR_DMA(struct __I2C_HandleTypeDef *hi2c, uint32_t ITFlags, uint32_t ITSources)
Interrupt Sub-Routine which handle the Interrupt Flags Slave Mode with DMA.
static void I2C_Enable_IRQ(I2C_HandleTypeDef *hi2c, uint16_t InterruptRequest)
Manage the enabling of Interrupts.
void(* XferCpltCallback)(struct __DMA_HandleTypeDef *hdma)
void(* XferErrorCallback)(struct __DMA_HandleTypeDef *hdma)
__HAL_UNLOCK(hrtc)
void(* XferHalfCpltCallback)(struct __DMA_HandleTypeDef *hdma)
static void I2C_DMAError(DMA_HandleTypeDef *hdma)
DMA I2C communication error callback.
HAL_StatusTypeDef HAL_DMA_Start_IT(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength)
Start the DMA Transfer with interrupt enabled.
__HAL_LOCK(hrtc)
return HAL_OK
__IO HAL_I2C_ModeTypeDef Mode
HAL_StatusTypeDef(* XferISR)(struct __I2C_HandleTypeDef *hi2c, uint32_t ITFlags, uint32_t ITSources)
__IO HAL_I2C_StateTypeDef State
__IO uint32_t XferOptions
static void I2C_DMASlaveReceiveCplt(DMA_HandleTypeDef *hdma)
DMA I2C slave receive process complete callback.

◆ HAL_I2C_Slave_Receive_IT()

HAL_StatusTypeDef HAL_I2C_Slave_Receive_IT ( I2C_HandleTypeDef hi2c,
uint8_t *  pData,
uint16_t  Size 
)

Receive in slave mode an amount of data in non-blocking mode with Interrupt.

Parameters
hi2cPointer to a I2C_HandleTypeDef structure that contains the configuration information for the specified I2C.
pDataPointer to data buffer
SizeAmount of data to be sent
Return values
HALstatus

Definition at line 1735 of file stm32l4xx_hal_i2c.c.

1736 {
1737  if (hi2c->State == HAL_I2C_STATE_READY)
1738  {
1739  /* Process Locked */
1740  __HAL_LOCK(hi2c);
1741 
1742  hi2c->State = HAL_I2C_STATE_BUSY_RX;
1743  hi2c->Mode = HAL_I2C_MODE_SLAVE;
1744  hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
1745 
1746  /* Enable Address Acknowledge */
1747  hi2c->Instance->CR2 &= ~I2C_CR2_NACK;
1748 
1749  /* Prepare transfer parameters */
1750  hi2c->pBuffPtr = pData;
1751  hi2c->XferCount = Size;
1752  hi2c->XferSize = hi2c->XferCount;
1753  hi2c->XferOptions = I2C_NO_OPTION_FRAME;
1754  hi2c->XferISR = I2C_Slave_ISR_IT;
1755 
1756  /* Process Unlocked */
1757  __HAL_UNLOCK(hi2c);
1758 
1759  /* Note : The I2C interrupts must be enabled after unlocking current process
1760  to avoid the risk of I2C interrupt handle execution before current
1761  process unlock */
1762 
1763  /* Enable ERR, TC, STOP, NACK, RXI interrupt */
1764  /* possible to enable all of these */
1765  /* I2C_IT_ERRI | I2C_IT_TCI| I2C_IT_STOPI| I2C_IT_NACKI | I2C_IT_ADDRI | I2C_IT_RXI | I2C_IT_TXI */
1766  I2C_Enable_IRQ(hi2c, I2C_XFER_RX_IT | I2C_XFER_LISTEN_IT);
1767 
1768  return HAL_OK;
1769  }
1770  else
1771  {
1772  return HAL_BUSY;
1773  }
1774 }
static void I2C_Enable_IRQ(I2C_HandleTypeDef *hi2c, uint16_t InterruptRequest)
Manage the enabling of Interrupts.
static HAL_StatusTypeDef I2C_Slave_ISR_IT(struct __I2C_HandleTypeDef *hi2c, uint32_t ITFlags, uint32_t ITSources)
Interrupt Sub-Routine which handle the Interrupt Flags Slave Mode with Interrupt. ...
__HAL_UNLOCK(hrtc)
__HAL_LOCK(hrtc)
return HAL_OK
__IO HAL_I2C_ModeTypeDef Mode
HAL_StatusTypeDef(* XferISR)(struct __I2C_HandleTypeDef *hi2c, uint32_t ITFlags, uint32_t ITSources)
__IO HAL_I2C_StateTypeDef State
__IO uint32_t XferOptions

◆ HAL_I2C_Slave_Seq_Receive_DMA()

HAL_StatusTypeDef HAL_I2C_Slave_Seq_Receive_DMA ( I2C_HandleTypeDef hi2c,
uint8_t *  pData,
uint16_t  Size,
uint32_t  XferOptions 
)

Sequential receive in slave/device I2C mode an amount of data in non-blocking mode with DMA.

Note
This interface allow to manage repeated start condition when a direction change during transfer
Parameters
hi2cPointer to a I2C_HandleTypeDef structure that contains the configuration information for the specified I2C.
pDataPointer to data buffer
SizeAmount of data to be sent
XferOptionsOptions of Transfer, value of I2C Sequential Transfer Options
Return values
HALstatus

Definition at line 4015 of file stm32l4xx_hal_i2c.c.

4016 {
4017  HAL_StatusTypeDef dmaxferstatus;
4018 
4019  /* Check the parameters */
4020  assert_param(IS_I2C_TRANSFER_OPTIONS_REQUEST(XferOptions));
4021 
4022  if (((uint32_t)hi2c->State & (uint32_t)HAL_I2C_STATE_LISTEN) == (uint32_t)HAL_I2C_STATE_LISTEN)
4023  {
4024  if ((pData == NULL) || (Size == 0U))
4025  {
4026  hi2c->ErrorCode = HAL_I2C_ERROR_INVALID_PARAM;
4027  return HAL_ERROR;
4028  }
4029 
4030  /* Disable Interrupts, to prevent preemption during treatment in case of multicall */
4031  I2C_Disable_IRQ(hi2c, I2C_XFER_LISTEN_IT | I2C_XFER_RX_IT);
4032 
4033  /* Process Locked */
4034  __HAL_LOCK(hi2c);
4035 
4036  /* I2C cannot manage full duplex exchange so disable previous IT enabled if any */
4037  /* and then toggle the HAL slave TX state to RX state */
4038  if (hi2c->State == HAL_I2C_STATE_BUSY_TX_LISTEN)
4039  {
4040  /* Disable associated Interrupts */
4041  I2C_Disable_IRQ(hi2c, I2C_XFER_TX_IT);
4042 
4043  if ((hi2c->Instance->CR1 & I2C_CR1_TXDMAEN) == I2C_CR1_TXDMAEN)
4044  {
4045  /* Abort DMA Xfer if any */
4046  if (hi2c->hdmatx != NULL)
4047  {
4048  hi2c->Instance->CR1 &= ~I2C_CR1_TXDMAEN;
4049 
4050  /* Set the I2C DMA Abort callback :
4051  will lead to call HAL_I2C_ErrorCallback() at end of DMA abort procedure */
4053 
4054  /* Abort DMA TX */
4055  if (HAL_DMA_Abort_IT(hi2c->hdmatx) != HAL_OK)
4056  {
4057  /* Call Directly XferAbortCallback function in case of error */
4058  hi2c->hdmatx->XferAbortCallback(hi2c->hdmatx);
4059  }
4060  }
4061  }
4062  }
4063  else if (hi2c->State == HAL_I2C_STATE_BUSY_RX_LISTEN)
4064  {
4065  if ((hi2c->Instance->CR1 & I2C_CR1_RXDMAEN) == I2C_CR1_RXDMAEN)
4066  {
4067  hi2c->Instance->CR1 &= ~I2C_CR1_RXDMAEN;
4068 
4069  /* Abort DMA Xfer if any */
4070  if (hi2c->hdmarx != NULL)
4071  {
4072  /* Set the I2C DMA Abort callback :
4073  will lead to call HAL_I2C_ErrorCallback() at end of DMA abort procedure */
4075 
4076  /* Abort DMA RX */
4077  if (HAL_DMA_Abort_IT(hi2c->hdmarx) != HAL_OK)
4078  {
4079  /* Call Directly XferAbortCallback function in case of error */
4080  hi2c->hdmarx->XferAbortCallback(hi2c->hdmarx);
4081  }
4082  }
4083  }
4084  }
4085  else
4086  {
4087  /* Nothing to do */
4088  }
4089 
4091  hi2c->Mode = HAL_I2C_MODE_SLAVE;
4092  hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
4093 
4094  /* Enable Address Acknowledge */
4095  hi2c->Instance->CR2 &= ~I2C_CR2_NACK;
4096 
4097  /* Prepare transfer parameters */
4098  hi2c->pBuffPtr = pData;
4099  hi2c->XferCount = Size;
4100  hi2c->XferSize = hi2c->XferCount;
4101  hi2c->XferOptions = XferOptions;
4102  hi2c->XferISR = I2C_Slave_ISR_DMA;
4103 
4104  if (hi2c->hdmarx != NULL)
4105  {
4106  /* Set the I2C DMA transfer complete callback */
4108 
4109  /* Set the DMA error callback */
4111 
4112  /* Set the unused DMA callbacks to NULL */
4113  hi2c->hdmarx->XferHalfCpltCallback = NULL;
4114  hi2c->hdmarx->XferAbortCallback = NULL;
4115 
4116  /* Enable the DMA channel */
4117  dmaxferstatus = HAL_DMA_Start_IT(hi2c->hdmarx, (uint32_t)&hi2c->Instance->RXDR, (uint32_t)pData, hi2c->XferSize);
4118  }
4119  else
4120  {
4121  /* Update I2C state */
4122  hi2c->State = HAL_I2C_STATE_LISTEN;
4123  hi2c->Mode = HAL_I2C_MODE_NONE;
4124 
4125  /* Update I2C error code */
4126  hi2c->ErrorCode |= HAL_I2C_ERROR_DMA_PARAM;
4127 
4128  /* Process Unlocked */
4129  __HAL_UNLOCK(hi2c);
4130 
4131  return HAL_ERROR;
4132  }
4133 
4134  if (dmaxferstatus == HAL_OK)
4135  {
4136  /* Update XferCount value */
4137  hi2c->XferCount -= hi2c->XferSize;
4138 
4139  /* Reset XferSize */
4140  hi2c->XferSize = 0;
4141  }
4142  else
4143  {
4144  /* Update I2C state */
4145  hi2c->State = HAL_I2C_STATE_LISTEN;
4146  hi2c->Mode = HAL_I2C_MODE_NONE;
4147 
4148  /* Update I2C error code */
4149  hi2c->ErrorCode |= HAL_I2C_ERROR_DMA;
4150 
4151  /* Process Unlocked */
4152  __HAL_UNLOCK(hi2c);
4153 
4154  return HAL_ERROR;
4155  }
4156 
4157  if (I2C_GET_DIR(hi2c) == I2C_DIRECTION_TRANSMIT)
4158  {
4159  /* Clear ADDR flag after prepare the transfer parameters */
4160  /* This action will generate an acknowledge to the Master */
4161  __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_ADDR);
4162  }
4163 
4164  /* Process Unlocked */
4165  __HAL_UNLOCK(hi2c);
4166 
4167  /* Note : The I2C interrupts must be enabled after unlocking current process
4168  to avoid the risk of I2C interrupt handle execution before current
4169  process unlock */
4170  /* REnable ADDR interrupt */
4171  I2C_Enable_IRQ(hi2c, I2C_XFER_RX_IT | I2C_XFER_LISTEN_IT);
4172 
4173  /* Enable DMA Request */
4174  hi2c->Instance->CR1 |= I2C_CR1_RXDMAEN;
4175 
4176  return HAL_OK;
4177  }
4178  else
4179  {
4180  return HAL_ERROR;
4181  }
4182 }
DMA_HandleTypeDef * hdmarx
void(* XferAbortCallback)(struct __DMA_HandleTypeDef *hdma)
static HAL_StatusTypeDef I2C_Slave_ISR_DMA(struct __I2C_HandleTypeDef *hi2c, uint32_t ITFlags, uint32_t ITSources)
Interrupt Sub-Routine which handle the Interrupt Flags Slave Mode with DMA.
static void I2C_Enable_IRQ(I2C_HandleTypeDef *hi2c, uint16_t InterruptRequest)
Manage the enabling of Interrupts.
void(* XferCpltCallback)(struct __DMA_HandleTypeDef *hdma)
void(* XferErrorCallback)(struct __DMA_HandleTypeDef *hdma)
HAL_StatusTypeDef HAL_DMA_Abort_IT(DMA_HandleTypeDef *hdma)
Aborts the DMA Transfer in Interrupt mode.
__HAL_UNLOCK(hrtc)
void(* XferHalfCpltCallback)(struct __DMA_HandleTypeDef *hdma)
static void I2C_DMAError(DMA_HandleTypeDef *hdma)
DMA I2C communication error callback.
HAL_StatusTypeDef HAL_DMA_Start_IT(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength)
Start the DMA Transfer with interrupt enabled.
__HAL_LOCK(hrtc)
return HAL_OK
__IO HAL_I2C_ModeTypeDef Mode
DMA_HandleTypeDef * hdmatx
static void I2C_Disable_IRQ(I2C_HandleTypeDef *hi2c, uint16_t InterruptRequest)
Manage the disabling of Interrupts.
HAL_StatusTypeDef(* XferISR)(struct __I2C_HandleTypeDef *hi2c, uint32_t ITFlags, uint32_t ITSources)
__IO HAL_I2C_StateTypeDef State
__IO uint32_t XferOptions
static void I2C_DMASlaveReceiveCplt(DMA_HandleTypeDef *hdma)
DMA I2C slave receive process complete callback.
static void I2C_DMAAbort(DMA_HandleTypeDef *hdma)
DMA I2C communication abort callback (To be called at end of DMA Abort procedure).
assert_param(IS_RTC_WAKEUP_CLOCK(WakeUpClock))

◆ HAL_I2C_Slave_Seq_Receive_IT()

HAL_StatusTypeDef HAL_I2C_Slave_Seq_Receive_IT ( I2C_HandleTypeDef hi2c,
uint8_t *  pData,
uint16_t  Size,
uint32_t  XferOptions 
)

Sequential receive in slave/device I2C mode an amount of data in non-blocking mode with Interrupt.

Note
This interface allow to manage repeated start condition when a direction change during transfer
Parameters
hi2cPointer to a I2C_HandleTypeDef structure that contains the configuration information for the specified I2C.
pDataPointer to data buffer
SizeAmount of data to be sent
XferOptionsOptions of Transfer, value of I2C Sequential Transfer Options
Return values
HALstatus

Definition at line 3920 of file stm32l4xx_hal_i2c.c.

3921 {
3922  /* Check the parameters */
3923  assert_param(IS_I2C_TRANSFER_OPTIONS_REQUEST(XferOptions));
3924 
3925  if (((uint32_t)hi2c->State & (uint32_t)HAL_I2C_STATE_LISTEN) == (uint32_t)HAL_I2C_STATE_LISTEN)
3926  {
3927  if ((pData == NULL) || (Size == 0U))
3928  {
3929  hi2c->ErrorCode = HAL_I2C_ERROR_INVALID_PARAM;
3930  return HAL_ERROR;
3931  }
3932 
3933  /* Disable Interrupts, to prevent preemption during treatment in case of multicall */
3934  I2C_Disable_IRQ(hi2c, I2C_XFER_LISTEN_IT | I2C_XFER_RX_IT);
3935 
3936  /* Process Locked */
3937  __HAL_LOCK(hi2c);
3938 
3939  /* I2C cannot manage full duplex exchange so disable previous IT enabled if any */
3940  /* and then toggle the HAL slave TX state to RX state */
3941  if (hi2c->State == HAL_I2C_STATE_BUSY_TX_LISTEN)
3942  {
3943  /* Disable associated Interrupts */
3944  I2C_Disable_IRQ(hi2c, I2C_XFER_TX_IT);
3945 
3946  if ((hi2c->Instance->CR1 & I2C_CR1_TXDMAEN) == I2C_CR1_TXDMAEN)
3947  {
3948  hi2c->Instance->CR1 &= ~I2C_CR1_TXDMAEN;
3949 
3950  /* Abort DMA Xfer if any */
3951  if (hi2c->hdmatx != NULL)
3952  {
3953  /* Set the I2C DMA Abort callback :
3954  will lead to call HAL_I2C_ErrorCallback() at end of DMA abort procedure */
3956 
3957  /* Abort DMA TX */
3958  if (HAL_DMA_Abort_IT(hi2c->hdmatx) != HAL_OK)
3959  {
3960  /* Call Directly XferAbortCallback function in case of error */
3961  hi2c->hdmatx->XferAbortCallback(hi2c->hdmatx);
3962  }
3963  }
3964  }
3965  }
3966 
3968  hi2c->Mode = HAL_I2C_MODE_SLAVE;
3969  hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
3970 
3971  /* Enable Address Acknowledge */
3972  hi2c->Instance->CR2 &= ~I2C_CR2_NACK;
3973 
3974  /* Prepare transfer parameters */
3975  hi2c->pBuffPtr = pData;
3976  hi2c->XferCount = Size;
3977  hi2c->XferSize = hi2c->XferCount;
3978  hi2c->XferOptions = XferOptions;
3979  hi2c->XferISR = I2C_Slave_ISR_IT;
3980 
3981  if (I2C_GET_DIR(hi2c) == I2C_DIRECTION_TRANSMIT)
3982  {
3983  /* Clear ADDR flag after prepare the transfer parameters */
3984  /* This action will generate an acknowledge to the Master */
3985  __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_ADDR);
3986  }
3987 
3988  /* Process Unlocked */
3989  __HAL_UNLOCK(hi2c);
3990 
3991  /* Note : The I2C interrupts must be enabled after unlocking current process
3992  to avoid the risk of I2C interrupt handle execution before current
3993  process unlock */
3994  /* REnable ADDR interrupt */
3995  I2C_Enable_IRQ(hi2c, I2C_XFER_RX_IT | I2C_XFER_LISTEN_IT);
3996 
3997  return HAL_OK;
3998  }
3999  else
4000  {
4001  return HAL_ERROR;
4002  }
4003 }
void(* XferAbortCallback)(struct __DMA_HandleTypeDef *hdma)
static void I2C_Enable_IRQ(I2C_HandleTypeDef *hi2c, uint16_t InterruptRequest)
Manage the enabling of Interrupts.
static HAL_StatusTypeDef I2C_Slave_ISR_IT(struct __I2C_HandleTypeDef *hi2c, uint32_t ITFlags, uint32_t ITSources)
Interrupt Sub-Routine which handle the Interrupt Flags Slave Mode with Interrupt. ...
HAL_StatusTypeDef HAL_DMA_Abort_IT(DMA_HandleTypeDef *hdma)
Aborts the DMA Transfer in Interrupt mode.
__HAL_UNLOCK(hrtc)
__HAL_LOCK(hrtc)
return HAL_OK
__IO HAL_I2C_ModeTypeDef Mode
DMA_HandleTypeDef * hdmatx
static void I2C_Disable_IRQ(I2C_HandleTypeDef *hi2c, uint16_t InterruptRequest)
Manage the disabling of Interrupts.
HAL_StatusTypeDef(* XferISR)(struct __I2C_HandleTypeDef *hi2c, uint32_t ITFlags, uint32_t ITSources)
__IO HAL_I2C_StateTypeDef State
__IO uint32_t XferOptions
static void I2C_DMAAbort(DMA_HandleTypeDef *hdma)
DMA I2C communication abort callback (To be called at end of DMA Abort procedure).
assert_param(IS_RTC_WAKEUP_CLOCK(WakeUpClock))

◆ HAL_I2C_Slave_Seq_Transmit_DMA()

HAL_StatusTypeDef HAL_I2C_Slave_Seq_Transmit_DMA ( I2C_HandleTypeDef hi2c,
uint8_t *  pData,
uint16_t  Size,
uint32_t  XferOptions 
)

Sequential transmit in slave/device I2C mode an amount of data in non-blocking mode with DMA.

Note
This interface allow to manage repeated start condition when a direction change during transfer
Parameters
hi2cPointer to a I2C_HandleTypeDef structure that contains the configuration information for the specified I2C.
pDataPointer to data buffer
SizeAmount of data to be sent
XferOptionsOptions of Transfer, value of I2C Sequential Transfer Options
Return values
HALstatus

Definition at line 3741 of file stm32l4xx_hal_i2c.c.

3742 {
3743  HAL_StatusTypeDef dmaxferstatus;
3744 
3745  /* Check the parameters */
3746  assert_param(IS_I2C_TRANSFER_OPTIONS_REQUEST(XferOptions));
3747 
3748  if (((uint32_t)hi2c->State & (uint32_t)HAL_I2C_STATE_LISTEN) == (uint32_t)HAL_I2C_STATE_LISTEN)
3749  {
3750  if ((pData == NULL) || (Size == 0U))
3751  {
3752  hi2c->ErrorCode = HAL_I2C_ERROR_INVALID_PARAM;
3753  return HAL_ERROR;
3754  }
3755 
3756  /* Process Locked */
3757  __HAL_LOCK(hi2c);
3758 
3759  /* Disable Interrupts, to prevent preemption during treatment in case of multicall */
3760  I2C_Disable_IRQ(hi2c, I2C_XFER_LISTEN_IT | I2C_XFER_TX_IT);
3761 
3762  /* I2C cannot manage full duplex exchange so disable previous IT enabled if any */
3763  /* and then toggle the HAL slave RX state to TX state */
3764  if (hi2c->State == HAL_I2C_STATE_BUSY_RX_LISTEN)
3765  {
3766  /* Disable associated Interrupts */
3767  I2C_Disable_IRQ(hi2c, I2C_XFER_RX_IT);
3768 
3769  if ((hi2c->Instance->CR1 & I2C_CR1_RXDMAEN) == I2C_CR1_RXDMAEN)
3770  {
3771  /* Abort DMA Xfer if any */
3772  if (hi2c->hdmarx != NULL)
3773  {
3774  hi2c->Instance->CR1 &= ~I2C_CR1_RXDMAEN;
3775 
3776  /* Set the I2C DMA Abort callback :
3777  will lead to call HAL_I2C_ErrorCallback() at end of DMA abort procedure */
3779 
3780  /* Abort DMA RX */
3781  if (HAL_DMA_Abort_IT(hi2c->hdmarx) != HAL_OK)
3782  {
3783  /* Call Directly XferAbortCallback function in case of error */
3784  hi2c->hdmarx->XferAbortCallback(hi2c->hdmarx);
3785  }
3786  }
3787  }
3788  }
3789  else if (hi2c->State == HAL_I2C_STATE_BUSY_TX_LISTEN)
3790  {
3791  if ((hi2c->Instance->CR1 & I2C_CR1_TXDMAEN) == I2C_CR1_TXDMAEN)
3792  {
3793  hi2c->Instance->CR1 &= ~I2C_CR1_TXDMAEN;
3794 
3795  /* Abort DMA Xfer if any */
3796  if (hi2c->hdmatx != NULL)
3797  {
3798  /* Set the I2C DMA Abort callback :
3799  will lead to call HAL_I2C_ErrorCallback() at end of DMA abort procedure */
3801 
3802  /* Abort DMA TX */
3803  if (HAL_DMA_Abort_IT(hi2c->hdmatx) != HAL_OK)
3804  {
3805  /* Call Directly XferAbortCallback function in case of error */
3806  hi2c->hdmatx->XferAbortCallback(hi2c->hdmatx);
3807  }
3808  }
3809  }
3810  }
3811  else
3812  {
3813  /* Nothing to do */
3814  }
3815 
3817  hi2c->Mode = HAL_I2C_MODE_SLAVE;
3818  hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
3819 
3820  /* Enable Address Acknowledge */
3821  hi2c->Instance->CR2 &= ~I2C_CR2_NACK;
3822 
3823  /* Prepare transfer parameters */
3824  hi2c->pBuffPtr = pData;
3825  hi2c->XferCount = Size;
3826  hi2c->XferSize = hi2c->XferCount;
3827  hi2c->XferOptions = XferOptions;
3828  hi2c->XferISR = I2C_Slave_ISR_DMA;
3829 
3830  if (hi2c->hdmatx != NULL)
3831  {
3832  /* Set the I2C DMA transfer complete callback */
3834 
3835  /* Set the DMA error callback */
3837 
3838  /* Set the unused DMA callbacks to NULL */
3839  hi2c->hdmatx->XferHalfCpltCallback = NULL;
3840  hi2c->hdmatx->XferAbortCallback = NULL;
3841 
3842  /* Enable the DMA channel */
3843  dmaxferstatus = HAL_DMA_Start_IT(hi2c->hdmatx, (uint32_t)pData, (uint32_t)&hi2c->Instance->TXDR, hi2c->XferSize);
3844  }
3845  else
3846  {
3847  /* Update I2C state */
3848  hi2c->State = HAL_I2C_STATE_LISTEN;
3849  hi2c->Mode = HAL_I2C_MODE_NONE;
3850 
3851  /* Update I2C error code */
3852  hi2c->ErrorCode |= HAL_I2C_ERROR_DMA_PARAM;
3853 
3854  /* Process Unlocked */
3855  __HAL_UNLOCK(hi2c);
3856 
3857  return HAL_ERROR;
3858  }
3859 
3860  if (dmaxferstatus == HAL_OK)
3861  {
3862  /* Update XferCount value */
3863  hi2c->XferCount -= hi2c->XferSize;
3864 
3865  /* Reset XferSize */
3866  hi2c->XferSize = 0;
3867  }
3868  else
3869  {
3870  /* Update I2C state */
3871  hi2c->State = HAL_I2C_STATE_LISTEN;
3872  hi2c->Mode = HAL_I2C_MODE_NONE;
3873 
3874  /* Update I2C error code */
3875  hi2c->ErrorCode |= HAL_I2C_ERROR_DMA;
3876 
3877  /* Process Unlocked */
3878  __HAL_UNLOCK(hi2c);
3879 
3880  return HAL_ERROR;
3881  }
3882 
3883  if (I2C_GET_DIR(hi2c) == I2C_DIRECTION_RECEIVE)
3884  {
3885  /* Clear ADDR flag after prepare the transfer parameters */
3886  /* This action will generate an acknowledge to the Master */
3887  __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_ADDR);
3888  }
3889 
3890  /* Process Unlocked */
3891  __HAL_UNLOCK(hi2c);
3892 
3893  /* Note : The I2C interrupts must be enabled after unlocking current process
3894  to avoid the risk of I2C interrupt handle execution before current
3895  process unlock */
3896  /* Enable ERR, STOP, NACK, ADDR interrupts */
3897  I2C_Enable_IRQ(hi2c, I2C_XFER_LISTEN_IT);
3898 
3899  /* Enable DMA Request */
3900  hi2c->Instance->CR1 |= I2C_CR1_TXDMAEN;
3901 
3902  return HAL_OK;
3903  }
3904  else
3905  {
3906  return HAL_ERROR;
3907  }
3908 }
DMA_HandleTypeDef * hdmarx
static void I2C_DMASlaveTransmitCplt(DMA_HandleTypeDef *hdma)
DMA I2C slave transmit process complete callback.
void(* XferAbortCallback)(struct __DMA_HandleTypeDef *hdma)
static HAL_StatusTypeDef I2C_Slave_ISR_DMA(struct __I2C_HandleTypeDef *hi2c, uint32_t ITFlags, uint32_t ITSources)
Interrupt Sub-Routine which handle the Interrupt Flags Slave Mode with DMA.
static void I2C_Enable_IRQ(I2C_HandleTypeDef *hi2c, uint16_t InterruptRequest)
Manage the enabling of Interrupts.
void(* XferCpltCallback)(struct __DMA_HandleTypeDef *hdma)
void(* XferErrorCallback)(struct __DMA_HandleTypeDef *hdma)
HAL_StatusTypeDef HAL_DMA_Abort_IT(DMA_HandleTypeDef *hdma)
Aborts the DMA Transfer in Interrupt mode.
__HAL_UNLOCK(hrtc)
void(* XferHalfCpltCallback)(struct __DMA_HandleTypeDef *hdma)
static void I2C_DMAError(DMA_HandleTypeDef *hdma)
DMA I2C communication error callback.
HAL_StatusTypeDef HAL_DMA_Start_IT(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength)
Start the DMA Transfer with interrupt enabled.
__HAL_LOCK(hrtc)
return HAL_OK
__IO HAL_I2C_ModeTypeDef Mode
DMA_HandleTypeDef * hdmatx
static void I2C_Disable_IRQ(I2C_HandleTypeDef *hi2c, uint16_t InterruptRequest)
Manage the disabling of Interrupts.
HAL_StatusTypeDef(* XferISR)(struct __I2C_HandleTypeDef *hi2c, uint32_t ITFlags, uint32_t ITSources)
__IO HAL_I2C_StateTypeDef State
__IO uint32_t XferOptions
static void I2C_DMAAbort(DMA_HandleTypeDef *hdma)
DMA I2C communication abort callback (To be called at end of DMA Abort procedure).
assert_param(IS_RTC_WAKEUP_CLOCK(WakeUpClock))

◆ HAL_I2C_Slave_Seq_Transmit_IT()

HAL_StatusTypeDef HAL_I2C_Slave_Seq_Transmit_IT ( I2C_HandleTypeDef hi2c,
uint8_t *  pData,
uint16_t  Size,
uint32_t  XferOptions 
)

Sequential transmit in slave/device I2C mode an amount of data in non-blocking mode with Interrupt.

Note
This interface allow to manage repeated start condition when a direction change during transfer
Parameters
hi2cPointer to a I2C_HandleTypeDef structure that contains the configuration information for the specified I2C.
pDataPointer to data buffer
SizeAmount of data to be sent
XferOptionsOptions of Transfer, value of I2C Sequential Transfer Options
Return values
HALstatus

Definition at line 3646 of file stm32l4xx_hal_i2c.c.

3647 {
3648  /* Check the parameters */
3649  assert_param(IS_I2C_TRANSFER_OPTIONS_REQUEST(XferOptions));
3650 
3651  if (((uint32_t)hi2c->State & (uint32_t)HAL_I2C_STATE_LISTEN) == (uint32_t)HAL_I2C_STATE_LISTEN)
3652  {
3653  if ((pData == NULL) || (Size == 0U))
3654  {
3655  hi2c->ErrorCode = HAL_I2C_ERROR_INVALID_PARAM;
3656  return HAL_ERROR;
3657  }
3658 
3659  /* Disable Interrupts, to prevent preemption during treatment in case of multicall */
3660  I2C_Disable_IRQ(hi2c, I2C_XFER_LISTEN_IT | I2C_XFER_TX_IT);
3661 
3662  /* Process Locked */
3663  __HAL_LOCK(hi2c);
3664 
3665  /* I2C cannot manage full duplex exchange so disable previous IT enabled if any */
3666  /* and then toggle the HAL slave RX state to TX state */
3667  if (hi2c->State == HAL_I2C_STATE_BUSY_RX_LISTEN)
3668  {
3669  /* Disable associated Interrupts */
3670  I2C_Disable_IRQ(hi2c, I2C_XFER_RX_IT);
3671 
3672  /* Abort DMA Xfer if any */
3673  if ((hi2c->Instance->CR1 & I2C_CR1_RXDMAEN) == I2C_CR1_RXDMAEN)
3674  {
3675  hi2c->Instance->CR1 &= ~I2C_CR1_RXDMAEN;
3676 
3677  if (hi2c->hdmarx != NULL)
3678  {
3679  /* Set the I2C DMA Abort callback :
3680  will lead to call HAL_I2C_ErrorCallback() at end of DMA abort procedure */
3682 
3683  /* Abort DMA RX */
3684  if (HAL_DMA_Abort_IT(hi2c->hdmarx) != HAL_OK)
3685  {
3686  /* Call Directly XferAbortCallback function in case of error */
3687  hi2c->hdmarx->XferAbortCallback(hi2c->hdmarx);
3688  }
3689  }
3690  }
3691  }
3692 
3694  hi2c->Mode = HAL_I2C_MODE_SLAVE;
3695  hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
3696 
3697  /* Enable Address Acknowledge */
3698  hi2c->Instance->CR2 &= ~I2C_CR2_NACK;
3699 
3700  /* Prepare transfer parameters */
3701  hi2c->pBuffPtr = pData;
3702  hi2c->XferCount = Size;
3703  hi2c->XferSize = hi2c->XferCount;
3704  hi2c->XferOptions = XferOptions;
3705  hi2c->XferISR = I2C_Slave_ISR_IT;
3706 
3707  if (I2C_GET_DIR(hi2c) == I2C_DIRECTION_RECEIVE)
3708  {
3709  /* Clear ADDR flag after prepare the transfer parameters */
3710  /* This action will generate an acknowledge to the Master */
3711  __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_ADDR);
3712  }
3713 
3714  /* Process Unlocked */
3715  __HAL_UNLOCK(hi2c);
3716 
3717  /* Note : The I2C interrupts must be enabled after unlocking current process
3718  to avoid the risk of I2C interrupt handle execution before current
3719  process unlock */
3720  /* REnable ADDR interrupt */
3721  I2C_Enable_IRQ(hi2c, I2C_XFER_TX_IT | I2C_XFER_LISTEN_IT);
3722 
3723  return HAL_OK;
3724  }
3725  else
3726  {
3727  return HAL_ERROR;
3728  }
3729 }
DMA_HandleTypeDef * hdmarx
void(* XferAbortCallback)(struct __DMA_HandleTypeDef *hdma)
static void I2C_Enable_IRQ(I2C_HandleTypeDef *hi2c, uint16_t InterruptRequest)
Manage the enabling of Interrupts.
static HAL_StatusTypeDef I2C_Slave_ISR_IT(struct __I2C_HandleTypeDef *hi2c, uint32_t ITFlags, uint32_t ITSources)
Interrupt Sub-Routine which handle the Interrupt Flags Slave Mode with Interrupt. ...
HAL_StatusTypeDef HAL_DMA_Abort_IT(DMA_HandleTypeDef *hdma)
Aborts the DMA Transfer in Interrupt mode.
__HAL_UNLOCK(hrtc)
__HAL_LOCK(hrtc)
return HAL_OK
__IO HAL_I2C_ModeTypeDef Mode
static void I2C_Disable_IRQ(I2C_HandleTypeDef *hi2c, uint16_t InterruptRequest)
Manage the disabling of Interrupts.
HAL_StatusTypeDef(* XferISR)(struct __I2C_HandleTypeDef *hi2c, uint32_t ITFlags, uint32_t ITSources)
__IO HAL_I2C_StateTypeDef State
__IO uint32_t XferOptions
static void I2C_DMAAbort(DMA_HandleTypeDef *hdma)
DMA I2C communication abort callback (To be called at end of DMA Abort procedure).
assert_param(IS_RTC_WAKEUP_CLOCK(WakeUpClock))

◆ HAL_I2C_Slave_Transmit()

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

Transmits in slave mode an amount of data in blocking mode.

Parameters
hi2cPointer to a I2C_HandleTypeDef structure that contains the configuration information for the specified I2C.
pDataPointer to data buffer
SizeAmount of data to be sent
TimeoutTimeout duration
Return values
HALstatus

Definition at line 1287 of file stm32l4xx_hal_i2c.c.

1288 {
1289  uint32_t tickstart;
1290 
1291  if (hi2c->State == HAL_I2C_STATE_READY)
1292  {
1293  if ((pData == NULL) || (Size == 0U))
1294  {
1295  hi2c->ErrorCode = HAL_I2C_ERROR_INVALID_PARAM;
1296  return HAL_ERROR;
1297  }
1298  /* Process Locked */
1299  __HAL_LOCK(hi2c);
1300 
1301  /* Init tickstart for timeout management*/
1302  tickstart = HAL_GetTick();
1303 
1304  hi2c->State = HAL_I2C_STATE_BUSY_TX;
1305  hi2c->Mode = HAL_I2C_MODE_SLAVE;
1306  hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
1307 
1308  /* Prepare transfer parameters */
1309  hi2c->pBuffPtr = pData;
1310  hi2c->XferCount = Size;
1311  hi2c->XferISR = NULL;
1312 
1313  /* Enable Address Acknowledge */
1314  hi2c->Instance->CR2 &= ~I2C_CR2_NACK;
1315 
1316  /* Wait until ADDR flag is set */
1317  if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, RESET, Timeout, tickstart) != HAL_OK)
1318  {
1319  /* Disable Address Acknowledge */
1320  hi2c->Instance->CR2 |= I2C_CR2_NACK;
1321  return HAL_ERROR;
1322  }
1323 
1324  /* Clear ADDR flag */
1325  __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_ADDR);
1326 
1327  /* If 10bit addressing mode is selected */
1328  if (hi2c->Init.AddressingMode == I2C_ADDRESSINGMODE_10BIT)
1329  {
1330  /* Wait until ADDR flag is set */
1331  if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, RESET, Timeout, tickstart) != HAL_OK)
1332  {
1333  /* Disable Address Acknowledge */
1334  hi2c->Instance->CR2 |= I2C_CR2_NACK;
1335  return HAL_ERROR;
1336  }
1337 
1338  /* Clear ADDR flag */
1339  __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_ADDR);
1340  }
1341 
1342  /* Wait until DIR flag is set Transmitter mode */
1343  if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_DIR, RESET, Timeout, tickstart) != HAL_OK)
1344  {
1345  /* Disable Address Acknowledge */
1346  hi2c->Instance->CR2 |= I2C_CR2_NACK;
1347  return HAL_ERROR;
1348  }
1349 
1350  while (hi2c->XferCount > 0U)
1351  {
1352  /* Wait until TXIS flag is set */
1353  if (I2C_WaitOnTXISFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK)
1354  {
1355  /* Disable Address Acknowledge */
1356  hi2c->Instance->CR2 |= I2C_CR2_NACK;
1357  return HAL_ERROR;
1358  }
1359 
1360  /* Write data to TXDR */
1361  hi2c->Instance->TXDR = *hi2c->pBuffPtr;
1362 
1363  /* Increment Buffer pointer */
1364  hi2c->pBuffPtr++;
1365 
1366  hi2c->XferCount--;
1367  }
1368 
1369  /* Wait until STOP flag is set */
1370  if (I2C_WaitOnSTOPFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK)
1371  {
1372  /* Disable Address Acknowledge */
1373  hi2c->Instance->CR2 |= I2C_CR2_NACK;
1374 
1375  if (hi2c->ErrorCode == HAL_I2C_ERROR_AF)
1376  {
1377  /* Normal use case for Transmitter mode */
1378  /* A NACK is generated to confirm the end of transfer */
1379  hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
1380  }
1381  else
1382  {
1383  return HAL_ERROR;
1384  }
1385  }
1386 
1387  /* Clear STOP flag */
1388  __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF);
1389 
1390  /* Wait until BUSY flag is reset */
1391  if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, Timeout, tickstart) != HAL_OK)
1392  {
1393  /* Disable Address Acknowledge */
1394  hi2c->Instance->CR2 |= I2C_CR2_NACK;
1395  return HAL_ERROR;
1396  }
1397 
1398  /* Disable Address Acknowledge */
1399  hi2c->Instance->CR2 |= I2C_CR2_NACK;
1400 
1401  hi2c->State = HAL_I2C_STATE_READY;
1402  hi2c->Mode = HAL_I2C_MODE_NONE;
1403 
1404  /* Process Unlocked */
1405  __HAL_UNLOCK(hi2c);
1406 
1407  return HAL_OK;
1408  }
1409  else
1410  {
1411  return HAL_BUSY;
1412  }
1413 }
static HAL_StatusTypeDef I2C_WaitOnTXISFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Timeout, uint32_t Tickstart)
This function handles I2C Communication Timeout for specific usage of TXIS flag.
uint32_t HAL_GetTick(void)
Provide a tick value in millisecond.
__HAL_UNLOCK(hrtc)
I2C_InitTypeDef Init
__HAL_LOCK(hrtc)
static HAL_StatusTypeDef I2C_WaitOnSTOPFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Timeout, uint32_t Tickstart)
This function handles I2C Communication Timeout for specific usage of STOP flag.
return HAL_OK
__IO HAL_I2C_ModeTypeDef Mode
HAL_StatusTypeDef(* XferISR)(struct __I2C_HandleTypeDef *hi2c, uint32_t ITFlags, uint32_t ITSources)
__IO HAL_I2C_StateTypeDef State
static HAL_StatusTypeDef I2C_WaitOnFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Flag, FlagStatus Status, uint32_t Timeout, uint32_t Tickstart)
This function handles I2C Communication Timeout.

◆ HAL_I2C_Slave_Transmit_DMA()

HAL_StatusTypeDef HAL_I2C_Slave_Transmit_DMA ( I2C_HandleTypeDef hi2c,
uint8_t *  pData,
uint16_t  Size 
)

Transmit in slave mode an amount of data in non-blocking mode with DMA.

Parameters
hi2cPointer to a I2C_HandleTypeDef structure that contains the configuration information for the specified I2C.
pDataPointer to data buffer
SizeAmount of data to be sent
Return values
HALstatus

Definition at line 2070 of file stm32l4xx_hal_i2c.c.

2071 {
2072  HAL_StatusTypeDef dmaxferstatus;
2073 
2074  if (hi2c->State == HAL_I2C_STATE_READY)
2075  {
2076  if ((pData == NULL) || (Size == 0U))
2077  {
2078  hi2c->ErrorCode = HAL_I2C_ERROR_INVALID_PARAM;
2079  return HAL_ERROR;
2080  }
2081  /* Process Locked */
2082  __HAL_LOCK(hi2c);
2083 
2084  hi2c->State = HAL_I2C_STATE_BUSY_TX;
2085  hi2c->Mode = HAL_I2C_MODE_SLAVE;
2086  hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
2087 
2088  /* Prepare transfer parameters */
2089  hi2c->pBuffPtr = pData;
2090  hi2c->XferCount = Size;
2091  hi2c->XferSize = hi2c->XferCount;
2092  hi2c->XferOptions = I2C_NO_OPTION_FRAME;
2093  hi2c->XferISR = I2C_Slave_ISR_DMA;
2094 
2095  if (hi2c->hdmatx != NULL)
2096  {
2097  /* Set the I2C DMA transfer complete callback */
2099 
2100  /* Set the DMA error callback */
2102 
2103  /* Set the unused DMA callbacks to NULL */
2104  hi2c->hdmatx->XferHalfCpltCallback = NULL;
2105  hi2c->hdmatx->XferAbortCallback = NULL;
2106 
2107  /* Enable the DMA channel */
2108  dmaxferstatus = HAL_DMA_Start_IT(hi2c->hdmatx, (uint32_t)pData, (uint32_t)&hi2c->Instance->TXDR, hi2c->XferSize);
2109  }
2110  else
2111  {
2112  /* Update I2C state */
2113  hi2c->State = HAL_I2C_STATE_LISTEN;
2114  hi2c->Mode = HAL_I2C_MODE_NONE;
2115 
2116  /* Update I2C error code */
2117  hi2c->ErrorCode |= HAL_I2C_ERROR_DMA_PARAM;
2118 
2119  /* Process Unlocked */
2120  __HAL_UNLOCK(hi2c);
2121 
2122  return HAL_ERROR;
2123  }
2124 
2125  if (dmaxferstatus == HAL_OK)
2126  {
2127  /* Enable Address Acknowledge */
2128  hi2c->Instance->CR2 &= ~I2C_CR2_NACK;
2129 
2130  /* Process Unlocked */
2131  __HAL_UNLOCK(hi2c);
2132 
2133  /* Note : The I2C interrupts must be enabled after unlocking current process
2134  to avoid the risk of I2C interrupt handle execution before current
2135  process unlock */
2136  /* Enable ERR, STOP, NACK, ADDR interrupts */
2137  I2C_Enable_IRQ(hi2c, I2C_XFER_LISTEN_IT);
2138 
2139  /* Enable DMA Request */
2140  hi2c->Instance->CR1 |= I2C_CR1_TXDMAEN;
2141  }
2142  else
2143  {
2144  /* Update I2C state */
2145  hi2c->State = HAL_I2C_STATE_LISTEN;
2146  hi2c->Mode = HAL_I2C_MODE_NONE;
2147 
2148  /* Update I2C error code */
2149  hi2c->ErrorCode |= HAL_I2C_ERROR_DMA;
2150 
2151  /* Process Unlocked */
2152  __HAL_UNLOCK(hi2c);
2153 
2154  return HAL_ERROR;
2155  }
2156 
2157  return HAL_OK;
2158  }
2159  else
2160  {
2161  return HAL_BUSY;
2162  }
2163 }
static void I2C_DMASlaveTransmitCplt(DMA_HandleTypeDef *hdma)
DMA I2C slave transmit process complete callback.
void(* XferAbortCallback)(struct __DMA_HandleTypeDef *hdma)
static HAL_StatusTypeDef I2C_Slave_ISR_DMA(struct __I2C_HandleTypeDef *hi2c, uint32_t ITFlags, uint32_t ITSources)
Interrupt Sub-Routine which handle the Interrupt Flags Slave Mode with DMA.
static void I2C_Enable_IRQ(I2C_HandleTypeDef *hi2c, uint16_t InterruptRequest)
Manage the enabling of Interrupts.
void(* XferCpltCallback)(struct __DMA_HandleTypeDef *hdma)
void(* XferErrorCallback)(struct __DMA_HandleTypeDef *hdma)
__HAL_UNLOCK(hrtc)
void(* XferHalfCpltCallback)(struct __DMA_HandleTypeDef *hdma)
static void I2C_DMAError(DMA_HandleTypeDef *hdma)
DMA I2C communication error callback.
HAL_StatusTypeDef HAL_DMA_Start_IT(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength)
Start the DMA Transfer with interrupt enabled.
__HAL_LOCK(hrtc)
return HAL_OK
__IO HAL_I2C_ModeTypeDef Mode
DMA_HandleTypeDef * hdmatx
HAL_StatusTypeDef(* XferISR)(struct __I2C_HandleTypeDef *hi2c, uint32_t ITFlags, uint32_t ITSources)
__IO HAL_I2C_StateTypeDef State
__IO uint32_t XferOptions

◆ HAL_I2C_Slave_Transmit_IT()

HAL_StatusTypeDef HAL_I2C_Slave_Transmit_IT ( I2C_HandleTypeDef hi2c,
uint8_t *  pData,
uint16_t  Size 
)

Transmit in slave mode an amount of data in non-blocking mode with Interrupt.

Parameters
hi2cPointer to a I2C_HandleTypeDef structure that contains the configuration information for the specified I2C.
pDataPointer to data buffer
SizeAmount of data to be sent
Return values
HALstatus

Definition at line 1686 of file stm32l4xx_hal_i2c.c.

1687 {
1688  if (hi2c->State == HAL_I2C_STATE_READY)
1689  {
1690  /* Process Locked */
1691  __HAL_LOCK(hi2c);
1692 
1693  hi2c->State = HAL_I2C_STATE_BUSY_TX;
1694  hi2c->Mode = HAL_I2C_MODE_SLAVE;
1695  hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
1696 
1697  /* Enable Address Acknowledge */
1698  hi2c->Instance->CR2 &= ~I2C_CR2_NACK;
1699 
1700  /* Prepare transfer parameters */
1701  hi2c->pBuffPtr = pData;
1702  hi2c->XferCount = Size;
1703  hi2c->XferSize = hi2c->XferCount;
1704  hi2c->XferOptions = I2C_NO_OPTION_FRAME;
1705  hi2c->XferISR = I2C_Slave_ISR_IT;
1706 
1707  /* Process Unlocked */
1708  __HAL_UNLOCK(hi2c);
1709 
1710  /* Note : The I2C interrupts must be enabled after unlocking current process
1711  to avoid the risk of I2C interrupt handle execution before current
1712  process unlock */
1713 
1714  /* Enable ERR, TC, STOP, NACK, TXI interrupt */
1715  /* possible to enable all of these */
1716  /* I2C_IT_ERRI | I2C_IT_TCI| I2C_IT_STOPI| I2C_IT_NACKI | I2C_IT_ADDRI | I2C_IT_RXI | I2C_IT_TXI */
1717  I2C_Enable_IRQ(hi2c, I2C_XFER_TX_IT | I2C_XFER_LISTEN_IT);
1718 
1719  return HAL_OK;
1720  }
1721  else
1722  {
1723  return HAL_BUSY;
1724  }
1725 }
static void I2C_Enable_IRQ(I2C_HandleTypeDef *hi2c, uint16_t InterruptRequest)
Manage the enabling of Interrupts.
static HAL_StatusTypeDef I2C_Slave_ISR_IT(struct __I2C_HandleTypeDef *hi2c, uint32_t ITFlags, uint32_t ITSources)
Interrupt Sub-Routine which handle the Interrupt Flags Slave Mode with Interrupt. ...
__HAL_UNLOCK(hrtc)
__HAL_LOCK(hrtc)
return HAL_OK
__IO HAL_I2C_ModeTypeDef Mode
HAL_StatusTypeDef(* XferISR)(struct __I2C_HandleTypeDef *hi2c, uint32_t ITFlags, uint32_t ITSources)
__IO HAL_I2C_StateTypeDef State
__IO uint32_t XferOptions