fix LPC812 PWM

Dependents:   IR_LED_Send

Fork of mbed-dev by mbed official

Committer:
mbed_official
Date:
Tue Nov 10 09:30:11 2015 +0000
Revision:
19:112740acecfa
Parent:
0:9b334a45a8ff
Synchronized with git revision 7218418919aeaf775fb8d386ea7ee0dfc0c80ff9

Full URL: https://github.com/mbedmicro/mbed/commit/7218418919aeaf775fb8d386ea7ee0dfc0c80ff9/

DISCO_F469NI - add disco F469NI support

Who changed what in which revision?

UserRevisionLine numberNew contents of line
bogdanm 0:9b334a45a8ff 1 /**
bogdanm 0:9b334a45a8ff 2 ******************************************************************************
bogdanm 0:9b334a45a8ff 3 * @file stm32f4xx_hal_fmpi2c.c
bogdanm 0:9b334a45a8ff 4 * @author MCD Application Team
mbed_official 19:112740acecfa 5 * @version V1.4.1
mbed_official 19:112740acecfa 6 * @date 09-October-2015
bogdanm 0:9b334a45a8ff 7 * @brief FMPI2C HAL module driver.
bogdanm 0:9b334a45a8ff 8 *
bogdanm 0:9b334a45a8ff 9 * This file provides firmware functions to manage the following
bogdanm 0:9b334a45a8ff 10 * functionalities of the Inter Integrated Circuit (FMPI2C) peripheral:
bogdanm 0:9b334a45a8ff 11 * + Initialization and de-initialization functions
bogdanm 0:9b334a45a8ff 12 * + IO operation functions
bogdanm 0:9b334a45a8ff 13 * + Peripheral State functions
bogdanm 0:9b334a45a8ff 14 *
bogdanm 0:9b334a45a8ff 15 @verbatim
bogdanm 0:9b334a45a8ff 16 ==============================================================================
bogdanm 0:9b334a45a8ff 17 ##### How to use this driver #####
bogdanm 0:9b334a45a8ff 18 ==============================================================================
bogdanm 0:9b334a45a8ff 19 [..]
bogdanm 0:9b334a45a8ff 20 The FMPI2C HAL driver can be used as follows:
bogdanm 0:9b334a45a8ff 21
bogdanm 0:9b334a45a8ff 22 (#) Declare a FMPI2C_HandleTypeDef handle structure, for example:
bogdanm 0:9b334a45a8ff 23 FMPI2C_HandleTypeDef hfmpi2c;
bogdanm 0:9b334a45a8ff 24
bogdanm 0:9b334a45a8ff 25 (#)Initialize the FMPI2C low level resources by implement the HAL_FMPI2C_MspInit ()API:
bogdanm 0:9b334a45a8ff 26 (##) Enable the FMPI2Cx interface clock
bogdanm 0:9b334a45a8ff 27 (##) FMPI2C pins configuration
bogdanm 0:9b334a45a8ff 28 (+++) Enable the clock for the FMPI2C GPIOs
bogdanm 0:9b334a45a8ff 29 (+++) Configure FMPI2C pins as alternate function open-drain
bogdanm 0:9b334a45a8ff 30 (##) NVIC configuration if you need to use interrupt process
bogdanm 0:9b334a45a8ff 31 (+++) Configure the FMPI2Cx interrupt priority
bogdanm 0:9b334a45a8ff 32 (+++) Enable the NVIC FMPI2C IRQ Channel
bogdanm 0:9b334a45a8ff 33 (##) DMA Configuration if you need to use DMA process
bogdanm 0:9b334a45a8ff 34 (+++) Declare a DMA_HandleTypeDef handle structure for the transmit or receive stream
bogdanm 0:9b334a45a8ff 35 (+++) Enable the DMAx interface clock using
bogdanm 0:9b334a45a8ff 36 (+++) Configure the DMA handle parameters
bogdanm 0:9b334a45a8ff 37 (+++) Configure the DMA Tx or Rx Stream
bogdanm 0:9b334a45a8ff 38 (+++) Associate the initilalized DMA handle to the hfmpi2c DMA Tx or Rx handle
bogdanm 0:9b334a45a8ff 39 (+++) Configure the priority and enable the NVIC for the transfer complete interrupt on the DMA Tx or Rx Stream
bogdanm 0:9b334a45a8ff 40
bogdanm 0:9b334a45a8ff 41 (#) Configure the Communication Clock Timing, Own Address1, Master Adressing Mode, Dual Addressing mode,
bogdanm 0:9b334a45a8ff 42 Own Address2, Own Address2 Mask, General call and Nostretch mode in the hfmpi2c Init structure.
bogdanm 0:9b334a45a8ff 43
bogdanm 0:9b334a45a8ff 44 (#) Initialize the FMPI2C registers by calling the HAL_FMPI2C_Init() API:
bogdanm 0:9b334a45a8ff 45 (+++) These API's configures also the low level Hardware GPIO, CLOCK, CORTEX...etc)
bogdanm 0:9b334a45a8ff 46 by calling the customed HAL_FMPI2C_MspInit(&hfmpi2c) API.
bogdanm 0:9b334a45a8ff 47
bogdanm 0:9b334a45a8ff 48 (#) To check if target device is ready for communication, use the function HAL_FMPI2C_IsDeviceReady()
bogdanm 0:9b334a45a8ff 49
bogdanm 0:9b334a45a8ff 50 (#) For FMPI2C IO and IO MEM operations, three mode of operations are available within this driver :
bogdanm 0:9b334a45a8ff 51
bogdanm 0:9b334a45a8ff 52 *** Polling mode IO operation ***
bogdanm 0:9b334a45a8ff 53 =================================
bogdanm 0:9b334a45a8ff 54 [..]
bogdanm 0:9b334a45a8ff 55 (+) Transmit in master mode an amount of data in blocking mode using HAL_FMPI2C_Master_Transmit()
bogdanm 0:9b334a45a8ff 56 (+) Receive in master mode an amount of data in blocking mode using HAL_FMPI2C_Master_Receive()
bogdanm 0:9b334a45a8ff 57 (+) Transmit in slave mode an amount of data in blocking mode using HAL_FMPI2C_Slave_Transmit()
bogdanm 0:9b334a45a8ff 58 (+) Receive in slave mode an amount of data in blocking mode using HAL_FMPI2C_Slave_Receive()
bogdanm 0:9b334a45a8ff 59
bogdanm 0:9b334a45a8ff 60 *** Polling mode IO MEM operation ***
bogdanm 0:9b334a45a8ff 61 =====================================
bogdanm 0:9b334a45a8ff 62 [..]
bogdanm 0:9b334a45a8ff 63 (+) Write an amount of data in blocking mode to a specific memory address using HAL_FMPI2C_Mem_Write()
bogdanm 0:9b334a45a8ff 64 (+) Read an amount of data in blocking mode from a specific memory address using HAL_FMPI2C_Mem_Read()
bogdanm 0:9b334a45a8ff 65
bogdanm 0:9b334a45a8ff 66
bogdanm 0:9b334a45a8ff 67 *** Interrupt mode IO operation ***
bogdanm 0:9b334a45a8ff 68 ===================================
bogdanm 0:9b334a45a8ff 69 [..]
bogdanm 0:9b334a45a8ff 70 (+) Transmit in master mode an amount of data in non blocking mode using HAL_FMPI2C_Master_Transmit_IT()
bogdanm 0:9b334a45a8ff 71 (+) At transmission end of transfer HAL_FMPI2C_MasterTxCpltCallback is executed and user can
bogdanm 0:9b334a45a8ff 72 add his own code by customization of function pointer HAL_FMPI2C_MasterTxCpltCallback
bogdanm 0:9b334a45a8ff 73 (+) Receive in master mode an amount of data in non blocking mode using HAL_FMPI2C_Master_Receive_IT()
bogdanm 0:9b334a45a8ff 74 (+) At reception end of transfer HAL_FMPI2C_MasterRxCpltCallback is executed and user can
bogdanm 0:9b334a45a8ff 75 add his own code by customization of function pointer HAL_FMPI2C_MasterRxCpltCallback
bogdanm 0:9b334a45a8ff 76 (+) Transmit in slave mode an amount of data in non blocking mode using HAL_FMPI2C_Slave_Transmit_IT()
bogdanm 0:9b334a45a8ff 77 (+) At transmission end of transfer HAL_FMPI2C_SlaveTxCpltCallback is executed and user can
bogdanm 0:9b334a45a8ff 78 add his own code by customization of function pointer HAL_FMPI2C_SlaveTxCpltCallback
bogdanm 0:9b334a45a8ff 79 (+) Receive in slave mode an amount of data in non blocking mode using HAL_FMPI2C_Slave_Receive_IT()
bogdanm 0:9b334a45a8ff 80 (+) At reception end of transfer HAL_FMPI2C_SlaveRxCpltCallback is executed and user can
bogdanm 0:9b334a45a8ff 81 add his own code by customization of function pointer HAL_FMPI2C_SlaveRxCpltCallback
bogdanm 0:9b334a45a8ff 82 (+) In case of transfer Error, HAL_FMPI2C_ErrorCallback() function is executed and user can
bogdanm 0:9b334a45a8ff 83 add his own code by customization of function pointer HAL_FMPI2C_ErrorCallback
bogdanm 0:9b334a45a8ff 84
bogdanm 0:9b334a45a8ff 85 *** Interrupt mode IO MEM operation ***
bogdanm 0:9b334a45a8ff 86 =======================================
bogdanm 0:9b334a45a8ff 87 [..]
bogdanm 0:9b334a45a8ff 88 (+) Write an amount of data in no-blocking mode with Interrupt to a specific memory address using
bogdanm 0:9b334a45a8ff 89 HAL_FMPI2C_Mem_Write_IT()
bogdanm 0:9b334a45a8ff 90 (+) At MEM end of write transfer HAL_FMPI2C_MemTxCpltCallback is executed and user can
bogdanm 0:9b334a45a8ff 91 add his own code by customization of function pointer HAL_FMPI2C_MemTxCpltCallback
bogdanm 0:9b334a45a8ff 92 (+) Read an amount of data in no-blocking mode with Interrupt from a specific memory address using
bogdanm 0:9b334a45a8ff 93 HAL_FMPI2C_Mem_Read_IT()
bogdanm 0:9b334a45a8ff 94 (+) At MEM end of read transfer HAL_FMPI2C_MemRxCpltCallback is executed and user can
bogdanm 0:9b334a45a8ff 95 add his own code by customization of function pointer HAL_FMPI2C_MemRxCpltCallback
bogdanm 0:9b334a45a8ff 96 (+) In case of transfer Error, HAL_FMPI2C_ErrorCallback() function is executed and user can
bogdanm 0:9b334a45a8ff 97 add his own code by customization of function pointer HAL_FMPI2C_ErrorCallback
bogdanm 0:9b334a45a8ff 98
bogdanm 0:9b334a45a8ff 99 *** DMA mode IO operation ***
bogdanm 0:9b334a45a8ff 100 ==============================
bogdanm 0:9b334a45a8ff 101 [..]
bogdanm 0:9b334a45a8ff 102 (+) Transmit in master mode an amount of data in non blocking mode (DMA) using
bogdanm 0:9b334a45a8ff 103 HAL_FMPI2C_Master_Transmit_DMA()
bogdanm 0:9b334a45a8ff 104 (+) At transmission end of transfer HAL_FMPI2C_MasterTxCpltCallback is executed and user can
bogdanm 0:9b334a45a8ff 105 add his own code by customization of function pointer HAL_FMPI2C_MasterTxCpltCallback
bogdanm 0:9b334a45a8ff 106 (+) Receive in master mode an amount of data in non blocking mode (DMA) using
bogdanm 0:9b334a45a8ff 107 HAL_FMPI2C_Master_Receive_DMA()
bogdanm 0:9b334a45a8ff 108 (+) At reception end of transfer HAL_FMPI2C_MasterRxCpltCallback is executed and user can
bogdanm 0:9b334a45a8ff 109 add his own code by customization of function pointer HAL_FMPI2C_MasterRxCpltCallback
bogdanm 0:9b334a45a8ff 110 (+) Transmit in slave mode an amount of data in non blocking mode (DMA) using
bogdanm 0:9b334a45a8ff 111 HAL_FMPI2C_Slave_Transmit_DMA()
bogdanm 0:9b334a45a8ff 112 (+) At transmission end of transfer HAL_FMPI2C_SlaveTxCpltCallback is executed and user can
bogdanm 0:9b334a45a8ff 113 add his own code by customization of function pointer HAL_FMPI2C_SlaveTxCpltCallback
bogdanm 0:9b334a45a8ff 114 (+) Receive in slave mode an amount of data in non blocking mode (DMA) using
bogdanm 0:9b334a45a8ff 115 HAL_FMPI2C_Slave_Receive_DMA()
bogdanm 0:9b334a45a8ff 116 (+) At reception end of transfer HAL_FMPI2C_SlaveRxCpltCallback is executed and user can
bogdanm 0:9b334a45a8ff 117 add his own code by customization of function pointer HAL_FMPI2C_SlaveRxCpltCallback
bogdanm 0:9b334a45a8ff 118 (+) In case of transfer Error, HAL_FMPI2C_ErrorCallback() function is executed and user can
bogdanm 0:9b334a45a8ff 119 add his own code by customization of function pointer HAL_FMPI2C_ErrorCallback
bogdanm 0:9b334a45a8ff 120
bogdanm 0:9b334a45a8ff 121 *** DMA mode IO MEM operation ***
bogdanm 0:9b334a45a8ff 122 =================================
bogdanm 0:9b334a45a8ff 123 [..]
bogdanm 0:9b334a45a8ff 124 (+) Write an amount of data in no-blocking mode with DMA to a specific memory address using
bogdanm 0:9b334a45a8ff 125 HAL_FMPI2C_Mem_Write_DMA()
bogdanm 0:9b334a45a8ff 126 (+) At MEM end of write transfer HAL_FMPI2C_MemTxCpltCallback is executed and user can
bogdanm 0:9b334a45a8ff 127 add his own code by customization of function pointer HAL_FMPI2C_MemTxCpltCallback
bogdanm 0:9b334a45a8ff 128 (+) Read an amount of data in no-blocking mode with DMA from a specific memory address using
bogdanm 0:9b334a45a8ff 129 HAL_FMPI2C_Mem_Read_DMA()
bogdanm 0:9b334a45a8ff 130 (+) At MEM end of read transfer HAL_FMPI2C_MemRxCpltCallback is executed and user can
bogdanm 0:9b334a45a8ff 131 add his own code by customization of function pointer HAL_FMPI2C_MemRxCpltCallback
bogdanm 0:9b334a45a8ff 132 (+) In case of transfer Error, HAL_FMPI2C_ErrorCallback() function is executed and user can
bogdanm 0:9b334a45a8ff 133 add his own code by customization of function pointer HAL_FMPI2C_ErrorCallback
bogdanm 0:9b334a45a8ff 134
bogdanm 0:9b334a45a8ff 135
bogdanm 0:9b334a45a8ff 136 *** FMPI2C HAL driver macros list ***
bogdanm 0:9b334a45a8ff 137 ==================================
bogdanm 0:9b334a45a8ff 138 [..]
bogdanm 0:9b334a45a8ff 139 Below the list of most used macros in FMPI2C HAL driver.
bogdanm 0:9b334a45a8ff 140
bogdanm 0:9b334a45a8ff 141 (+) __HAL_FMPI2C_ENABLE: Enable the FMPI2C peripheral
bogdanm 0:9b334a45a8ff 142 (+) __HAL_FMPI2C_DISABLE: Disable the FMPI2C peripheral
bogdanm 0:9b334a45a8ff 143 (+) __HAL_FMPI2C_GET_FLAG : Checks whether the specified FMPI2C flag is set or not
bogdanm 0:9b334a45a8ff 144 (+) __HAL_FMPI2C_CLEAR_FLAG : Clears the specified FMPI2C pending flag
bogdanm 0:9b334a45a8ff 145 (+) __HAL_FMPI2C_ENABLE_IT: Enables the specified FMPI2C interrupt
bogdanm 0:9b334a45a8ff 146 (+) __HAL_FMPI2C_DISABLE_IT: Disables the specified FMPI2C interrupt
bogdanm 0:9b334a45a8ff 147
bogdanm 0:9b334a45a8ff 148 [..]
bogdanm 0:9b334a45a8ff 149 (@) You can refer to the FMPI2C HAL driver header file for more useful macros
bogdanm 0:9b334a45a8ff 150
bogdanm 0:9b334a45a8ff 151 @endverbatim
bogdanm 0:9b334a45a8ff 152 ******************************************************************************
bogdanm 0:9b334a45a8ff 153 * @attention
bogdanm 0:9b334a45a8ff 154 *
bogdanm 0:9b334a45a8ff 155 * <h2><center>&copy; COPYRIGHT(c) 2015 STMicroelectronics</center></h2>
bogdanm 0:9b334a45a8ff 156 *
bogdanm 0:9b334a45a8ff 157 * Redistribution and use in source and binary forms, with or without modification,
bogdanm 0:9b334a45a8ff 158 * are permitted provided that the following conditions are met:
bogdanm 0:9b334a45a8ff 159 * 1. Redistributions of source code must retain the above copyright notice,
bogdanm 0:9b334a45a8ff 160 * this list of conditions and the following disclaimer.
bogdanm 0:9b334a45a8ff 161 * 2. Redistributions in binary form must reproduce the above copyright notice,
bogdanm 0:9b334a45a8ff 162 * this list of conditions and the following disclaimer in the documentation
bogdanm 0:9b334a45a8ff 163 * and/or other materials provided with the distribution.
bogdanm 0:9b334a45a8ff 164 * 3. Neither the name of STMicroelectronics nor the names of its contributors
bogdanm 0:9b334a45a8ff 165 * may be used to endorse or promote products derived from this software
bogdanm 0:9b334a45a8ff 166 * without specific prior written permission.
bogdanm 0:9b334a45a8ff 167 *
bogdanm 0:9b334a45a8ff 168 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
bogdanm 0:9b334a45a8ff 169 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
bogdanm 0:9b334a45a8ff 170 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
bogdanm 0:9b334a45a8ff 171 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
bogdanm 0:9b334a45a8ff 172 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
bogdanm 0:9b334a45a8ff 173 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
bogdanm 0:9b334a45a8ff 174 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
bogdanm 0:9b334a45a8ff 175 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
bogdanm 0:9b334a45a8ff 176 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
bogdanm 0:9b334a45a8ff 177 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
bogdanm 0:9b334a45a8ff 178 *
bogdanm 0:9b334a45a8ff 179 ******************************************************************************
bogdanm 0:9b334a45a8ff 180 */
bogdanm 0:9b334a45a8ff 181
bogdanm 0:9b334a45a8ff 182 /* Includes ------------------------------------------------------------------*/
bogdanm 0:9b334a45a8ff 183 #include "stm32f4xx_hal.h"
bogdanm 0:9b334a45a8ff 184
bogdanm 0:9b334a45a8ff 185 /** @addtogroup STM32F4xx_HAL_Driver
bogdanm 0:9b334a45a8ff 186 * @{
bogdanm 0:9b334a45a8ff 187 */
bogdanm 0:9b334a45a8ff 188
bogdanm 0:9b334a45a8ff 189 /** @defgroup FMPI2C FMPI2C
bogdanm 0:9b334a45a8ff 190 * @brief FMPI2C HAL module driver
bogdanm 0:9b334a45a8ff 191 * @{
bogdanm 0:9b334a45a8ff 192 */
bogdanm 0:9b334a45a8ff 193
bogdanm 0:9b334a45a8ff 194 #ifdef HAL_FMPI2C_MODULE_ENABLED
bogdanm 0:9b334a45a8ff 195
mbed_official 19:112740acecfa 196 #if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F446xx)
bogdanm 0:9b334a45a8ff 197
bogdanm 0:9b334a45a8ff 198 /* Private typedef -----------------------------------------------------------*/
bogdanm 0:9b334a45a8ff 199 /* Private define ------------------------------------------------------------*/
bogdanm 0:9b334a45a8ff 200 /** @addtogroup FMPI2C_Private_Constants
bogdanm 0:9b334a45a8ff 201 * @{
bogdanm 0:9b334a45a8ff 202 */
bogdanm 0:9b334a45a8ff 203 #define TIMING_CLEAR_MASK ((uint32_t)0xF0FFFFFF) /*<! FMPI2C TIMING clear register Mask */
bogdanm 0:9b334a45a8ff 204 #define FMPI2C_TIMEOUT_ADDR ((uint32_t)10000) /* 10 s */
bogdanm 0:9b334a45a8ff 205 #define FMPI2C_TIMEOUT_BUSY ((uint32_t)25) /* 25 ms */
bogdanm 0:9b334a45a8ff 206 #define FMPI2C_TIMEOUT_DIR ((uint32_t)25) /* 25 ms */
bogdanm 0:9b334a45a8ff 207 #define FMPI2C_TIMEOUT_RXNE ((uint32_t)25) /* 25 ms */
bogdanm 0:9b334a45a8ff 208 #define FMPI2C_TIMEOUT_STOPF ((uint32_t)25) /* 25 ms */
bogdanm 0:9b334a45a8ff 209 #define FMPI2C_TIMEOUT_TC ((uint32_t)25) /* 25 ms */
bogdanm 0:9b334a45a8ff 210 #define FMPI2C_TIMEOUT_TCR ((uint32_t)25) /* 25 ms */
bogdanm 0:9b334a45a8ff 211 #define FMPI2C_TIMEOUT_TXIS ((uint32_t)25) /* 25 ms */
bogdanm 0:9b334a45a8ff 212 #define FMPI2C_TIMEOUT_FLAG ((uint32_t)25) /* 25 ms */
bogdanm 0:9b334a45a8ff 213 /**
bogdanm 0:9b334a45a8ff 214 * @}
bogdanm 0:9b334a45a8ff 215 */
bogdanm 0:9b334a45a8ff 216
bogdanm 0:9b334a45a8ff 217 /* Private macro -------------------------------------------------------------*/
bogdanm 0:9b334a45a8ff 218 /* Private variables ---------------------------------------------------------*/
bogdanm 0:9b334a45a8ff 219 /* Private function prototypes -----------------------------------------------*/
bogdanm 0:9b334a45a8ff 220 /** @addtogroup FMPI2C_Private_Functions
bogdanm 0:9b334a45a8ff 221 * @brief FMPI2C private functions
bogdanm 0:9b334a45a8ff 222 * @{
bogdanm 0:9b334a45a8ff 223 */
bogdanm 0:9b334a45a8ff 224 static void FMPI2C_DMAMasterTransmitCplt(DMA_HandleTypeDef *hdma);
bogdanm 0:9b334a45a8ff 225 static void FMPI2C_DMAMasterReceiveCplt(DMA_HandleTypeDef *hdma);
bogdanm 0:9b334a45a8ff 226 static void FMPI2C_DMASlaveTransmitCplt(DMA_HandleTypeDef *hdma);
bogdanm 0:9b334a45a8ff 227 static void FMPI2C_DMASlaveReceiveCplt(DMA_HandleTypeDef *hdma);
bogdanm 0:9b334a45a8ff 228 static void FMPI2C_DMAMemTransmitCplt(DMA_HandleTypeDef *hdma);
bogdanm 0:9b334a45a8ff 229 static void FMPI2C_DMAMemReceiveCplt(DMA_HandleTypeDef *hdma);
bogdanm 0:9b334a45a8ff 230 static void FMPI2C_DMAError(DMA_HandleTypeDef *hdma);
bogdanm 0:9b334a45a8ff 231
bogdanm 0:9b334a45a8ff 232 static HAL_StatusTypeDef FMPI2C_RequestMemoryWrite(FMPI2C_HandleTypeDef *hfmpi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint32_t Timeout);
bogdanm 0:9b334a45a8ff 233 static HAL_StatusTypeDef FMPI2C_RequestMemoryRead(FMPI2C_HandleTypeDef *hfmpi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint32_t Timeout);
bogdanm 0:9b334a45a8ff 234 static HAL_StatusTypeDef FMPI2C_WaitOnFlagUntilTimeout(FMPI2C_HandleTypeDef *hfmpi2c, uint32_t Flag, FlagStatus Status, uint32_t Timeout);
bogdanm 0:9b334a45a8ff 235 static HAL_StatusTypeDef FMPI2C_WaitOnTXISFlagUntilTimeout(FMPI2C_HandleTypeDef *hfmpi2c, uint32_t Timeout);
bogdanm 0:9b334a45a8ff 236 static HAL_StatusTypeDef FMPI2C_WaitOnRXNEFlagUntilTimeout(FMPI2C_HandleTypeDef *hfmpi2c, uint32_t Timeout);
bogdanm 0:9b334a45a8ff 237 static HAL_StatusTypeDef FMPI2C_WaitOnSTOPFlagUntilTimeout(FMPI2C_HandleTypeDef *hfmpi2c, uint32_t Timeout);
bogdanm 0:9b334a45a8ff 238 static HAL_StatusTypeDef FMPI2C_IsAcknowledgeFailed(FMPI2C_HandleTypeDef *hfmpi2c, uint32_t Timeout);
bogdanm 0:9b334a45a8ff 239
bogdanm 0:9b334a45a8ff 240 static HAL_StatusTypeDef FMPI2C_MasterTransmit_ISR(FMPI2C_HandleTypeDef *hfmpi2c);
bogdanm 0:9b334a45a8ff 241 static HAL_StatusTypeDef FMPI2C_MasterReceive_ISR(FMPI2C_HandleTypeDef *hfmpi2c);
bogdanm 0:9b334a45a8ff 242
bogdanm 0:9b334a45a8ff 243 static HAL_StatusTypeDef FMPI2C_SlaveTransmit_ISR(FMPI2C_HandleTypeDef *hfmpi2c);
bogdanm 0:9b334a45a8ff 244 static HAL_StatusTypeDef FMPI2C_SlaveReceive_ISR(FMPI2C_HandleTypeDef *hfmpi2c);
bogdanm 0:9b334a45a8ff 245
bogdanm 0:9b334a45a8ff 246 static void FMPI2C_TransferConfig(FMPI2C_HandleTypeDef *hfmpi2c, uint16_t DevAddress, uint8_t Size, uint32_t Mode, uint32_t Request);
bogdanm 0:9b334a45a8ff 247 /**
bogdanm 0:9b334a45a8ff 248 * @}
bogdanm 0:9b334a45a8ff 249 */
bogdanm 0:9b334a45a8ff 250
bogdanm 0:9b334a45a8ff 251 /* Exported functions --------------------------------------------------------*/
bogdanm 0:9b334a45a8ff 252 /** @defgroup FMPI2C_Exported_Functions FMPI2C Exported Functions
bogdanm 0:9b334a45a8ff 253 * @{
bogdanm 0:9b334a45a8ff 254 */
bogdanm 0:9b334a45a8ff 255
mbed_official 19:112740acecfa 256 /** @defgroup FMPI2C_Exported_Functions_Group1 Initialization and de-initialization functions
bogdanm 0:9b334a45a8ff 257 * @brief Initialization and Configuration functions
bogdanm 0:9b334a45a8ff 258 *
bogdanm 0:9b334a45a8ff 259 @verbatim
bogdanm 0:9b334a45a8ff 260 ===============================================================================
mbed_official 19:112740acecfa 261 ##### Initialization and de-initialization functions #####
bogdanm 0:9b334a45a8ff 262 ===============================================================================
bogdanm 0:9b334a45a8ff 263 [..] This subsection provides a set of functions allowing to initialize and
bogdanm 0:9b334a45a8ff 264 de-initialiaze the FMPI2Cx peripheral:
bogdanm 0:9b334a45a8ff 265
bogdanm 0:9b334a45a8ff 266 (+) User must Implement HAL_FMPI2C_MspInit() function in which he configures
bogdanm 0:9b334a45a8ff 267 all related peripherals resources (CLOCK, GPIO, DMA, IT and NVIC ).
bogdanm 0:9b334a45a8ff 268
bogdanm 0:9b334a45a8ff 269 (+) Call the function HAL_FMPI2C_Init() to configure the selected device with
bogdanm 0:9b334a45a8ff 270 the selected configuration:
bogdanm 0:9b334a45a8ff 271 (++) Clock Timing
bogdanm 0:9b334a45a8ff 272 (++) Own Address 1
bogdanm 0:9b334a45a8ff 273 (++) Addressing mode (Master, Slave)
bogdanm 0:9b334a45a8ff 274 (++) Dual Addressing mode
bogdanm 0:9b334a45a8ff 275 (++) Own Address 2
bogdanm 0:9b334a45a8ff 276 (++) Own Address 2 Mask
bogdanm 0:9b334a45a8ff 277 (++) General call mode
bogdanm 0:9b334a45a8ff 278 (++) Nostretch mode
bogdanm 0:9b334a45a8ff 279
bogdanm 0:9b334a45a8ff 280 (+) Call the function HAL_FMPI2C_DeInit() to restore the default configuration
bogdanm 0:9b334a45a8ff 281 of the selected FMPI2Cx periperal.
bogdanm 0:9b334a45a8ff 282
bogdanm 0:9b334a45a8ff 283 @endverbatim
bogdanm 0:9b334a45a8ff 284 * @{
bogdanm 0:9b334a45a8ff 285 */
bogdanm 0:9b334a45a8ff 286
bogdanm 0:9b334a45a8ff 287 /**
bogdanm 0:9b334a45a8ff 288 * @brief Initializes the FMPI2C according to the specified parameters
bogdanm 0:9b334a45a8ff 289 * in the FMPI2C_InitTypeDef and create the associated handle.
bogdanm 0:9b334a45a8ff 290 * @param hfmpi2c : Pointer to a FMPI2C_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 291 * the configuration information for the specified FMPI2C.
bogdanm 0:9b334a45a8ff 292 * @retval HAL status
bogdanm 0:9b334a45a8ff 293 */
bogdanm 0:9b334a45a8ff 294 HAL_StatusTypeDef HAL_FMPI2C_Init(FMPI2C_HandleTypeDef *hfmpi2c)
bogdanm 0:9b334a45a8ff 295 {
bogdanm 0:9b334a45a8ff 296 /* Check the FMPI2C handle allocation */
bogdanm 0:9b334a45a8ff 297 if(hfmpi2c == NULL)
bogdanm 0:9b334a45a8ff 298 {
bogdanm 0:9b334a45a8ff 299 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 300 }
bogdanm 0:9b334a45a8ff 301
bogdanm 0:9b334a45a8ff 302 /* Check the parameters */
bogdanm 0:9b334a45a8ff 303 assert_param(IS_FMPI2C_ALL_INSTANCE(hfmpi2c->Instance));
bogdanm 0:9b334a45a8ff 304 assert_param(IS_FMPI2C_OWN_ADDRESS1(hfmpi2c->Init.OwnAddress1));
bogdanm 0:9b334a45a8ff 305 assert_param(IS_FMPI2C_ADDRESSING_MODE(hfmpi2c->Init.AddressingMode));
bogdanm 0:9b334a45a8ff 306 assert_param(IS_FMPI2C_DUAL_ADDRESS(hfmpi2c->Init.DualAddressMode));
bogdanm 0:9b334a45a8ff 307 assert_param(IS_FMPI2C_OWN_ADDRESS2(hfmpi2c->Init.OwnAddress2));
bogdanm 0:9b334a45a8ff 308 assert_param(IS_FMPI2C_OWN_ADDRESS2_MASK(hfmpi2c->Init.OwnAddress2Masks));
bogdanm 0:9b334a45a8ff 309 assert_param(IS_FMPI2C_GENERAL_CALL(hfmpi2c->Init.GeneralCallMode));
bogdanm 0:9b334a45a8ff 310 assert_param(IS_FMPI2C_NO_STRETCH(hfmpi2c->Init.NoStretchMode));
bogdanm 0:9b334a45a8ff 311
bogdanm 0:9b334a45a8ff 312 if(hfmpi2c->State == HAL_FMPI2C_STATE_RESET)
bogdanm 0:9b334a45a8ff 313 {
bogdanm 0:9b334a45a8ff 314 /* Allocate lock resource and initialize it */
bogdanm 0:9b334a45a8ff 315 hfmpi2c->Lock = HAL_UNLOCKED;
bogdanm 0:9b334a45a8ff 316 /* Init the low level hardware : GPIO, CLOCK, CORTEX...etc */
bogdanm 0:9b334a45a8ff 317 HAL_FMPI2C_MspInit(hfmpi2c);
bogdanm 0:9b334a45a8ff 318 }
bogdanm 0:9b334a45a8ff 319
bogdanm 0:9b334a45a8ff 320 hfmpi2c->State = HAL_FMPI2C_STATE_BUSY;
bogdanm 0:9b334a45a8ff 321
bogdanm 0:9b334a45a8ff 322 /* Disable the selected FMPI2C peripheral */
bogdanm 0:9b334a45a8ff 323 __HAL_FMPI2C_DISABLE(hfmpi2c);
bogdanm 0:9b334a45a8ff 324
bogdanm 0:9b334a45a8ff 325 /*---------------------------- FMPI2Cx TIMINGR Configuration ------------------*/
bogdanm 0:9b334a45a8ff 326 /* Configure FMPI2Cx: Frequency range */
bogdanm 0:9b334a45a8ff 327 hfmpi2c->Instance->TIMINGR = hfmpi2c->Init.Timing & TIMING_CLEAR_MASK;
bogdanm 0:9b334a45a8ff 328
bogdanm 0:9b334a45a8ff 329 /*---------------------------- FMPI2Cx OAR1 Configuration ---------------------*/
bogdanm 0:9b334a45a8ff 330 /* Configure FMPI2Cx: Own Address1 and ack own address1 mode */
bogdanm 0:9b334a45a8ff 331 hfmpi2c->Instance->OAR1 &= ~FMPI2C_OAR1_OA1EN;
bogdanm 0:9b334a45a8ff 332 if(hfmpi2c->Init.OwnAddress1 != 0)
bogdanm 0:9b334a45a8ff 333 {
bogdanm 0:9b334a45a8ff 334 if(hfmpi2c->Init.AddressingMode == FMPI2C_ADDRESSINGMODE_7BIT)
bogdanm 0:9b334a45a8ff 335 {
bogdanm 0:9b334a45a8ff 336 hfmpi2c->Instance->OAR1 = (FMPI2C_OAR1_OA1EN | hfmpi2c->Init.OwnAddress1);
bogdanm 0:9b334a45a8ff 337 }
bogdanm 0:9b334a45a8ff 338 else /* FMPI2C_ADDRESSINGMODE_10BIT */
bogdanm 0:9b334a45a8ff 339 {
bogdanm 0:9b334a45a8ff 340 hfmpi2c->Instance->OAR1 = (FMPI2C_OAR1_OA1EN | FMPI2C_OAR1_OA1MODE | hfmpi2c->Init.OwnAddress1);
bogdanm 0:9b334a45a8ff 341 }
bogdanm 0:9b334a45a8ff 342 }
bogdanm 0:9b334a45a8ff 343
bogdanm 0:9b334a45a8ff 344 /*---------------------------- FMPI2Cx CR2 Configuration ----------------------*/
bogdanm 0:9b334a45a8ff 345 /* Configure FMPI2Cx: Addressing Master mode */
bogdanm 0:9b334a45a8ff 346 if(hfmpi2c->Init.AddressingMode == FMPI2C_ADDRESSINGMODE_10BIT)
bogdanm 0:9b334a45a8ff 347 {
bogdanm 0:9b334a45a8ff 348 hfmpi2c->Instance->CR2 = (FMPI2C_CR2_ADD10);
bogdanm 0:9b334a45a8ff 349 }
bogdanm 0:9b334a45a8ff 350 /* Enable the AUTOEND by default, and enable NACK (should be disable only during Slave process */
bogdanm 0:9b334a45a8ff 351 hfmpi2c->Instance->CR2 |= (FMPI2C_CR2_AUTOEND | FMPI2C_CR2_NACK);
bogdanm 0:9b334a45a8ff 352
bogdanm 0:9b334a45a8ff 353 /*---------------------------- FMPI2Cx OAR2 Configuration ---------------------*/
bogdanm 0:9b334a45a8ff 354 /* Configure FMPI2Cx: Dual mode and Own Address2 */
bogdanm 0:9b334a45a8ff 355 hfmpi2c->Instance->OAR2 = (hfmpi2c->Init.DualAddressMode | hfmpi2c->Init.OwnAddress2 | (hfmpi2c->Init.OwnAddress2Masks << 8));
bogdanm 0:9b334a45a8ff 356
bogdanm 0:9b334a45a8ff 357 /*---------------------------- FMPI2Cx CR1 Configuration ----------------------*/
bogdanm 0:9b334a45a8ff 358 /* Configure FMPI2Cx: Generalcall and NoStretch mode */
bogdanm 0:9b334a45a8ff 359 hfmpi2c->Instance->CR1 = (hfmpi2c->Init.GeneralCallMode | hfmpi2c->Init.NoStretchMode);
bogdanm 0:9b334a45a8ff 360
bogdanm 0:9b334a45a8ff 361 /* Enable the selected FMPI2C peripheral */
bogdanm 0:9b334a45a8ff 362 __HAL_FMPI2C_ENABLE(hfmpi2c);
bogdanm 0:9b334a45a8ff 363
bogdanm 0:9b334a45a8ff 364 hfmpi2c->ErrorCode = HAL_FMPI2C_ERROR_NONE;
bogdanm 0:9b334a45a8ff 365 hfmpi2c->State = HAL_FMPI2C_STATE_READY;
bogdanm 0:9b334a45a8ff 366
bogdanm 0:9b334a45a8ff 367 return HAL_OK;
bogdanm 0:9b334a45a8ff 368 }
bogdanm 0:9b334a45a8ff 369
bogdanm 0:9b334a45a8ff 370 /**
bogdanm 0:9b334a45a8ff 371 * @brief DeInitializes the FMPI2C peripheral.
bogdanm 0:9b334a45a8ff 372 * @param hfmpi2c : Pointer to a FMPI2C_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 373 * the configuration information for the specified FMPI2C.
bogdanm 0:9b334a45a8ff 374 * @retval HAL status
bogdanm 0:9b334a45a8ff 375 */
bogdanm 0:9b334a45a8ff 376 HAL_StatusTypeDef HAL_FMPI2C_DeInit(FMPI2C_HandleTypeDef *hfmpi2c)
bogdanm 0:9b334a45a8ff 377 {
bogdanm 0:9b334a45a8ff 378 /* Check the FMPI2C handle allocation */
bogdanm 0:9b334a45a8ff 379 if(hfmpi2c == NULL)
bogdanm 0:9b334a45a8ff 380 {
bogdanm 0:9b334a45a8ff 381 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 382 }
bogdanm 0:9b334a45a8ff 383
bogdanm 0:9b334a45a8ff 384 /* Check the parameters */
bogdanm 0:9b334a45a8ff 385 assert_param(IS_FMPI2C_ALL_INSTANCE(hfmpi2c->Instance));
bogdanm 0:9b334a45a8ff 386
bogdanm 0:9b334a45a8ff 387 hfmpi2c->State = HAL_FMPI2C_STATE_BUSY;
bogdanm 0:9b334a45a8ff 388
bogdanm 0:9b334a45a8ff 389 /* Disable the FMPI2C Peripheral Clock */
bogdanm 0:9b334a45a8ff 390 __HAL_FMPI2C_DISABLE(hfmpi2c);
bogdanm 0:9b334a45a8ff 391
bogdanm 0:9b334a45a8ff 392 /* DeInit the low level hardware: GPIO, CLOCK, NVIC */
bogdanm 0:9b334a45a8ff 393 HAL_FMPI2C_MspDeInit(hfmpi2c);
bogdanm 0:9b334a45a8ff 394
bogdanm 0:9b334a45a8ff 395 hfmpi2c->ErrorCode = HAL_FMPI2C_ERROR_NONE;
bogdanm 0:9b334a45a8ff 396 hfmpi2c->State = HAL_FMPI2C_STATE_RESET;
bogdanm 0:9b334a45a8ff 397
bogdanm 0:9b334a45a8ff 398 /* Release Lock */
bogdanm 0:9b334a45a8ff 399 __HAL_UNLOCK(hfmpi2c);
bogdanm 0:9b334a45a8ff 400
bogdanm 0:9b334a45a8ff 401 return HAL_OK;
bogdanm 0:9b334a45a8ff 402 }
bogdanm 0:9b334a45a8ff 403
bogdanm 0:9b334a45a8ff 404 /**
bogdanm 0:9b334a45a8ff 405 * @brief FMPI2C MSP Init.
bogdanm 0:9b334a45a8ff 406 * @param hfmpi2c : Pointer to a FMPI2C_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 407 * the configuration information for the specified FMPI2C.
bogdanm 0:9b334a45a8ff 408 * @retval None
bogdanm 0:9b334a45a8ff 409 */
bogdanm 0:9b334a45a8ff 410 __weak void HAL_FMPI2C_MspInit(FMPI2C_HandleTypeDef *hfmpi2c)
bogdanm 0:9b334a45a8ff 411 {
bogdanm 0:9b334a45a8ff 412 /* NOTE : This function Should not be modified, when the callback is needed,
bogdanm 0:9b334a45a8ff 413 the HAL_FMPI2C_MspInit could be implemented in the user file
bogdanm 0:9b334a45a8ff 414 */
bogdanm 0:9b334a45a8ff 415 }
bogdanm 0:9b334a45a8ff 416
bogdanm 0:9b334a45a8ff 417 /**
bogdanm 0:9b334a45a8ff 418 * @brief FMPI2C MSP DeInit
bogdanm 0:9b334a45a8ff 419 * @param hfmpi2c : Pointer to a FMPI2C_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 420 * the configuration information for the specified FMPI2C.
bogdanm 0:9b334a45a8ff 421 * @retval None
bogdanm 0:9b334a45a8ff 422 */
bogdanm 0:9b334a45a8ff 423 __weak void HAL_FMPI2C_MspDeInit(FMPI2C_HandleTypeDef *hfmpi2c)
bogdanm 0:9b334a45a8ff 424 {
bogdanm 0:9b334a45a8ff 425 /* NOTE : This function Should not be modified, when the callback is needed,
bogdanm 0:9b334a45a8ff 426 the HAL_FMPI2C_MspDeInit could be implemented in the user file
bogdanm 0:9b334a45a8ff 427 */
bogdanm 0:9b334a45a8ff 428 }
bogdanm 0:9b334a45a8ff 429
bogdanm 0:9b334a45a8ff 430 /**
bogdanm 0:9b334a45a8ff 431 * @}
bogdanm 0:9b334a45a8ff 432 */
bogdanm 0:9b334a45a8ff 433
bogdanm 0:9b334a45a8ff 434 /** @defgroup FMPI2C_Exported_Functions_Group2 I/O operation functions
bogdanm 0:9b334a45a8ff 435 * @brief Data transfers functions
bogdanm 0:9b334a45a8ff 436 *
bogdanm 0:9b334a45a8ff 437 @verbatim
bogdanm 0:9b334a45a8ff 438 ===============================================================================
bogdanm 0:9b334a45a8ff 439 ##### IO operation functions #####
bogdanm 0:9b334a45a8ff 440 ===============================================================================
bogdanm 0:9b334a45a8ff 441 [..]
bogdanm 0:9b334a45a8ff 442 This subsection provides a set of functions allowing to manage the FMPI2C data
bogdanm 0:9b334a45a8ff 443 transfers.
bogdanm 0:9b334a45a8ff 444
bogdanm 0:9b334a45a8ff 445 (#) There is two mode of transfer:
bogdanm 0:9b334a45a8ff 446 (++) Blocking mode : The communication is performed in the polling mode.
bogdanm 0:9b334a45a8ff 447 The status of all data processing is returned by the same function
bogdanm 0:9b334a45a8ff 448 after finishing transfer.
bogdanm 0:9b334a45a8ff 449 (++) No-Blocking mode : The communication is performed using Interrupts
bogdanm 0:9b334a45a8ff 450 or DMA. These functions return the status of the transfer startup.
bogdanm 0:9b334a45a8ff 451 The end of the data processing will be indicated through the
bogdanm 0:9b334a45a8ff 452 dedicated FMPI2C IRQ when using Interrupt mode or the DMA IRQ when
bogdanm 0:9b334a45a8ff 453 using DMA mode.
bogdanm 0:9b334a45a8ff 454
bogdanm 0:9b334a45a8ff 455 (#) Blocking mode functions are :
bogdanm 0:9b334a45a8ff 456 (++) HAL_FMPI2C_Master_Transmit()
bogdanm 0:9b334a45a8ff 457 (++) HAL_FMPI2C_Master_Receive()
bogdanm 0:9b334a45a8ff 458 (++) HAL_FMPI2C_Slave_Transmit()
bogdanm 0:9b334a45a8ff 459 (++) HAL_FMPI2C_Slave_Receive()
bogdanm 0:9b334a45a8ff 460 (++) HAL_FMPI2C_Mem_Write()
bogdanm 0:9b334a45a8ff 461 (++) HAL_FMPI2C_Mem_Read()
bogdanm 0:9b334a45a8ff 462 (++) HAL_FMPI2C_IsDeviceReady()
bogdanm 0:9b334a45a8ff 463
bogdanm 0:9b334a45a8ff 464 (#) No-Blocking mode functions with Interrupt are :
bogdanm 0:9b334a45a8ff 465 (++) HAL_FMPI2C_Master_Transmit_IT()
bogdanm 0:9b334a45a8ff 466 (++) HAL_FMPI2C_Master_Receive_IT()
bogdanm 0:9b334a45a8ff 467 (++) HAL_FMPI2C_Slave_Transmit_IT()
bogdanm 0:9b334a45a8ff 468 (++) HAL_FMPI2C_Slave_Receive_IT()
bogdanm 0:9b334a45a8ff 469 (++) HAL_FMPI2C_Mem_Write_IT()
bogdanm 0:9b334a45a8ff 470 (++) HAL_FMPI2C_Mem_Read_IT()
bogdanm 0:9b334a45a8ff 471
bogdanm 0:9b334a45a8ff 472 (#) No-Blocking mode functions with DMA are :
bogdanm 0:9b334a45a8ff 473 (++) HAL_FMPI2C_Master_Transmit_DMA()
bogdanm 0:9b334a45a8ff 474 (++) HAL_FMPI2C_Master_Receive_DMA()
bogdanm 0:9b334a45a8ff 475 (++) HAL_FMPI2C_Slave_Transmit_DMA()
bogdanm 0:9b334a45a8ff 476 (++) HAL_FMPI2C_Slave_Receive_DMA()
bogdanm 0:9b334a45a8ff 477 (++) HAL_FMPI2C_Mem_Write_DMA()
bogdanm 0:9b334a45a8ff 478 (++) HAL_FMPI2C_Mem_Read_DMA()
bogdanm 0:9b334a45a8ff 479
bogdanm 0:9b334a45a8ff 480 (#) A set of Transfer Complete Callbacks are provided in No_Blocking mode:
bogdanm 0:9b334a45a8ff 481 (++) HAL_FMPI2C_MemTxCpltCallback()
bogdanm 0:9b334a45a8ff 482 (++) HAL_FMPI2C_MemRxCpltCallback()
bogdanm 0:9b334a45a8ff 483 (++) HAL_FMPI2C_MasterTxCpltCallback()
bogdanm 0:9b334a45a8ff 484 (++) HAL_FMPI2C_MasterRxCpltCallback()
bogdanm 0:9b334a45a8ff 485 (++) HAL_FMPI2C_SlaveTxCpltCallback()
bogdanm 0:9b334a45a8ff 486 (++) HAL_FMPI2C_SlaveRxCpltCallback()
bogdanm 0:9b334a45a8ff 487 (++) HAL_FMPI2C_ErrorCallback()
bogdanm 0:9b334a45a8ff 488
bogdanm 0:9b334a45a8ff 489 @endverbatim
bogdanm 0:9b334a45a8ff 490 * @{
bogdanm 0:9b334a45a8ff 491 */
bogdanm 0:9b334a45a8ff 492
bogdanm 0:9b334a45a8ff 493 /**
bogdanm 0:9b334a45a8ff 494 * @brief Transmits in master mode an amount of data in blocking mode.
bogdanm 0:9b334a45a8ff 495 * @param hfmpi2c : Pointer to a FMPI2C_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 496 * the configuration information for the specified FMPI2C.
bogdanm 0:9b334a45a8ff 497 * @param DevAddress: Target device address
bogdanm 0:9b334a45a8ff 498 * @param pData: Pointer to data buffer
bogdanm 0:9b334a45a8ff 499 * @param Size: Amount of data to be sent
bogdanm 0:9b334a45a8ff 500 * @param Timeout: Timeout duration
bogdanm 0:9b334a45a8ff 501 * @retval HAL status
bogdanm 0:9b334a45a8ff 502 */
bogdanm 0:9b334a45a8ff 503 HAL_StatusTypeDef HAL_FMPI2C_Master_Transmit(FMPI2C_HandleTypeDef *hfmpi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout)
bogdanm 0:9b334a45a8ff 504 {
bogdanm 0:9b334a45a8ff 505 uint32_t sizetmp = 0;
bogdanm 0:9b334a45a8ff 506
bogdanm 0:9b334a45a8ff 507 if(hfmpi2c->State == HAL_FMPI2C_STATE_READY)
bogdanm 0:9b334a45a8ff 508 {
bogdanm 0:9b334a45a8ff 509 if((pData == NULL ) || (Size == 0))
bogdanm 0:9b334a45a8ff 510 {
bogdanm 0:9b334a45a8ff 511 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 512 }
bogdanm 0:9b334a45a8ff 513
bogdanm 0:9b334a45a8ff 514 if(__HAL_FMPI2C_GET_FLAG(hfmpi2c, FMPI2C_FLAG_BUSY) == SET)
bogdanm 0:9b334a45a8ff 515 {
bogdanm 0:9b334a45a8ff 516 return HAL_BUSY;
bogdanm 0:9b334a45a8ff 517 }
bogdanm 0:9b334a45a8ff 518
bogdanm 0:9b334a45a8ff 519 /* Process Locked */
bogdanm 0:9b334a45a8ff 520 __HAL_LOCK(hfmpi2c);
bogdanm 0:9b334a45a8ff 521
bogdanm 0:9b334a45a8ff 522 hfmpi2c->State = HAL_FMPI2C_STATE_MASTER_BUSY_TX;
bogdanm 0:9b334a45a8ff 523 hfmpi2c->ErrorCode = HAL_FMPI2C_ERROR_NONE;
bogdanm 0:9b334a45a8ff 524
bogdanm 0:9b334a45a8ff 525 /* Send Slave Address */
bogdanm 0:9b334a45a8ff 526 /* Set NBYTES to write and reload if size > 255 and generate RESTART */
bogdanm 0:9b334a45a8ff 527 /* Size > 255, need to set RELOAD bit */
bogdanm 0:9b334a45a8ff 528 if(Size > 255)
bogdanm 0:9b334a45a8ff 529 {
bogdanm 0:9b334a45a8ff 530 FMPI2C_TransferConfig(hfmpi2c,DevAddress,255, FMPI2C_RELOAD_MODE, FMPI2C_GENERATE_START_WRITE);
bogdanm 0:9b334a45a8ff 531 sizetmp = 255;
bogdanm 0:9b334a45a8ff 532 }
bogdanm 0:9b334a45a8ff 533 else
bogdanm 0:9b334a45a8ff 534 {
bogdanm 0:9b334a45a8ff 535 FMPI2C_TransferConfig(hfmpi2c,DevAddress,Size, FMPI2C_AUTOEND_MODE, FMPI2C_GENERATE_START_WRITE);
bogdanm 0:9b334a45a8ff 536 sizetmp = Size;
bogdanm 0:9b334a45a8ff 537 }
bogdanm 0:9b334a45a8ff 538
bogdanm 0:9b334a45a8ff 539 do
bogdanm 0:9b334a45a8ff 540 {
bogdanm 0:9b334a45a8ff 541 /* Wait until TXIS flag is set */
bogdanm 0:9b334a45a8ff 542 if(FMPI2C_WaitOnTXISFlagUntilTimeout(hfmpi2c, Timeout) != HAL_OK)
bogdanm 0:9b334a45a8ff 543 {
bogdanm 0:9b334a45a8ff 544 if(hfmpi2c->ErrorCode == HAL_FMPI2C_ERROR_AF)
bogdanm 0:9b334a45a8ff 545 {
bogdanm 0:9b334a45a8ff 546 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 547 }
bogdanm 0:9b334a45a8ff 548 else
bogdanm 0:9b334a45a8ff 549 {
bogdanm 0:9b334a45a8ff 550 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 551 }
bogdanm 0:9b334a45a8ff 552 }
bogdanm 0:9b334a45a8ff 553 /* Write data to TXDR */
bogdanm 0:9b334a45a8ff 554 hfmpi2c->Instance->TXDR = (*pData++);
bogdanm 0:9b334a45a8ff 555 sizetmp--;
bogdanm 0:9b334a45a8ff 556 Size--;
bogdanm 0:9b334a45a8ff 557
bogdanm 0:9b334a45a8ff 558 if((sizetmp == 0)&&(Size!=0))
bogdanm 0:9b334a45a8ff 559 {
bogdanm 0:9b334a45a8ff 560 /* Wait until TXE flag is set */
bogdanm 0:9b334a45a8ff 561 if(FMPI2C_WaitOnFlagUntilTimeout(hfmpi2c, FMPI2C_FLAG_TCR, RESET, Timeout) != HAL_OK)
bogdanm 0:9b334a45a8ff 562 {
bogdanm 0:9b334a45a8ff 563 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 564 }
bogdanm 0:9b334a45a8ff 565
bogdanm 0:9b334a45a8ff 566 if(Size > 255)
bogdanm 0:9b334a45a8ff 567 {
bogdanm 0:9b334a45a8ff 568 FMPI2C_TransferConfig(hfmpi2c,DevAddress,255, FMPI2C_RELOAD_MODE, FMPI2C_NO_STARTSTOP);
bogdanm 0:9b334a45a8ff 569 sizetmp = 255;
bogdanm 0:9b334a45a8ff 570 }
bogdanm 0:9b334a45a8ff 571 else
bogdanm 0:9b334a45a8ff 572 {
bogdanm 0:9b334a45a8ff 573 FMPI2C_TransferConfig(hfmpi2c,DevAddress,Size, FMPI2C_AUTOEND_MODE, FMPI2C_NO_STARTSTOP);
bogdanm 0:9b334a45a8ff 574 sizetmp = Size;
bogdanm 0:9b334a45a8ff 575 }
bogdanm 0:9b334a45a8ff 576 }
bogdanm 0:9b334a45a8ff 577
bogdanm 0:9b334a45a8ff 578 }while(Size > 0);
bogdanm 0:9b334a45a8ff 579
bogdanm 0:9b334a45a8ff 580 /* No need to Check TC flag, with AUTOEND mode the stop is automatically generated */
bogdanm 0:9b334a45a8ff 581 /* Wait until STOPF flag is set */
bogdanm 0:9b334a45a8ff 582 if(FMPI2C_WaitOnSTOPFlagUntilTimeout(hfmpi2c, Timeout) != HAL_OK)
bogdanm 0:9b334a45a8ff 583 {
bogdanm 0:9b334a45a8ff 584 if(hfmpi2c->ErrorCode == HAL_FMPI2C_ERROR_AF)
bogdanm 0:9b334a45a8ff 585 {
bogdanm 0:9b334a45a8ff 586 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 587 }
bogdanm 0:9b334a45a8ff 588 else
bogdanm 0:9b334a45a8ff 589 {
bogdanm 0:9b334a45a8ff 590 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 591 }
bogdanm 0:9b334a45a8ff 592 }
bogdanm 0:9b334a45a8ff 593
bogdanm 0:9b334a45a8ff 594 /* Clear STOP Flag */
bogdanm 0:9b334a45a8ff 595 __HAL_FMPI2C_CLEAR_FLAG(hfmpi2c, FMPI2C_FLAG_STOPF);
bogdanm 0:9b334a45a8ff 596
bogdanm 0:9b334a45a8ff 597 /* Clear Configuration Register 2 */
bogdanm 0:9b334a45a8ff 598 __HAL_FMPI2C_RESET_CR2(hfmpi2c);
bogdanm 0:9b334a45a8ff 599
bogdanm 0:9b334a45a8ff 600 hfmpi2c->State = HAL_FMPI2C_STATE_READY;
bogdanm 0:9b334a45a8ff 601
bogdanm 0:9b334a45a8ff 602 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 603 __HAL_UNLOCK(hfmpi2c);
bogdanm 0:9b334a45a8ff 604
bogdanm 0:9b334a45a8ff 605 return HAL_OK;
bogdanm 0:9b334a45a8ff 606 }
bogdanm 0:9b334a45a8ff 607 else
bogdanm 0:9b334a45a8ff 608 {
bogdanm 0:9b334a45a8ff 609 return HAL_BUSY;
bogdanm 0:9b334a45a8ff 610 }
bogdanm 0:9b334a45a8ff 611 }
bogdanm 0:9b334a45a8ff 612
bogdanm 0:9b334a45a8ff 613 /**
bogdanm 0:9b334a45a8ff 614 * @brief Receives in master mode an amount of data in blocking mode.
bogdanm 0:9b334a45a8ff 615 * @param hfmpi2c : Pointer to a FMPI2C_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 616 * the configuration information for the specified FMPI2C.
bogdanm 0:9b334a45a8ff 617 * @param DevAddress: Target device address
bogdanm 0:9b334a45a8ff 618 * @param pData: Pointer to data buffer
bogdanm 0:9b334a45a8ff 619 * @param Size: Amount of data to be sent
bogdanm 0:9b334a45a8ff 620 * @param Timeout: Timeout duration
bogdanm 0:9b334a45a8ff 621 * @retval HAL status
bogdanm 0:9b334a45a8ff 622 */
bogdanm 0:9b334a45a8ff 623 HAL_StatusTypeDef HAL_FMPI2C_Master_Receive(FMPI2C_HandleTypeDef *hfmpi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout)
bogdanm 0:9b334a45a8ff 624 {
bogdanm 0:9b334a45a8ff 625 uint32_t sizetmp = 0;
bogdanm 0:9b334a45a8ff 626
bogdanm 0:9b334a45a8ff 627 if(hfmpi2c->State == HAL_FMPI2C_STATE_READY)
bogdanm 0:9b334a45a8ff 628 {
bogdanm 0:9b334a45a8ff 629 if((pData == NULL ) || (Size == 0))
bogdanm 0:9b334a45a8ff 630 {
bogdanm 0:9b334a45a8ff 631 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 632 }
bogdanm 0:9b334a45a8ff 633
bogdanm 0:9b334a45a8ff 634 if(__HAL_FMPI2C_GET_FLAG(hfmpi2c, FMPI2C_FLAG_BUSY) == SET)
bogdanm 0:9b334a45a8ff 635 {
bogdanm 0:9b334a45a8ff 636 return HAL_BUSY;
bogdanm 0:9b334a45a8ff 637 }
bogdanm 0:9b334a45a8ff 638
bogdanm 0:9b334a45a8ff 639 /* Process Locked */
bogdanm 0:9b334a45a8ff 640 __HAL_LOCK(hfmpi2c);
bogdanm 0:9b334a45a8ff 641
bogdanm 0:9b334a45a8ff 642 hfmpi2c->State = HAL_FMPI2C_STATE_MASTER_BUSY_RX;
bogdanm 0:9b334a45a8ff 643 hfmpi2c->ErrorCode = HAL_FMPI2C_ERROR_NONE;
bogdanm 0:9b334a45a8ff 644
bogdanm 0:9b334a45a8ff 645 /* Send Slave Address */
bogdanm 0:9b334a45a8ff 646 /* Set NBYTES to write and reload if size > 255 and generate RESTART */
bogdanm 0:9b334a45a8ff 647 /* Size > 255, need to set RELOAD bit */
bogdanm 0:9b334a45a8ff 648 if(Size > 255)
bogdanm 0:9b334a45a8ff 649 {
bogdanm 0:9b334a45a8ff 650 FMPI2C_TransferConfig(hfmpi2c,DevAddress,255, FMPI2C_RELOAD_MODE, FMPI2C_GENERATE_START_READ);
bogdanm 0:9b334a45a8ff 651 sizetmp = 255;
bogdanm 0:9b334a45a8ff 652 }
bogdanm 0:9b334a45a8ff 653 else
bogdanm 0:9b334a45a8ff 654 {
bogdanm 0:9b334a45a8ff 655 FMPI2C_TransferConfig(hfmpi2c,DevAddress,Size, FMPI2C_AUTOEND_MODE, FMPI2C_GENERATE_START_READ);
bogdanm 0:9b334a45a8ff 656 sizetmp = Size;
bogdanm 0:9b334a45a8ff 657 }
bogdanm 0:9b334a45a8ff 658
bogdanm 0:9b334a45a8ff 659 do
bogdanm 0:9b334a45a8ff 660 {
bogdanm 0:9b334a45a8ff 661 /* Wait until RXNE flag is set */
bogdanm 0:9b334a45a8ff 662 if(FMPI2C_WaitOnFlagUntilTimeout(hfmpi2c, FMPI2C_FLAG_RXNE, RESET, Timeout) != HAL_OK)
bogdanm 0:9b334a45a8ff 663 {
bogdanm 0:9b334a45a8ff 664 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 665 }
bogdanm 0:9b334a45a8ff 666
bogdanm 0:9b334a45a8ff 667 /* Write data to RXDR */
bogdanm 0:9b334a45a8ff 668 (*pData++) =hfmpi2c->Instance->RXDR;
bogdanm 0:9b334a45a8ff 669 sizetmp--;
bogdanm 0:9b334a45a8ff 670 Size--;
bogdanm 0:9b334a45a8ff 671
bogdanm 0:9b334a45a8ff 672 if((sizetmp == 0)&&(Size!=0))
bogdanm 0:9b334a45a8ff 673 {
bogdanm 0:9b334a45a8ff 674 /* Wait until TCR flag is set */
bogdanm 0:9b334a45a8ff 675 if(FMPI2C_WaitOnFlagUntilTimeout(hfmpi2c, FMPI2C_FLAG_TCR, RESET, Timeout) != HAL_OK)
bogdanm 0:9b334a45a8ff 676 {
bogdanm 0:9b334a45a8ff 677 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 678 }
bogdanm 0:9b334a45a8ff 679
bogdanm 0:9b334a45a8ff 680 if(Size > 255)
bogdanm 0:9b334a45a8ff 681 {
bogdanm 0:9b334a45a8ff 682 FMPI2C_TransferConfig(hfmpi2c,DevAddress,255, FMPI2C_RELOAD_MODE, FMPI2C_NO_STARTSTOP);
bogdanm 0:9b334a45a8ff 683 sizetmp = 255;
bogdanm 0:9b334a45a8ff 684 }
bogdanm 0:9b334a45a8ff 685 else
bogdanm 0:9b334a45a8ff 686 {
bogdanm 0:9b334a45a8ff 687 FMPI2C_TransferConfig(hfmpi2c,DevAddress,Size, FMPI2C_AUTOEND_MODE, FMPI2C_NO_STARTSTOP);
bogdanm 0:9b334a45a8ff 688 sizetmp = Size;
bogdanm 0:9b334a45a8ff 689 }
bogdanm 0:9b334a45a8ff 690 }
bogdanm 0:9b334a45a8ff 691
bogdanm 0:9b334a45a8ff 692 }while(Size > 0);
bogdanm 0:9b334a45a8ff 693
bogdanm 0:9b334a45a8ff 694 /* No need to Check TC flag, with AUTOEND mode the stop is automatically generated */
bogdanm 0:9b334a45a8ff 695 /* Wait until STOPF flag is set */
bogdanm 0:9b334a45a8ff 696 if(FMPI2C_WaitOnSTOPFlagUntilTimeout(hfmpi2c, FMPI2C_TIMEOUT_STOPF) != HAL_OK)
bogdanm 0:9b334a45a8ff 697 {
bogdanm 0:9b334a45a8ff 698 if(hfmpi2c->ErrorCode == HAL_FMPI2C_ERROR_AF)
bogdanm 0:9b334a45a8ff 699 {
bogdanm 0:9b334a45a8ff 700 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 701 }
bogdanm 0:9b334a45a8ff 702 else
bogdanm 0:9b334a45a8ff 703 {
bogdanm 0:9b334a45a8ff 704 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 705 }
bogdanm 0:9b334a45a8ff 706 }
bogdanm 0:9b334a45a8ff 707
bogdanm 0:9b334a45a8ff 708 /* Clear STOP Flag */
bogdanm 0:9b334a45a8ff 709 __HAL_FMPI2C_CLEAR_FLAG(hfmpi2c, FMPI2C_FLAG_STOPF);
bogdanm 0:9b334a45a8ff 710
bogdanm 0:9b334a45a8ff 711 /* Clear Configuration Register 2 */
bogdanm 0:9b334a45a8ff 712 __HAL_FMPI2C_RESET_CR2(hfmpi2c);
bogdanm 0:9b334a45a8ff 713
bogdanm 0:9b334a45a8ff 714 hfmpi2c->State = HAL_FMPI2C_STATE_READY;
bogdanm 0:9b334a45a8ff 715
bogdanm 0:9b334a45a8ff 716 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 717 __HAL_UNLOCK(hfmpi2c);
bogdanm 0:9b334a45a8ff 718
bogdanm 0:9b334a45a8ff 719 return HAL_OK;
bogdanm 0:9b334a45a8ff 720 }
bogdanm 0:9b334a45a8ff 721 else
bogdanm 0:9b334a45a8ff 722 {
bogdanm 0:9b334a45a8ff 723 return HAL_BUSY;
bogdanm 0:9b334a45a8ff 724 }
bogdanm 0:9b334a45a8ff 725 }
bogdanm 0:9b334a45a8ff 726
bogdanm 0:9b334a45a8ff 727 /**
bogdanm 0:9b334a45a8ff 728 * @brief Transmits in slave mode an amount of data in blocking mode.
bogdanm 0:9b334a45a8ff 729 * @param hfmpi2c : Pointer to a FMPI2C_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 730 * the configuration information for the specified FMPI2C.
bogdanm 0:9b334a45a8ff 731 * @param pData: Pointer to data buffer
bogdanm 0:9b334a45a8ff 732 * @param Size: Amount of data to be sent
bogdanm 0:9b334a45a8ff 733 * @param Timeout: Timeout duration
bogdanm 0:9b334a45a8ff 734 * @retval HAL status
bogdanm 0:9b334a45a8ff 735 */
bogdanm 0:9b334a45a8ff 736 HAL_StatusTypeDef HAL_FMPI2C_Slave_Transmit(FMPI2C_HandleTypeDef *hfmpi2c, uint8_t *pData, uint16_t Size, uint32_t Timeout)
bogdanm 0:9b334a45a8ff 737 {
bogdanm 0:9b334a45a8ff 738 if(hfmpi2c->State == HAL_FMPI2C_STATE_READY)
bogdanm 0:9b334a45a8ff 739 {
bogdanm 0:9b334a45a8ff 740 if((pData == NULL ) || (Size == 0))
bogdanm 0:9b334a45a8ff 741 {
bogdanm 0:9b334a45a8ff 742 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 743 }
bogdanm 0:9b334a45a8ff 744
bogdanm 0:9b334a45a8ff 745 /* Process Locked */
bogdanm 0:9b334a45a8ff 746 __HAL_LOCK(hfmpi2c);
bogdanm 0:9b334a45a8ff 747
bogdanm 0:9b334a45a8ff 748 hfmpi2c->State = HAL_FMPI2C_STATE_SLAVE_BUSY_RX;
bogdanm 0:9b334a45a8ff 749 hfmpi2c->ErrorCode = HAL_FMPI2C_ERROR_NONE;
bogdanm 0:9b334a45a8ff 750
bogdanm 0:9b334a45a8ff 751 /* Enable Address Acknowledge */
bogdanm 0:9b334a45a8ff 752 hfmpi2c->Instance->CR2 &= ~FMPI2C_CR2_NACK;
bogdanm 0:9b334a45a8ff 753
bogdanm 0:9b334a45a8ff 754 /* Wait until ADDR flag is set */
bogdanm 0:9b334a45a8ff 755 if(FMPI2C_WaitOnFlagUntilTimeout(hfmpi2c, FMPI2C_FLAG_ADDR, RESET, Timeout) != HAL_OK)
bogdanm 0:9b334a45a8ff 756 {
bogdanm 0:9b334a45a8ff 757 /* Disable Address Acknowledge */
bogdanm 0:9b334a45a8ff 758 hfmpi2c->Instance->CR2 |= FMPI2C_CR2_NACK;
bogdanm 0:9b334a45a8ff 759 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 760 }
bogdanm 0:9b334a45a8ff 761
bogdanm 0:9b334a45a8ff 762 /* Clear ADDR flag */
bogdanm 0:9b334a45a8ff 763 __HAL_FMPI2C_CLEAR_FLAG(hfmpi2c,FMPI2C_FLAG_ADDR);
bogdanm 0:9b334a45a8ff 764
bogdanm 0:9b334a45a8ff 765 /* If 10bit addressing mode is selected */
bogdanm 0:9b334a45a8ff 766 if(hfmpi2c->Init.AddressingMode == FMPI2C_ADDRESSINGMODE_10BIT)
bogdanm 0:9b334a45a8ff 767 {
bogdanm 0:9b334a45a8ff 768 /* Wait until ADDR flag is set */
bogdanm 0:9b334a45a8ff 769 if(FMPI2C_WaitOnFlagUntilTimeout(hfmpi2c, FMPI2C_FLAG_ADDR, RESET, Timeout) != HAL_OK)
bogdanm 0:9b334a45a8ff 770 {
bogdanm 0:9b334a45a8ff 771 /* Disable Address Acknowledge */
bogdanm 0:9b334a45a8ff 772 hfmpi2c->Instance->CR2 |= FMPI2C_CR2_NACK;
bogdanm 0:9b334a45a8ff 773 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 774 }
bogdanm 0:9b334a45a8ff 775
bogdanm 0:9b334a45a8ff 776 /* Clear ADDR flag */
bogdanm 0:9b334a45a8ff 777 __HAL_FMPI2C_CLEAR_FLAG(hfmpi2c,FMPI2C_FLAG_ADDR);
bogdanm 0:9b334a45a8ff 778 }
bogdanm 0:9b334a45a8ff 779
bogdanm 0:9b334a45a8ff 780 /* Wait until DIR flag is set Transmitter mode */
bogdanm 0:9b334a45a8ff 781 if(FMPI2C_WaitOnFlagUntilTimeout(hfmpi2c, FMPI2C_FLAG_DIR, RESET, Timeout) != HAL_OK)
bogdanm 0:9b334a45a8ff 782 {
bogdanm 0:9b334a45a8ff 783 /* Disable Address Acknowledge */
bogdanm 0:9b334a45a8ff 784 hfmpi2c->Instance->CR2 |= FMPI2C_CR2_NACK;
bogdanm 0:9b334a45a8ff 785 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 786 }
bogdanm 0:9b334a45a8ff 787
bogdanm 0:9b334a45a8ff 788 do
bogdanm 0:9b334a45a8ff 789 {
bogdanm 0:9b334a45a8ff 790 /* Wait until TXIS flag is set */
bogdanm 0:9b334a45a8ff 791 if(FMPI2C_WaitOnTXISFlagUntilTimeout(hfmpi2c, Timeout) != HAL_OK)
bogdanm 0:9b334a45a8ff 792 {
bogdanm 0:9b334a45a8ff 793 /* Disable Address Acknowledge */
bogdanm 0:9b334a45a8ff 794 hfmpi2c->Instance->CR2 |= FMPI2C_CR2_NACK;
bogdanm 0:9b334a45a8ff 795
bogdanm 0:9b334a45a8ff 796 if(hfmpi2c->ErrorCode == HAL_FMPI2C_ERROR_AF)
bogdanm 0:9b334a45a8ff 797 {
bogdanm 0:9b334a45a8ff 798 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 799 }
bogdanm 0:9b334a45a8ff 800 else
bogdanm 0:9b334a45a8ff 801 {
bogdanm 0:9b334a45a8ff 802 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 803 }
bogdanm 0:9b334a45a8ff 804 }
bogdanm 0:9b334a45a8ff 805
bogdanm 0:9b334a45a8ff 806 /* Read data from TXDR */
bogdanm 0:9b334a45a8ff 807 hfmpi2c->Instance->TXDR = (*pData++);
bogdanm 0:9b334a45a8ff 808 Size--;
bogdanm 0:9b334a45a8ff 809 }while(Size > 0);
bogdanm 0:9b334a45a8ff 810
bogdanm 0:9b334a45a8ff 811 /* Wait until STOP flag is set */
bogdanm 0:9b334a45a8ff 812 if(FMPI2C_WaitOnSTOPFlagUntilTimeout(hfmpi2c, FMPI2C_TIMEOUT_STOPF) != HAL_OK)
bogdanm 0:9b334a45a8ff 813 {
bogdanm 0:9b334a45a8ff 814 /* Disable Address Acknowledge */
bogdanm 0:9b334a45a8ff 815 hfmpi2c->Instance->CR2 |= FMPI2C_CR2_NACK;
bogdanm 0:9b334a45a8ff 816
bogdanm 0:9b334a45a8ff 817 if(hfmpi2c->ErrorCode == HAL_FMPI2C_ERROR_AF)
bogdanm 0:9b334a45a8ff 818 {
bogdanm 0:9b334a45a8ff 819 /* Normal use case for Transmitter mode */
bogdanm 0:9b334a45a8ff 820 /* A NACK is generated to confirm the end of transfer */
bogdanm 0:9b334a45a8ff 821 hfmpi2c->ErrorCode = HAL_FMPI2C_ERROR_NONE;
bogdanm 0:9b334a45a8ff 822 }
bogdanm 0:9b334a45a8ff 823 else
bogdanm 0:9b334a45a8ff 824 {
bogdanm 0:9b334a45a8ff 825 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 826 }
bogdanm 0:9b334a45a8ff 827 }
bogdanm 0:9b334a45a8ff 828
bogdanm 0:9b334a45a8ff 829 /* Clear STOP flag */
bogdanm 0:9b334a45a8ff 830 __HAL_FMPI2C_CLEAR_FLAG(hfmpi2c,FMPI2C_FLAG_STOPF);
bogdanm 0:9b334a45a8ff 831
bogdanm 0:9b334a45a8ff 832 /* Wait until BUSY flag is reset */
bogdanm 0:9b334a45a8ff 833 if(FMPI2C_WaitOnFlagUntilTimeout(hfmpi2c, FMPI2C_FLAG_BUSY, SET, Timeout) != HAL_OK)
bogdanm 0:9b334a45a8ff 834 {
bogdanm 0:9b334a45a8ff 835 /* Disable Address Acknowledge */
bogdanm 0:9b334a45a8ff 836 hfmpi2c->Instance->CR2 |= FMPI2C_CR2_NACK;
bogdanm 0:9b334a45a8ff 837 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 838 }
bogdanm 0:9b334a45a8ff 839
bogdanm 0:9b334a45a8ff 840 /* Disable Address Acknowledge */
bogdanm 0:9b334a45a8ff 841 hfmpi2c->Instance->CR2 |= FMPI2C_CR2_NACK;
bogdanm 0:9b334a45a8ff 842
bogdanm 0:9b334a45a8ff 843 hfmpi2c->State = HAL_FMPI2C_STATE_READY;
bogdanm 0:9b334a45a8ff 844
bogdanm 0:9b334a45a8ff 845 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 846 __HAL_UNLOCK(hfmpi2c);
bogdanm 0:9b334a45a8ff 847
bogdanm 0:9b334a45a8ff 848 return HAL_OK;
bogdanm 0:9b334a45a8ff 849 }
bogdanm 0:9b334a45a8ff 850 else
bogdanm 0:9b334a45a8ff 851 {
bogdanm 0:9b334a45a8ff 852 return HAL_BUSY;
bogdanm 0:9b334a45a8ff 853 }
bogdanm 0:9b334a45a8ff 854 }
bogdanm 0:9b334a45a8ff 855
bogdanm 0:9b334a45a8ff 856 /**
bogdanm 0:9b334a45a8ff 857 * @brief Receive in slave mode an amount of data in blocking mode
bogdanm 0:9b334a45a8ff 858 * @param hfmpi2c : Pointer to a FMPI2C_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 859 * the configuration information for the specified FMPI2C.
bogdanm 0:9b334a45a8ff 860 * @param pData: Pointer to data buffer
bogdanm 0:9b334a45a8ff 861 * @param Size: Amount of data to be sent
bogdanm 0:9b334a45a8ff 862 * @param Timeout: Timeout duration
bogdanm 0:9b334a45a8ff 863 * @retval HAL status
bogdanm 0:9b334a45a8ff 864 */
bogdanm 0:9b334a45a8ff 865 HAL_StatusTypeDef HAL_FMPI2C_Slave_Receive(FMPI2C_HandleTypeDef *hfmpi2c, uint8_t *pData, uint16_t Size, uint32_t Timeout)
bogdanm 0:9b334a45a8ff 866 {
bogdanm 0:9b334a45a8ff 867 if(hfmpi2c->State == HAL_FMPI2C_STATE_READY)
bogdanm 0:9b334a45a8ff 868 {
bogdanm 0:9b334a45a8ff 869 if((pData == NULL ) || (Size == 0))
bogdanm 0:9b334a45a8ff 870 {
bogdanm 0:9b334a45a8ff 871 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 872 }
bogdanm 0:9b334a45a8ff 873
bogdanm 0:9b334a45a8ff 874 /* Process Locked */
bogdanm 0:9b334a45a8ff 875 __HAL_LOCK(hfmpi2c);
bogdanm 0:9b334a45a8ff 876
bogdanm 0:9b334a45a8ff 877 hfmpi2c->State = HAL_FMPI2C_STATE_SLAVE_BUSY_RX;
bogdanm 0:9b334a45a8ff 878 hfmpi2c->ErrorCode = HAL_FMPI2C_ERROR_NONE;
bogdanm 0:9b334a45a8ff 879
bogdanm 0:9b334a45a8ff 880 /* Enable Address Acknowledge */
bogdanm 0:9b334a45a8ff 881 hfmpi2c->Instance->CR2 &= ~FMPI2C_CR2_NACK;
bogdanm 0:9b334a45a8ff 882
bogdanm 0:9b334a45a8ff 883 /* Wait until ADDR flag is set */
bogdanm 0:9b334a45a8ff 884 if(FMPI2C_WaitOnFlagUntilTimeout(hfmpi2c, FMPI2C_FLAG_ADDR, RESET, Timeout) != HAL_OK)
bogdanm 0:9b334a45a8ff 885 {
bogdanm 0:9b334a45a8ff 886 /* Disable Address Acknowledge */
bogdanm 0:9b334a45a8ff 887 hfmpi2c->Instance->CR2 |= FMPI2C_CR2_NACK;
bogdanm 0:9b334a45a8ff 888 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 889 }
bogdanm 0:9b334a45a8ff 890
bogdanm 0:9b334a45a8ff 891 /* Clear ADDR flag */
bogdanm 0:9b334a45a8ff 892 __HAL_FMPI2C_CLEAR_FLAG(hfmpi2c,FMPI2C_FLAG_ADDR);
bogdanm 0:9b334a45a8ff 893
bogdanm 0:9b334a45a8ff 894 /* Wait until DIR flag is reset Receiver mode */
bogdanm 0:9b334a45a8ff 895 if(FMPI2C_WaitOnFlagUntilTimeout(hfmpi2c, FMPI2C_FLAG_DIR, SET, Timeout) != HAL_OK)
bogdanm 0:9b334a45a8ff 896 {
bogdanm 0:9b334a45a8ff 897 /* Disable Address Acknowledge */
bogdanm 0:9b334a45a8ff 898 hfmpi2c->Instance->CR2 |= FMPI2C_CR2_NACK;
bogdanm 0:9b334a45a8ff 899 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 900 }
bogdanm 0:9b334a45a8ff 901
bogdanm 0:9b334a45a8ff 902 while(Size > 0)
bogdanm 0:9b334a45a8ff 903 {
bogdanm 0:9b334a45a8ff 904 /* Wait until RXNE flag is set */
bogdanm 0:9b334a45a8ff 905 if(FMPI2C_WaitOnRXNEFlagUntilTimeout(hfmpi2c, Timeout) != HAL_OK)
bogdanm 0:9b334a45a8ff 906 {
bogdanm 0:9b334a45a8ff 907 /* Disable Address Acknowledge */
bogdanm 0:9b334a45a8ff 908 hfmpi2c->Instance->CR2 |= FMPI2C_CR2_NACK;
bogdanm 0:9b334a45a8ff 909 if(hfmpi2c->ErrorCode == HAL_FMPI2C_ERROR_TIMEOUT)
bogdanm 0:9b334a45a8ff 910 {
bogdanm 0:9b334a45a8ff 911 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 912 }
bogdanm 0:9b334a45a8ff 913 else
bogdanm 0:9b334a45a8ff 914 {
bogdanm 0:9b334a45a8ff 915 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 916 }
bogdanm 0:9b334a45a8ff 917 }
bogdanm 0:9b334a45a8ff 918
bogdanm 0:9b334a45a8ff 919 /* Read data from RXDR */
bogdanm 0:9b334a45a8ff 920 (*pData++) = hfmpi2c->Instance->RXDR;
bogdanm 0:9b334a45a8ff 921 Size--;
bogdanm 0:9b334a45a8ff 922 }
bogdanm 0:9b334a45a8ff 923
bogdanm 0:9b334a45a8ff 924 /* Wait until STOP flag is set */
bogdanm 0:9b334a45a8ff 925 if(FMPI2C_WaitOnSTOPFlagUntilTimeout(hfmpi2c, FMPI2C_TIMEOUT_STOPF) != HAL_OK)
bogdanm 0:9b334a45a8ff 926 {
bogdanm 0:9b334a45a8ff 927 /* Disable Address Acknowledge */
bogdanm 0:9b334a45a8ff 928 hfmpi2c->Instance->CR2 |= FMPI2C_CR2_NACK;
bogdanm 0:9b334a45a8ff 929
bogdanm 0:9b334a45a8ff 930 if(hfmpi2c->ErrorCode == HAL_FMPI2C_ERROR_AF)
bogdanm 0:9b334a45a8ff 931 {
bogdanm 0:9b334a45a8ff 932 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 933 }
bogdanm 0:9b334a45a8ff 934 else
bogdanm 0:9b334a45a8ff 935 {
bogdanm 0:9b334a45a8ff 936 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 937 }
bogdanm 0:9b334a45a8ff 938 }
bogdanm 0:9b334a45a8ff 939
bogdanm 0:9b334a45a8ff 940 /* Clear STOP flag */
bogdanm 0:9b334a45a8ff 941 __HAL_FMPI2C_CLEAR_FLAG(hfmpi2c,FMPI2C_FLAG_STOPF);
bogdanm 0:9b334a45a8ff 942
bogdanm 0:9b334a45a8ff 943 /* Wait until BUSY flag is reset */
bogdanm 0:9b334a45a8ff 944 if(FMPI2C_WaitOnFlagUntilTimeout(hfmpi2c, FMPI2C_FLAG_BUSY, SET, Timeout) != HAL_OK)
bogdanm 0:9b334a45a8ff 945 {
bogdanm 0:9b334a45a8ff 946 /* Disable Address Acknowledge */
bogdanm 0:9b334a45a8ff 947 hfmpi2c->Instance->CR2 |= FMPI2C_CR2_NACK;
bogdanm 0:9b334a45a8ff 948 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 949 }
bogdanm 0:9b334a45a8ff 950
bogdanm 0:9b334a45a8ff 951
bogdanm 0:9b334a45a8ff 952 /* Disable Address Acknowledge */
bogdanm 0:9b334a45a8ff 953 hfmpi2c->Instance->CR2 |= FMPI2C_CR2_NACK;
bogdanm 0:9b334a45a8ff 954
bogdanm 0:9b334a45a8ff 955 hfmpi2c->State = HAL_FMPI2C_STATE_READY;
bogdanm 0:9b334a45a8ff 956
bogdanm 0:9b334a45a8ff 957 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 958 __HAL_UNLOCK(hfmpi2c);
bogdanm 0:9b334a45a8ff 959
bogdanm 0:9b334a45a8ff 960 return HAL_OK;
bogdanm 0:9b334a45a8ff 961 }
bogdanm 0:9b334a45a8ff 962 else
bogdanm 0:9b334a45a8ff 963 {
bogdanm 0:9b334a45a8ff 964 return HAL_BUSY;
bogdanm 0:9b334a45a8ff 965 }
bogdanm 0:9b334a45a8ff 966 }
bogdanm 0:9b334a45a8ff 967
bogdanm 0:9b334a45a8ff 968 /**
bogdanm 0:9b334a45a8ff 969 * @brief Transmit in master mode an amount of data in no-blocking mode with Interrupt
bogdanm 0:9b334a45a8ff 970 * @param hfmpi2c : Pointer to a FMPI2C_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 971 * the configuration information for the specified FMPI2C.
bogdanm 0:9b334a45a8ff 972 * @param DevAddress: Target device address
bogdanm 0:9b334a45a8ff 973 * @param pData: Pointer to data buffer
bogdanm 0:9b334a45a8ff 974 * @param Size: Amount of data to be sent
bogdanm 0:9b334a45a8ff 975 * @retval HAL status
bogdanm 0:9b334a45a8ff 976 */
bogdanm 0:9b334a45a8ff 977 HAL_StatusTypeDef HAL_FMPI2C_Master_Transmit_IT(FMPI2C_HandleTypeDef *hfmpi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size)
bogdanm 0:9b334a45a8ff 978 {
bogdanm 0:9b334a45a8ff 979 if(hfmpi2c->State == HAL_FMPI2C_STATE_READY)
bogdanm 0:9b334a45a8ff 980 {
bogdanm 0:9b334a45a8ff 981 if((pData == NULL) || (Size == 0))
bogdanm 0:9b334a45a8ff 982 {
bogdanm 0:9b334a45a8ff 983 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 984 }
bogdanm 0:9b334a45a8ff 985
bogdanm 0:9b334a45a8ff 986 if(__HAL_FMPI2C_GET_FLAG(hfmpi2c, FMPI2C_FLAG_BUSY) == SET)
bogdanm 0:9b334a45a8ff 987 {
bogdanm 0:9b334a45a8ff 988 return HAL_BUSY;
bogdanm 0:9b334a45a8ff 989 }
bogdanm 0:9b334a45a8ff 990
bogdanm 0:9b334a45a8ff 991 /* Process Locked */
bogdanm 0:9b334a45a8ff 992 __HAL_LOCK(hfmpi2c);
bogdanm 0:9b334a45a8ff 993
bogdanm 0:9b334a45a8ff 994 hfmpi2c->State = HAL_FMPI2C_STATE_MASTER_BUSY_TX;
bogdanm 0:9b334a45a8ff 995 hfmpi2c->ErrorCode = HAL_FMPI2C_ERROR_NONE;
bogdanm 0:9b334a45a8ff 996
bogdanm 0:9b334a45a8ff 997 hfmpi2c->pBuffPtr = pData;
bogdanm 0:9b334a45a8ff 998 hfmpi2c->XferCount = Size;
bogdanm 0:9b334a45a8ff 999 if(Size > 255)
bogdanm 0:9b334a45a8ff 1000 {
bogdanm 0:9b334a45a8ff 1001 hfmpi2c->XferSize = 255;
bogdanm 0:9b334a45a8ff 1002 }
bogdanm 0:9b334a45a8ff 1003 else
bogdanm 0:9b334a45a8ff 1004 {
bogdanm 0:9b334a45a8ff 1005 hfmpi2c->XferSize = Size;
bogdanm 0:9b334a45a8ff 1006 }
bogdanm 0:9b334a45a8ff 1007
bogdanm 0:9b334a45a8ff 1008 /* Send Slave Address */
bogdanm 0:9b334a45a8ff 1009 /* Set NBYTES to write and reload if size > 255 and generate RESTART */
bogdanm 0:9b334a45a8ff 1010 if( (hfmpi2c->XferSize == 255) && (hfmpi2c->XferSize < hfmpi2c->XferCount) )
bogdanm 0:9b334a45a8ff 1011 {
bogdanm 0:9b334a45a8ff 1012 FMPI2C_TransferConfig(hfmpi2c,DevAddress,hfmpi2c->XferSize, FMPI2C_RELOAD_MODE, FMPI2C_GENERATE_START_WRITE);
bogdanm 0:9b334a45a8ff 1013 }
bogdanm 0:9b334a45a8ff 1014 else
bogdanm 0:9b334a45a8ff 1015 {
bogdanm 0:9b334a45a8ff 1016 FMPI2C_TransferConfig(hfmpi2c,DevAddress,hfmpi2c->XferSize, FMPI2C_AUTOEND_MODE, FMPI2C_GENERATE_START_WRITE);
bogdanm 0:9b334a45a8ff 1017 }
bogdanm 0:9b334a45a8ff 1018
bogdanm 0:9b334a45a8ff 1019 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 1020 __HAL_UNLOCK(hfmpi2c);
bogdanm 0:9b334a45a8ff 1021
bogdanm 0:9b334a45a8ff 1022 /* Note : The FMPI2C interrupts must be enabled after unlocking current process
bogdanm 0:9b334a45a8ff 1023 to avoid the risk of FMPI2C interrupt handle execution before current
bogdanm 0:9b334a45a8ff 1024 process unlock */
bogdanm 0:9b334a45a8ff 1025
bogdanm 0:9b334a45a8ff 1026
bogdanm 0:9b334a45a8ff 1027 /* Enable ERR, TC, STOP, NACK, TXI interrupt */
bogdanm 0:9b334a45a8ff 1028 /* possible to enable all of these */
bogdanm 0:9b334a45a8ff 1029 /* FMPI2C_IT_ERRI | FMPI2C_IT_TCI| FMPI2C_IT_STOPI| FMPI2C_IT_NACKI | FMPI2C_IT_ADDRI | FMPI2C_IT_RXI | FMPI2C_IT_TXI */
bogdanm 0:9b334a45a8ff 1030 __HAL_FMPI2C_ENABLE_IT(hfmpi2c,FMPI2C_IT_ERRI | FMPI2C_IT_TCI| FMPI2C_IT_STOPI| FMPI2C_IT_NACKI | FMPI2C_IT_TXI );
bogdanm 0:9b334a45a8ff 1031
bogdanm 0:9b334a45a8ff 1032 return HAL_OK;
bogdanm 0:9b334a45a8ff 1033 }
bogdanm 0:9b334a45a8ff 1034 else
bogdanm 0:9b334a45a8ff 1035 {
bogdanm 0:9b334a45a8ff 1036 return HAL_BUSY;
bogdanm 0:9b334a45a8ff 1037 }
bogdanm 0:9b334a45a8ff 1038 }
bogdanm 0:9b334a45a8ff 1039
bogdanm 0:9b334a45a8ff 1040 /**
bogdanm 0:9b334a45a8ff 1041 * @brief Receive in master mode an amount of data in no-blocking mode with Interrupt
bogdanm 0:9b334a45a8ff 1042 * @param hfmpi2c : Pointer to a FMPI2C_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 1043 * the configuration information for the specified FMPI2C.
bogdanm 0:9b334a45a8ff 1044 * @param DevAddress: Target device address
bogdanm 0:9b334a45a8ff 1045 * @param pData: Pointer to data buffer
bogdanm 0:9b334a45a8ff 1046 * @param Size: Amount of data to be sent
bogdanm 0:9b334a45a8ff 1047 * @retval HAL status
bogdanm 0:9b334a45a8ff 1048 */
bogdanm 0:9b334a45a8ff 1049 HAL_StatusTypeDef HAL_FMPI2C_Master_Receive_IT(FMPI2C_HandleTypeDef *hfmpi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size)
bogdanm 0:9b334a45a8ff 1050 {
bogdanm 0:9b334a45a8ff 1051 if(hfmpi2c->State == HAL_FMPI2C_STATE_READY)
bogdanm 0:9b334a45a8ff 1052 {
bogdanm 0:9b334a45a8ff 1053 if((pData == NULL) || (Size == 0))
bogdanm 0:9b334a45a8ff 1054 {
bogdanm 0:9b334a45a8ff 1055 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 1056 }
bogdanm 0:9b334a45a8ff 1057
bogdanm 0:9b334a45a8ff 1058 if(__HAL_FMPI2C_GET_FLAG(hfmpi2c, FMPI2C_FLAG_BUSY) == SET)
bogdanm 0:9b334a45a8ff 1059 {
bogdanm 0:9b334a45a8ff 1060 return HAL_BUSY;
bogdanm 0:9b334a45a8ff 1061 }
bogdanm 0:9b334a45a8ff 1062
bogdanm 0:9b334a45a8ff 1063 /* Process Locked */
bogdanm 0:9b334a45a8ff 1064 __HAL_LOCK(hfmpi2c);
bogdanm 0:9b334a45a8ff 1065
bogdanm 0:9b334a45a8ff 1066 hfmpi2c->State = HAL_FMPI2C_STATE_MASTER_BUSY_RX;
bogdanm 0:9b334a45a8ff 1067 hfmpi2c->ErrorCode = HAL_FMPI2C_ERROR_NONE;
bogdanm 0:9b334a45a8ff 1068
bogdanm 0:9b334a45a8ff 1069 hfmpi2c->pBuffPtr = pData;
bogdanm 0:9b334a45a8ff 1070 hfmpi2c->XferCount = Size;
bogdanm 0:9b334a45a8ff 1071 if(Size > 255)
bogdanm 0:9b334a45a8ff 1072 {
bogdanm 0:9b334a45a8ff 1073 hfmpi2c->XferSize = 255;
bogdanm 0:9b334a45a8ff 1074 }
bogdanm 0:9b334a45a8ff 1075 else
bogdanm 0:9b334a45a8ff 1076 {
bogdanm 0:9b334a45a8ff 1077 hfmpi2c->XferSize = Size;
bogdanm 0:9b334a45a8ff 1078 }
bogdanm 0:9b334a45a8ff 1079
bogdanm 0:9b334a45a8ff 1080 /* Send Slave Address */
bogdanm 0:9b334a45a8ff 1081 /* Set NBYTES to write and reload if size > 255 and generate RESTART */
bogdanm 0:9b334a45a8ff 1082 if( (hfmpi2c->XferSize == 255) && (hfmpi2c->XferSize < hfmpi2c->XferCount) )
bogdanm 0:9b334a45a8ff 1083 {
bogdanm 0:9b334a45a8ff 1084 FMPI2C_TransferConfig(hfmpi2c,DevAddress,hfmpi2c->XferSize, FMPI2C_RELOAD_MODE, FMPI2C_GENERATE_START_READ);
bogdanm 0:9b334a45a8ff 1085 }
bogdanm 0:9b334a45a8ff 1086 else
bogdanm 0:9b334a45a8ff 1087 {
bogdanm 0:9b334a45a8ff 1088 FMPI2C_TransferConfig(hfmpi2c,DevAddress,hfmpi2c->XferSize, FMPI2C_AUTOEND_MODE, FMPI2C_GENERATE_START_READ);
bogdanm 0:9b334a45a8ff 1089 }
bogdanm 0:9b334a45a8ff 1090
bogdanm 0:9b334a45a8ff 1091 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 1092 __HAL_UNLOCK(hfmpi2c);
bogdanm 0:9b334a45a8ff 1093
bogdanm 0:9b334a45a8ff 1094 /* Note : The FMPI2C interrupts must be enabled after unlocking current process
bogdanm 0:9b334a45a8ff 1095 to avoid the risk of FMPI2C interrupt handle execution before current
bogdanm 0:9b334a45a8ff 1096 process unlock */
bogdanm 0:9b334a45a8ff 1097
bogdanm 0:9b334a45a8ff 1098 /* Enable ERR, TC, STOP, NACK, RXI interrupt */
bogdanm 0:9b334a45a8ff 1099 /* possible to enable all of these */
bogdanm 0:9b334a45a8ff 1100 /* FMPI2C_IT_ERRI | FMPI2C_IT_TCI| FMPI2C_IT_STOPI| FMPI2C_IT_NACKI | FMPI2C_IT_ADDRI | FMPI2C_IT_RXI | FMPI2C_IT_TXI */
bogdanm 0:9b334a45a8ff 1101 __HAL_FMPI2C_ENABLE_IT(hfmpi2c,FMPI2C_IT_ERRI | FMPI2C_IT_TCI | FMPI2C_IT_STOPI | FMPI2C_IT_NACKI | FMPI2C_IT_RXI );
bogdanm 0:9b334a45a8ff 1102
bogdanm 0:9b334a45a8ff 1103 return HAL_OK;
bogdanm 0:9b334a45a8ff 1104 }
bogdanm 0:9b334a45a8ff 1105 else
bogdanm 0:9b334a45a8ff 1106 {
bogdanm 0:9b334a45a8ff 1107 return HAL_BUSY;
bogdanm 0:9b334a45a8ff 1108 }
bogdanm 0:9b334a45a8ff 1109 }
bogdanm 0:9b334a45a8ff 1110
bogdanm 0:9b334a45a8ff 1111 /**
bogdanm 0:9b334a45a8ff 1112 * @brief Transmit in slave mode an amount of data in no-blocking mode with Interrupt
bogdanm 0:9b334a45a8ff 1113 * @param hfmpi2c : Pointer to a FMPI2C_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 1114 * the configuration information for the specified FMPI2C.
bogdanm 0:9b334a45a8ff 1115 * @param pData: Pointer to data buffer
bogdanm 0:9b334a45a8ff 1116 * @param Size: Amount of data to be sent
bogdanm 0:9b334a45a8ff 1117 * @retval HAL status
bogdanm 0:9b334a45a8ff 1118 */
bogdanm 0:9b334a45a8ff 1119 HAL_StatusTypeDef HAL_FMPI2C_Slave_Transmit_IT(FMPI2C_HandleTypeDef *hfmpi2c, uint8_t *pData, uint16_t Size)
bogdanm 0:9b334a45a8ff 1120 {
bogdanm 0:9b334a45a8ff 1121 if(hfmpi2c->State == HAL_FMPI2C_STATE_READY)
bogdanm 0:9b334a45a8ff 1122 {
bogdanm 0:9b334a45a8ff 1123 if((pData == NULL) || (Size == 0))
bogdanm 0:9b334a45a8ff 1124 {
bogdanm 0:9b334a45a8ff 1125 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 1126 }
bogdanm 0:9b334a45a8ff 1127
bogdanm 0:9b334a45a8ff 1128 /* Process Locked */
bogdanm 0:9b334a45a8ff 1129 __HAL_LOCK(hfmpi2c);
bogdanm 0:9b334a45a8ff 1130
bogdanm 0:9b334a45a8ff 1131 hfmpi2c->State = HAL_FMPI2C_STATE_SLAVE_BUSY_TX;
bogdanm 0:9b334a45a8ff 1132 hfmpi2c->ErrorCode = HAL_FMPI2C_ERROR_NONE;
bogdanm 0:9b334a45a8ff 1133
bogdanm 0:9b334a45a8ff 1134 /* Enable Address Acknowledge */
bogdanm 0:9b334a45a8ff 1135 hfmpi2c->Instance->CR2 &= ~FMPI2C_CR2_NACK;
bogdanm 0:9b334a45a8ff 1136
bogdanm 0:9b334a45a8ff 1137 hfmpi2c->pBuffPtr = pData;
bogdanm 0:9b334a45a8ff 1138 hfmpi2c->XferSize = Size;
bogdanm 0:9b334a45a8ff 1139 hfmpi2c->XferCount = Size;
bogdanm 0:9b334a45a8ff 1140
bogdanm 0:9b334a45a8ff 1141 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 1142 __HAL_UNLOCK(hfmpi2c);
bogdanm 0:9b334a45a8ff 1143
bogdanm 0:9b334a45a8ff 1144 /* Note : The FMPI2C interrupts must be enabled after unlocking current process
bogdanm 0:9b334a45a8ff 1145 to avoid the risk of FMPI2C interrupt handle execution before current
bogdanm 0:9b334a45a8ff 1146 process unlock */
bogdanm 0:9b334a45a8ff 1147
bogdanm 0:9b334a45a8ff 1148 /* Enable ERR, TC, STOP, NACK, TXI interrupt */
bogdanm 0:9b334a45a8ff 1149 /* possible to enable all of these */
bogdanm 0:9b334a45a8ff 1150 /* FMPI2C_IT_ERRI | FMPI2C_IT_TCI| FMPI2C_IT_STOPI| FMPI2C_IT_NACKI | FMPI2C_IT_ADDRI | FMPI2C_IT_RXI | FMPI2C_IT_TXI */
bogdanm 0:9b334a45a8ff 1151 __HAL_FMPI2C_ENABLE_IT(hfmpi2c,FMPI2C_IT_ERRI | FMPI2C_IT_TCI| FMPI2C_IT_STOPI | FMPI2C_IT_NACKI | FMPI2C_IT_ADDRI | FMPI2C_IT_TXI );
bogdanm 0:9b334a45a8ff 1152
bogdanm 0:9b334a45a8ff 1153 return HAL_OK;
bogdanm 0:9b334a45a8ff 1154 }
bogdanm 0:9b334a45a8ff 1155 else
bogdanm 0:9b334a45a8ff 1156 {
bogdanm 0:9b334a45a8ff 1157 return HAL_BUSY;
bogdanm 0:9b334a45a8ff 1158 }
bogdanm 0:9b334a45a8ff 1159 }
bogdanm 0:9b334a45a8ff 1160
bogdanm 0:9b334a45a8ff 1161 /**
bogdanm 0:9b334a45a8ff 1162 * @brief Receive in slave mode an amount of data in no-blocking mode with Interrupt
bogdanm 0:9b334a45a8ff 1163 * @param hfmpi2c : Pointer to a FMPI2C_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 1164 * the configuration information for the specified FMPI2C.
bogdanm 0:9b334a45a8ff 1165 * @param pData: Pointer to data buffer
bogdanm 0:9b334a45a8ff 1166 * @param Size: Amount of data to be sent
bogdanm 0:9b334a45a8ff 1167 * @retval HAL status
bogdanm 0:9b334a45a8ff 1168 */
bogdanm 0:9b334a45a8ff 1169 HAL_StatusTypeDef HAL_FMPI2C_Slave_Receive_IT(FMPI2C_HandleTypeDef *hfmpi2c, uint8_t *pData, uint16_t Size)
bogdanm 0:9b334a45a8ff 1170 {
bogdanm 0:9b334a45a8ff 1171 if(hfmpi2c->State == HAL_FMPI2C_STATE_READY)
bogdanm 0:9b334a45a8ff 1172 {
bogdanm 0:9b334a45a8ff 1173 if((pData == NULL) || (Size == 0))
bogdanm 0:9b334a45a8ff 1174 {
bogdanm 0:9b334a45a8ff 1175 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 1176 }
bogdanm 0:9b334a45a8ff 1177
bogdanm 0:9b334a45a8ff 1178 /* Process Locked */
bogdanm 0:9b334a45a8ff 1179 __HAL_LOCK(hfmpi2c);
bogdanm 0:9b334a45a8ff 1180
bogdanm 0:9b334a45a8ff 1181 hfmpi2c->State = HAL_FMPI2C_STATE_SLAVE_BUSY_RX;
bogdanm 0:9b334a45a8ff 1182 hfmpi2c->ErrorCode = HAL_FMPI2C_ERROR_NONE;
bogdanm 0:9b334a45a8ff 1183
bogdanm 0:9b334a45a8ff 1184 /* Enable Address Acknowledge */
bogdanm 0:9b334a45a8ff 1185 hfmpi2c->Instance->CR2 &= ~FMPI2C_CR2_NACK;
bogdanm 0:9b334a45a8ff 1186
bogdanm 0:9b334a45a8ff 1187 hfmpi2c->pBuffPtr = pData;
bogdanm 0:9b334a45a8ff 1188 hfmpi2c->XferSize = Size;
bogdanm 0:9b334a45a8ff 1189 hfmpi2c->XferCount = Size;
bogdanm 0:9b334a45a8ff 1190
bogdanm 0:9b334a45a8ff 1191 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 1192 __HAL_UNLOCK(hfmpi2c);
bogdanm 0:9b334a45a8ff 1193
bogdanm 0:9b334a45a8ff 1194 /* Note : The FMPI2C interrupts must be enabled after unlocking current process
bogdanm 0:9b334a45a8ff 1195 to avoid the risk of FMPI2C interrupt handle execution before current
bogdanm 0:9b334a45a8ff 1196 process unlock */
bogdanm 0:9b334a45a8ff 1197
bogdanm 0:9b334a45a8ff 1198 /* Enable ERR, TC, STOP, NACK, RXI interrupt */
bogdanm 0:9b334a45a8ff 1199 /* possible to enable all of these */
bogdanm 0:9b334a45a8ff 1200 /* FMPI2C_IT_ERRI | FMPI2C_IT_TCI| FMPI2C_IT_STOPI| FMPI2C_IT_NACKI | FMPI2C_IT_ADDRI | FMPI2C_IT_RXI | FMPI2C_IT_TXI */
bogdanm 0:9b334a45a8ff 1201 __HAL_FMPI2C_ENABLE_IT(hfmpi2c,FMPI2C_IT_ERRI | FMPI2C_IT_TCI | FMPI2C_IT_STOPI | FMPI2C_IT_NACKI | FMPI2C_IT_ADDRI | FMPI2C_IT_RXI);
bogdanm 0:9b334a45a8ff 1202
bogdanm 0:9b334a45a8ff 1203 return HAL_OK;
bogdanm 0:9b334a45a8ff 1204 }
bogdanm 0:9b334a45a8ff 1205 else
bogdanm 0:9b334a45a8ff 1206 {
bogdanm 0:9b334a45a8ff 1207 return HAL_BUSY;
bogdanm 0:9b334a45a8ff 1208 }
bogdanm 0:9b334a45a8ff 1209 }
bogdanm 0:9b334a45a8ff 1210
bogdanm 0:9b334a45a8ff 1211 /**
bogdanm 0:9b334a45a8ff 1212 * @brief Transmit in master mode an amount of data in no-blocking mode with DMA
bogdanm 0:9b334a45a8ff 1213 * @param hfmpi2c : Pointer to a FMPI2C_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 1214 * the configuration information for the specified FMPI2C.
bogdanm 0:9b334a45a8ff 1215 * @param DevAddress: Target device address
bogdanm 0:9b334a45a8ff 1216 * @param pData: Pointer to data buffer
bogdanm 0:9b334a45a8ff 1217 * @param Size: Amount of data to be sent
bogdanm 0:9b334a45a8ff 1218 * @retval HAL status
bogdanm 0:9b334a45a8ff 1219 */
bogdanm 0:9b334a45a8ff 1220 HAL_StatusTypeDef HAL_FMPI2C_Master_Transmit_DMA(FMPI2C_HandleTypeDef *hfmpi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size)
bogdanm 0:9b334a45a8ff 1221 {
bogdanm 0:9b334a45a8ff 1222 if(hfmpi2c->State == HAL_FMPI2C_STATE_READY)
bogdanm 0:9b334a45a8ff 1223 {
bogdanm 0:9b334a45a8ff 1224 if((pData == NULL) || (Size == 0))
bogdanm 0:9b334a45a8ff 1225 {
bogdanm 0:9b334a45a8ff 1226 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 1227 }
bogdanm 0:9b334a45a8ff 1228
bogdanm 0:9b334a45a8ff 1229 if(__HAL_FMPI2C_GET_FLAG(hfmpi2c, FMPI2C_FLAG_BUSY) == SET)
bogdanm 0:9b334a45a8ff 1230 {
bogdanm 0:9b334a45a8ff 1231 return HAL_BUSY;
bogdanm 0:9b334a45a8ff 1232 }
bogdanm 0:9b334a45a8ff 1233
bogdanm 0:9b334a45a8ff 1234 /* Process Locked */
bogdanm 0:9b334a45a8ff 1235 __HAL_LOCK(hfmpi2c);
bogdanm 0:9b334a45a8ff 1236
bogdanm 0:9b334a45a8ff 1237 hfmpi2c->State = HAL_FMPI2C_STATE_MASTER_BUSY_TX;
bogdanm 0:9b334a45a8ff 1238 hfmpi2c->ErrorCode = HAL_FMPI2C_ERROR_NONE;
bogdanm 0:9b334a45a8ff 1239
bogdanm 0:9b334a45a8ff 1240 hfmpi2c->pBuffPtr = pData;
bogdanm 0:9b334a45a8ff 1241 hfmpi2c->XferCount = Size;
bogdanm 0:9b334a45a8ff 1242 if(Size > 255)
bogdanm 0:9b334a45a8ff 1243 {
bogdanm 0:9b334a45a8ff 1244 hfmpi2c->XferSize = 255;
bogdanm 0:9b334a45a8ff 1245 }
bogdanm 0:9b334a45a8ff 1246 else
bogdanm 0:9b334a45a8ff 1247 {
bogdanm 0:9b334a45a8ff 1248 hfmpi2c->XferSize = Size;
bogdanm 0:9b334a45a8ff 1249 }
bogdanm 0:9b334a45a8ff 1250
bogdanm 0:9b334a45a8ff 1251 /* Set the FMPI2C DMA transfer complete callback */
bogdanm 0:9b334a45a8ff 1252 hfmpi2c->hdmatx->XferCpltCallback = FMPI2C_DMAMasterTransmitCplt;
bogdanm 0:9b334a45a8ff 1253
bogdanm 0:9b334a45a8ff 1254 /* Set the DMA error callback */
bogdanm 0:9b334a45a8ff 1255 hfmpi2c->hdmatx->XferErrorCallback = FMPI2C_DMAError;
bogdanm 0:9b334a45a8ff 1256
bogdanm 0:9b334a45a8ff 1257 /* Enable the DMA channel */
bogdanm 0:9b334a45a8ff 1258 HAL_DMA_Start_IT(hfmpi2c->hdmatx, (uint32_t)pData, (uint32_t)&hfmpi2c->Instance->TXDR, hfmpi2c->XferSize);
bogdanm 0:9b334a45a8ff 1259
bogdanm 0:9b334a45a8ff 1260 /* Send Slave Address */
bogdanm 0:9b334a45a8ff 1261 /* Set NBYTES to write and reload if size > 255 and generate RESTART */
bogdanm 0:9b334a45a8ff 1262 if( (hfmpi2c->XferSize == 255) && (hfmpi2c->XferSize < hfmpi2c->XferCount) )
bogdanm 0:9b334a45a8ff 1263 {
bogdanm 0:9b334a45a8ff 1264 FMPI2C_TransferConfig(hfmpi2c,DevAddress,hfmpi2c->XferSize, FMPI2C_RELOAD_MODE, FMPI2C_GENERATE_START_WRITE);
bogdanm 0:9b334a45a8ff 1265 }
bogdanm 0:9b334a45a8ff 1266 else
bogdanm 0:9b334a45a8ff 1267 {
bogdanm 0:9b334a45a8ff 1268 FMPI2C_TransferConfig(hfmpi2c,DevAddress,hfmpi2c->XferSize, FMPI2C_AUTOEND_MODE, FMPI2C_GENERATE_START_WRITE);
bogdanm 0:9b334a45a8ff 1269 }
bogdanm 0:9b334a45a8ff 1270
bogdanm 0:9b334a45a8ff 1271 /* Wait until TXIS flag is set */
bogdanm 0:9b334a45a8ff 1272 if(FMPI2C_WaitOnTXISFlagUntilTimeout(hfmpi2c, FMPI2C_TIMEOUT_TXIS) != HAL_OK)
bogdanm 0:9b334a45a8ff 1273 {
bogdanm 0:9b334a45a8ff 1274 /* Disable Address Acknowledge */
bogdanm 0:9b334a45a8ff 1275 hfmpi2c->Instance->CR2 |= FMPI2C_CR2_NACK;
bogdanm 0:9b334a45a8ff 1276
bogdanm 0:9b334a45a8ff 1277 if(hfmpi2c->ErrorCode == HAL_FMPI2C_ERROR_AF)
bogdanm 0:9b334a45a8ff 1278 {
bogdanm 0:9b334a45a8ff 1279 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 1280 }
bogdanm 0:9b334a45a8ff 1281 else
bogdanm 0:9b334a45a8ff 1282 {
bogdanm 0:9b334a45a8ff 1283 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 1284 }
bogdanm 0:9b334a45a8ff 1285 }
bogdanm 0:9b334a45a8ff 1286
bogdanm 0:9b334a45a8ff 1287
bogdanm 0:9b334a45a8ff 1288 /* Enable DMA Request */
bogdanm 0:9b334a45a8ff 1289 hfmpi2c->Instance->CR1 |= FMPI2C_CR1_TXDMAEN;
bogdanm 0:9b334a45a8ff 1290
bogdanm 0:9b334a45a8ff 1291 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 1292 __HAL_UNLOCK(hfmpi2c);
bogdanm 0:9b334a45a8ff 1293
bogdanm 0:9b334a45a8ff 1294 return HAL_OK;
bogdanm 0:9b334a45a8ff 1295 }
bogdanm 0:9b334a45a8ff 1296 else
bogdanm 0:9b334a45a8ff 1297 {
bogdanm 0:9b334a45a8ff 1298 return HAL_BUSY;
bogdanm 0:9b334a45a8ff 1299 }
bogdanm 0:9b334a45a8ff 1300 }
bogdanm 0:9b334a45a8ff 1301
bogdanm 0:9b334a45a8ff 1302 /**
bogdanm 0:9b334a45a8ff 1303 * @brief Receive in master mode an amount of data in no-blocking mode with DMA
bogdanm 0:9b334a45a8ff 1304 * @param hfmpi2c : Pointer to a FMPI2C_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 1305 * the configuration information for the specified FMPI2C.
bogdanm 0:9b334a45a8ff 1306 * @param DevAddress: Target device address
bogdanm 0:9b334a45a8ff 1307 * @param pData: Pointer to data buffer
bogdanm 0:9b334a45a8ff 1308 * @param Size: Amount of data to be sent
bogdanm 0:9b334a45a8ff 1309 * @retval HAL status
bogdanm 0:9b334a45a8ff 1310 */
bogdanm 0:9b334a45a8ff 1311 HAL_StatusTypeDef HAL_FMPI2C_Master_Receive_DMA(FMPI2C_HandleTypeDef *hfmpi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size)
bogdanm 0:9b334a45a8ff 1312 {
bogdanm 0:9b334a45a8ff 1313 if(hfmpi2c->State == HAL_FMPI2C_STATE_READY)
bogdanm 0:9b334a45a8ff 1314 {
bogdanm 0:9b334a45a8ff 1315 if((pData == NULL) || (Size == 0))
bogdanm 0:9b334a45a8ff 1316 {
bogdanm 0:9b334a45a8ff 1317 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 1318 }
bogdanm 0:9b334a45a8ff 1319
bogdanm 0:9b334a45a8ff 1320 if(__HAL_FMPI2C_GET_FLAG(hfmpi2c, FMPI2C_FLAG_BUSY) == SET)
bogdanm 0:9b334a45a8ff 1321 {
bogdanm 0:9b334a45a8ff 1322 return HAL_BUSY;
bogdanm 0:9b334a45a8ff 1323 }
bogdanm 0:9b334a45a8ff 1324
bogdanm 0:9b334a45a8ff 1325 /* Process Locked */
bogdanm 0:9b334a45a8ff 1326 __HAL_LOCK(hfmpi2c);
bogdanm 0:9b334a45a8ff 1327
bogdanm 0:9b334a45a8ff 1328 hfmpi2c->State = HAL_FMPI2C_STATE_MASTER_BUSY_RX;
bogdanm 0:9b334a45a8ff 1329 hfmpi2c->ErrorCode = HAL_FMPI2C_ERROR_NONE;
bogdanm 0:9b334a45a8ff 1330
bogdanm 0:9b334a45a8ff 1331 hfmpi2c->pBuffPtr = pData;
bogdanm 0:9b334a45a8ff 1332 hfmpi2c->XferCount = Size;
bogdanm 0:9b334a45a8ff 1333 if(Size > 255)
bogdanm 0:9b334a45a8ff 1334 {
bogdanm 0:9b334a45a8ff 1335 hfmpi2c->XferSize = 255;
bogdanm 0:9b334a45a8ff 1336 }
bogdanm 0:9b334a45a8ff 1337 else
bogdanm 0:9b334a45a8ff 1338 {
bogdanm 0:9b334a45a8ff 1339 hfmpi2c->XferSize = Size;
bogdanm 0:9b334a45a8ff 1340 }
bogdanm 0:9b334a45a8ff 1341
bogdanm 0:9b334a45a8ff 1342 /* Set the FMPI2C DMA transfer complete callback */
bogdanm 0:9b334a45a8ff 1343 hfmpi2c->hdmarx->XferCpltCallback = FMPI2C_DMAMasterReceiveCplt;
bogdanm 0:9b334a45a8ff 1344
bogdanm 0:9b334a45a8ff 1345 /* Set the DMA error callback */
bogdanm 0:9b334a45a8ff 1346 hfmpi2c->hdmarx->XferErrorCallback = FMPI2C_DMAError;
bogdanm 0:9b334a45a8ff 1347
bogdanm 0:9b334a45a8ff 1348 /* Enable the DMA channel */
bogdanm 0:9b334a45a8ff 1349 HAL_DMA_Start_IT(hfmpi2c->hdmarx, (uint32_t)&hfmpi2c->Instance->RXDR, (uint32_t)pData, hfmpi2c->XferSize);
bogdanm 0:9b334a45a8ff 1350
bogdanm 0:9b334a45a8ff 1351 /* Send Slave Address */
bogdanm 0:9b334a45a8ff 1352 /* Set NBYTES to write and reload if size > 255 and generate RESTART */
bogdanm 0:9b334a45a8ff 1353 if( (hfmpi2c->XferSize == 255) && (hfmpi2c->XferSize < hfmpi2c->XferCount) )
bogdanm 0:9b334a45a8ff 1354 {
bogdanm 0:9b334a45a8ff 1355 FMPI2C_TransferConfig(hfmpi2c,DevAddress,hfmpi2c->XferSize, FMPI2C_RELOAD_MODE, FMPI2C_GENERATE_START_READ);
bogdanm 0:9b334a45a8ff 1356 }
bogdanm 0:9b334a45a8ff 1357 else
bogdanm 0:9b334a45a8ff 1358 {
bogdanm 0:9b334a45a8ff 1359 FMPI2C_TransferConfig(hfmpi2c,DevAddress,hfmpi2c->XferSize, FMPI2C_AUTOEND_MODE, FMPI2C_GENERATE_START_READ);
bogdanm 0:9b334a45a8ff 1360 }
bogdanm 0:9b334a45a8ff 1361
bogdanm 0:9b334a45a8ff 1362 /* Wait until RXNE flag is set */
bogdanm 0:9b334a45a8ff 1363 if(FMPI2C_WaitOnFlagUntilTimeout(hfmpi2c, FMPI2C_FLAG_RXNE, RESET, FMPI2C_TIMEOUT_RXNE) != HAL_OK)
bogdanm 0:9b334a45a8ff 1364 {
bogdanm 0:9b334a45a8ff 1365 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 1366 }
bogdanm 0:9b334a45a8ff 1367
bogdanm 0:9b334a45a8ff 1368
bogdanm 0:9b334a45a8ff 1369 /* Enable DMA Request */
bogdanm 0:9b334a45a8ff 1370 hfmpi2c->Instance->CR1 |= FMPI2C_CR1_RXDMAEN;
bogdanm 0:9b334a45a8ff 1371
bogdanm 0:9b334a45a8ff 1372 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 1373 __HAL_UNLOCK(hfmpi2c);
bogdanm 0:9b334a45a8ff 1374
bogdanm 0:9b334a45a8ff 1375 return HAL_OK;
bogdanm 0:9b334a45a8ff 1376 }
bogdanm 0:9b334a45a8ff 1377 else
bogdanm 0:9b334a45a8ff 1378 {
bogdanm 0:9b334a45a8ff 1379 return HAL_BUSY;
bogdanm 0:9b334a45a8ff 1380 }
bogdanm 0:9b334a45a8ff 1381 }
bogdanm 0:9b334a45a8ff 1382
bogdanm 0:9b334a45a8ff 1383 /**
bogdanm 0:9b334a45a8ff 1384 * @brief Transmit in slave mode an amount of data in no-blocking mode with DMA
bogdanm 0:9b334a45a8ff 1385 * @param hfmpi2c : Pointer to a FMPI2C_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 1386 * the configuration information for the specified FMPI2C.
bogdanm 0:9b334a45a8ff 1387 * @param pData: Pointer to data buffer
bogdanm 0:9b334a45a8ff 1388 * @param Size: Amount of data to be sent
bogdanm 0:9b334a45a8ff 1389 * @retval HAL status
bogdanm 0:9b334a45a8ff 1390 */
bogdanm 0:9b334a45a8ff 1391 HAL_StatusTypeDef HAL_FMPI2C_Slave_Transmit_DMA(FMPI2C_HandleTypeDef *hfmpi2c, uint8_t *pData, uint16_t Size)
bogdanm 0:9b334a45a8ff 1392 {
bogdanm 0:9b334a45a8ff 1393 if(hfmpi2c->State == HAL_FMPI2C_STATE_READY)
bogdanm 0:9b334a45a8ff 1394 {
bogdanm 0:9b334a45a8ff 1395 if((pData == NULL) || (Size == 0))
bogdanm 0:9b334a45a8ff 1396 {
bogdanm 0:9b334a45a8ff 1397 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 1398 }
bogdanm 0:9b334a45a8ff 1399 /* Process Locked */
bogdanm 0:9b334a45a8ff 1400 __HAL_LOCK(hfmpi2c);
bogdanm 0:9b334a45a8ff 1401
bogdanm 0:9b334a45a8ff 1402 hfmpi2c->State = HAL_FMPI2C_STATE_SLAVE_BUSY_TX;
bogdanm 0:9b334a45a8ff 1403 hfmpi2c->ErrorCode = HAL_FMPI2C_ERROR_NONE;
bogdanm 0:9b334a45a8ff 1404
bogdanm 0:9b334a45a8ff 1405 hfmpi2c->pBuffPtr = pData;
bogdanm 0:9b334a45a8ff 1406 hfmpi2c->XferCount = Size;
bogdanm 0:9b334a45a8ff 1407 hfmpi2c->XferSize = Size;
bogdanm 0:9b334a45a8ff 1408
bogdanm 0:9b334a45a8ff 1409 /* Set the FMPI2C DMA transfer complete callback */
bogdanm 0:9b334a45a8ff 1410 hfmpi2c->hdmatx->XferCpltCallback = FMPI2C_DMASlaveTransmitCplt;
bogdanm 0:9b334a45a8ff 1411
bogdanm 0:9b334a45a8ff 1412 /* Set the DMA error callback */
bogdanm 0:9b334a45a8ff 1413 hfmpi2c->hdmatx->XferErrorCallback = FMPI2C_DMAError;
bogdanm 0:9b334a45a8ff 1414
bogdanm 0:9b334a45a8ff 1415 /* Enable the DMA channel */
bogdanm 0:9b334a45a8ff 1416 HAL_DMA_Start_IT(hfmpi2c->hdmatx, (uint32_t)pData, (uint32_t)&hfmpi2c->Instance->TXDR, hfmpi2c->XferSize);
bogdanm 0:9b334a45a8ff 1417
bogdanm 0:9b334a45a8ff 1418 /* Enable Address Acknowledge */
bogdanm 0:9b334a45a8ff 1419 hfmpi2c->Instance->CR2 &= ~FMPI2C_CR2_NACK;
bogdanm 0:9b334a45a8ff 1420
bogdanm 0:9b334a45a8ff 1421 /* Wait until ADDR flag is set */
bogdanm 0:9b334a45a8ff 1422 if(FMPI2C_WaitOnFlagUntilTimeout(hfmpi2c, FMPI2C_FLAG_ADDR, RESET, FMPI2C_TIMEOUT_ADDR) != HAL_OK)
bogdanm 0:9b334a45a8ff 1423 {
bogdanm 0:9b334a45a8ff 1424 /* Disable Address Acknowledge */
bogdanm 0:9b334a45a8ff 1425 hfmpi2c->Instance->CR2 |= FMPI2C_CR2_NACK;
bogdanm 0:9b334a45a8ff 1426 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 1427 }
bogdanm 0:9b334a45a8ff 1428
bogdanm 0:9b334a45a8ff 1429 /* Clear ADDR flag */
bogdanm 0:9b334a45a8ff 1430 __HAL_FMPI2C_CLEAR_FLAG(hfmpi2c,FMPI2C_FLAG_ADDR);
bogdanm 0:9b334a45a8ff 1431
bogdanm 0:9b334a45a8ff 1432 /* If 10bits addressing mode is selected */
bogdanm 0:9b334a45a8ff 1433 if(hfmpi2c->Init.AddressingMode == FMPI2C_ADDRESSINGMODE_10BIT)
bogdanm 0:9b334a45a8ff 1434 {
bogdanm 0:9b334a45a8ff 1435 /* Wait until ADDR flag is set */
bogdanm 0:9b334a45a8ff 1436 if(FMPI2C_WaitOnFlagUntilTimeout(hfmpi2c, FMPI2C_FLAG_ADDR, RESET, FMPI2C_TIMEOUT_ADDR) != HAL_OK)
bogdanm 0:9b334a45a8ff 1437 {
bogdanm 0:9b334a45a8ff 1438 /* Disable Address Acknowledge */
bogdanm 0:9b334a45a8ff 1439 hfmpi2c->Instance->CR2 |= FMPI2C_CR2_NACK;
bogdanm 0:9b334a45a8ff 1440 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 1441 }
bogdanm 0:9b334a45a8ff 1442
bogdanm 0:9b334a45a8ff 1443 /* Clear ADDR flag */
bogdanm 0:9b334a45a8ff 1444 __HAL_FMPI2C_CLEAR_FLAG(hfmpi2c,FMPI2C_FLAG_ADDR);
bogdanm 0:9b334a45a8ff 1445 }
bogdanm 0:9b334a45a8ff 1446
bogdanm 0:9b334a45a8ff 1447 /* Wait until DIR flag is set Transmitter mode */
bogdanm 0:9b334a45a8ff 1448 if(FMPI2C_WaitOnFlagUntilTimeout(hfmpi2c, FMPI2C_FLAG_DIR, RESET, FMPI2C_TIMEOUT_BUSY) != HAL_OK)
bogdanm 0:9b334a45a8ff 1449 {
bogdanm 0:9b334a45a8ff 1450 /* Disable Address Acknowledge */
bogdanm 0:9b334a45a8ff 1451 hfmpi2c->Instance->CR2 |= FMPI2C_CR2_NACK;
bogdanm 0:9b334a45a8ff 1452 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 1453 }
bogdanm 0:9b334a45a8ff 1454
bogdanm 0:9b334a45a8ff 1455 /* Enable DMA Request */
bogdanm 0:9b334a45a8ff 1456 hfmpi2c->Instance->CR1 |= FMPI2C_CR1_TXDMAEN;
bogdanm 0:9b334a45a8ff 1457
bogdanm 0:9b334a45a8ff 1458 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 1459 __HAL_UNLOCK(hfmpi2c);
bogdanm 0:9b334a45a8ff 1460
bogdanm 0:9b334a45a8ff 1461 return HAL_OK;
bogdanm 0:9b334a45a8ff 1462 }
bogdanm 0:9b334a45a8ff 1463 else
bogdanm 0:9b334a45a8ff 1464 {
bogdanm 0:9b334a45a8ff 1465 return HAL_BUSY;
bogdanm 0:9b334a45a8ff 1466 }
bogdanm 0:9b334a45a8ff 1467 }
bogdanm 0:9b334a45a8ff 1468
bogdanm 0:9b334a45a8ff 1469 /**
bogdanm 0:9b334a45a8ff 1470 * @brief Receive in slave mode an amount of data in no-blocking mode with DMA
bogdanm 0:9b334a45a8ff 1471 * @param hfmpi2c : Pointer to a FMPI2C_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 1472 * the configuration information for the specified FMPI2C.
bogdanm 0:9b334a45a8ff 1473 * @param pData: Pointer to data buffer
bogdanm 0:9b334a45a8ff 1474 * @param Size: Amount of data to be sent
bogdanm 0:9b334a45a8ff 1475 * @retval HAL status
bogdanm 0:9b334a45a8ff 1476 */
bogdanm 0:9b334a45a8ff 1477 HAL_StatusTypeDef HAL_FMPI2C_Slave_Receive_DMA(FMPI2C_HandleTypeDef *hfmpi2c, uint8_t *pData, uint16_t Size)
bogdanm 0:9b334a45a8ff 1478 {
bogdanm 0:9b334a45a8ff 1479 if(hfmpi2c->State == HAL_FMPI2C_STATE_READY)
bogdanm 0:9b334a45a8ff 1480 {
bogdanm 0:9b334a45a8ff 1481 if((pData == NULL) || (Size == 0))
bogdanm 0:9b334a45a8ff 1482 {
bogdanm 0:9b334a45a8ff 1483 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 1484 }
bogdanm 0:9b334a45a8ff 1485 /* Process Locked */
bogdanm 0:9b334a45a8ff 1486 __HAL_LOCK(hfmpi2c);
bogdanm 0:9b334a45a8ff 1487
bogdanm 0:9b334a45a8ff 1488 hfmpi2c->State = HAL_FMPI2C_STATE_SLAVE_BUSY_RX;
bogdanm 0:9b334a45a8ff 1489 hfmpi2c->ErrorCode = HAL_FMPI2C_ERROR_NONE;
bogdanm 0:9b334a45a8ff 1490
bogdanm 0:9b334a45a8ff 1491 hfmpi2c->pBuffPtr = pData;
bogdanm 0:9b334a45a8ff 1492 hfmpi2c->XferSize = Size;
bogdanm 0:9b334a45a8ff 1493 hfmpi2c->XferCount = Size;
bogdanm 0:9b334a45a8ff 1494
bogdanm 0:9b334a45a8ff 1495 /* Set the FMPI2C DMA transfer complete callback */
bogdanm 0:9b334a45a8ff 1496 hfmpi2c->hdmarx->XferCpltCallback = FMPI2C_DMASlaveReceiveCplt;
bogdanm 0:9b334a45a8ff 1497
bogdanm 0:9b334a45a8ff 1498 /* Set the DMA error callback */
bogdanm 0:9b334a45a8ff 1499 hfmpi2c->hdmarx->XferErrorCallback = FMPI2C_DMAError;
bogdanm 0:9b334a45a8ff 1500
bogdanm 0:9b334a45a8ff 1501 /* Enable the DMA channel */
bogdanm 0:9b334a45a8ff 1502 HAL_DMA_Start_IT(hfmpi2c->hdmarx, (uint32_t)&hfmpi2c->Instance->RXDR, (uint32_t)pData, Size);
bogdanm 0:9b334a45a8ff 1503
bogdanm 0:9b334a45a8ff 1504 /* Enable Address Acknowledge */
bogdanm 0:9b334a45a8ff 1505 hfmpi2c->Instance->CR2 &= ~FMPI2C_CR2_NACK;
bogdanm 0:9b334a45a8ff 1506
bogdanm 0:9b334a45a8ff 1507 /* Wait until ADDR flag is set */
bogdanm 0:9b334a45a8ff 1508 if(FMPI2C_WaitOnFlagUntilTimeout(hfmpi2c, FMPI2C_FLAG_ADDR, RESET, FMPI2C_TIMEOUT_ADDR) != HAL_OK)
bogdanm 0:9b334a45a8ff 1509 {
bogdanm 0:9b334a45a8ff 1510 /* Disable Address Acknowledge */
bogdanm 0:9b334a45a8ff 1511 hfmpi2c->Instance->CR2 |= FMPI2C_CR2_NACK;
bogdanm 0:9b334a45a8ff 1512 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 1513 }
bogdanm 0:9b334a45a8ff 1514
bogdanm 0:9b334a45a8ff 1515 /* Clear ADDR flag */
bogdanm 0:9b334a45a8ff 1516 __HAL_FMPI2C_CLEAR_FLAG(hfmpi2c,FMPI2C_FLAG_ADDR);
bogdanm 0:9b334a45a8ff 1517
bogdanm 0:9b334a45a8ff 1518 /* Wait until DIR flag is set Receiver mode */
bogdanm 0:9b334a45a8ff 1519 if(FMPI2C_WaitOnFlagUntilTimeout(hfmpi2c, FMPI2C_FLAG_DIR, SET, FMPI2C_TIMEOUT_DIR) != HAL_OK)
bogdanm 0:9b334a45a8ff 1520 {
bogdanm 0:9b334a45a8ff 1521 /* Disable Address Acknowledge */
bogdanm 0:9b334a45a8ff 1522 hfmpi2c->Instance->CR2 |= FMPI2C_CR2_NACK;
bogdanm 0:9b334a45a8ff 1523 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 1524 }
bogdanm 0:9b334a45a8ff 1525
bogdanm 0:9b334a45a8ff 1526 /* Enable DMA Request */
bogdanm 0:9b334a45a8ff 1527 hfmpi2c->Instance->CR1 |= FMPI2C_CR1_RXDMAEN;
bogdanm 0:9b334a45a8ff 1528
bogdanm 0:9b334a45a8ff 1529 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 1530 __HAL_UNLOCK(hfmpi2c);
bogdanm 0:9b334a45a8ff 1531
bogdanm 0:9b334a45a8ff 1532 return HAL_OK;
bogdanm 0:9b334a45a8ff 1533 }
bogdanm 0:9b334a45a8ff 1534 else
bogdanm 0:9b334a45a8ff 1535 {
bogdanm 0:9b334a45a8ff 1536 return HAL_BUSY;
bogdanm 0:9b334a45a8ff 1537 }
bogdanm 0:9b334a45a8ff 1538 }
bogdanm 0:9b334a45a8ff 1539 /**
bogdanm 0:9b334a45a8ff 1540 * @brief Write an amount of data in blocking mode to a specific memory address
bogdanm 0:9b334a45a8ff 1541 * @param hfmpi2c : Pointer to a FMPI2C_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 1542 * the configuration information for the specified FMPI2C.
bogdanm 0:9b334a45a8ff 1543 * @param DevAddress: Target device address
bogdanm 0:9b334a45a8ff 1544 * @param MemAddress: Internal memory address
bogdanm 0:9b334a45a8ff 1545 * @param MemAddSize: Size of internal memory address
bogdanm 0:9b334a45a8ff 1546 * @param pData: Pointer to data buffer
bogdanm 0:9b334a45a8ff 1547 * @param Size: Amount of data to be sent
bogdanm 0:9b334a45a8ff 1548 * @param Timeout: Timeout duration
bogdanm 0:9b334a45a8ff 1549 * @retval HAL status
bogdanm 0:9b334a45a8ff 1550 */
bogdanm 0:9b334a45a8ff 1551 HAL_StatusTypeDef HAL_FMPI2C_Mem_Write(FMPI2C_HandleTypeDef *hfmpi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout)
bogdanm 0:9b334a45a8ff 1552 {
bogdanm 0:9b334a45a8ff 1553 uint32_t Sizetmp = 0;
bogdanm 0:9b334a45a8ff 1554
bogdanm 0:9b334a45a8ff 1555 /* Check the parameters */
bogdanm 0:9b334a45a8ff 1556 assert_param(IS_FMPI2C_MEMADD_SIZE(MemAddSize));
bogdanm 0:9b334a45a8ff 1557
bogdanm 0:9b334a45a8ff 1558 if(hfmpi2c->State == HAL_FMPI2C_STATE_READY)
bogdanm 0:9b334a45a8ff 1559 {
bogdanm 0:9b334a45a8ff 1560 if((pData == NULL) || (Size == 0))
bogdanm 0:9b334a45a8ff 1561 {
bogdanm 0:9b334a45a8ff 1562 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 1563 }
bogdanm 0:9b334a45a8ff 1564
bogdanm 0:9b334a45a8ff 1565 if(__HAL_FMPI2C_GET_FLAG(hfmpi2c, FMPI2C_FLAG_BUSY) == SET)
bogdanm 0:9b334a45a8ff 1566 {
bogdanm 0:9b334a45a8ff 1567 return HAL_BUSY;
bogdanm 0:9b334a45a8ff 1568 }
bogdanm 0:9b334a45a8ff 1569
bogdanm 0:9b334a45a8ff 1570 /* Process Locked */
bogdanm 0:9b334a45a8ff 1571 __HAL_LOCK(hfmpi2c);
bogdanm 0:9b334a45a8ff 1572
bogdanm 0:9b334a45a8ff 1573 hfmpi2c->State = HAL_FMPI2C_STATE_MEM_BUSY_TX;
bogdanm 0:9b334a45a8ff 1574 hfmpi2c->ErrorCode = HAL_FMPI2C_ERROR_NONE;
bogdanm 0:9b334a45a8ff 1575
bogdanm 0:9b334a45a8ff 1576 /* Send Slave Address and Memory Address */
bogdanm 0:9b334a45a8ff 1577 if(FMPI2C_RequestMemoryWrite(hfmpi2c, DevAddress, MemAddress, MemAddSize, Timeout) != HAL_OK)
bogdanm 0:9b334a45a8ff 1578 {
bogdanm 0:9b334a45a8ff 1579 if(hfmpi2c->ErrorCode == HAL_FMPI2C_ERROR_AF)
bogdanm 0:9b334a45a8ff 1580 {
bogdanm 0:9b334a45a8ff 1581 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 1582 __HAL_UNLOCK(hfmpi2c);
bogdanm 0:9b334a45a8ff 1583 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 1584 }
bogdanm 0:9b334a45a8ff 1585 else
bogdanm 0:9b334a45a8ff 1586 {
bogdanm 0:9b334a45a8ff 1587 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 1588 __HAL_UNLOCK(hfmpi2c);
bogdanm 0:9b334a45a8ff 1589 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 1590 }
bogdanm 0:9b334a45a8ff 1591 }
bogdanm 0:9b334a45a8ff 1592
bogdanm 0:9b334a45a8ff 1593 /* Set NBYTES to write and reload if size > 255 */
bogdanm 0:9b334a45a8ff 1594 /* Size > 255, need to set RELOAD bit */
bogdanm 0:9b334a45a8ff 1595 if(Size > 255)
bogdanm 0:9b334a45a8ff 1596 {
bogdanm 0:9b334a45a8ff 1597 FMPI2C_TransferConfig(hfmpi2c,DevAddress,255, FMPI2C_RELOAD_MODE, FMPI2C_NO_STARTSTOP);
bogdanm 0:9b334a45a8ff 1598 Sizetmp = 255;
bogdanm 0:9b334a45a8ff 1599 }
bogdanm 0:9b334a45a8ff 1600 else
bogdanm 0:9b334a45a8ff 1601 {
bogdanm 0:9b334a45a8ff 1602 FMPI2C_TransferConfig(hfmpi2c,DevAddress,Size, FMPI2C_AUTOEND_MODE, FMPI2C_NO_STARTSTOP);
bogdanm 0:9b334a45a8ff 1603 Sizetmp = Size;
bogdanm 0:9b334a45a8ff 1604 }
bogdanm 0:9b334a45a8ff 1605
bogdanm 0:9b334a45a8ff 1606 do
bogdanm 0:9b334a45a8ff 1607 {
bogdanm 0:9b334a45a8ff 1608 /* Wait until TXIS flag is set */
bogdanm 0:9b334a45a8ff 1609 if(FMPI2C_WaitOnTXISFlagUntilTimeout(hfmpi2c, Timeout) != HAL_OK)
bogdanm 0:9b334a45a8ff 1610 {
bogdanm 0:9b334a45a8ff 1611 if(hfmpi2c->ErrorCode == HAL_FMPI2C_ERROR_AF)
bogdanm 0:9b334a45a8ff 1612 {
bogdanm 0:9b334a45a8ff 1613 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 1614 }
bogdanm 0:9b334a45a8ff 1615 else
bogdanm 0:9b334a45a8ff 1616 {
bogdanm 0:9b334a45a8ff 1617 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 1618 }
bogdanm 0:9b334a45a8ff 1619 }
bogdanm 0:9b334a45a8ff 1620
bogdanm 0:9b334a45a8ff 1621 /* Write data to DR */
bogdanm 0:9b334a45a8ff 1622 hfmpi2c->Instance->TXDR = (*pData++);
bogdanm 0:9b334a45a8ff 1623 Sizetmp--;
bogdanm 0:9b334a45a8ff 1624 Size--;
bogdanm 0:9b334a45a8ff 1625
bogdanm 0:9b334a45a8ff 1626 if((Sizetmp == 0)&&(Size!=0))
bogdanm 0:9b334a45a8ff 1627 {
bogdanm 0:9b334a45a8ff 1628 /* Wait until TCR flag is set */
bogdanm 0:9b334a45a8ff 1629 if(FMPI2C_WaitOnFlagUntilTimeout(hfmpi2c, FMPI2C_FLAG_TCR, RESET, Timeout) != HAL_OK)
bogdanm 0:9b334a45a8ff 1630 {
bogdanm 0:9b334a45a8ff 1631 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 1632 }
bogdanm 0:9b334a45a8ff 1633
bogdanm 0:9b334a45a8ff 1634
bogdanm 0:9b334a45a8ff 1635 if(Size > 255)
bogdanm 0:9b334a45a8ff 1636 {
bogdanm 0:9b334a45a8ff 1637 FMPI2C_TransferConfig(hfmpi2c,DevAddress,255, FMPI2C_RELOAD_MODE, FMPI2C_NO_STARTSTOP);
bogdanm 0:9b334a45a8ff 1638 Sizetmp = 255;
bogdanm 0:9b334a45a8ff 1639 }
bogdanm 0:9b334a45a8ff 1640 else
bogdanm 0:9b334a45a8ff 1641 {
bogdanm 0:9b334a45a8ff 1642 FMPI2C_TransferConfig(hfmpi2c,DevAddress,Size, FMPI2C_AUTOEND_MODE, FMPI2C_NO_STARTSTOP);
bogdanm 0:9b334a45a8ff 1643 Sizetmp = Size;
bogdanm 0:9b334a45a8ff 1644 }
bogdanm 0:9b334a45a8ff 1645 }
bogdanm 0:9b334a45a8ff 1646
bogdanm 0:9b334a45a8ff 1647 }while(Size > 0);
bogdanm 0:9b334a45a8ff 1648
bogdanm 0:9b334a45a8ff 1649 /* No need to Check TC flag, with AUTOEND mode the stop is automatically generated */
bogdanm 0:9b334a45a8ff 1650 /* Wait until STOPF flag is reset */
bogdanm 0:9b334a45a8ff 1651 if(FMPI2C_WaitOnSTOPFlagUntilTimeout(hfmpi2c, FMPI2C_TIMEOUT_STOPF) != HAL_OK)
bogdanm 0:9b334a45a8ff 1652 {
bogdanm 0:9b334a45a8ff 1653 if(hfmpi2c->ErrorCode == HAL_FMPI2C_ERROR_AF)
bogdanm 0:9b334a45a8ff 1654 {
bogdanm 0:9b334a45a8ff 1655 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 1656 }
bogdanm 0:9b334a45a8ff 1657 else
bogdanm 0:9b334a45a8ff 1658 {
bogdanm 0:9b334a45a8ff 1659 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 1660 }
bogdanm 0:9b334a45a8ff 1661 }
bogdanm 0:9b334a45a8ff 1662
bogdanm 0:9b334a45a8ff 1663 /* Clear STOP Flag */
bogdanm 0:9b334a45a8ff 1664 __HAL_FMPI2C_CLEAR_FLAG(hfmpi2c, FMPI2C_FLAG_STOPF);
bogdanm 0:9b334a45a8ff 1665
bogdanm 0:9b334a45a8ff 1666 /* Clear Configuration Register 2 */
bogdanm 0:9b334a45a8ff 1667 __HAL_FMPI2C_RESET_CR2(hfmpi2c);
bogdanm 0:9b334a45a8ff 1668
bogdanm 0:9b334a45a8ff 1669 hfmpi2c->State = HAL_FMPI2C_STATE_READY;
bogdanm 0:9b334a45a8ff 1670
bogdanm 0:9b334a45a8ff 1671 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 1672 __HAL_UNLOCK(hfmpi2c);
bogdanm 0:9b334a45a8ff 1673
bogdanm 0:9b334a45a8ff 1674 return HAL_OK;
bogdanm 0:9b334a45a8ff 1675 }
bogdanm 0:9b334a45a8ff 1676 else
bogdanm 0:9b334a45a8ff 1677 {
bogdanm 0:9b334a45a8ff 1678 return HAL_BUSY;
bogdanm 0:9b334a45a8ff 1679 }
bogdanm 0:9b334a45a8ff 1680 }
bogdanm 0:9b334a45a8ff 1681
bogdanm 0:9b334a45a8ff 1682 /**
bogdanm 0:9b334a45a8ff 1683 * @brief Read an amount of data in blocking mode from a specific memory address
bogdanm 0:9b334a45a8ff 1684 * @param hfmpi2c : Pointer to a FMPI2C_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 1685 * the configuration information for the specified FMPI2C.
bogdanm 0:9b334a45a8ff 1686 * @param DevAddress: Target device address
bogdanm 0:9b334a45a8ff 1687 * @param MemAddress: Internal memory address
bogdanm 0:9b334a45a8ff 1688 * @param MemAddSize: Size of internal memory address
bogdanm 0:9b334a45a8ff 1689 * @param pData: Pointer to data buffer
bogdanm 0:9b334a45a8ff 1690 * @param Size: Amount of data to be sent
bogdanm 0:9b334a45a8ff 1691 * @param Timeout: Timeout duration
bogdanm 0:9b334a45a8ff 1692 * @retval HAL status
bogdanm 0:9b334a45a8ff 1693 */
bogdanm 0:9b334a45a8ff 1694 HAL_StatusTypeDef HAL_FMPI2C_Mem_Read(FMPI2C_HandleTypeDef *hfmpi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout)
bogdanm 0:9b334a45a8ff 1695 {
bogdanm 0:9b334a45a8ff 1696 uint32_t Sizetmp = 0;
bogdanm 0:9b334a45a8ff 1697
bogdanm 0:9b334a45a8ff 1698 /* Check the parameters */
bogdanm 0:9b334a45a8ff 1699 assert_param(IS_FMPI2C_MEMADD_SIZE(MemAddSize));
bogdanm 0:9b334a45a8ff 1700
bogdanm 0:9b334a45a8ff 1701 if(hfmpi2c->State == HAL_FMPI2C_STATE_READY)
bogdanm 0:9b334a45a8ff 1702 {
bogdanm 0:9b334a45a8ff 1703 if((pData == NULL) || (Size == 0))
bogdanm 0:9b334a45a8ff 1704 {
bogdanm 0:9b334a45a8ff 1705 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 1706 }
bogdanm 0:9b334a45a8ff 1707
bogdanm 0:9b334a45a8ff 1708 if(__HAL_FMPI2C_GET_FLAG(hfmpi2c, FMPI2C_FLAG_BUSY) == SET)
bogdanm 0:9b334a45a8ff 1709 {
bogdanm 0:9b334a45a8ff 1710 return HAL_BUSY;
bogdanm 0:9b334a45a8ff 1711 }
bogdanm 0:9b334a45a8ff 1712
bogdanm 0:9b334a45a8ff 1713 /* Process Locked */
bogdanm 0:9b334a45a8ff 1714 __HAL_LOCK(hfmpi2c);
bogdanm 0:9b334a45a8ff 1715
bogdanm 0:9b334a45a8ff 1716 hfmpi2c->State = HAL_FMPI2C_STATE_MEM_BUSY_RX;
bogdanm 0:9b334a45a8ff 1717 hfmpi2c->ErrorCode = HAL_FMPI2C_ERROR_NONE;
bogdanm 0:9b334a45a8ff 1718
bogdanm 0:9b334a45a8ff 1719 /* Send Slave Address and Memory Address */
bogdanm 0:9b334a45a8ff 1720 if(FMPI2C_RequestMemoryRead(hfmpi2c, DevAddress, MemAddress, MemAddSize, Timeout) != HAL_OK)
bogdanm 0:9b334a45a8ff 1721 {
bogdanm 0:9b334a45a8ff 1722 if(hfmpi2c->ErrorCode == HAL_FMPI2C_ERROR_AF)
bogdanm 0:9b334a45a8ff 1723 {
bogdanm 0:9b334a45a8ff 1724 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 1725 __HAL_UNLOCK(hfmpi2c);
bogdanm 0:9b334a45a8ff 1726 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 1727 }
bogdanm 0:9b334a45a8ff 1728 else
bogdanm 0:9b334a45a8ff 1729 {
bogdanm 0:9b334a45a8ff 1730 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 1731 __HAL_UNLOCK(hfmpi2c);
bogdanm 0:9b334a45a8ff 1732 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 1733 }
bogdanm 0:9b334a45a8ff 1734 }
bogdanm 0:9b334a45a8ff 1735
bogdanm 0:9b334a45a8ff 1736 /* Send Slave Address */
bogdanm 0:9b334a45a8ff 1737 /* Set NBYTES to write and reload if size > 255 and generate RESTART */
bogdanm 0:9b334a45a8ff 1738 /* Size > 255, need to set RELOAD bit */
bogdanm 0:9b334a45a8ff 1739 if(Size > 255)
bogdanm 0:9b334a45a8ff 1740 {
bogdanm 0:9b334a45a8ff 1741 FMPI2C_TransferConfig(hfmpi2c,DevAddress,255, FMPI2C_RELOAD_MODE, FMPI2C_GENERATE_START_READ);
bogdanm 0:9b334a45a8ff 1742 Sizetmp = 255;
bogdanm 0:9b334a45a8ff 1743 }
bogdanm 0:9b334a45a8ff 1744 else
bogdanm 0:9b334a45a8ff 1745 {
bogdanm 0:9b334a45a8ff 1746 FMPI2C_TransferConfig(hfmpi2c,DevAddress,Size, FMPI2C_AUTOEND_MODE, FMPI2C_GENERATE_START_READ);
bogdanm 0:9b334a45a8ff 1747 Sizetmp = Size;
bogdanm 0:9b334a45a8ff 1748 }
bogdanm 0:9b334a45a8ff 1749
bogdanm 0:9b334a45a8ff 1750 do
bogdanm 0:9b334a45a8ff 1751 {
bogdanm 0:9b334a45a8ff 1752 /* Wait until RXNE flag is set */
bogdanm 0:9b334a45a8ff 1753 if(FMPI2C_WaitOnFlagUntilTimeout(hfmpi2c, FMPI2C_FLAG_RXNE, RESET, Timeout) != HAL_OK)
bogdanm 0:9b334a45a8ff 1754 {
bogdanm 0:9b334a45a8ff 1755 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 1756 }
bogdanm 0:9b334a45a8ff 1757
bogdanm 0:9b334a45a8ff 1758 /* Read data from RXDR */
bogdanm 0:9b334a45a8ff 1759 (*pData++) = hfmpi2c->Instance->RXDR;
bogdanm 0:9b334a45a8ff 1760
bogdanm 0:9b334a45a8ff 1761 /* Decrement the Size counter */
bogdanm 0:9b334a45a8ff 1762 Sizetmp--;
bogdanm 0:9b334a45a8ff 1763 Size--;
bogdanm 0:9b334a45a8ff 1764
bogdanm 0:9b334a45a8ff 1765 if((Sizetmp == 0)&&(Size!=0))
bogdanm 0:9b334a45a8ff 1766 {
bogdanm 0:9b334a45a8ff 1767 /* Wait until TCR flag is set */
bogdanm 0:9b334a45a8ff 1768 if(FMPI2C_WaitOnFlagUntilTimeout(hfmpi2c, FMPI2C_FLAG_TCR, RESET, Timeout) != HAL_OK)
bogdanm 0:9b334a45a8ff 1769 {
bogdanm 0:9b334a45a8ff 1770 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 1771 }
bogdanm 0:9b334a45a8ff 1772
bogdanm 0:9b334a45a8ff 1773 if(Size > 255)
bogdanm 0:9b334a45a8ff 1774 {
bogdanm 0:9b334a45a8ff 1775 FMPI2C_TransferConfig(hfmpi2c,DevAddress,255, FMPI2C_RELOAD_MODE, FMPI2C_NO_STARTSTOP);
bogdanm 0:9b334a45a8ff 1776 Sizetmp = 255;
bogdanm 0:9b334a45a8ff 1777 }
bogdanm 0:9b334a45a8ff 1778 else
bogdanm 0:9b334a45a8ff 1779 {
bogdanm 0:9b334a45a8ff 1780 FMPI2C_TransferConfig(hfmpi2c,DevAddress,Size, FMPI2C_AUTOEND_MODE, FMPI2C_NO_STARTSTOP);
bogdanm 0:9b334a45a8ff 1781 Sizetmp = Size;
bogdanm 0:9b334a45a8ff 1782 }
bogdanm 0:9b334a45a8ff 1783 }
bogdanm 0:9b334a45a8ff 1784
bogdanm 0:9b334a45a8ff 1785 }while(Size > 0);
bogdanm 0:9b334a45a8ff 1786
bogdanm 0:9b334a45a8ff 1787 /* No need to Check TC flag, with AUTOEND mode the stop is automatically generated */
bogdanm 0:9b334a45a8ff 1788 /* Wait until STOPF flag is reset */
bogdanm 0:9b334a45a8ff 1789 if(FMPI2C_WaitOnSTOPFlagUntilTimeout(hfmpi2c, FMPI2C_TIMEOUT_STOPF) != HAL_OK)
bogdanm 0:9b334a45a8ff 1790 {
bogdanm 0:9b334a45a8ff 1791 if(hfmpi2c->ErrorCode == HAL_FMPI2C_ERROR_AF)
bogdanm 0:9b334a45a8ff 1792 {
bogdanm 0:9b334a45a8ff 1793 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 1794 }
bogdanm 0:9b334a45a8ff 1795 else
bogdanm 0:9b334a45a8ff 1796 {
bogdanm 0:9b334a45a8ff 1797 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 1798 }
bogdanm 0:9b334a45a8ff 1799 }
bogdanm 0:9b334a45a8ff 1800
bogdanm 0:9b334a45a8ff 1801 /* Clear STOP Flag */
bogdanm 0:9b334a45a8ff 1802 __HAL_FMPI2C_CLEAR_FLAG(hfmpi2c, FMPI2C_FLAG_STOPF);
bogdanm 0:9b334a45a8ff 1803
bogdanm 0:9b334a45a8ff 1804 /* Clear Configuration Register 2 */
bogdanm 0:9b334a45a8ff 1805 __HAL_FMPI2C_RESET_CR2(hfmpi2c);
bogdanm 0:9b334a45a8ff 1806
bogdanm 0:9b334a45a8ff 1807 hfmpi2c->State = HAL_FMPI2C_STATE_READY;
bogdanm 0:9b334a45a8ff 1808
bogdanm 0:9b334a45a8ff 1809 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 1810 __HAL_UNLOCK(hfmpi2c);
bogdanm 0:9b334a45a8ff 1811
bogdanm 0:9b334a45a8ff 1812 return HAL_OK;
bogdanm 0:9b334a45a8ff 1813 }
bogdanm 0:9b334a45a8ff 1814 else
bogdanm 0:9b334a45a8ff 1815 {
bogdanm 0:9b334a45a8ff 1816 return HAL_BUSY;
bogdanm 0:9b334a45a8ff 1817 }
bogdanm 0:9b334a45a8ff 1818 }
bogdanm 0:9b334a45a8ff 1819 /**
bogdanm 0:9b334a45a8ff 1820 * @brief Write an amount of data in no-blocking mode with Interrupt to a specific memory address
bogdanm 0:9b334a45a8ff 1821 * @param hfmpi2c : Pointer to a FMPI2C_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 1822 * the configuration information for the specified FMPI2C.
bogdanm 0:9b334a45a8ff 1823 * @param DevAddress: Target device address
bogdanm 0:9b334a45a8ff 1824 * @param MemAddress: Internal memory address
bogdanm 0:9b334a45a8ff 1825 * @param MemAddSize: Size of internal memory address
bogdanm 0:9b334a45a8ff 1826 * @param pData: Pointer to data buffer
bogdanm 0:9b334a45a8ff 1827 * @param Size: Amount of data to be sent
bogdanm 0:9b334a45a8ff 1828 * @retval HAL status
bogdanm 0:9b334a45a8ff 1829 */
bogdanm 0:9b334a45a8ff 1830 HAL_StatusTypeDef HAL_FMPI2C_Mem_Write_IT(FMPI2C_HandleTypeDef *hfmpi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size)
bogdanm 0:9b334a45a8ff 1831 {
bogdanm 0:9b334a45a8ff 1832 /* Check the parameters */
bogdanm 0:9b334a45a8ff 1833 assert_param(IS_FMPI2C_MEMADD_SIZE(MemAddSize));
bogdanm 0:9b334a45a8ff 1834
bogdanm 0:9b334a45a8ff 1835 if(hfmpi2c->State == HAL_FMPI2C_STATE_READY)
bogdanm 0:9b334a45a8ff 1836 {
bogdanm 0:9b334a45a8ff 1837 if((pData == NULL) || (Size == 0))
bogdanm 0:9b334a45a8ff 1838 {
bogdanm 0:9b334a45a8ff 1839 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 1840 }
bogdanm 0:9b334a45a8ff 1841
bogdanm 0:9b334a45a8ff 1842 if(__HAL_FMPI2C_GET_FLAG(hfmpi2c, FMPI2C_FLAG_BUSY) == SET)
bogdanm 0:9b334a45a8ff 1843 {
bogdanm 0:9b334a45a8ff 1844 return HAL_BUSY;
bogdanm 0:9b334a45a8ff 1845 }
bogdanm 0:9b334a45a8ff 1846
bogdanm 0:9b334a45a8ff 1847 /* Process Locked */
bogdanm 0:9b334a45a8ff 1848 __HAL_LOCK(hfmpi2c);
bogdanm 0:9b334a45a8ff 1849
bogdanm 0:9b334a45a8ff 1850 hfmpi2c->State = HAL_FMPI2C_STATE_MEM_BUSY_TX;
bogdanm 0:9b334a45a8ff 1851 hfmpi2c->ErrorCode = HAL_FMPI2C_ERROR_NONE;
bogdanm 0:9b334a45a8ff 1852
bogdanm 0:9b334a45a8ff 1853 hfmpi2c->pBuffPtr = pData;
bogdanm 0:9b334a45a8ff 1854 hfmpi2c->XferCount = Size;
bogdanm 0:9b334a45a8ff 1855 if(Size > 255)
bogdanm 0:9b334a45a8ff 1856 {
bogdanm 0:9b334a45a8ff 1857 hfmpi2c->XferSize = 255;
bogdanm 0:9b334a45a8ff 1858 }
bogdanm 0:9b334a45a8ff 1859 else
bogdanm 0:9b334a45a8ff 1860 {
bogdanm 0:9b334a45a8ff 1861 hfmpi2c->XferSize = Size;
bogdanm 0:9b334a45a8ff 1862 }
bogdanm 0:9b334a45a8ff 1863
bogdanm 0:9b334a45a8ff 1864 /* Send Slave Address and Memory Address */
bogdanm 0:9b334a45a8ff 1865 if(FMPI2C_RequestMemoryWrite(hfmpi2c, DevAddress, MemAddress, MemAddSize, FMPI2C_TIMEOUT_FLAG) != HAL_OK)
bogdanm 0:9b334a45a8ff 1866 {
bogdanm 0:9b334a45a8ff 1867 if(hfmpi2c->ErrorCode == HAL_FMPI2C_ERROR_AF)
bogdanm 0:9b334a45a8ff 1868 {
bogdanm 0:9b334a45a8ff 1869 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 1870 __HAL_UNLOCK(hfmpi2c);
bogdanm 0:9b334a45a8ff 1871 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 1872 }
bogdanm 0:9b334a45a8ff 1873 else
bogdanm 0:9b334a45a8ff 1874 {
bogdanm 0:9b334a45a8ff 1875 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 1876 __HAL_UNLOCK(hfmpi2c);
bogdanm 0:9b334a45a8ff 1877 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 1878 }
bogdanm 0:9b334a45a8ff 1879 }
bogdanm 0:9b334a45a8ff 1880
bogdanm 0:9b334a45a8ff 1881 /* Set NBYTES to write and reload if size > 255 */
bogdanm 0:9b334a45a8ff 1882 /* Size > 255, need to set RELOAD bit */
bogdanm 0:9b334a45a8ff 1883 if( (hfmpi2c->XferSize == 255) && (hfmpi2c->XferSize < hfmpi2c->XferCount) )
bogdanm 0:9b334a45a8ff 1884 {
bogdanm 0:9b334a45a8ff 1885 FMPI2C_TransferConfig(hfmpi2c,DevAddress,hfmpi2c->XferSize, FMPI2C_RELOAD_MODE, FMPI2C_NO_STARTSTOP);
bogdanm 0:9b334a45a8ff 1886 }
bogdanm 0:9b334a45a8ff 1887 else
bogdanm 0:9b334a45a8ff 1888 {
bogdanm 0:9b334a45a8ff 1889 FMPI2C_TransferConfig(hfmpi2c,DevAddress,hfmpi2c->XferSize, FMPI2C_AUTOEND_MODE, FMPI2C_NO_STARTSTOP);
bogdanm 0:9b334a45a8ff 1890 }
bogdanm 0:9b334a45a8ff 1891
bogdanm 0:9b334a45a8ff 1892 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 1893 __HAL_UNLOCK(hfmpi2c);
bogdanm 0:9b334a45a8ff 1894
bogdanm 0:9b334a45a8ff 1895 /* Note : The FMPI2C interrupts must be enabled after unlocking current process
bogdanm 0:9b334a45a8ff 1896 to avoid the risk of FMPI2C interrupt handle execution before current
bogdanm 0:9b334a45a8ff 1897 process unlock */
bogdanm 0:9b334a45a8ff 1898
bogdanm 0:9b334a45a8ff 1899 /* Enable ERR, TC, STOP, NACK, TXI interrupt */
bogdanm 0:9b334a45a8ff 1900 /* possible to enable all of these */
bogdanm 0:9b334a45a8ff 1901 /* FMPI2C_IT_ERRI | FMPI2C_IT_TCI| FMPI2C_IT_STOPI| FMPI2C_IT_NACKI | FMPI2C_IT_ADDRI | FMPI2C_IT_RXI | FMPI2C_IT_TXI */
bogdanm 0:9b334a45a8ff 1902 __HAL_FMPI2C_ENABLE_IT(hfmpi2c,FMPI2C_IT_ERRI | FMPI2C_IT_TCI| FMPI2C_IT_STOPI| FMPI2C_IT_NACKI | FMPI2C_IT_TXI );
bogdanm 0:9b334a45a8ff 1903
bogdanm 0:9b334a45a8ff 1904 return HAL_OK;
bogdanm 0:9b334a45a8ff 1905 }
bogdanm 0:9b334a45a8ff 1906 else
bogdanm 0:9b334a45a8ff 1907 {
bogdanm 0:9b334a45a8ff 1908 return HAL_BUSY;
bogdanm 0:9b334a45a8ff 1909 }
bogdanm 0:9b334a45a8ff 1910 }
bogdanm 0:9b334a45a8ff 1911
bogdanm 0:9b334a45a8ff 1912 /**
bogdanm 0:9b334a45a8ff 1913 * @brief Read an amount of data in no-blocking mode with Interrupt from a specific memory address
bogdanm 0:9b334a45a8ff 1914 * @param hfmpi2c : Pointer to a FMPI2C_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 1915 * the configuration information for the specified FMPI2C.
bogdanm 0:9b334a45a8ff 1916 * @param DevAddress: Target device address
bogdanm 0:9b334a45a8ff 1917 * @param MemAddress: Internal memory address
bogdanm 0:9b334a45a8ff 1918 * @param MemAddSize: Size of internal memory address
bogdanm 0:9b334a45a8ff 1919 * @param pData: Pointer to data buffer
bogdanm 0:9b334a45a8ff 1920 * @param Size: Amount of data to be sent
bogdanm 0:9b334a45a8ff 1921 * @retval HAL status
bogdanm 0:9b334a45a8ff 1922 */
bogdanm 0:9b334a45a8ff 1923 HAL_StatusTypeDef HAL_FMPI2C_Mem_Read_IT(FMPI2C_HandleTypeDef *hfmpi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size)
bogdanm 0:9b334a45a8ff 1924 {
bogdanm 0:9b334a45a8ff 1925 /* Check the parameters */
bogdanm 0:9b334a45a8ff 1926 assert_param(IS_FMPI2C_MEMADD_SIZE(MemAddSize));
bogdanm 0:9b334a45a8ff 1927
bogdanm 0:9b334a45a8ff 1928 if(hfmpi2c->State == HAL_FMPI2C_STATE_READY)
bogdanm 0:9b334a45a8ff 1929 {
bogdanm 0:9b334a45a8ff 1930 if((pData == NULL) || (Size == 0))
bogdanm 0:9b334a45a8ff 1931 {
bogdanm 0:9b334a45a8ff 1932 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 1933 }
bogdanm 0:9b334a45a8ff 1934
bogdanm 0:9b334a45a8ff 1935 if(__HAL_FMPI2C_GET_FLAG(hfmpi2c, FMPI2C_FLAG_BUSY) == SET)
bogdanm 0:9b334a45a8ff 1936 {
bogdanm 0:9b334a45a8ff 1937 return HAL_BUSY;
bogdanm 0:9b334a45a8ff 1938 }
bogdanm 0:9b334a45a8ff 1939
bogdanm 0:9b334a45a8ff 1940 /* Process Locked */
bogdanm 0:9b334a45a8ff 1941 __HAL_LOCK(hfmpi2c);
bogdanm 0:9b334a45a8ff 1942
bogdanm 0:9b334a45a8ff 1943 hfmpi2c->State = HAL_FMPI2C_STATE_MEM_BUSY_RX;
bogdanm 0:9b334a45a8ff 1944
bogdanm 0:9b334a45a8ff 1945 hfmpi2c->pBuffPtr = pData;
bogdanm 0:9b334a45a8ff 1946 hfmpi2c->XferCount = Size;
bogdanm 0:9b334a45a8ff 1947 if(Size > 255)
bogdanm 0:9b334a45a8ff 1948 {
bogdanm 0:9b334a45a8ff 1949 hfmpi2c->XferSize = 255;
bogdanm 0:9b334a45a8ff 1950 }
bogdanm 0:9b334a45a8ff 1951 else
bogdanm 0:9b334a45a8ff 1952 {
bogdanm 0:9b334a45a8ff 1953 hfmpi2c->XferSize = Size;
bogdanm 0:9b334a45a8ff 1954 }
bogdanm 0:9b334a45a8ff 1955
bogdanm 0:9b334a45a8ff 1956 /* Send Slave Address and Memory Address */
bogdanm 0:9b334a45a8ff 1957 if(FMPI2C_RequestMemoryRead(hfmpi2c, DevAddress, MemAddress, MemAddSize, FMPI2C_TIMEOUT_FLAG) != HAL_OK)
bogdanm 0:9b334a45a8ff 1958 {
bogdanm 0:9b334a45a8ff 1959 if(hfmpi2c->ErrorCode == HAL_FMPI2C_ERROR_AF)
bogdanm 0:9b334a45a8ff 1960 {
bogdanm 0:9b334a45a8ff 1961 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 1962 __HAL_UNLOCK(hfmpi2c);
bogdanm 0:9b334a45a8ff 1963 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 1964 }
bogdanm 0:9b334a45a8ff 1965 else
bogdanm 0:9b334a45a8ff 1966 {
bogdanm 0:9b334a45a8ff 1967 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 1968 __HAL_UNLOCK(hfmpi2c);
bogdanm 0:9b334a45a8ff 1969 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 1970 }
bogdanm 0:9b334a45a8ff 1971 }
bogdanm 0:9b334a45a8ff 1972
bogdanm 0:9b334a45a8ff 1973 /* Set NBYTES to write and reload if size > 255 and generate RESTART */
bogdanm 0:9b334a45a8ff 1974 /* Size > 255, need to set RELOAD bit */
bogdanm 0:9b334a45a8ff 1975 if( (hfmpi2c->XferSize == 255) && (hfmpi2c->XferSize < hfmpi2c->XferCount) )
bogdanm 0:9b334a45a8ff 1976 {
bogdanm 0:9b334a45a8ff 1977 FMPI2C_TransferConfig(hfmpi2c,DevAddress,hfmpi2c->XferSize, FMPI2C_RELOAD_MODE, FMPI2C_GENERATE_START_READ);
bogdanm 0:9b334a45a8ff 1978 }
bogdanm 0:9b334a45a8ff 1979 else
bogdanm 0:9b334a45a8ff 1980 {
bogdanm 0:9b334a45a8ff 1981 FMPI2C_TransferConfig(hfmpi2c,DevAddress,hfmpi2c->XferSize, FMPI2C_AUTOEND_MODE, FMPI2C_GENERATE_START_READ);
bogdanm 0:9b334a45a8ff 1982 }
bogdanm 0:9b334a45a8ff 1983
bogdanm 0:9b334a45a8ff 1984 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 1985 __HAL_UNLOCK(hfmpi2c);
bogdanm 0:9b334a45a8ff 1986
bogdanm 0:9b334a45a8ff 1987 /* Note : The FMPI2C interrupts must be enabled after unlocking current process
bogdanm 0:9b334a45a8ff 1988 to avoid the risk of FMPI2C interrupt handle execution before current
bogdanm 0:9b334a45a8ff 1989 process unlock */
bogdanm 0:9b334a45a8ff 1990
bogdanm 0:9b334a45a8ff 1991 /* Enable ERR, TC, STOP, NACK, RXI interrupt */
bogdanm 0:9b334a45a8ff 1992 /* possible to enable all of these */
bogdanm 0:9b334a45a8ff 1993 /* FMPI2C_IT_ERRI | FMPI2C_IT_TCI| FMPI2C_IT_STOPI| FMPI2C_IT_NACKI | FMPI2C_IT_ADDRI | FMPI2C_IT_RXI | FMPI2C_IT_TXI */
bogdanm 0:9b334a45a8ff 1994 __HAL_FMPI2C_ENABLE_IT(hfmpi2c, FMPI2C_IT_ERRI | FMPI2C_IT_TCI| FMPI2C_IT_STOPI| FMPI2C_IT_NACKI | FMPI2C_IT_RXI );
bogdanm 0:9b334a45a8ff 1995
bogdanm 0:9b334a45a8ff 1996 return HAL_OK;
bogdanm 0:9b334a45a8ff 1997 }
bogdanm 0:9b334a45a8ff 1998 else
bogdanm 0:9b334a45a8ff 1999 {
bogdanm 0:9b334a45a8ff 2000 return HAL_BUSY;
bogdanm 0:9b334a45a8ff 2001 }
bogdanm 0:9b334a45a8ff 2002 }
bogdanm 0:9b334a45a8ff 2003 /**
bogdanm 0:9b334a45a8ff 2004 * @brief Write an amount of data in no-blocking mode with DMA to a specific memory address
bogdanm 0:9b334a45a8ff 2005 * @param hfmpi2c : Pointer to a FMPI2C_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 2006 * the configuration information for the specified FMPI2C.
bogdanm 0:9b334a45a8ff 2007 * @param DevAddress: Target device address
bogdanm 0:9b334a45a8ff 2008 * @param MemAddress: Internal memory address
bogdanm 0:9b334a45a8ff 2009 * @param MemAddSize: Size of internal memory address
bogdanm 0:9b334a45a8ff 2010 * @param pData: Pointer to data buffer
bogdanm 0:9b334a45a8ff 2011 * @param Size: Amount of data to be sent
bogdanm 0:9b334a45a8ff 2012 * @retval HAL status
bogdanm 0:9b334a45a8ff 2013 */
bogdanm 0:9b334a45a8ff 2014 HAL_StatusTypeDef HAL_FMPI2C_Mem_Write_DMA(FMPI2C_HandleTypeDef *hfmpi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size)
bogdanm 0:9b334a45a8ff 2015 {
bogdanm 0:9b334a45a8ff 2016 /* Check the parameters */
bogdanm 0:9b334a45a8ff 2017 assert_param(IS_FMPI2C_MEMADD_SIZE(MemAddSize));
bogdanm 0:9b334a45a8ff 2018
bogdanm 0:9b334a45a8ff 2019 if(hfmpi2c->State == HAL_FMPI2C_STATE_READY)
bogdanm 0:9b334a45a8ff 2020 {
bogdanm 0:9b334a45a8ff 2021 if((pData == NULL) || (Size == 0))
bogdanm 0:9b334a45a8ff 2022 {
bogdanm 0:9b334a45a8ff 2023 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 2024 }
bogdanm 0:9b334a45a8ff 2025
bogdanm 0:9b334a45a8ff 2026 if(__HAL_FMPI2C_GET_FLAG(hfmpi2c, FMPI2C_FLAG_BUSY) == SET)
bogdanm 0:9b334a45a8ff 2027 {
bogdanm 0:9b334a45a8ff 2028 return HAL_BUSY;
bogdanm 0:9b334a45a8ff 2029 }
bogdanm 0:9b334a45a8ff 2030
bogdanm 0:9b334a45a8ff 2031 /* Process Locked */
bogdanm 0:9b334a45a8ff 2032 __HAL_LOCK(hfmpi2c);
bogdanm 0:9b334a45a8ff 2033
bogdanm 0:9b334a45a8ff 2034 hfmpi2c->State = HAL_FMPI2C_STATE_MEM_BUSY_TX;
bogdanm 0:9b334a45a8ff 2035 hfmpi2c->ErrorCode = HAL_FMPI2C_ERROR_NONE;
bogdanm 0:9b334a45a8ff 2036
bogdanm 0:9b334a45a8ff 2037 hfmpi2c->pBuffPtr = pData;
bogdanm 0:9b334a45a8ff 2038 hfmpi2c->XferCount = Size;
bogdanm 0:9b334a45a8ff 2039 if(Size > 255)
bogdanm 0:9b334a45a8ff 2040 {
bogdanm 0:9b334a45a8ff 2041 hfmpi2c->XferSize = 255;
bogdanm 0:9b334a45a8ff 2042 }
bogdanm 0:9b334a45a8ff 2043 else
bogdanm 0:9b334a45a8ff 2044 {
bogdanm 0:9b334a45a8ff 2045 hfmpi2c->XferSize = Size;
bogdanm 0:9b334a45a8ff 2046 }
bogdanm 0:9b334a45a8ff 2047
bogdanm 0:9b334a45a8ff 2048 /* Set the FMPI2C DMA transfer complete callback */
bogdanm 0:9b334a45a8ff 2049 hfmpi2c->hdmatx->XferCpltCallback = FMPI2C_DMAMemTransmitCplt;
bogdanm 0:9b334a45a8ff 2050
bogdanm 0:9b334a45a8ff 2051 /* Set the DMA error callback */
bogdanm 0:9b334a45a8ff 2052 hfmpi2c->hdmatx->XferErrorCallback = FMPI2C_DMAError;
bogdanm 0:9b334a45a8ff 2053
bogdanm 0:9b334a45a8ff 2054 /* Enable the DMA channel */
bogdanm 0:9b334a45a8ff 2055 HAL_DMA_Start_IT(hfmpi2c->hdmatx, (uint32_t)pData, (uint32_t)&hfmpi2c->Instance->TXDR, hfmpi2c->XferSize);
bogdanm 0:9b334a45a8ff 2056
bogdanm 0:9b334a45a8ff 2057 /* Send Slave Address and Memory Address */
bogdanm 0:9b334a45a8ff 2058 if(FMPI2C_RequestMemoryWrite(hfmpi2c, DevAddress, MemAddress, MemAddSize, FMPI2C_TIMEOUT_FLAG) != HAL_OK)
bogdanm 0:9b334a45a8ff 2059 {
bogdanm 0:9b334a45a8ff 2060 if(hfmpi2c->ErrorCode == HAL_FMPI2C_ERROR_AF)
bogdanm 0:9b334a45a8ff 2061 {
bogdanm 0:9b334a45a8ff 2062 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 2063 __HAL_UNLOCK(hfmpi2c);
bogdanm 0:9b334a45a8ff 2064 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 2065 }
bogdanm 0:9b334a45a8ff 2066 else
bogdanm 0:9b334a45a8ff 2067 {
bogdanm 0:9b334a45a8ff 2068 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 2069 __HAL_UNLOCK(hfmpi2c);
bogdanm 0:9b334a45a8ff 2070 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 2071 }
bogdanm 0:9b334a45a8ff 2072 }
bogdanm 0:9b334a45a8ff 2073
bogdanm 0:9b334a45a8ff 2074 /* Send Slave Address */
bogdanm 0:9b334a45a8ff 2075 /* Set NBYTES to write and reload if size > 255 */
bogdanm 0:9b334a45a8ff 2076 if( (hfmpi2c->XferSize == 255) && (hfmpi2c->XferSize < hfmpi2c->XferCount) )
bogdanm 0:9b334a45a8ff 2077 {
bogdanm 0:9b334a45a8ff 2078 FMPI2C_TransferConfig(hfmpi2c,DevAddress,hfmpi2c->XferSize, FMPI2C_RELOAD_MODE, FMPI2C_NO_STARTSTOP);
bogdanm 0:9b334a45a8ff 2079 }
bogdanm 0:9b334a45a8ff 2080 else
bogdanm 0:9b334a45a8ff 2081 {
bogdanm 0:9b334a45a8ff 2082 FMPI2C_TransferConfig(hfmpi2c,DevAddress,hfmpi2c->XferSize, FMPI2C_AUTOEND_MODE, FMPI2C_NO_STARTSTOP);
bogdanm 0:9b334a45a8ff 2083 }
bogdanm 0:9b334a45a8ff 2084
bogdanm 0:9b334a45a8ff 2085 /* Wait until TXIS flag is set */
bogdanm 0:9b334a45a8ff 2086 if(FMPI2C_WaitOnTXISFlagUntilTimeout(hfmpi2c, FMPI2C_TIMEOUT_TXIS) != HAL_OK)
bogdanm 0:9b334a45a8ff 2087 {
bogdanm 0:9b334a45a8ff 2088 if(hfmpi2c->ErrorCode == HAL_FMPI2C_ERROR_AF)
bogdanm 0:9b334a45a8ff 2089 {
bogdanm 0:9b334a45a8ff 2090 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 2091 }
bogdanm 0:9b334a45a8ff 2092 else
bogdanm 0:9b334a45a8ff 2093 {
bogdanm 0:9b334a45a8ff 2094 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 2095 }
bogdanm 0:9b334a45a8ff 2096 }
bogdanm 0:9b334a45a8ff 2097
bogdanm 0:9b334a45a8ff 2098 /* Enable DMA Request */
bogdanm 0:9b334a45a8ff 2099 hfmpi2c->Instance->CR1 |= FMPI2C_CR1_TXDMAEN;
bogdanm 0:9b334a45a8ff 2100
bogdanm 0:9b334a45a8ff 2101 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 2102 __HAL_UNLOCK(hfmpi2c);
bogdanm 0:9b334a45a8ff 2103
bogdanm 0:9b334a45a8ff 2104 return HAL_OK;
bogdanm 0:9b334a45a8ff 2105 }
bogdanm 0:9b334a45a8ff 2106 else
bogdanm 0:9b334a45a8ff 2107 {
bogdanm 0:9b334a45a8ff 2108 return HAL_BUSY;
bogdanm 0:9b334a45a8ff 2109 }
bogdanm 0:9b334a45a8ff 2110 }
bogdanm 0:9b334a45a8ff 2111
bogdanm 0:9b334a45a8ff 2112 /**
bogdanm 0:9b334a45a8ff 2113 * @brief Reads an amount of data in no-blocking mode with DMA from a specific memory address.
bogdanm 0:9b334a45a8ff 2114 * @param hfmpi2c : Pointer to a FMPI2C_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 2115 * the configuration information for the specified FMPI2C.
bogdanm 0:9b334a45a8ff 2116 * @param DevAddress: Target device address
bogdanm 0:9b334a45a8ff 2117 * @param MemAddress: Internal memory address
bogdanm 0:9b334a45a8ff 2118 * @param MemAddSize: Size of internal memory address
bogdanm 0:9b334a45a8ff 2119 * @param pData: Pointer to data buffer
bogdanm 0:9b334a45a8ff 2120 * @param Size: Amount of data to be read
bogdanm 0:9b334a45a8ff 2121 * @retval HAL status
bogdanm 0:9b334a45a8ff 2122 */
bogdanm 0:9b334a45a8ff 2123 HAL_StatusTypeDef HAL_FMPI2C_Mem_Read_DMA(FMPI2C_HandleTypeDef *hfmpi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size)
bogdanm 0:9b334a45a8ff 2124 {
bogdanm 0:9b334a45a8ff 2125 /* Check the parameters */
bogdanm 0:9b334a45a8ff 2126 assert_param(IS_FMPI2C_MEMADD_SIZE(MemAddSize));
bogdanm 0:9b334a45a8ff 2127
bogdanm 0:9b334a45a8ff 2128 if(hfmpi2c->State == HAL_FMPI2C_STATE_READY)
bogdanm 0:9b334a45a8ff 2129 {
bogdanm 0:9b334a45a8ff 2130 if((pData == NULL) || (Size == 0))
bogdanm 0:9b334a45a8ff 2131 {
bogdanm 0:9b334a45a8ff 2132 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 2133 }
bogdanm 0:9b334a45a8ff 2134
bogdanm 0:9b334a45a8ff 2135 if(__HAL_FMPI2C_GET_FLAG(hfmpi2c, FMPI2C_FLAG_BUSY) == SET)
bogdanm 0:9b334a45a8ff 2136 {
bogdanm 0:9b334a45a8ff 2137 return HAL_BUSY;
bogdanm 0:9b334a45a8ff 2138 }
bogdanm 0:9b334a45a8ff 2139
bogdanm 0:9b334a45a8ff 2140 /* Process Locked */
bogdanm 0:9b334a45a8ff 2141 __HAL_LOCK(hfmpi2c);
bogdanm 0:9b334a45a8ff 2142
bogdanm 0:9b334a45a8ff 2143 hfmpi2c->State = HAL_FMPI2C_STATE_MEM_BUSY_RX;
bogdanm 0:9b334a45a8ff 2144
bogdanm 0:9b334a45a8ff 2145 hfmpi2c->pBuffPtr = pData;
bogdanm 0:9b334a45a8ff 2146 hfmpi2c->XferCount = Size;
bogdanm 0:9b334a45a8ff 2147 if(Size > 255)
bogdanm 0:9b334a45a8ff 2148 {
bogdanm 0:9b334a45a8ff 2149 hfmpi2c->XferSize = 255;
bogdanm 0:9b334a45a8ff 2150 }
bogdanm 0:9b334a45a8ff 2151 else
bogdanm 0:9b334a45a8ff 2152 {
bogdanm 0:9b334a45a8ff 2153 hfmpi2c->XferSize = Size;
bogdanm 0:9b334a45a8ff 2154 }
bogdanm 0:9b334a45a8ff 2155
bogdanm 0:9b334a45a8ff 2156 /* Set the FMPI2C DMA transfer complete callback */
bogdanm 0:9b334a45a8ff 2157 hfmpi2c->hdmarx->XferCpltCallback = FMPI2C_DMAMemReceiveCplt;
bogdanm 0:9b334a45a8ff 2158
bogdanm 0:9b334a45a8ff 2159 /* Set the DMA error callback */
bogdanm 0:9b334a45a8ff 2160 hfmpi2c->hdmarx->XferErrorCallback = FMPI2C_DMAError;
bogdanm 0:9b334a45a8ff 2161
bogdanm 0:9b334a45a8ff 2162 /* Enable the DMA channel */
bogdanm 0:9b334a45a8ff 2163 HAL_DMA_Start_IT(hfmpi2c->hdmarx, (uint32_t)&hfmpi2c->Instance->RXDR, (uint32_t)pData, hfmpi2c->XferSize);
bogdanm 0:9b334a45a8ff 2164
bogdanm 0:9b334a45a8ff 2165 /* Send Slave Address and Memory Address */
bogdanm 0:9b334a45a8ff 2166 if(FMPI2C_RequestMemoryRead(hfmpi2c, DevAddress, MemAddress, MemAddSize, FMPI2C_TIMEOUT_FLAG) != HAL_OK)
bogdanm 0:9b334a45a8ff 2167 {
bogdanm 0:9b334a45a8ff 2168 if(hfmpi2c->ErrorCode == HAL_FMPI2C_ERROR_AF)
bogdanm 0:9b334a45a8ff 2169 {
bogdanm 0:9b334a45a8ff 2170 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 2171 __HAL_UNLOCK(hfmpi2c);
bogdanm 0:9b334a45a8ff 2172 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 2173 }
bogdanm 0:9b334a45a8ff 2174 else
bogdanm 0:9b334a45a8ff 2175 {
bogdanm 0:9b334a45a8ff 2176 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 2177 __HAL_UNLOCK(hfmpi2c);
bogdanm 0:9b334a45a8ff 2178 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 2179 }
bogdanm 0:9b334a45a8ff 2180 }
bogdanm 0:9b334a45a8ff 2181
bogdanm 0:9b334a45a8ff 2182 /* Set NBYTES to write and reload if size > 255 and generate RESTART */
bogdanm 0:9b334a45a8ff 2183 if( (hfmpi2c->XferSize == 255) && (hfmpi2c->XferSize < hfmpi2c->XferCount) )
bogdanm 0:9b334a45a8ff 2184 {
bogdanm 0:9b334a45a8ff 2185 FMPI2C_TransferConfig(hfmpi2c,DevAddress,hfmpi2c->XferSize, FMPI2C_RELOAD_MODE, FMPI2C_GENERATE_START_READ);
bogdanm 0:9b334a45a8ff 2186 }
bogdanm 0:9b334a45a8ff 2187 else
bogdanm 0:9b334a45a8ff 2188 {
bogdanm 0:9b334a45a8ff 2189 FMPI2C_TransferConfig(hfmpi2c,DevAddress,hfmpi2c->XferSize, FMPI2C_AUTOEND_MODE, FMPI2C_GENERATE_START_READ);
bogdanm 0:9b334a45a8ff 2190 }
bogdanm 0:9b334a45a8ff 2191
bogdanm 0:9b334a45a8ff 2192 /* Wait until RXNE flag is set */
bogdanm 0:9b334a45a8ff 2193 if(FMPI2C_WaitOnFlagUntilTimeout(hfmpi2c, FMPI2C_FLAG_RXNE, RESET, FMPI2C_TIMEOUT_RXNE) != HAL_OK)
bogdanm 0:9b334a45a8ff 2194 {
bogdanm 0:9b334a45a8ff 2195 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 2196 }
bogdanm 0:9b334a45a8ff 2197
bogdanm 0:9b334a45a8ff 2198 /* Enable DMA Request */
bogdanm 0:9b334a45a8ff 2199 hfmpi2c->Instance->CR1 |= FMPI2C_CR1_RXDMAEN;
bogdanm 0:9b334a45a8ff 2200
bogdanm 0:9b334a45a8ff 2201 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 2202 __HAL_UNLOCK(hfmpi2c);
bogdanm 0:9b334a45a8ff 2203
bogdanm 0:9b334a45a8ff 2204 return HAL_OK;
bogdanm 0:9b334a45a8ff 2205 }
bogdanm 0:9b334a45a8ff 2206 else
bogdanm 0:9b334a45a8ff 2207 {
bogdanm 0:9b334a45a8ff 2208 return HAL_BUSY;
bogdanm 0:9b334a45a8ff 2209 }
bogdanm 0:9b334a45a8ff 2210 }
bogdanm 0:9b334a45a8ff 2211
bogdanm 0:9b334a45a8ff 2212 /**
bogdanm 0:9b334a45a8ff 2213 * @brief Checks if target device is ready for communication.
bogdanm 0:9b334a45a8ff 2214 * @note This function is used with Memory devices
bogdanm 0:9b334a45a8ff 2215 * @param hfmpi2c : Pointer to a FMPI2C_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 2216 * the configuration information for the specified FMPI2C.
bogdanm 0:9b334a45a8ff 2217 * @param DevAddress: Target device address
bogdanm 0:9b334a45a8ff 2218 * @param Trials: Number of trials
bogdanm 0:9b334a45a8ff 2219 * @param Timeout: Timeout duration
bogdanm 0:9b334a45a8ff 2220 * @retval HAL status
bogdanm 0:9b334a45a8ff 2221 */
bogdanm 0:9b334a45a8ff 2222 HAL_StatusTypeDef HAL_FMPI2C_IsDeviceReady(FMPI2C_HandleTypeDef *hfmpi2c, uint16_t DevAddress, uint32_t Trials, uint32_t Timeout)
bogdanm 0:9b334a45a8ff 2223 {
bogdanm 0:9b334a45a8ff 2224 uint32_t tickstart = 0;
bogdanm 0:9b334a45a8ff 2225
bogdanm 0:9b334a45a8ff 2226 __IO uint32_t FMPI2C_Trials = 0;
bogdanm 0:9b334a45a8ff 2227
bogdanm 0:9b334a45a8ff 2228 if(hfmpi2c->State == HAL_FMPI2C_STATE_READY)
bogdanm 0:9b334a45a8ff 2229 {
bogdanm 0:9b334a45a8ff 2230 if(__HAL_FMPI2C_GET_FLAG(hfmpi2c, FMPI2C_FLAG_BUSY) == SET)
bogdanm 0:9b334a45a8ff 2231 {
bogdanm 0:9b334a45a8ff 2232 return HAL_BUSY;
bogdanm 0:9b334a45a8ff 2233 }
bogdanm 0:9b334a45a8ff 2234
bogdanm 0:9b334a45a8ff 2235 /* Process Locked */
bogdanm 0:9b334a45a8ff 2236 __HAL_LOCK(hfmpi2c);
bogdanm 0:9b334a45a8ff 2237
bogdanm 0:9b334a45a8ff 2238 hfmpi2c->State = HAL_FMPI2C_STATE_BUSY;
bogdanm 0:9b334a45a8ff 2239 hfmpi2c->ErrorCode = HAL_FMPI2C_ERROR_NONE;
bogdanm 0:9b334a45a8ff 2240
bogdanm 0:9b334a45a8ff 2241 do
bogdanm 0:9b334a45a8ff 2242 {
bogdanm 0:9b334a45a8ff 2243 /* Generate Start */
bogdanm 0:9b334a45a8ff 2244 hfmpi2c->Instance->CR2 = __HAL_FMPI2C_GENERATE_START(hfmpi2c->Init.AddressingMode,DevAddress);
bogdanm 0:9b334a45a8ff 2245
bogdanm 0:9b334a45a8ff 2246 /* No need to Check TC flag, with AUTOEND mode the stop is automatically generated */
bogdanm 0:9b334a45a8ff 2247 /* Wait until STOPF flag is set or a NACK flag is set*/
bogdanm 0:9b334a45a8ff 2248 tickstart = HAL_GetTick();
bogdanm 0:9b334a45a8ff 2249 while((__HAL_FMPI2C_GET_FLAG(hfmpi2c, FMPI2C_FLAG_STOPF) == RESET) && (__HAL_FMPI2C_GET_FLAG(hfmpi2c, FMPI2C_FLAG_AF) == RESET) && (hfmpi2c->State != HAL_FMPI2C_STATE_TIMEOUT))
bogdanm 0:9b334a45a8ff 2250 {
bogdanm 0:9b334a45a8ff 2251 if(Timeout != HAL_MAX_DELAY)
bogdanm 0:9b334a45a8ff 2252 {
bogdanm 0:9b334a45a8ff 2253 if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout))
bogdanm 0:9b334a45a8ff 2254 {
bogdanm 0:9b334a45a8ff 2255 /* Device is ready */
bogdanm 0:9b334a45a8ff 2256 hfmpi2c->State = HAL_FMPI2C_STATE_READY;
bogdanm 0:9b334a45a8ff 2257 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 2258 __HAL_UNLOCK(hfmpi2c);
bogdanm 0:9b334a45a8ff 2259 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 2260 }
bogdanm 0:9b334a45a8ff 2261 }
bogdanm 0:9b334a45a8ff 2262 }
bogdanm 0:9b334a45a8ff 2263
bogdanm 0:9b334a45a8ff 2264 /* Check if the NACKF flag has not been set */
bogdanm 0:9b334a45a8ff 2265 if (__HAL_FMPI2C_GET_FLAG(hfmpi2c, FMPI2C_FLAG_AF) == RESET)
bogdanm 0:9b334a45a8ff 2266 {
bogdanm 0:9b334a45a8ff 2267 /* Wait until STOPF flag is reset */
bogdanm 0:9b334a45a8ff 2268 if(FMPI2C_WaitOnFlagUntilTimeout(hfmpi2c, FMPI2C_FLAG_STOPF, RESET, Timeout) != HAL_OK)
bogdanm 0:9b334a45a8ff 2269 {
bogdanm 0:9b334a45a8ff 2270 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 2271 }
bogdanm 0:9b334a45a8ff 2272
bogdanm 0:9b334a45a8ff 2273 /* Clear STOP Flag */
bogdanm 0:9b334a45a8ff 2274 __HAL_FMPI2C_CLEAR_FLAG(hfmpi2c, FMPI2C_FLAG_STOPF);
bogdanm 0:9b334a45a8ff 2275
bogdanm 0:9b334a45a8ff 2276 /* Device is ready */
bogdanm 0:9b334a45a8ff 2277 hfmpi2c->State = HAL_FMPI2C_STATE_READY;
bogdanm 0:9b334a45a8ff 2278
bogdanm 0:9b334a45a8ff 2279 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 2280 __HAL_UNLOCK(hfmpi2c);
bogdanm 0:9b334a45a8ff 2281
bogdanm 0:9b334a45a8ff 2282 return HAL_OK;
bogdanm 0:9b334a45a8ff 2283 }
bogdanm 0:9b334a45a8ff 2284 else
bogdanm 0:9b334a45a8ff 2285 {
bogdanm 0:9b334a45a8ff 2286 /* Wait until STOPF flag is reset */
bogdanm 0:9b334a45a8ff 2287 if(FMPI2C_WaitOnFlagUntilTimeout(hfmpi2c, FMPI2C_FLAG_STOPF, RESET, Timeout) != HAL_OK)
bogdanm 0:9b334a45a8ff 2288 {
bogdanm 0:9b334a45a8ff 2289 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 2290 }
bogdanm 0:9b334a45a8ff 2291
bogdanm 0:9b334a45a8ff 2292 /* Clear NACK Flag */
bogdanm 0:9b334a45a8ff 2293 __HAL_FMPI2C_CLEAR_FLAG(hfmpi2c, FMPI2C_FLAG_AF);
bogdanm 0:9b334a45a8ff 2294
bogdanm 0:9b334a45a8ff 2295 /* Clear STOP Flag, auto generated with autoend*/
bogdanm 0:9b334a45a8ff 2296 __HAL_FMPI2C_CLEAR_FLAG(hfmpi2c, FMPI2C_FLAG_STOPF);
bogdanm 0:9b334a45a8ff 2297 }
bogdanm 0:9b334a45a8ff 2298
bogdanm 0:9b334a45a8ff 2299 /* Check if the maximum allowed number of trials has been reached */
bogdanm 0:9b334a45a8ff 2300 if (FMPI2C_Trials++ == Trials)
bogdanm 0:9b334a45a8ff 2301 {
bogdanm 0:9b334a45a8ff 2302 /* Generate Stop */
bogdanm 0:9b334a45a8ff 2303 hfmpi2c->Instance->CR2 |= FMPI2C_CR2_STOP;
bogdanm 0:9b334a45a8ff 2304
bogdanm 0:9b334a45a8ff 2305 /* Wait until STOPF flag is reset */
bogdanm 0:9b334a45a8ff 2306 if(FMPI2C_WaitOnFlagUntilTimeout(hfmpi2c, FMPI2C_FLAG_STOPF, RESET, Timeout) != HAL_OK)
bogdanm 0:9b334a45a8ff 2307 {
bogdanm 0:9b334a45a8ff 2308 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 2309 }
bogdanm 0:9b334a45a8ff 2310
bogdanm 0:9b334a45a8ff 2311 /* Clear STOP Flag */
bogdanm 0:9b334a45a8ff 2312 __HAL_FMPI2C_CLEAR_FLAG(hfmpi2c, FMPI2C_FLAG_STOPF);
bogdanm 0:9b334a45a8ff 2313 }
bogdanm 0:9b334a45a8ff 2314 }while(FMPI2C_Trials < Trials);
bogdanm 0:9b334a45a8ff 2315
bogdanm 0:9b334a45a8ff 2316 hfmpi2c->State = HAL_FMPI2C_STATE_READY;
bogdanm 0:9b334a45a8ff 2317
bogdanm 0:9b334a45a8ff 2318 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 2319 __HAL_UNLOCK(hfmpi2c);
bogdanm 0:9b334a45a8ff 2320
bogdanm 0:9b334a45a8ff 2321 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 2322 }
bogdanm 0:9b334a45a8ff 2323 else
bogdanm 0:9b334a45a8ff 2324 {
bogdanm 0:9b334a45a8ff 2325 return HAL_BUSY;
bogdanm 0:9b334a45a8ff 2326 }
bogdanm 0:9b334a45a8ff 2327 }
bogdanm 0:9b334a45a8ff 2328
bogdanm 0:9b334a45a8ff 2329 /**
bogdanm 0:9b334a45a8ff 2330 * @brief This function handles FMPI2C event interrupt request.
bogdanm 0:9b334a45a8ff 2331 * @param hfmpi2c : Pointer to a FMPI2C_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 2332 * the configuration information for the specified FMPI2C.
bogdanm 0:9b334a45a8ff 2333 * @retval None
bogdanm 0:9b334a45a8ff 2334 */
bogdanm 0:9b334a45a8ff 2335 void HAL_FMPI2C_EV_IRQHandler(FMPI2C_HandleTypeDef *hfmpi2c)
bogdanm 0:9b334a45a8ff 2336 {
bogdanm 0:9b334a45a8ff 2337 /* FMPI2C in mode Transmitter ---------------------------------------------------*/
bogdanm 0:9b334a45a8ff 2338 if (((__HAL_FMPI2C_GET_FLAG(hfmpi2c, FMPI2C_FLAG_TXIS) == SET) || (__HAL_FMPI2C_GET_FLAG(hfmpi2c, FMPI2C_FLAG_TCR) == SET) || (__HAL_FMPI2C_GET_FLAG(hfmpi2c, FMPI2C_FLAG_TC) == SET) || (__HAL_FMPI2C_GET_FLAG(hfmpi2c, FMPI2C_FLAG_STOPF) == SET) || (__HAL_FMPI2C_GET_FLAG(hfmpi2c, FMPI2C_FLAG_AF) == SET) || (__HAL_FMPI2C_GET_FLAG(hfmpi2c, FMPI2C_FLAG_ADDR) == SET)) && (__HAL_FMPI2C_GET_IT_SOURCE(hfmpi2c, (FMPI2C_IT_TCI | FMPI2C_IT_STOPI | FMPI2C_IT_NACKI | FMPI2C_IT_TXI | FMPI2C_IT_ADDRI)) == SET))
bogdanm 0:9b334a45a8ff 2339 {
bogdanm 0:9b334a45a8ff 2340 /* Slave mode selected */
bogdanm 0:9b334a45a8ff 2341 if (hfmpi2c->State == HAL_FMPI2C_STATE_SLAVE_BUSY_TX)
bogdanm 0:9b334a45a8ff 2342 {
bogdanm 0:9b334a45a8ff 2343 FMPI2C_SlaveTransmit_ISR(hfmpi2c);
bogdanm 0:9b334a45a8ff 2344 }
bogdanm 0:9b334a45a8ff 2345 }
bogdanm 0:9b334a45a8ff 2346
bogdanm 0:9b334a45a8ff 2347 if (((__HAL_FMPI2C_GET_FLAG(hfmpi2c, FMPI2C_FLAG_TXIS) == SET) || (__HAL_FMPI2C_GET_FLAG(hfmpi2c, FMPI2C_FLAG_TCR) == SET) || (__HAL_FMPI2C_GET_FLAG(hfmpi2c, FMPI2C_FLAG_TC) == SET) || (__HAL_FMPI2C_GET_FLAG(hfmpi2c, FMPI2C_FLAG_STOPF) == SET) || (__HAL_FMPI2C_GET_FLAG(hfmpi2c, FMPI2C_FLAG_AF) == SET)) && (__HAL_FMPI2C_GET_IT_SOURCE(hfmpi2c, (FMPI2C_IT_TCI | FMPI2C_IT_STOPI | FMPI2C_IT_NACKI | FMPI2C_IT_TXI)) == SET))
bogdanm 0:9b334a45a8ff 2348 {
bogdanm 0:9b334a45a8ff 2349 /* Master mode selected */
bogdanm 0:9b334a45a8ff 2350 if ((hfmpi2c->State == HAL_FMPI2C_STATE_MASTER_BUSY_TX) || (hfmpi2c->State == HAL_FMPI2C_STATE_MEM_BUSY_TX))
bogdanm 0:9b334a45a8ff 2351 {
bogdanm 0:9b334a45a8ff 2352 FMPI2C_MasterTransmit_ISR(hfmpi2c);
bogdanm 0:9b334a45a8ff 2353 }
bogdanm 0:9b334a45a8ff 2354 }
bogdanm 0:9b334a45a8ff 2355
bogdanm 0:9b334a45a8ff 2356 /* FMPI2C in mode Receiver ----------------------------------------------------*/
bogdanm 0:9b334a45a8ff 2357 if (((__HAL_FMPI2C_GET_FLAG(hfmpi2c, FMPI2C_FLAG_RXNE) == SET) || (__HAL_FMPI2C_GET_FLAG(hfmpi2c, FMPI2C_FLAG_TCR) == SET) || (__HAL_FMPI2C_GET_FLAG(hfmpi2c, FMPI2C_FLAG_TC) == SET) || (__HAL_FMPI2C_GET_FLAG(hfmpi2c, FMPI2C_FLAG_STOPF) == SET) || (__HAL_FMPI2C_GET_FLAG(hfmpi2c, FMPI2C_FLAG_AF) == SET) || (__HAL_FMPI2C_GET_FLAG(hfmpi2c, FMPI2C_FLAG_ADDR) == SET)) && (__HAL_FMPI2C_GET_IT_SOURCE(hfmpi2c, (FMPI2C_IT_TCI| FMPI2C_IT_STOPI| FMPI2C_IT_NACKI | FMPI2C_IT_RXI | FMPI2C_IT_ADDRI)) == SET))
bogdanm 0:9b334a45a8ff 2358 {
bogdanm 0:9b334a45a8ff 2359 /* Slave mode selected */
bogdanm 0:9b334a45a8ff 2360 if (hfmpi2c->State == HAL_FMPI2C_STATE_SLAVE_BUSY_RX)
bogdanm 0:9b334a45a8ff 2361 {
bogdanm 0:9b334a45a8ff 2362 FMPI2C_SlaveReceive_ISR(hfmpi2c);
bogdanm 0:9b334a45a8ff 2363 }
bogdanm 0:9b334a45a8ff 2364 }
bogdanm 0:9b334a45a8ff 2365 if (((__HAL_FMPI2C_GET_FLAG(hfmpi2c, FMPI2C_FLAG_RXNE) == SET) || (__HAL_FMPI2C_GET_FLAG(hfmpi2c, FMPI2C_FLAG_TCR) == SET) || (__HAL_FMPI2C_GET_FLAG(hfmpi2c, FMPI2C_FLAG_TC) == SET) || (__HAL_FMPI2C_GET_FLAG(hfmpi2c, FMPI2C_FLAG_STOPF) == SET) || (__HAL_FMPI2C_GET_FLAG(hfmpi2c, FMPI2C_FLAG_AF) == SET)) && (__HAL_FMPI2C_GET_IT_SOURCE(hfmpi2c, (FMPI2C_IT_TCI| FMPI2C_IT_STOPI| FMPI2C_IT_NACKI | FMPI2C_IT_RXI)) == SET))
bogdanm 0:9b334a45a8ff 2366 {
bogdanm 0:9b334a45a8ff 2367 /* Master mode selected */
bogdanm 0:9b334a45a8ff 2368 if ((hfmpi2c->State == HAL_FMPI2C_STATE_MASTER_BUSY_RX) || (hfmpi2c->State == HAL_FMPI2C_STATE_MEM_BUSY_RX))
bogdanm 0:9b334a45a8ff 2369 {
bogdanm 0:9b334a45a8ff 2370 FMPI2C_MasterReceive_ISR(hfmpi2c);
bogdanm 0:9b334a45a8ff 2371 }
bogdanm 0:9b334a45a8ff 2372 }
bogdanm 0:9b334a45a8ff 2373 }
bogdanm 0:9b334a45a8ff 2374
bogdanm 0:9b334a45a8ff 2375 /**
bogdanm 0:9b334a45a8ff 2376 * @brief This function handles FMPI2C error interrupt request.
bogdanm 0:9b334a45a8ff 2377 * @param hfmpi2c : Pointer to a FMPI2C_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 2378 * the configuration information for the specified FMPI2C.
bogdanm 0:9b334a45a8ff 2379 * @retval None
bogdanm 0:9b334a45a8ff 2380 */
bogdanm 0:9b334a45a8ff 2381 void HAL_FMPI2C_ER_IRQHandler(FMPI2C_HandleTypeDef *hfmpi2c)
bogdanm 0:9b334a45a8ff 2382 {
bogdanm 0:9b334a45a8ff 2383 /* FMPI2C Bus error interrupt occurred ------------------------------------*/
bogdanm 0:9b334a45a8ff 2384 if((__HAL_FMPI2C_GET_FLAG(hfmpi2c, FMPI2C_FLAG_BERR) == SET) && (__HAL_FMPI2C_GET_IT_SOURCE(hfmpi2c, FMPI2C_IT_ERRI) == SET))
bogdanm 0:9b334a45a8ff 2385 {
bogdanm 0:9b334a45a8ff 2386 hfmpi2c->ErrorCode |= HAL_FMPI2C_ERROR_BERR;
bogdanm 0:9b334a45a8ff 2387
bogdanm 0:9b334a45a8ff 2388 /* Clear BERR flag */
bogdanm 0:9b334a45a8ff 2389 __HAL_FMPI2C_CLEAR_FLAG(hfmpi2c, FMPI2C_FLAG_BERR);
bogdanm 0:9b334a45a8ff 2390 }
bogdanm 0:9b334a45a8ff 2391
bogdanm 0:9b334a45a8ff 2392 /* FMPI2C Over-Run/Under-Run interrupt occurred ----------------------------------------*/
bogdanm 0:9b334a45a8ff 2393 if((__HAL_FMPI2C_GET_FLAG(hfmpi2c, FMPI2C_FLAG_OVR) == SET) && (__HAL_FMPI2C_GET_IT_SOURCE(hfmpi2c, FMPI2C_IT_ERRI) == SET))
bogdanm 0:9b334a45a8ff 2394 {
bogdanm 0:9b334a45a8ff 2395 hfmpi2c->ErrorCode |= HAL_FMPI2C_ERROR_OVR;
bogdanm 0:9b334a45a8ff 2396
bogdanm 0:9b334a45a8ff 2397 /* Clear OVR flag */
bogdanm 0:9b334a45a8ff 2398 __HAL_FMPI2C_CLEAR_FLAG(hfmpi2c, FMPI2C_FLAG_OVR);
bogdanm 0:9b334a45a8ff 2399 }
bogdanm 0:9b334a45a8ff 2400
bogdanm 0:9b334a45a8ff 2401 /* FMPI2C Arbitration Loss error interrupt occurred -------------------------------------*/
bogdanm 0:9b334a45a8ff 2402 if((__HAL_FMPI2C_GET_FLAG(hfmpi2c, FMPI2C_FLAG_ARLO) == SET) && (__HAL_FMPI2C_GET_IT_SOURCE(hfmpi2c, FMPI2C_IT_ERRI) == SET))
bogdanm 0:9b334a45a8ff 2403 {
bogdanm 0:9b334a45a8ff 2404 hfmpi2c->ErrorCode |= HAL_FMPI2C_ERROR_ARLO;
bogdanm 0:9b334a45a8ff 2405
bogdanm 0:9b334a45a8ff 2406 /* Clear ARLO flag */
bogdanm 0:9b334a45a8ff 2407 __HAL_FMPI2C_CLEAR_FLAG(hfmpi2c, FMPI2C_FLAG_ARLO);
bogdanm 0:9b334a45a8ff 2408 }
bogdanm 0:9b334a45a8ff 2409
bogdanm 0:9b334a45a8ff 2410 /* Call the Error Callback in case of Error detected */
bogdanm 0:9b334a45a8ff 2411 if(hfmpi2c->ErrorCode != HAL_FMPI2C_ERROR_NONE)
bogdanm 0:9b334a45a8ff 2412 {
bogdanm 0:9b334a45a8ff 2413 hfmpi2c->State = HAL_FMPI2C_STATE_READY;
bogdanm 0:9b334a45a8ff 2414
bogdanm 0:9b334a45a8ff 2415 HAL_FMPI2C_ErrorCallback(hfmpi2c);
bogdanm 0:9b334a45a8ff 2416 }
bogdanm 0:9b334a45a8ff 2417 }
bogdanm 0:9b334a45a8ff 2418
bogdanm 0:9b334a45a8ff 2419 /**
bogdanm 0:9b334a45a8ff 2420 * @brief Master Tx Transfer completed callbacks.
bogdanm 0:9b334a45a8ff 2421 * @param hfmpi2c : Pointer to a FMPI2C_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 2422 * the configuration information for the specified FMPI2C.
bogdanm 0:9b334a45a8ff 2423 * @retval None
bogdanm 0:9b334a45a8ff 2424 */
bogdanm 0:9b334a45a8ff 2425 __weak void HAL_FMPI2C_MasterTxCpltCallback(FMPI2C_HandleTypeDef *hfmpi2c)
bogdanm 0:9b334a45a8ff 2426 {
bogdanm 0:9b334a45a8ff 2427 /* NOTE : This function Should not be modified, when the callback is needed,
bogdanm 0:9b334a45a8ff 2428 the HAL_FMPI2C_TxCpltCallback could be implemented in the user file
bogdanm 0:9b334a45a8ff 2429 */
bogdanm 0:9b334a45a8ff 2430 }
bogdanm 0:9b334a45a8ff 2431
bogdanm 0:9b334a45a8ff 2432 /**
bogdanm 0:9b334a45a8ff 2433 * @brief Master Rx Transfer completed callbacks.
bogdanm 0:9b334a45a8ff 2434 * @param hfmpi2c : Pointer to a FMPI2C_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 2435 * the configuration information for the specified FMPI2C.
bogdanm 0:9b334a45a8ff 2436 * @retval None
bogdanm 0:9b334a45a8ff 2437 */
bogdanm 0:9b334a45a8ff 2438 __weak void HAL_FMPI2C_MasterRxCpltCallback(FMPI2C_HandleTypeDef *hfmpi2c)
bogdanm 0:9b334a45a8ff 2439 {
bogdanm 0:9b334a45a8ff 2440 /* NOTE : This function Should not be modified, when the callback is needed,
bogdanm 0:9b334a45a8ff 2441 the HAL_FMPI2C_TxCpltCallback could be implemented in the user file
bogdanm 0:9b334a45a8ff 2442 */
bogdanm 0:9b334a45a8ff 2443 }
bogdanm 0:9b334a45a8ff 2444
bogdanm 0:9b334a45a8ff 2445 /** @brief Slave Tx Transfer completed callbacks.
bogdanm 0:9b334a45a8ff 2446 * @param hfmpi2c : Pointer to a FMPI2C_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 2447 * the configuration information for the specified FMPI2C.
bogdanm 0:9b334a45a8ff 2448 * @retval None
bogdanm 0:9b334a45a8ff 2449 */
bogdanm 0:9b334a45a8ff 2450 __weak void HAL_FMPI2C_SlaveTxCpltCallback(FMPI2C_HandleTypeDef *hfmpi2c)
bogdanm 0:9b334a45a8ff 2451 {
bogdanm 0:9b334a45a8ff 2452 /* NOTE : This function Should not be modified, when the callback is needed,
bogdanm 0:9b334a45a8ff 2453 the HAL_FMPI2C_TxCpltCallback could be implemented in the user file
bogdanm 0:9b334a45a8ff 2454 */
bogdanm 0:9b334a45a8ff 2455 }
bogdanm 0:9b334a45a8ff 2456
bogdanm 0:9b334a45a8ff 2457 /**
bogdanm 0:9b334a45a8ff 2458 * @brief Slave Rx Transfer completed callbacks.
bogdanm 0:9b334a45a8ff 2459 * @param hfmpi2c : Pointer to a FMPI2C_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 2460 * the configuration information for the specified FMPI2C.
bogdanm 0:9b334a45a8ff 2461 * @retval None
bogdanm 0:9b334a45a8ff 2462 */
bogdanm 0:9b334a45a8ff 2463 __weak void HAL_FMPI2C_SlaveRxCpltCallback(FMPI2C_HandleTypeDef *hfmpi2c)
bogdanm 0:9b334a45a8ff 2464 {
bogdanm 0:9b334a45a8ff 2465 /* NOTE : This function Should not be modified, when the callback is needed,
bogdanm 0:9b334a45a8ff 2466 the HAL_FMPI2C_TxCpltCallback could be implemented in the user file
bogdanm 0:9b334a45a8ff 2467 */
bogdanm 0:9b334a45a8ff 2468 }
bogdanm 0:9b334a45a8ff 2469
bogdanm 0:9b334a45a8ff 2470 /**
bogdanm 0:9b334a45a8ff 2471 * @brief Memory Tx Transfer completed callbacks.
bogdanm 0:9b334a45a8ff 2472 * @param hfmpi2c : Pointer to a FMPI2C_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 2473 * the configuration information for the specified FMPI2C.
bogdanm 0:9b334a45a8ff 2474 * @retval None
bogdanm 0:9b334a45a8ff 2475 */
bogdanm 0:9b334a45a8ff 2476 __weak void HAL_FMPI2C_MemTxCpltCallback(FMPI2C_HandleTypeDef *hfmpi2c)
bogdanm 0:9b334a45a8ff 2477 {
bogdanm 0:9b334a45a8ff 2478 /* NOTE : This function Should not be modified, when the callback is needed,
bogdanm 0:9b334a45a8ff 2479 the HAL_FMPI2C_TxCpltCallback could be implemented in the user file
bogdanm 0:9b334a45a8ff 2480 */
bogdanm 0:9b334a45a8ff 2481 }
bogdanm 0:9b334a45a8ff 2482
bogdanm 0:9b334a45a8ff 2483 /**
bogdanm 0:9b334a45a8ff 2484 * @brief Memory Rx Transfer completed callbacks.
bogdanm 0:9b334a45a8ff 2485 * @param hfmpi2c : Pointer to a FMPI2C_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 2486 * the configuration information for the specified FMPI2C.
bogdanm 0:9b334a45a8ff 2487 * @retval None
bogdanm 0:9b334a45a8ff 2488 */
bogdanm 0:9b334a45a8ff 2489 __weak void HAL_FMPI2C_MemRxCpltCallback(FMPI2C_HandleTypeDef *hfmpi2c)
bogdanm 0:9b334a45a8ff 2490 {
bogdanm 0:9b334a45a8ff 2491 /* NOTE : This function Should not be modified, when the callback is needed,
bogdanm 0:9b334a45a8ff 2492 the HAL_FMPI2C_TxCpltCallback could be implemented in the user file
bogdanm 0:9b334a45a8ff 2493 */
bogdanm 0:9b334a45a8ff 2494 }
bogdanm 0:9b334a45a8ff 2495
bogdanm 0:9b334a45a8ff 2496 /**
bogdanm 0:9b334a45a8ff 2497 * @brief FMPI2C error callbacks.
bogdanm 0:9b334a45a8ff 2498 * @param hfmpi2c : Pointer to a FMPI2C_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 2499 * the configuration information for the specified FMPI2C.
bogdanm 0:9b334a45a8ff 2500 * @retval None
bogdanm 0:9b334a45a8ff 2501 */
bogdanm 0:9b334a45a8ff 2502 __weak void HAL_FMPI2C_ErrorCallback(FMPI2C_HandleTypeDef *hfmpi2c)
bogdanm 0:9b334a45a8ff 2503 {
bogdanm 0:9b334a45a8ff 2504 /* NOTE : This function Should not be modified, when the callback is needed,
bogdanm 0:9b334a45a8ff 2505 the HAL_FMPI2C_ErrorCallback could be implemented in the user file
bogdanm 0:9b334a45a8ff 2506 */
bogdanm 0:9b334a45a8ff 2507 }
bogdanm 0:9b334a45a8ff 2508
bogdanm 0:9b334a45a8ff 2509 /**
bogdanm 0:9b334a45a8ff 2510 * @}
bogdanm 0:9b334a45a8ff 2511 */
bogdanm 0:9b334a45a8ff 2512
bogdanm 0:9b334a45a8ff 2513 /** @defgroup FMPI2C_Exported_Functions_Group3 Peripheral State and Errors functions
bogdanm 0:9b334a45a8ff 2514 * @brief Peripheral State and Errors functions
bogdanm 0:9b334a45a8ff 2515 *
bogdanm 0:9b334a45a8ff 2516 @verbatim
bogdanm 0:9b334a45a8ff 2517 ===============================================================================
bogdanm 0:9b334a45a8ff 2518 ##### Peripheral State and Errors functions #####
bogdanm 0:9b334a45a8ff 2519 ===============================================================================
bogdanm 0:9b334a45a8ff 2520 [..]
bogdanm 0:9b334a45a8ff 2521 This subsection permit to get in run-time the status of the peripheral
bogdanm 0:9b334a45a8ff 2522 and the data flow.
bogdanm 0:9b334a45a8ff 2523
bogdanm 0:9b334a45a8ff 2524 @endverbatim
bogdanm 0:9b334a45a8ff 2525 * @{
bogdanm 0:9b334a45a8ff 2526 */
bogdanm 0:9b334a45a8ff 2527
bogdanm 0:9b334a45a8ff 2528 /**
bogdanm 0:9b334a45a8ff 2529 * @brief Returns the FMPI2C state.
bogdanm 0:9b334a45a8ff 2530 * @param hfmpi2c : FMPI2C handle
bogdanm 0:9b334a45a8ff 2531 * @retval HAL state
bogdanm 0:9b334a45a8ff 2532 */
bogdanm 0:9b334a45a8ff 2533 HAL_FMPI2C_StateTypeDef HAL_FMPI2C_GetState(FMPI2C_HandleTypeDef *hfmpi2c)
bogdanm 0:9b334a45a8ff 2534 {
bogdanm 0:9b334a45a8ff 2535 return hfmpi2c->State;
bogdanm 0:9b334a45a8ff 2536 }
bogdanm 0:9b334a45a8ff 2537
bogdanm 0:9b334a45a8ff 2538 /**
bogdanm 0:9b334a45a8ff 2539 * @brief Return the FMPI2C error code
bogdanm 0:9b334a45a8ff 2540 * @param hfmpi2c : pointer to a FMPI2C_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 2541 * the configuration information for the specified FMPI2C.
bogdanm 0:9b334a45a8ff 2542 * @retval FMPI2C Error Code
bogdanm 0:9b334a45a8ff 2543 */
bogdanm 0:9b334a45a8ff 2544 uint32_t HAL_FMPI2C_GetError(FMPI2C_HandleTypeDef *hfmpi2c)
bogdanm 0:9b334a45a8ff 2545 {
bogdanm 0:9b334a45a8ff 2546 return hfmpi2c->ErrorCode;
bogdanm 0:9b334a45a8ff 2547 }
bogdanm 0:9b334a45a8ff 2548
bogdanm 0:9b334a45a8ff 2549 /**
bogdanm 0:9b334a45a8ff 2550 * @}
bogdanm 0:9b334a45a8ff 2551 */
bogdanm 0:9b334a45a8ff 2552
bogdanm 0:9b334a45a8ff 2553 /**
bogdanm 0:9b334a45a8ff 2554 * @brief Handle Interrupt Flags Master Transmit Mode
bogdanm 0:9b334a45a8ff 2555 * @param hfmpi2c : Pointer to a FMPI2C_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 2556 * the configuration information for the specified FMPI2C.
bogdanm 0:9b334a45a8ff 2557 * @retval HAL status
bogdanm 0:9b334a45a8ff 2558 */
bogdanm 0:9b334a45a8ff 2559 static HAL_StatusTypeDef FMPI2C_MasterTransmit_ISR(FMPI2C_HandleTypeDef *hfmpi2c)
bogdanm 0:9b334a45a8ff 2560 {
bogdanm 0:9b334a45a8ff 2561 uint16_t DevAddress;
bogdanm 0:9b334a45a8ff 2562
bogdanm 0:9b334a45a8ff 2563 /* Process Locked */
bogdanm 0:9b334a45a8ff 2564 __HAL_LOCK(hfmpi2c);
bogdanm 0:9b334a45a8ff 2565
bogdanm 0:9b334a45a8ff 2566 if(__HAL_FMPI2C_GET_FLAG(hfmpi2c, FMPI2C_FLAG_TXIS) == SET)
bogdanm 0:9b334a45a8ff 2567 {
bogdanm 0:9b334a45a8ff 2568 /* Write data to TXDR */
bogdanm 0:9b334a45a8ff 2569 hfmpi2c->Instance->TXDR = (*hfmpi2c->pBuffPtr++);
bogdanm 0:9b334a45a8ff 2570 hfmpi2c->XferSize--;
bogdanm 0:9b334a45a8ff 2571 hfmpi2c->XferCount--;
bogdanm 0:9b334a45a8ff 2572 }
bogdanm 0:9b334a45a8ff 2573 else if(__HAL_FMPI2C_GET_FLAG(hfmpi2c, FMPI2C_FLAG_TCR) == SET)
bogdanm 0:9b334a45a8ff 2574 {
bogdanm 0:9b334a45a8ff 2575 if((hfmpi2c->XferSize == 0)&&(hfmpi2c->XferCount!=0))
bogdanm 0:9b334a45a8ff 2576 {
bogdanm 0:9b334a45a8ff 2577 DevAddress = (hfmpi2c->Instance->CR2 & FMPI2C_CR2_SADD);
bogdanm 0:9b334a45a8ff 2578
bogdanm 0:9b334a45a8ff 2579 if(hfmpi2c->XferCount > 255)
bogdanm 0:9b334a45a8ff 2580 {
bogdanm 0:9b334a45a8ff 2581 FMPI2C_TransferConfig(hfmpi2c,DevAddress,255, FMPI2C_RELOAD_MODE, FMPI2C_NO_STARTSTOP);
bogdanm 0:9b334a45a8ff 2582 hfmpi2c->XferSize = 255;
bogdanm 0:9b334a45a8ff 2583 }
bogdanm 0:9b334a45a8ff 2584 else
bogdanm 0:9b334a45a8ff 2585 {
bogdanm 0:9b334a45a8ff 2586 FMPI2C_TransferConfig(hfmpi2c,DevAddress,hfmpi2c->XferCount, FMPI2C_AUTOEND_MODE, FMPI2C_NO_STARTSTOP);
bogdanm 0:9b334a45a8ff 2587 hfmpi2c->XferSize = hfmpi2c->XferCount;
bogdanm 0:9b334a45a8ff 2588 }
bogdanm 0:9b334a45a8ff 2589 }
bogdanm 0:9b334a45a8ff 2590 else
bogdanm 0:9b334a45a8ff 2591 {
bogdanm 0:9b334a45a8ff 2592 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 2593 __HAL_UNLOCK(hfmpi2c);
bogdanm 0:9b334a45a8ff 2594
bogdanm 0:9b334a45a8ff 2595 /* Wrong size Status regarding TCR flag event */
bogdanm 0:9b334a45a8ff 2596 hfmpi2c->ErrorCode |= HAL_FMPI2C_ERROR_SIZE;
bogdanm 0:9b334a45a8ff 2597 HAL_FMPI2C_ErrorCallback(hfmpi2c);
bogdanm 0:9b334a45a8ff 2598 }
bogdanm 0:9b334a45a8ff 2599 }
bogdanm 0:9b334a45a8ff 2600 else if(__HAL_FMPI2C_GET_FLAG(hfmpi2c, FMPI2C_FLAG_TC) == SET)
bogdanm 0:9b334a45a8ff 2601 {
bogdanm 0:9b334a45a8ff 2602 if(hfmpi2c->XferCount == 0)
bogdanm 0:9b334a45a8ff 2603 {
bogdanm 0:9b334a45a8ff 2604 /* Generate Stop */
bogdanm 0:9b334a45a8ff 2605 hfmpi2c->Instance->CR2 |= FMPI2C_CR2_STOP;
bogdanm 0:9b334a45a8ff 2606 }
bogdanm 0:9b334a45a8ff 2607 else
bogdanm 0:9b334a45a8ff 2608 {
bogdanm 0:9b334a45a8ff 2609 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 2610 __HAL_UNLOCK(hfmpi2c);
bogdanm 0:9b334a45a8ff 2611
bogdanm 0:9b334a45a8ff 2612 /* Wrong size Status regarding TCR flag event */
bogdanm 0:9b334a45a8ff 2613 hfmpi2c->ErrorCode |= HAL_FMPI2C_ERROR_SIZE;
bogdanm 0:9b334a45a8ff 2614 HAL_FMPI2C_ErrorCallback(hfmpi2c);
bogdanm 0:9b334a45a8ff 2615 }
bogdanm 0:9b334a45a8ff 2616 }
bogdanm 0:9b334a45a8ff 2617 else if(__HAL_FMPI2C_GET_FLAG(hfmpi2c, FMPI2C_FLAG_STOPF) == SET)
bogdanm 0:9b334a45a8ff 2618 {
bogdanm 0:9b334a45a8ff 2619 /* Disable ERR, TC, STOP, NACK, TXI interrupt */
bogdanm 0:9b334a45a8ff 2620 __HAL_FMPI2C_DISABLE_IT(hfmpi2c,FMPI2C_IT_ERRI | FMPI2C_IT_TCI| FMPI2C_IT_STOPI| FMPI2C_IT_NACKI | FMPI2C_IT_TXI );
bogdanm 0:9b334a45a8ff 2621
bogdanm 0:9b334a45a8ff 2622 /* Clear STOP Flag */
bogdanm 0:9b334a45a8ff 2623 __HAL_FMPI2C_CLEAR_FLAG(hfmpi2c, FMPI2C_FLAG_STOPF);
bogdanm 0:9b334a45a8ff 2624
bogdanm 0:9b334a45a8ff 2625 /* Clear Configuration Register 2 */
bogdanm 0:9b334a45a8ff 2626 __HAL_FMPI2C_RESET_CR2(hfmpi2c);
bogdanm 0:9b334a45a8ff 2627
bogdanm 0:9b334a45a8ff 2628 hfmpi2c->State = HAL_FMPI2C_STATE_READY;
bogdanm 0:9b334a45a8ff 2629
bogdanm 0:9b334a45a8ff 2630 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 2631 __HAL_UNLOCK(hfmpi2c);
bogdanm 0:9b334a45a8ff 2632
bogdanm 0:9b334a45a8ff 2633 if(hfmpi2c->State == HAL_FMPI2C_STATE_MEM_BUSY_TX)
bogdanm 0:9b334a45a8ff 2634 {
bogdanm 0:9b334a45a8ff 2635 HAL_FMPI2C_MemTxCpltCallback(hfmpi2c);
bogdanm 0:9b334a45a8ff 2636 }
bogdanm 0:9b334a45a8ff 2637 else
bogdanm 0:9b334a45a8ff 2638 {
bogdanm 0:9b334a45a8ff 2639 HAL_FMPI2C_MasterTxCpltCallback(hfmpi2c);
bogdanm 0:9b334a45a8ff 2640 }
bogdanm 0:9b334a45a8ff 2641 }
bogdanm 0:9b334a45a8ff 2642 else if(__HAL_FMPI2C_GET_FLAG(hfmpi2c, FMPI2C_FLAG_AF) == SET)
bogdanm 0:9b334a45a8ff 2643 {
bogdanm 0:9b334a45a8ff 2644 /* Clear NACK Flag */
bogdanm 0:9b334a45a8ff 2645 __HAL_FMPI2C_CLEAR_FLAG(hfmpi2c, FMPI2C_FLAG_AF);
bogdanm 0:9b334a45a8ff 2646
bogdanm 0:9b334a45a8ff 2647 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 2648 __HAL_UNLOCK(hfmpi2c);
bogdanm 0:9b334a45a8ff 2649
bogdanm 0:9b334a45a8ff 2650 hfmpi2c->ErrorCode |= HAL_FMPI2C_ERROR_AF;
bogdanm 0:9b334a45a8ff 2651 HAL_FMPI2C_ErrorCallback(hfmpi2c);
bogdanm 0:9b334a45a8ff 2652 }
bogdanm 0:9b334a45a8ff 2653
bogdanm 0:9b334a45a8ff 2654 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 2655 __HAL_UNLOCK(hfmpi2c);
bogdanm 0:9b334a45a8ff 2656
bogdanm 0:9b334a45a8ff 2657 return HAL_OK;
bogdanm 0:9b334a45a8ff 2658 }
bogdanm 0:9b334a45a8ff 2659
bogdanm 0:9b334a45a8ff 2660 /**
bogdanm 0:9b334a45a8ff 2661 * @brief Handle Interrupt Flags Master Receive Mode
bogdanm 0:9b334a45a8ff 2662 * @param hfmpi2c : Pointer to a FMPI2C_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 2663 * the configuration information for the specified FMPI2C.
bogdanm 0:9b334a45a8ff 2664 * @retval HAL status
bogdanm 0:9b334a45a8ff 2665 */
bogdanm 0:9b334a45a8ff 2666 static HAL_StatusTypeDef FMPI2C_MasterReceive_ISR(FMPI2C_HandleTypeDef *hfmpi2c)
bogdanm 0:9b334a45a8ff 2667 {
bogdanm 0:9b334a45a8ff 2668 uint16_t DevAddress;
bogdanm 0:9b334a45a8ff 2669
bogdanm 0:9b334a45a8ff 2670 /* Process Locked */
bogdanm 0:9b334a45a8ff 2671 __HAL_LOCK(hfmpi2c);
bogdanm 0:9b334a45a8ff 2672
bogdanm 0:9b334a45a8ff 2673 if(__HAL_FMPI2C_GET_FLAG(hfmpi2c, FMPI2C_FLAG_RXNE) == SET)
bogdanm 0:9b334a45a8ff 2674 {
bogdanm 0:9b334a45a8ff 2675 /* Read data from RXDR */
bogdanm 0:9b334a45a8ff 2676 (*hfmpi2c->pBuffPtr++) = hfmpi2c->Instance->RXDR;
bogdanm 0:9b334a45a8ff 2677 hfmpi2c->XferSize--;
bogdanm 0:9b334a45a8ff 2678 hfmpi2c->XferCount--;
bogdanm 0:9b334a45a8ff 2679 }
bogdanm 0:9b334a45a8ff 2680 else if(__HAL_FMPI2C_GET_FLAG(hfmpi2c, FMPI2C_FLAG_TCR) == SET)
bogdanm 0:9b334a45a8ff 2681 {
bogdanm 0:9b334a45a8ff 2682 if((hfmpi2c->XferSize == 0)&&(hfmpi2c->XferCount!=0))
bogdanm 0:9b334a45a8ff 2683 {
bogdanm 0:9b334a45a8ff 2684 DevAddress = (hfmpi2c->Instance->CR2 & FMPI2C_CR2_SADD);
bogdanm 0:9b334a45a8ff 2685
bogdanm 0:9b334a45a8ff 2686 if(hfmpi2c->XferCount > 255)
bogdanm 0:9b334a45a8ff 2687 {
bogdanm 0:9b334a45a8ff 2688 FMPI2C_TransferConfig(hfmpi2c,DevAddress,255, FMPI2C_RELOAD_MODE, FMPI2C_NO_STARTSTOP);
bogdanm 0:9b334a45a8ff 2689 hfmpi2c->XferSize = 255;
bogdanm 0:9b334a45a8ff 2690 }
bogdanm 0:9b334a45a8ff 2691 else
bogdanm 0:9b334a45a8ff 2692 {
bogdanm 0:9b334a45a8ff 2693 FMPI2C_TransferConfig(hfmpi2c,DevAddress,hfmpi2c->XferCount, FMPI2C_AUTOEND_MODE, FMPI2C_NO_STARTSTOP);
bogdanm 0:9b334a45a8ff 2694 hfmpi2c->XferSize = hfmpi2c->XferCount;
bogdanm 0:9b334a45a8ff 2695 }
bogdanm 0:9b334a45a8ff 2696 }
bogdanm 0:9b334a45a8ff 2697 else
bogdanm 0:9b334a45a8ff 2698 {
bogdanm 0:9b334a45a8ff 2699 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 2700 __HAL_UNLOCK(hfmpi2c);
bogdanm 0:9b334a45a8ff 2701
bogdanm 0:9b334a45a8ff 2702 /* Wrong size Status regarding TCR flag event */
bogdanm 0:9b334a45a8ff 2703 hfmpi2c->ErrorCode |= HAL_FMPI2C_ERROR_SIZE;
bogdanm 0:9b334a45a8ff 2704 HAL_FMPI2C_ErrorCallback(hfmpi2c);
bogdanm 0:9b334a45a8ff 2705 }
bogdanm 0:9b334a45a8ff 2706 }
bogdanm 0:9b334a45a8ff 2707 else if(__HAL_FMPI2C_GET_FLAG(hfmpi2c, FMPI2C_FLAG_TC) == SET)
bogdanm 0:9b334a45a8ff 2708 {
bogdanm 0:9b334a45a8ff 2709 if(hfmpi2c->XferCount == 0)
bogdanm 0:9b334a45a8ff 2710 {
bogdanm 0:9b334a45a8ff 2711 /* Generate Stop */
bogdanm 0:9b334a45a8ff 2712 hfmpi2c->Instance->CR2 |= FMPI2C_CR2_STOP;
bogdanm 0:9b334a45a8ff 2713 }
bogdanm 0:9b334a45a8ff 2714 else
bogdanm 0:9b334a45a8ff 2715 {
bogdanm 0:9b334a45a8ff 2716 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 2717 __HAL_UNLOCK(hfmpi2c);
bogdanm 0:9b334a45a8ff 2718
bogdanm 0:9b334a45a8ff 2719 /* Wrong size Status regarding TCR flag event */
bogdanm 0:9b334a45a8ff 2720 hfmpi2c->ErrorCode |= HAL_FMPI2C_ERROR_SIZE;
bogdanm 0:9b334a45a8ff 2721 HAL_FMPI2C_ErrorCallback(hfmpi2c);
bogdanm 0:9b334a45a8ff 2722 }
bogdanm 0:9b334a45a8ff 2723 }
bogdanm 0:9b334a45a8ff 2724 else if(__HAL_FMPI2C_GET_FLAG(hfmpi2c, FMPI2C_FLAG_STOPF) == SET)
bogdanm 0:9b334a45a8ff 2725 {
bogdanm 0:9b334a45a8ff 2726 /* Disable ERR, TC, STOP, NACK, TXI interrupt */
bogdanm 0:9b334a45a8ff 2727 __HAL_FMPI2C_DISABLE_IT(hfmpi2c,FMPI2C_IT_ERRI | FMPI2C_IT_TCI| FMPI2C_IT_STOPI| FMPI2C_IT_NACKI | FMPI2C_IT_RXI );
bogdanm 0:9b334a45a8ff 2728
bogdanm 0:9b334a45a8ff 2729 /* Clear STOP Flag */
bogdanm 0:9b334a45a8ff 2730 __HAL_FMPI2C_CLEAR_FLAG(hfmpi2c, FMPI2C_FLAG_STOPF);
bogdanm 0:9b334a45a8ff 2731
bogdanm 0:9b334a45a8ff 2732 /* Clear Configuration Register 2 */
bogdanm 0:9b334a45a8ff 2733 __HAL_FMPI2C_RESET_CR2(hfmpi2c);
bogdanm 0:9b334a45a8ff 2734
bogdanm 0:9b334a45a8ff 2735 hfmpi2c->State = HAL_FMPI2C_STATE_READY;
bogdanm 0:9b334a45a8ff 2736
bogdanm 0:9b334a45a8ff 2737 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 2738 __HAL_UNLOCK(hfmpi2c);
bogdanm 0:9b334a45a8ff 2739
bogdanm 0:9b334a45a8ff 2740 if(hfmpi2c->State == HAL_FMPI2C_STATE_MEM_BUSY_RX)
bogdanm 0:9b334a45a8ff 2741 {
bogdanm 0:9b334a45a8ff 2742 HAL_FMPI2C_MemRxCpltCallback(hfmpi2c);
bogdanm 0:9b334a45a8ff 2743 }
bogdanm 0:9b334a45a8ff 2744 else
bogdanm 0:9b334a45a8ff 2745 {
bogdanm 0:9b334a45a8ff 2746 HAL_FMPI2C_MasterRxCpltCallback(hfmpi2c);
bogdanm 0:9b334a45a8ff 2747 }
bogdanm 0:9b334a45a8ff 2748 }
bogdanm 0:9b334a45a8ff 2749 else if(__HAL_FMPI2C_GET_FLAG(hfmpi2c, FMPI2C_FLAG_AF) == SET)
bogdanm 0:9b334a45a8ff 2750 {
bogdanm 0:9b334a45a8ff 2751 /* Clear NACK Flag */
bogdanm 0:9b334a45a8ff 2752 __HAL_FMPI2C_CLEAR_FLAG(hfmpi2c, FMPI2C_FLAG_AF);
bogdanm 0:9b334a45a8ff 2753
bogdanm 0:9b334a45a8ff 2754 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 2755 __HAL_UNLOCK(hfmpi2c);
bogdanm 0:9b334a45a8ff 2756
bogdanm 0:9b334a45a8ff 2757 hfmpi2c->ErrorCode |= HAL_FMPI2C_ERROR_AF;
bogdanm 0:9b334a45a8ff 2758 HAL_FMPI2C_ErrorCallback(hfmpi2c);
bogdanm 0:9b334a45a8ff 2759 }
bogdanm 0:9b334a45a8ff 2760
bogdanm 0:9b334a45a8ff 2761 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 2762 __HAL_UNLOCK(hfmpi2c);
bogdanm 0:9b334a45a8ff 2763
bogdanm 0:9b334a45a8ff 2764 return HAL_OK;
bogdanm 0:9b334a45a8ff 2765
bogdanm 0:9b334a45a8ff 2766 }
bogdanm 0:9b334a45a8ff 2767
bogdanm 0:9b334a45a8ff 2768 /**
bogdanm 0:9b334a45a8ff 2769 * @brief Handle Interrupt Flags Slave Transmit Mode
bogdanm 0:9b334a45a8ff 2770 * @param hfmpi2c : Pointer to a FMPI2C_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 2771 * the configuration information for the specified FMPI2C.
bogdanm 0:9b334a45a8ff 2772 * @retval HAL status
bogdanm 0:9b334a45a8ff 2773 */
bogdanm 0:9b334a45a8ff 2774 static HAL_StatusTypeDef FMPI2C_SlaveTransmit_ISR(FMPI2C_HandleTypeDef *hfmpi2c)
bogdanm 0:9b334a45a8ff 2775 {
bogdanm 0:9b334a45a8ff 2776 /* Process locked */
bogdanm 0:9b334a45a8ff 2777 __HAL_LOCK(hfmpi2c);
bogdanm 0:9b334a45a8ff 2778
bogdanm 0:9b334a45a8ff 2779 if(__HAL_FMPI2C_GET_FLAG(hfmpi2c, FMPI2C_FLAG_AF) != RESET)
bogdanm 0:9b334a45a8ff 2780 {
bogdanm 0:9b334a45a8ff 2781 /* Check that FMPI2C transfer finished */
bogdanm 0:9b334a45a8ff 2782 /* if yes, normal usecase, a NACK is sent by the MASTER when Transfer is finished */
bogdanm 0:9b334a45a8ff 2783 /* Mean XferCount == 0*/
bogdanm 0:9b334a45a8ff 2784 /* So clear Flag NACKF only */
bogdanm 0:9b334a45a8ff 2785 if(hfmpi2c->XferCount == 0)
bogdanm 0:9b334a45a8ff 2786 {
bogdanm 0:9b334a45a8ff 2787 /* Clear NACK Flag */
bogdanm 0:9b334a45a8ff 2788 __HAL_FMPI2C_CLEAR_FLAG(hfmpi2c, FMPI2C_FLAG_AF);
bogdanm 0:9b334a45a8ff 2789
bogdanm 0:9b334a45a8ff 2790 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 2791 __HAL_UNLOCK(hfmpi2c);
bogdanm 0:9b334a45a8ff 2792 }
bogdanm 0:9b334a45a8ff 2793 else
bogdanm 0:9b334a45a8ff 2794 {
bogdanm 0:9b334a45a8ff 2795 /* if no, error usecase, a Non-Acknowledge of last Data is generated by the MASTER*/
bogdanm 0:9b334a45a8ff 2796 /* Clear NACK Flag */
bogdanm 0:9b334a45a8ff 2797 __HAL_FMPI2C_CLEAR_FLAG(hfmpi2c, FMPI2C_FLAG_AF);
bogdanm 0:9b334a45a8ff 2798
bogdanm 0:9b334a45a8ff 2799 /* Set ErrorCode corresponding to a Non-Acknowledge */
bogdanm 0:9b334a45a8ff 2800 hfmpi2c->ErrorCode |= HAL_FMPI2C_ERROR_AF;
bogdanm 0:9b334a45a8ff 2801
bogdanm 0:9b334a45a8ff 2802 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 2803 __HAL_UNLOCK(hfmpi2c);
bogdanm 0:9b334a45a8ff 2804
bogdanm 0:9b334a45a8ff 2805 /* Call the Error callback to prevent upper layer */
bogdanm 0:9b334a45a8ff 2806 HAL_FMPI2C_ErrorCallback(hfmpi2c);
bogdanm 0:9b334a45a8ff 2807 }
bogdanm 0:9b334a45a8ff 2808 }
bogdanm 0:9b334a45a8ff 2809 else if(__HAL_FMPI2C_GET_FLAG(hfmpi2c, FMPI2C_FLAG_ADDR) == SET)
bogdanm 0:9b334a45a8ff 2810 {
bogdanm 0:9b334a45a8ff 2811 /* Clear ADDR flag */
bogdanm 0:9b334a45a8ff 2812 __HAL_FMPI2C_CLEAR_FLAG(hfmpi2c, FMPI2C_FLAG_ADDR);
bogdanm 0:9b334a45a8ff 2813 }
bogdanm 0:9b334a45a8ff 2814 /* Check first if STOPF is set */
bogdanm 0:9b334a45a8ff 2815 /* to prevent a Write Data in TX buffer */
bogdanm 0:9b334a45a8ff 2816 /* which is stuck in TXDR until next */
bogdanm 0:9b334a45a8ff 2817 /* communication with Master */
bogdanm 0:9b334a45a8ff 2818 else if(__HAL_FMPI2C_GET_FLAG(hfmpi2c, FMPI2C_FLAG_STOPF) == SET)
bogdanm 0:9b334a45a8ff 2819 {
bogdanm 0:9b334a45a8ff 2820 /* Disable ERRI, TCI, STOPI, NACKI, ADDRI, RXI, TXI interrupt */
bogdanm 0:9b334a45a8ff 2821 __HAL_FMPI2C_DISABLE_IT(hfmpi2c,FMPI2C_IT_ERRI | FMPI2C_IT_TCI| FMPI2C_IT_STOPI| FMPI2C_IT_NACKI | FMPI2C_IT_ADDRI | FMPI2C_IT_RXI | FMPI2C_IT_TXI );
bogdanm 0:9b334a45a8ff 2822
bogdanm 0:9b334a45a8ff 2823 /* Disable Address Acknowledge */
bogdanm 0:9b334a45a8ff 2824 hfmpi2c->Instance->CR2 |= FMPI2C_CR2_NACK;
bogdanm 0:9b334a45a8ff 2825
bogdanm 0:9b334a45a8ff 2826 /* Clear STOP Flag */
bogdanm 0:9b334a45a8ff 2827 __HAL_FMPI2C_CLEAR_FLAG(hfmpi2c, FMPI2C_FLAG_STOPF);
bogdanm 0:9b334a45a8ff 2828
bogdanm 0:9b334a45a8ff 2829 hfmpi2c->State = HAL_FMPI2C_STATE_READY;
bogdanm 0:9b334a45a8ff 2830
bogdanm 0:9b334a45a8ff 2831 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 2832 __HAL_UNLOCK(hfmpi2c);
bogdanm 0:9b334a45a8ff 2833
bogdanm 0:9b334a45a8ff 2834 HAL_FMPI2C_SlaveTxCpltCallback(hfmpi2c);
bogdanm 0:9b334a45a8ff 2835 }
bogdanm 0:9b334a45a8ff 2836 else if(__HAL_FMPI2C_GET_FLAG(hfmpi2c, FMPI2C_FLAG_TXIS) == SET)
bogdanm 0:9b334a45a8ff 2837 {
bogdanm 0:9b334a45a8ff 2838 /* Write data to TXDR only if XferCount not reach "0" */
bogdanm 0:9b334a45a8ff 2839 /* A TXIS flag can be set, during STOP treatment */
bogdanm 0:9b334a45a8ff 2840 if(hfmpi2c->XferCount > 0)
bogdanm 0:9b334a45a8ff 2841 {
bogdanm 0:9b334a45a8ff 2842 /* Write data to TXDR */
bogdanm 0:9b334a45a8ff 2843 hfmpi2c->Instance->TXDR = (*hfmpi2c->pBuffPtr++);
bogdanm 0:9b334a45a8ff 2844 hfmpi2c->XferCount--;
bogdanm 0:9b334a45a8ff 2845 }
bogdanm 0:9b334a45a8ff 2846 }
bogdanm 0:9b334a45a8ff 2847
bogdanm 0:9b334a45a8ff 2848 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 2849 __HAL_UNLOCK(hfmpi2c);
bogdanm 0:9b334a45a8ff 2850
bogdanm 0:9b334a45a8ff 2851 return HAL_OK;
bogdanm 0:9b334a45a8ff 2852 }
bogdanm 0:9b334a45a8ff 2853
bogdanm 0:9b334a45a8ff 2854 /**
bogdanm 0:9b334a45a8ff 2855 * @brief Handle Interrupt Flags Slave Receive Mode
bogdanm 0:9b334a45a8ff 2856 * @param hfmpi2c : Pointer to a FMPI2C_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 2857 * the configuration information for the specified FMPI2C.
bogdanm 0:9b334a45a8ff 2858 * @retval HAL status
bogdanm 0:9b334a45a8ff 2859 */
bogdanm 0:9b334a45a8ff 2860 static HAL_StatusTypeDef FMPI2C_SlaveReceive_ISR(FMPI2C_HandleTypeDef *hfmpi2c)
bogdanm 0:9b334a45a8ff 2861 {
bogdanm 0:9b334a45a8ff 2862 /* Process Locked */
bogdanm 0:9b334a45a8ff 2863 __HAL_LOCK(hfmpi2c);
bogdanm 0:9b334a45a8ff 2864
bogdanm 0:9b334a45a8ff 2865 if(__HAL_FMPI2C_GET_FLAG(hfmpi2c, FMPI2C_FLAG_AF) != RESET)
bogdanm 0:9b334a45a8ff 2866 {
bogdanm 0:9b334a45a8ff 2867 /* Clear NACK Flag */
bogdanm 0:9b334a45a8ff 2868 __HAL_FMPI2C_CLEAR_FLAG(hfmpi2c, FMPI2C_FLAG_AF);
bogdanm 0:9b334a45a8ff 2869
bogdanm 0:9b334a45a8ff 2870 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 2871 __HAL_UNLOCK(hfmpi2c);
bogdanm 0:9b334a45a8ff 2872
bogdanm 0:9b334a45a8ff 2873 hfmpi2c->ErrorCode |= HAL_FMPI2C_ERROR_AF;
bogdanm 0:9b334a45a8ff 2874 HAL_FMPI2C_ErrorCallback(hfmpi2c);
bogdanm 0:9b334a45a8ff 2875 }
bogdanm 0:9b334a45a8ff 2876 else if(__HAL_FMPI2C_GET_FLAG(hfmpi2c, FMPI2C_FLAG_ADDR) == SET)
bogdanm 0:9b334a45a8ff 2877 {
bogdanm 0:9b334a45a8ff 2878 /* Clear ADDR flag */
bogdanm 0:9b334a45a8ff 2879 __HAL_FMPI2C_CLEAR_FLAG(hfmpi2c, FMPI2C_FLAG_ADDR);
bogdanm 0:9b334a45a8ff 2880 }
bogdanm 0:9b334a45a8ff 2881 else if(__HAL_FMPI2C_GET_FLAG(hfmpi2c, FMPI2C_FLAG_RXNE) == SET)
bogdanm 0:9b334a45a8ff 2882 {
bogdanm 0:9b334a45a8ff 2883 /* Read data from RXDR */
bogdanm 0:9b334a45a8ff 2884 (*hfmpi2c->pBuffPtr++) = hfmpi2c->Instance->RXDR;
bogdanm 0:9b334a45a8ff 2885 hfmpi2c->XferSize--;
bogdanm 0:9b334a45a8ff 2886 hfmpi2c->XferCount--;
bogdanm 0:9b334a45a8ff 2887 }
bogdanm 0:9b334a45a8ff 2888 else if(__HAL_FMPI2C_GET_FLAG(hfmpi2c, FMPI2C_FLAG_STOPF) == SET)
bogdanm 0:9b334a45a8ff 2889 {
bogdanm 0:9b334a45a8ff 2890 /* Disable ERRI, TCI, STOPI, NACKI, ADDRI, RXI, TXI interrupt */
bogdanm 0:9b334a45a8ff 2891 __HAL_FMPI2C_DISABLE_IT(hfmpi2c,FMPI2C_IT_ERRI | FMPI2C_IT_TCI| FMPI2C_IT_STOPI| FMPI2C_IT_NACKI | FMPI2C_IT_ADDRI | FMPI2C_IT_RXI | FMPI2C_IT_RXI );
bogdanm 0:9b334a45a8ff 2892
bogdanm 0:9b334a45a8ff 2893 /* Disable Address Acknowledge */
bogdanm 0:9b334a45a8ff 2894 hfmpi2c->Instance->CR2 |= FMPI2C_CR2_NACK;
bogdanm 0:9b334a45a8ff 2895
bogdanm 0:9b334a45a8ff 2896 /* Clear STOP Flag */
bogdanm 0:9b334a45a8ff 2897 __HAL_FMPI2C_CLEAR_FLAG(hfmpi2c, FMPI2C_FLAG_STOPF);
bogdanm 0:9b334a45a8ff 2898
bogdanm 0:9b334a45a8ff 2899 hfmpi2c->State = HAL_FMPI2C_STATE_READY;
bogdanm 0:9b334a45a8ff 2900
bogdanm 0:9b334a45a8ff 2901 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 2902 __HAL_UNLOCK(hfmpi2c);
bogdanm 0:9b334a45a8ff 2903
bogdanm 0:9b334a45a8ff 2904 HAL_FMPI2C_SlaveRxCpltCallback(hfmpi2c);
bogdanm 0:9b334a45a8ff 2905 }
bogdanm 0:9b334a45a8ff 2906
bogdanm 0:9b334a45a8ff 2907 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 2908 __HAL_UNLOCK(hfmpi2c);
bogdanm 0:9b334a45a8ff 2909
bogdanm 0:9b334a45a8ff 2910 return HAL_OK;
bogdanm 0:9b334a45a8ff 2911 }
bogdanm 0:9b334a45a8ff 2912
bogdanm 0:9b334a45a8ff 2913 /**
bogdanm 0:9b334a45a8ff 2914 * @brief Master sends target device address followed by internal memory address for write request.
bogdanm 0:9b334a45a8ff 2915 * @param hfmpi2c : Pointer to a FMPI2C_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 2916 * the configuration information for the specified FMPI2C.
bogdanm 0:9b334a45a8ff 2917 * @param DevAddress: Target device address
bogdanm 0:9b334a45a8ff 2918 * @param MemAddress: Internal memory address
bogdanm 0:9b334a45a8ff 2919 * @param MemAddSize: Size of internal memory address
bogdanm 0:9b334a45a8ff 2920 * @param Timeout: Timeout duration
bogdanm 0:9b334a45a8ff 2921 * @retval HAL status
bogdanm 0:9b334a45a8ff 2922 */
bogdanm 0:9b334a45a8ff 2923 static HAL_StatusTypeDef FMPI2C_RequestMemoryWrite(FMPI2C_HandleTypeDef *hfmpi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint32_t Timeout)
bogdanm 0:9b334a45a8ff 2924 {
bogdanm 0:9b334a45a8ff 2925 FMPI2C_TransferConfig(hfmpi2c,DevAddress,MemAddSize, FMPI2C_RELOAD_MODE, FMPI2C_GENERATE_START_WRITE);
bogdanm 0:9b334a45a8ff 2926
bogdanm 0:9b334a45a8ff 2927 /* Wait until TXIS flag is set */
bogdanm 0:9b334a45a8ff 2928 if(FMPI2C_WaitOnTXISFlagUntilTimeout(hfmpi2c, Timeout) != HAL_OK)
bogdanm 0:9b334a45a8ff 2929 {
bogdanm 0:9b334a45a8ff 2930 if(hfmpi2c->ErrorCode == HAL_FMPI2C_ERROR_AF)
bogdanm 0:9b334a45a8ff 2931 {
bogdanm 0:9b334a45a8ff 2932 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 2933 }
bogdanm 0:9b334a45a8ff 2934 else
bogdanm 0:9b334a45a8ff 2935 {
bogdanm 0:9b334a45a8ff 2936 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 2937 }
bogdanm 0:9b334a45a8ff 2938 }
bogdanm 0:9b334a45a8ff 2939
bogdanm 0:9b334a45a8ff 2940 /* If Memory address size is 8Bit */
bogdanm 0:9b334a45a8ff 2941 if(MemAddSize == FMPI2C_MEMADD_SIZE_8BIT)
bogdanm 0:9b334a45a8ff 2942 {
bogdanm 0:9b334a45a8ff 2943 /* Send Memory Address */
bogdanm 0:9b334a45a8ff 2944 hfmpi2c->Instance->TXDR = __HAL_FMPI2C_MEM_ADD_LSB(MemAddress);
bogdanm 0:9b334a45a8ff 2945 }
bogdanm 0:9b334a45a8ff 2946 /* If Memory address size is 16Bit */
bogdanm 0:9b334a45a8ff 2947 else
bogdanm 0:9b334a45a8ff 2948 {
bogdanm 0:9b334a45a8ff 2949 /* Send MSB of Memory Address */
bogdanm 0:9b334a45a8ff 2950 hfmpi2c->Instance->TXDR = __HAL_FMPI2C_MEM_ADD_MSB(MemAddress);
bogdanm 0:9b334a45a8ff 2951
bogdanm 0:9b334a45a8ff 2952 /* Wait until TXIS flag is set */
bogdanm 0:9b334a45a8ff 2953 if(FMPI2C_WaitOnTXISFlagUntilTimeout(hfmpi2c, Timeout) != HAL_OK)
bogdanm 0:9b334a45a8ff 2954 {
bogdanm 0:9b334a45a8ff 2955 if(hfmpi2c->ErrorCode == HAL_FMPI2C_ERROR_AF)
bogdanm 0:9b334a45a8ff 2956 {
bogdanm 0:9b334a45a8ff 2957 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 2958 }
bogdanm 0:9b334a45a8ff 2959 else
bogdanm 0:9b334a45a8ff 2960 {
bogdanm 0:9b334a45a8ff 2961 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 2962 }
bogdanm 0:9b334a45a8ff 2963 }
bogdanm 0:9b334a45a8ff 2964
bogdanm 0:9b334a45a8ff 2965 /* Send LSB of Memory Address */
bogdanm 0:9b334a45a8ff 2966 hfmpi2c->Instance->TXDR = __HAL_FMPI2C_MEM_ADD_LSB(MemAddress);
bogdanm 0:9b334a45a8ff 2967 }
bogdanm 0:9b334a45a8ff 2968
bogdanm 0:9b334a45a8ff 2969 /* Wait until TCR flag is set */
bogdanm 0:9b334a45a8ff 2970 if(FMPI2C_WaitOnFlagUntilTimeout(hfmpi2c, FMPI2C_FLAG_TCR, RESET, Timeout) != HAL_OK)
bogdanm 0:9b334a45a8ff 2971 {
bogdanm 0:9b334a45a8ff 2972 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 2973 }
bogdanm 0:9b334a45a8ff 2974
bogdanm 0:9b334a45a8ff 2975 return HAL_OK;
bogdanm 0:9b334a45a8ff 2976 }
bogdanm 0:9b334a45a8ff 2977
bogdanm 0:9b334a45a8ff 2978 /**
bogdanm 0:9b334a45a8ff 2979 * @brief Master sends target device address followed by internal memory address for read request.
bogdanm 0:9b334a45a8ff 2980 * @param hfmpi2c : Pointer to a FMPI2C_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 2981 * the configuration information for the specified FMPI2C.
bogdanm 0:9b334a45a8ff 2982 * @param DevAddress: Target device address
bogdanm 0:9b334a45a8ff 2983 * @param MemAddress: Internal memory address
bogdanm 0:9b334a45a8ff 2984 * @param MemAddSize: Size of internal memory address
bogdanm 0:9b334a45a8ff 2985 * @param Timeout: Timeout duration
bogdanm 0:9b334a45a8ff 2986 * @retval HAL status
bogdanm 0:9b334a45a8ff 2987 */
bogdanm 0:9b334a45a8ff 2988 static HAL_StatusTypeDef FMPI2C_RequestMemoryRead(FMPI2C_HandleTypeDef *hfmpi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint32_t Timeout)
bogdanm 0:9b334a45a8ff 2989 {
bogdanm 0:9b334a45a8ff 2990 FMPI2C_TransferConfig(hfmpi2c,DevAddress,MemAddSize, FMPI2C_SOFTEND_MODE, FMPI2C_GENERATE_START_WRITE);
bogdanm 0:9b334a45a8ff 2991
bogdanm 0:9b334a45a8ff 2992 /* Wait until TXIS flag is set */
bogdanm 0:9b334a45a8ff 2993 if(FMPI2C_WaitOnTXISFlagUntilTimeout(hfmpi2c, Timeout) != HAL_OK)
bogdanm 0:9b334a45a8ff 2994 {
bogdanm 0:9b334a45a8ff 2995 if(hfmpi2c->ErrorCode == HAL_FMPI2C_ERROR_AF)
bogdanm 0:9b334a45a8ff 2996 {
bogdanm 0:9b334a45a8ff 2997 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 2998 }
bogdanm 0:9b334a45a8ff 2999 else
bogdanm 0:9b334a45a8ff 3000 {
bogdanm 0:9b334a45a8ff 3001 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 3002 }
bogdanm 0:9b334a45a8ff 3003 }
bogdanm 0:9b334a45a8ff 3004
bogdanm 0:9b334a45a8ff 3005 /* If Memory address size is 8Bit */
bogdanm 0:9b334a45a8ff 3006 if(MemAddSize == FMPI2C_MEMADD_SIZE_8BIT)
bogdanm 0:9b334a45a8ff 3007 {
bogdanm 0:9b334a45a8ff 3008 /* Send Memory Address */
bogdanm 0:9b334a45a8ff 3009 hfmpi2c->Instance->TXDR = __HAL_FMPI2C_MEM_ADD_LSB(MemAddress);
bogdanm 0:9b334a45a8ff 3010 }
bogdanm 0:9b334a45a8ff 3011 /* If Mememory address size is 16Bit */
bogdanm 0:9b334a45a8ff 3012 else
bogdanm 0:9b334a45a8ff 3013 {
bogdanm 0:9b334a45a8ff 3014 /* Send MSB of Memory Address */
bogdanm 0:9b334a45a8ff 3015 hfmpi2c->Instance->TXDR = __HAL_FMPI2C_MEM_ADD_MSB(MemAddress);
bogdanm 0:9b334a45a8ff 3016
bogdanm 0:9b334a45a8ff 3017 /* Wait until TXIS flag is set */
bogdanm 0:9b334a45a8ff 3018 if(FMPI2C_WaitOnTXISFlagUntilTimeout(hfmpi2c, Timeout) != HAL_OK)
bogdanm 0:9b334a45a8ff 3019 {
bogdanm 0:9b334a45a8ff 3020 if(hfmpi2c->ErrorCode == HAL_FMPI2C_ERROR_AF)
bogdanm 0:9b334a45a8ff 3021 {
bogdanm 0:9b334a45a8ff 3022 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 3023 }
bogdanm 0:9b334a45a8ff 3024 else
bogdanm 0:9b334a45a8ff 3025 {
bogdanm 0:9b334a45a8ff 3026 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 3027 }
bogdanm 0:9b334a45a8ff 3028 }
bogdanm 0:9b334a45a8ff 3029
bogdanm 0:9b334a45a8ff 3030 /* Send LSB of Memory Address */
bogdanm 0:9b334a45a8ff 3031 hfmpi2c->Instance->TXDR = __HAL_FMPI2C_MEM_ADD_LSB(MemAddress);
bogdanm 0:9b334a45a8ff 3032 }
bogdanm 0:9b334a45a8ff 3033
bogdanm 0:9b334a45a8ff 3034 /* Wait until TC flag is set */
bogdanm 0:9b334a45a8ff 3035 if(FMPI2C_WaitOnFlagUntilTimeout(hfmpi2c, FMPI2C_FLAG_TC, RESET, Timeout) != HAL_OK)
bogdanm 0:9b334a45a8ff 3036 {
bogdanm 0:9b334a45a8ff 3037 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 3038 }
bogdanm 0:9b334a45a8ff 3039
bogdanm 0:9b334a45a8ff 3040 return HAL_OK;
bogdanm 0:9b334a45a8ff 3041 }
bogdanm 0:9b334a45a8ff 3042
bogdanm 0:9b334a45a8ff 3043
bogdanm 0:9b334a45a8ff 3044 /**
bogdanm 0:9b334a45a8ff 3045 * @brief DMA FMPI2C master transmit process complete callback.
bogdanm 0:9b334a45a8ff 3046 * @param hdma: DMA handle
bogdanm 0:9b334a45a8ff 3047 * @retval None
bogdanm 0:9b334a45a8ff 3048 */
bogdanm 0:9b334a45a8ff 3049 static void FMPI2C_DMAMasterTransmitCplt(DMA_HandleTypeDef *hdma)
bogdanm 0:9b334a45a8ff 3050 {
bogdanm 0:9b334a45a8ff 3051 uint16_t DevAddress;
bogdanm 0:9b334a45a8ff 3052 FMPI2C_HandleTypeDef* hfmpi2c = (FMPI2C_HandleTypeDef*)((DMA_HandleTypeDef*)hdma)->Parent;
bogdanm 0:9b334a45a8ff 3053
bogdanm 0:9b334a45a8ff 3054 /* Check if last DMA request was done with RELOAD */
bogdanm 0:9b334a45a8ff 3055 /* Set NBYTES to write and reload if size > 255 */
bogdanm 0:9b334a45a8ff 3056 if( (hfmpi2c->XferSize == 255) && (hfmpi2c->XferSize < hfmpi2c->XferCount) )
bogdanm 0:9b334a45a8ff 3057 {
bogdanm 0:9b334a45a8ff 3058 /* Wait until TCR flag is set */
bogdanm 0:9b334a45a8ff 3059 if(FMPI2C_WaitOnFlagUntilTimeout(hfmpi2c, FMPI2C_FLAG_TCR, RESET, FMPI2C_TIMEOUT_TCR) != HAL_OK)
bogdanm 0:9b334a45a8ff 3060 {
bogdanm 0:9b334a45a8ff 3061 hfmpi2c->ErrorCode |= HAL_FMPI2C_ERROR_TIMEOUT;
bogdanm 0:9b334a45a8ff 3062 }
bogdanm 0:9b334a45a8ff 3063
bogdanm 0:9b334a45a8ff 3064 /* Disable DMA Request */
bogdanm 0:9b334a45a8ff 3065 hfmpi2c->Instance->CR1 &= ~FMPI2C_CR1_TXDMAEN;
bogdanm 0:9b334a45a8ff 3066
bogdanm 0:9b334a45a8ff 3067 /* Check if Errors has been detected during transfer */
bogdanm 0:9b334a45a8ff 3068 if(hfmpi2c->ErrorCode != HAL_FMPI2C_ERROR_NONE)
bogdanm 0:9b334a45a8ff 3069 {
bogdanm 0:9b334a45a8ff 3070 /* No need to Check TC flag, with AUTOEND mode the stop is automatically generated */
bogdanm 0:9b334a45a8ff 3071 /* Wait until STOPF flag is reset */
bogdanm 0:9b334a45a8ff 3072 if(FMPI2C_WaitOnSTOPFlagUntilTimeout(hfmpi2c, FMPI2C_TIMEOUT_STOPF) != HAL_OK)
bogdanm 0:9b334a45a8ff 3073 {
bogdanm 0:9b334a45a8ff 3074 if(hfmpi2c->ErrorCode == HAL_FMPI2C_ERROR_AF)
bogdanm 0:9b334a45a8ff 3075 {
bogdanm 0:9b334a45a8ff 3076 hfmpi2c->ErrorCode |= HAL_FMPI2C_ERROR_AF;
bogdanm 0:9b334a45a8ff 3077 }
bogdanm 0:9b334a45a8ff 3078 else
bogdanm 0:9b334a45a8ff 3079 {
bogdanm 0:9b334a45a8ff 3080 hfmpi2c->ErrorCode |= HAL_FMPI2C_ERROR_TIMEOUT;
bogdanm 0:9b334a45a8ff 3081 }
bogdanm 0:9b334a45a8ff 3082 }
bogdanm 0:9b334a45a8ff 3083
bogdanm 0:9b334a45a8ff 3084 /* Clear STOP Flag */
bogdanm 0:9b334a45a8ff 3085 __HAL_FMPI2C_CLEAR_FLAG(hfmpi2c, FMPI2C_FLAG_STOPF);
bogdanm 0:9b334a45a8ff 3086
bogdanm 0:9b334a45a8ff 3087 /* Clear Configuration Register 2 */
bogdanm 0:9b334a45a8ff 3088 __HAL_FMPI2C_RESET_CR2(hfmpi2c);
bogdanm 0:9b334a45a8ff 3089
bogdanm 0:9b334a45a8ff 3090 hfmpi2c->XferCount = 0;
bogdanm 0:9b334a45a8ff 3091
bogdanm 0:9b334a45a8ff 3092 hfmpi2c->State = HAL_FMPI2C_STATE_READY;
bogdanm 0:9b334a45a8ff 3093 HAL_FMPI2C_ErrorCallback(hfmpi2c);
bogdanm 0:9b334a45a8ff 3094 }
bogdanm 0:9b334a45a8ff 3095 else
bogdanm 0:9b334a45a8ff 3096 {
bogdanm 0:9b334a45a8ff 3097 hfmpi2c->pBuffPtr += hfmpi2c->XferSize;
bogdanm 0:9b334a45a8ff 3098 hfmpi2c->XferCount -= hfmpi2c->XferSize;
bogdanm 0:9b334a45a8ff 3099 if(hfmpi2c->XferCount > 255)
bogdanm 0:9b334a45a8ff 3100 {
bogdanm 0:9b334a45a8ff 3101 hfmpi2c->XferSize = 255;
bogdanm 0:9b334a45a8ff 3102 }
bogdanm 0:9b334a45a8ff 3103 else
bogdanm 0:9b334a45a8ff 3104 {
bogdanm 0:9b334a45a8ff 3105 hfmpi2c->XferSize = hfmpi2c->XferCount;
bogdanm 0:9b334a45a8ff 3106 }
bogdanm 0:9b334a45a8ff 3107
bogdanm 0:9b334a45a8ff 3108 DevAddress = (hfmpi2c->Instance->CR2 & FMPI2C_CR2_SADD);
bogdanm 0:9b334a45a8ff 3109
bogdanm 0:9b334a45a8ff 3110 /* Enable the DMA channel */
bogdanm 0:9b334a45a8ff 3111 HAL_DMA_Start_IT(hfmpi2c->hdmatx, (uint32_t)hfmpi2c->pBuffPtr, (uint32_t)&hfmpi2c->Instance->TXDR, hfmpi2c->XferSize);
bogdanm 0:9b334a45a8ff 3112
bogdanm 0:9b334a45a8ff 3113 /* Send Slave Address */
bogdanm 0:9b334a45a8ff 3114 /* Set NBYTES to write and reload if size > 255 */
bogdanm 0:9b334a45a8ff 3115 if( (hfmpi2c->XferSize == 255) && (hfmpi2c->XferSize < hfmpi2c->XferCount) )
bogdanm 0:9b334a45a8ff 3116 {
bogdanm 0:9b334a45a8ff 3117 FMPI2C_TransferConfig(hfmpi2c,DevAddress,hfmpi2c->XferSize, FMPI2C_RELOAD_MODE, FMPI2C_NO_STARTSTOP);
bogdanm 0:9b334a45a8ff 3118 }
bogdanm 0:9b334a45a8ff 3119 else
bogdanm 0:9b334a45a8ff 3120 {
bogdanm 0:9b334a45a8ff 3121 FMPI2C_TransferConfig(hfmpi2c,DevAddress,hfmpi2c->XferSize, FMPI2C_AUTOEND_MODE, FMPI2C_NO_STARTSTOP);
bogdanm 0:9b334a45a8ff 3122 }
bogdanm 0:9b334a45a8ff 3123
bogdanm 0:9b334a45a8ff 3124 /* Wait until TXIS flag is set */
bogdanm 0:9b334a45a8ff 3125 if(FMPI2C_WaitOnTXISFlagUntilTimeout(hfmpi2c, FMPI2C_TIMEOUT_TXIS) != HAL_OK)
bogdanm 0:9b334a45a8ff 3126 {
bogdanm 0:9b334a45a8ff 3127 /* No need to Check TC flag, with AUTOEND mode the stop is automatically generated */
bogdanm 0:9b334a45a8ff 3128 /* Wait until STOPF flag is reset */
bogdanm 0:9b334a45a8ff 3129 if(FMPI2C_WaitOnSTOPFlagUntilTimeout(hfmpi2c, FMPI2C_TIMEOUT_STOPF) != HAL_OK)
bogdanm 0:9b334a45a8ff 3130 {
bogdanm 0:9b334a45a8ff 3131 if(hfmpi2c->ErrorCode == HAL_FMPI2C_ERROR_AF)
bogdanm 0:9b334a45a8ff 3132 {
bogdanm 0:9b334a45a8ff 3133 hfmpi2c->ErrorCode |= HAL_FMPI2C_ERROR_AF;
bogdanm 0:9b334a45a8ff 3134 }
bogdanm 0:9b334a45a8ff 3135 else
bogdanm 0:9b334a45a8ff 3136 {
bogdanm 0:9b334a45a8ff 3137 hfmpi2c->ErrorCode |= HAL_FMPI2C_ERROR_TIMEOUT;
bogdanm 0:9b334a45a8ff 3138 }
bogdanm 0:9b334a45a8ff 3139 }
bogdanm 0:9b334a45a8ff 3140
bogdanm 0:9b334a45a8ff 3141 /* Clear STOP Flag */
bogdanm 0:9b334a45a8ff 3142 __HAL_FMPI2C_CLEAR_FLAG(hfmpi2c, FMPI2C_FLAG_STOPF);
bogdanm 0:9b334a45a8ff 3143
bogdanm 0:9b334a45a8ff 3144 /* Clear Configuration Register 2 */
bogdanm 0:9b334a45a8ff 3145 __HAL_FMPI2C_RESET_CR2(hfmpi2c);
bogdanm 0:9b334a45a8ff 3146
bogdanm 0:9b334a45a8ff 3147 hfmpi2c->XferCount = 0;
bogdanm 0:9b334a45a8ff 3148
bogdanm 0:9b334a45a8ff 3149 hfmpi2c->State = HAL_FMPI2C_STATE_READY;
bogdanm 0:9b334a45a8ff 3150 HAL_FMPI2C_ErrorCallback(hfmpi2c);
bogdanm 0:9b334a45a8ff 3151 }
bogdanm 0:9b334a45a8ff 3152 else
bogdanm 0:9b334a45a8ff 3153 {
bogdanm 0:9b334a45a8ff 3154 /* Enable DMA Request */
bogdanm 0:9b334a45a8ff 3155 hfmpi2c->Instance->CR1 |= FMPI2C_CR1_TXDMAEN;
bogdanm 0:9b334a45a8ff 3156 }
bogdanm 0:9b334a45a8ff 3157 }
bogdanm 0:9b334a45a8ff 3158 }
bogdanm 0:9b334a45a8ff 3159 else
bogdanm 0:9b334a45a8ff 3160 {
bogdanm 0:9b334a45a8ff 3161 /* No need to Check TC flag, with AUTOEND mode the stop is automatically generated */
bogdanm 0:9b334a45a8ff 3162 /* Wait until STOPF flag is reset */
bogdanm 0:9b334a45a8ff 3163 if(FMPI2C_WaitOnSTOPFlagUntilTimeout(hfmpi2c, FMPI2C_TIMEOUT_STOPF) != HAL_OK)
bogdanm 0:9b334a45a8ff 3164 {
bogdanm 0:9b334a45a8ff 3165 if(hfmpi2c->ErrorCode == HAL_FMPI2C_ERROR_AF)
bogdanm 0:9b334a45a8ff 3166 {
bogdanm 0:9b334a45a8ff 3167 hfmpi2c->ErrorCode |= HAL_FMPI2C_ERROR_AF;
bogdanm 0:9b334a45a8ff 3168 }
bogdanm 0:9b334a45a8ff 3169 else
bogdanm 0:9b334a45a8ff 3170 {
bogdanm 0:9b334a45a8ff 3171 hfmpi2c->ErrorCode |= HAL_FMPI2C_ERROR_TIMEOUT;
bogdanm 0:9b334a45a8ff 3172 }
bogdanm 0:9b334a45a8ff 3173 }
bogdanm 0:9b334a45a8ff 3174
bogdanm 0:9b334a45a8ff 3175 /* Clear STOP Flag */
bogdanm 0:9b334a45a8ff 3176 __HAL_FMPI2C_CLEAR_FLAG(hfmpi2c, FMPI2C_FLAG_STOPF);
bogdanm 0:9b334a45a8ff 3177
bogdanm 0:9b334a45a8ff 3178 /* Clear Configuration Register 2 */
bogdanm 0:9b334a45a8ff 3179 __HAL_FMPI2C_RESET_CR2(hfmpi2c);
bogdanm 0:9b334a45a8ff 3180
bogdanm 0:9b334a45a8ff 3181 /* Disable DMA Request */
bogdanm 0:9b334a45a8ff 3182 hfmpi2c->Instance->CR1 &= ~FMPI2C_CR1_TXDMAEN;
bogdanm 0:9b334a45a8ff 3183
bogdanm 0:9b334a45a8ff 3184 hfmpi2c->XferCount = 0;
bogdanm 0:9b334a45a8ff 3185
bogdanm 0:9b334a45a8ff 3186 hfmpi2c->State = HAL_FMPI2C_STATE_READY;
bogdanm 0:9b334a45a8ff 3187
bogdanm 0:9b334a45a8ff 3188 /* Check if Errors has been detected during transfer */
bogdanm 0:9b334a45a8ff 3189 if(hfmpi2c->ErrorCode != HAL_FMPI2C_ERROR_NONE)
bogdanm 0:9b334a45a8ff 3190 {
bogdanm 0:9b334a45a8ff 3191 HAL_FMPI2C_ErrorCallback(hfmpi2c);
bogdanm 0:9b334a45a8ff 3192 }
bogdanm 0:9b334a45a8ff 3193 else
bogdanm 0:9b334a45a8ff 3194 {
bogdanm 0:9b334a45a8ff 3195 HAL_FMPI2C_MasterTxCpltCallback(hfmpi2c);
bogdanm 0:9b334a45a8ff 3196 }
bogdanm 0:9b334a45a8ff 3197 }
bogdanm 0:9b334a45a8ff 3198 }
bogdanm 0:9b334a45a8ff 3199
bogdanm 0:9b334a45a8ff 3200 /**
bogdanm 0:9b334a45a8ff 3201 * @brief DMA FMPI2C slave transmit process complete callback.
bogdanm 0:9b334a45a8ff 3202 * @param hdma: DMA handle
bogdanm 0:9b334a45a8ff 3203 * @retval None
bogdanm 0:9b334a45a8ff 3204 */
bogdanm 0:9b334a45a8ff 3205 static void FMPI2C_DMASlaveTransmitCplt(DMA_HandleTypeDef *hdma)
bogdanm 0:9b334a45a8ff 3206 {
bogdanm 0:9b334a45a8ff 3207 FMPI2C_HandleTypeDef* hfmpi2c = (FMPI2C_HandleTypeDef*)((DMA_HandleTypeDef*)hdma)->Parent;
bogdanm 0:9b334a45a8ff 3208
bogdanm 0:9b334a45a8ff 3209 /* Wait until STOP flag is set */
bogdanm 0:9b334a45a8ff 3210 if(FMPI2C_WaitOnSTOPFlagUntilTimeout(hfmpi2c, FMPI2C_TIMEOUT_STOPF) != HAL_OK)
bogdanm 0:9b334a45a8ff 3211 {
bogdanm 0:9b334a45a8ff 3212 if(hfmpi2c->ErrorCode == HAL_FMPI2C_ERROR_AF)
bogdanm 0:9b334a45a8ff 3213 {
bogdanm 0:9b334a45a8ff 3214 /* Normal Use case, a AF is generated by master */
bogdanm 0:9b334a45a8ff 3215 /* to inform slave the end of transfer */
bogdanm 0:9b334a45a8ff 3216 hfmpi2c->ErrorCode = HAL_FMPI2C_ERROR_NONE;
bogdanm 0:9b334a45a8ff 3217 }
bogdanm 0:9b334a45a8ff 3218 else
bogdanm 0:9b334a45a8ff 3219 {
bogdanm 0:9b334a45a8ff 3220 hfmpi2c->ErrorCode |= HAL_FMPI2C_ERROR_TIMEOUT;
bogdanm 0:9b334a45a8ff 3221 }
bogdanm 0:9b334a45a8ff 3222 }
bogdanm 0:9b334a45a8ff 3223
bogdanm 0:9b334a45a8ff 3224 /* Clear STOP flag */
bogdanm 0:9b334a45a8ff 3225 __HAL_FMPI2C_CLEAR_FLAG(hfmpi2c,FMPI2C_FLAG_STOPF);
bogdanm 0:9b334a45a8ff 3226
bogdanm 0:9b334a45a8ff 3227 /* Wait until BUSY flag is reset */
bogdanm 0:9b334a45a8ff 3228 if(FMPI2C_WaitOnFlagUntilTimeout(hfmpi2c, FMPI2C_FLAG_BUSY, SET, FMPI2C_TIMEOUT_BUSY) != HAL_OK)
bogdanm 0:9b334a45a8ff 3229 {
bogdanm 0:9b334a45a8ff 3230 hfmpi2c->ErrorCode |= HAL_FMPI2C_ERROR_TIMEOUT;
bogdanm 0:9b334a45a8ff 3231 }
bogdanm 0:9b334a45a8ff 3232
bogdanm 0:9b334a45a8ff 3233 /* Disable DMA Request */
bogdanm 0:9b334a45a8ff 3234 hfmpi2c->Instance->CR1 &= ~FMPI2C_CR1_TXDMAEN;
bogdanm 0:9b334a45a8ff 3235
bogdanm 0:9b334a45a8ff 3236 hfmpi2c->XferCount = 0;
bogdanm 0:9b334a45a8ff 3237
bogdanm 0:9b334a45a8ff 3238 hfmpi2c->State = HAL_FMPI2C_STATE_READY;
bogdanm 0:9b334a45a8ff 3239
bogdanm 0:9b334a45a8ff 3240 /* Check if Errors has been detected during transfer */
bogdanm 0:9b334a45a8ff 3241 if(hfmpi2c->ErrorCode != HAL_FMPI2C_ERROR_NONE)
bogdanm 0:9b334a45a8ff 3242 {
bogdanm 0:9b334a45a8ff 3243 HAL_FMPI2C_ErrorCallback(hfmpi2c);
bogdanm 0:9b334a45a8ff 3244 }
bogdanm 0:9b334a45a8ff 3245 else
bogdanm 0:9b334a45a8ff 3246 {
bogdanm 0:9b334a45a8ff 3247 HAL_FMPI2C_SlaveTxCpltCallback(hfmpi2c);
bogdanm 0:9b334a45a8ff 3248 }
bogdanm 0:9b334a45a8ff 3249 }
bogdanm 0:9b334a45a8ff 3250
bogdanm 0:9b334a45a8ff 3251 /**
bogdanm 0:9b334a45a8ff 3252 * @brief DMA FMPI2C master receive process complete callback
bogdanm 0:9b334a45a8ff 3253 * @param hdma: DMA handle
bogdanm 0:9b334a45a8ff 3254 * @retval None
bogdanm 0:9b334a45a8ff 3255 */
bogdanm 0:9b334a45a8ff 3256 static void FMPI2C_DMAMasterReceiveCplt(DMA_HandleTypeDef *hdma)
bogdanm 0:9b334a45a8ff 3257 {
bogdanm 0:9b334a45a8ff 3258 FMPI2C_HandleTypeDef* hfmpi2c = (FMPI2C_HandleTypeDef*)((DMA_HandleTypeDef*)hdma)->Parent;
bogdanm 0:9b334a45a8ff 3259 uint16_t DevAddress;
bogdanm 0:9b334a45a8ff 3260
bogdanm 0:9b334a45a8ff 3261 /* Check if last DMA request was done with RELOAD */
bogdanm 0:9b334a45a8ff 3262 /* Set NBYTES to write and reload if size > 255 */
bogdanm 0:9b334a45a8ff 3263 if( (hfmpi2c->XferSize == 255) && (hfmpi2c->XferSize < hfmpi2c->XferCount) )
bogdanm 0:9b334a45a8ff 3264 {
bogdanm 0:9b334a45a8ff 3265 /* Wait until TCR flag is set */
bogdanm 0:9b334a45a8ff 3266 if(FMPI2C_WaitOnFlagUntilTimeout(hfmpi2c, FMPI2C_FLAG_TCR, RESET, FMPI2C_TIMEOUT_TCR) != HAL_OK)
bogdanm 0:9b334a45a8ff 3267 {
bogdanm 0:9b334a45a8ff 3268 hfmpi2c->ErrorCode |= HAL_FMPI2C_ERROR_TIMEOUT;
bogdanm 0:9b334a45a8ff 3269 }
bogdanm 0:9b334a45a8ff 3270
bogdanm 0:9b334a45a8ff 3271 /* Disable DMA Request */
bogdanm 0:9b334a45a8ff 3272 hfmpi2c->Instance->CR1 &= ~FMPI2C_CR1_RXDMAEN;
bogdanm 0:9b334a45a8ff 3273
bogdanm 0:9b334a45a8ff 3274 /* Check if Errors has been detected during transfer */
bogdanm 0:9b334a45a8ff 3275 if(hfmpi2c->ErrorCode != HAL_FMPI2C_ERROR_NONE)
bogdanm 0:9b334a45a8ff 3276 {
bogdanm 0:9b334a45a8ff 3277 /* No need to Check TC flag, with AUTOEND mode the stop is automatically generated */
bogdanm 0:9b334a45a8ff 3278 /* Wait until STOPF flag is reset */
bogdanm 0:9b334a45a8ff 3279 if(FMPI2C_WaitOnSTOPFlagUntilTimeout(hfmpi2c, FMPI2C_TIMEOUT_STOPF) != HAL_OK)
bogdanm 0:9b334a45a8ff 3280 {
bogdanm 0:9b334a45a8ff 3281 if(hfmpi2c->ErrorCode == HAL_FMPI2C_ERROR_AF)
bogdanm 0:9b334a45a8ff 3282 {
bogdanm 0:9b334a45a8ff 3283 hfmpi2c->ErrorCode |= HAL_FMPI2C_ERROR_AF;
bogdanm 0:9b334a45a8ff 3284 }
bogdanm 0:9b334a45a8ff 3285 else
bogdanm 0:9b334a45a8ff 3286 {
bogdanm 0:9b334a45a8ff 3287 hfmpi2c->ErrorCode |= HAL_FMPI2C_ERROR_TIMEOUT;
bogdanm 0:9b334a45a8ff 3288 }
bogdanm 0:9b334a45a8ff 3289 }
bogdanm 0:9b334a45a8ff 3290
bogdanm 0:9b334a45a8ff 3291 /* Clear STOP Flag */
bogdanm 0:9b334a45a8ff 3292 __HAL_FMPI2C_CLEAR_FLAG(hfmpi2c, FMPI2C_FLAG_STOPF);
bogdanm 0:9b334a45a8ff 3293
bogdanm 0:9b334a45a8ff 3294 /* Clear Configuration Register 2 */
bogdanm 0:9b334a45a8ff 3295 __HAL_FMPI2C_RESET_CR2(hfmpi2c);
bogdanm 0:9b334a45a8ff 3296
bogdanm 0:9b334a45a8ff 3297 hfmpi2c->XferCount = 0;
bogdanm 0:9b334a45a8ff 3298
bogdanm 0:9b334a45a8ff 3299 hfmpi2c->State = HAL_FMPI2C_STATE_READY;
bogdanm 0:9b334a45a8ff 3300 HAL_FMPI2C_ErrorCallback(hfmpi2c);
bogdanm 0:9b334a45a8ff 3301 }
bogdanm 0:9b334a45a8ff 3302 else
bogdanm 0:9b334a45a8ff 3303 {
bogdanm 0:9b334a45a8ff 3304 hfmpi2c->pBuffPtr += hfmpi2c->XferSize;
bogdanm 0:9b334a45a8ff 3305 hfmpi2c->XferCount -= hfmpi2c->XferSize;
bogdanm 0:9b334a45a8ff 3306 if(hfmpi2c->XferCount > 255)
bogdanm 0:9b334a45a8ff 3307 {
bogdanm 0:9b334a45a8ff 3308 hfmpi2c->XferSize = 255;
bogdanm 0:9b334a45a8ff 3309 }
bogdanm 0:9b334a45a8ff 3310 else
bogdanm 0:9b334a45a8ff 3311 {
bogdanm 0:9b334a45a8ff 3312 hfmpi2c->XferSize = hfmpi2c->XferCount;
bogdanm 0:9b334a45a8ff 3313 }
bogdanm 0:9b334a45a8ff 3314
bogdanm 0:9b334a45a8ff 3315 DevAddress = (hfmpi2c->Instance->CR2 & FMPI2C_CR2_SADD);
bogdanm 0:9b334a45a8ff 3316
bogdanm 0:9b334a45a8ff 3317 /* Enable the DMA channel */
bogdanm 0:9b334a45a8ff 3318 HAL_DMA_Start_IT(hfmpi2c->hdmarx, (uint32_t)&hfmpi2c->Instance->RXDR, (uint32_t)hfmpi2c->pBuffPtr, hfmpi2c->XferSize);
bogdanm 0:9b334a45a8ff 3319
bogdanm 0:9b334a45a8ff 3320 /* Send Slave Address */
bogdanm 0:9b334a45a8ff 3321 /* Set NBYTES to write and reload if size > 255 */
bogdanm 0:9b334a45a8ff 3322 if( (hfmpi2c->XferSize == 255) && (hfmpi2c->XferSize < hfmpi2c->XferCount) )
bogdanm 0:9b334a45a8ff 3323 {
bogdanm 0:9b334a45a8ff 3324 FMPI2C_TransferConfig(hfmpi2c,DevAddress,hfmpi2c->XferSize, FMPI2C_RELOAD_MODE, FMPI2C_NO_STARTSTOP);
bogdanm 0:9b334a45a8ff 3325 }
bogdanm 0:9b334a45a8ff 3326 else
bogdanm 0:9b334a45a8ff 3327 {
bogdanm 0:9b334a45a8ff 3328 FMPI2C_TransferConfig(hfmpi2c,DevAddress,hfmpi2c->XferSize, FMPI2C_AUTOEND_MODE, FMPI2C_NO_STARTSTOP);
bogdanm 0:9b334a45a8ff 3329 }
bogdanm 0:9b334a45a8ff 3330
bogdanm 0:9b334a45a8ff 3331 /* Wait until RXNE flag is set */
bogdanm 0:9b334a45a8ff 3332 if(FMPI2C_WaitOnFlagUntilTimeout(hfmpi2c, FMPI2C_FLAG_RXNE, RESET, FMPI2C_TIMEOUT_RXNE) != HAL_OK)
bogdanm 0:9b334a45a8ff 3333 {
bogdanm 0:9b334a45a8ff 3334 hfmpi2c->ErrorCode |= HAL_FMPI2C_ERROR_TIMEOUT;
bogdanm 0:9b334a45a8ff 3335 }
bogdanm 0:9b334a45a8ff 3336
bogdanm 0:9b334a45a8ff 3337 /* Check if Errors has been detected during transfer */
bogdanm 0:9b334a45a8ff 3338 if(hfmpi2c->ErrorCode != HAL_FMPI2C_ERROR_NONE)
bogdanm 0:9b334a45a8ff 3339 {
bogdanm 0:9b334a45a8ff 3340 /* No need to Check TC flag, with AUTOEND mode the stop is automatically generated */
bogdanm 0:9b334a45a8ff 3341 /* Wait until STOPF flag is reset */
bogdanm 0:9b334a45a8ff 3342 if(FMPI2C_WaitOnSTOPFlagUntilTimeout(hfmpi2c, FMPI2C_TIMEOUT_STOPF) != HAL_OK)
bogdanm 0:9b334a45a8ff 3343 {
bogdanm 0:9b334a45a8ff 3344 if(hfmpi2c->ErrorCode == HAL_FMPI2C_ERROR_AF)
bogdanm 0:9b334a45a8ff 3345 {
bogdanm 0:9b334a45a8ff 3346 hfmpi2c->ErrorCode |= HAL_FMPI2C_ERROR_AF;
bogdanm 0:9b334a45a8ff 3347 }
bogdanm 0:9b334a45a8ff 3348 else
bogdanm 0:9b334a45a8ff 3349 {
bogdanm 0:9b334a45a8ff 3350 hfmpi2c->ErrorCode |= HAL_FMPI2C_ERROR_TIMEOUT;
bogdanm 0:9b334a45a8ff 3351 }
bogdanm 0:9b334a45a8ff 3352 }
bogdanm 0:9b334a45a8ff 3353
bogdanm 0:9b334a45a8ff 3354 /* Clear STOP Flag */
bogdanm 0:9b334a45a8ff 3355 __HAL_FMPI2C_CLEAR_FLAG(hfmpi2c, FMPI2C_FLAG_STOPF);
bogdanm 0:9b334a45a8ff 3356
bogdanm 0:9b334a45a8ff 3357 /* Clear Configuration Register 2 */
bogdanm 0:9b334a45a8ff 3358 __HAL_FMPI2C_RESET_CR2(hfmpi2c);
bogdanm 0:9b334a45a8ff 3359
bogdanm 0:9b334a45a8ff 3360 hfmpi2c->XferCount = 0;
bogdanm 0:9b334a45a8ff 3361
bogdanm 0:9b334a45a8ff 3362 hfmpi2c->State = HAL_FMPI2C_STATE_READY;
bogdanm 0:9b334a45a8ff 3363
bogdanm 0:9b334a45a8ff 3364 HAL_FMPI2C_ErrorCallback(hfmpi2c);
bogdanm 0:9b334a45a8ff 3365 }
bogdanm 0:9b334a45a8ff 3366 else
bogdanm 0:9b334a45a8ff 3367 {
bogdanm 0:9b334a45a8ff 3368 /* Enable DMA Request */
bogdanm 0:9b334a45a8ff 3369 hfmpi2c->Instance->CR1 |= FMPI2C_CR1_RXDMAEN;
bogdanm 0:9b334a45a8ff 3370 }
bogdanm 0:9b334a45a8ff 3371 }
bogdanm 0:9b334a45a8ff 3372 }
bogdanm 0:9b334a45a8ff 3373 else
bogdanm 0:9b334a45a8ff 3374 {
bogdanm 0:9b334a45a8ff 3375 /* No need to Check TC flag, with AUTOEND mode the stop is automatically generated */
bogdanm 0:9b334a45a8ff 3376 /* Wait until STOPF flag is reset */
bogdanm 0:9b334a45a8ff 3377 if(FMPI2C_WaitOnSTOPFlagUntilTimeout(hfmpi2c, FMPI2C_TIMEOUT_STOPF) != HAL_OK)
bogdanm 0:9b334a45a8ff 3378 {
bogdanm 0:9b334a45a8ff 3379 if(hfmpi2c->ErrorCode == HAL_FMPI2C_ERROR_AF)
bogdanm 0:9b334a45a8ff 3380 {
bogdanm 0:9b334a45a8ff 3381 hfmpi2c->ErrorCode |= HAL_FMPI2C_ERROR_AF;
bogdanm 0:9b334a45a8ff 3382 }
bogdanm 0:9b334a45a8ff 3383 else
bogdanm 0:9b334a45a8ff 3384 {
bogdanm 0:9b334a45a8ff 3385 hfmpi2c->ErrorCode |= HAL_FMPI2C_ERROR_TIMEOUT;
bogdanm 0:9b334a45a8ff 3386 }
bogdanm 0:9b334a45a8ff 3387 }
bogdanm 0:9b334a45a8ff 3388
bogdanm 0:9b334a45a8ff 3389 /* Clear STOP Flag */
bogdanm 0:9b334a45a8ff 3390 __HAL_FMPI2C_CLEAR_FLAG(hfmpi2c, FMPI2C_FLAG_STOPF);
bogdanm 0:9b334a45a8ff 3391
bogdanm 0:9b334a45a8ff 3392 /* Clear Configuration Register 2 */
bogdanm 0:9b334a45a8ff 3393 __HAL_FMPI2C_RESET_CR2(hfmpi2c);
bogdanm 0:9b334a45a8ff 3394
bogdanm 0:9b334a45a8ff 3395 /* Disable DMA Request */
bogdanm 0:9b334a45a8ff 3396 hfmpi2c->Instance->CR1 &= ~FMPI2C_CR1_RXDMAEN;
bogdanm 0:9b334a45a8ff 3397
bogdanm 0:9b334a45a8ff 3398 hfmpi2c->XferCount = 0;
bogdanm 0:9b334a45a8ff 3399
bogdanm 0:9b334a45a8ff 3400 hfmpi2c->State = HAL_FMPI2C_STATE_READY;
bogdanm 0:9b334a45a8ff 3401
bogdanm 0:9b334a45a8ff 3402 /* Check if Errors has been detected during transfer */
bogdanm 0:9b334a45a8ff 3403 if(hfmpi2c->ErrorCode != HAL_FMPI2C_ERROR_NONE)
bogdanm 0:9b334a45a8ff 3404 {
bogdanm 0:9b334a45a8ff 3405 HAL_FMPI2C_ErrorCallback(hfmpi2c);
bogdanm 0:9b334a45a8ff 3406 }
bogdanm 0:9b334a45a8ff 3407 else
bogdanm 0:9b334a45a8ff 3408 {
bogdanm 0:9b334a45a8ff 3409 HAL_FMPI2C_MasterRxCpltCallback(hfmpi2c);
bogdanm 0:9b334a45a8ff 3410 }
bogdanm 0:9b334a45a8ff 3411 }
bogdanm 0:9b334a45a8ff 3412 }
bogdanm 0:9b334a45a8ff 3413
bogdanm 0:9b334a45a8ff 3414 /**
bogdanm 0:9b334a45a8ff 3415 * @brief DMA FMPI2C slave receive process complete callback.
bogdanm 0:9b334a45a8ff 3416 * @param hdma: DMA handle
bogdanm 0:9b334a45a8ff 3417 * @retval None
bogdanm 0:9b334a45a8ff 3418 */
bogdanm 0:9b334a45a8ff 3419 static void FMPI2C_DMASlaveReceiveCplt(DMA_HandleTypeDef *hdma)
bogdanm 0:9b334a45a8ff 3420 {
bogdanm 0:9b334a45a8ff 3421 FMPI2C_HandleTypeDef* hfmpi2c = (FMPI2C_HandleTypeDef*)((DMA_HandleTypeDef*)hdma)->Parent;
bogdanm 0:9b334a45a8ff 3422
bogdanm 0:9b334a45a8ff 3423 /* Wait until STOPF flag is reset */
bogdanm 0:9b334a45a8ff 3424 if(FMPI2C_WaitOnSTOPFlagUntilTimeout(hfmpi2c, FMPI2C_TIMEOUT_STOPF) != HAL_OK)
bogdanm 0:9b334a45a8ff 3425 {
bogdanm 0:9b334a45a8ff 3426 if(hfmpi2c->ErrorCode == HAL_FMPI2C_ERROR_AF)
bogdanm 0:9b334a45a8ff 3427 {
bogdanm 0:9b334a45a8ff 3428 hfmpi2c->ErrorCode |= HAL_FMPI2C_ERROR_AF;
bogdanm 0:9b334a45a8ff 3429 }
bogdanm 0:9b334a45a8ff 3430 else
bogdanm 0:9b334a45a8ff 3431 {
bogdanm 0:9b334a45a8ff 3432 hfmpi2c->ErrorCode |= HAL_FMPI2C_ERROR_TIMEOUT;
bogdanm 0:9b334a45a8ff 3433 }
bogdanm 0:9b334a45a8ff 3434 }
bogdanm 0:9b334a45a8ff 3435
bogdanm 0:9b334a45a8ff 3436 /* Clear STOPF flag */
bogdanm 0:9b334a45a8ff 3437 __HAL_FMPI2C_CLEAR_FLAG(hfmpi2c, FMPI2C_FLAG_STOPF);
bogdanm 0:9b334a45a8ff 3438
bogdanm 0:9b334a45a8ff 3439 /* Wait until BUSY flag is reset */
bogdanm 0:9b334a45a8ff 3440 if(FMPI2C_WaitOnFlagUntilTimeout(hfmpi2c, FMPI2C_FLAG_BUSY, SET, FMPI2C_TIMEOUT_BUSY) != HAL_OK)
bogdanm 0:9b334a45a8ff 3441 {
bogdanm 0:9b334a45a8ff 3442 hfmpi2c->ErrorCode |= HAL_FMPI2C_ERROR_TIMEOUT;
bogdanm 0:9b334a45a8ff 3443 }
bogdanm 0:9b334a45a8ff 3444
bogdanm 0:9b334a45a8ff 3445 /* Disable DMA Request */
bogdanm 0:9b334a45a8ff 3446 hfmpi2c->Instance->CR1 &= ~FMPI2C_CR1_RXDMAEN;
bogdanm 0:9b334a45a8ff 3447
bogdanm 0:9b334a45a8ff 3448 /* Disable Address Acknowledge */
bogdanm 0:9b334a45a8ff 3449 hfmpi2c->Instance->CR2 |= FMPI2C_CR2_NACK;
bogdanm 0:9b334a45a8ff 3450
bogdanm 0:9b334a45a8ff 3451 hfmpi2c->XferCount = 0;
bogdanm 0:9b334a45a8ff 3452
bogdanm 0:9b334a45a8ff 3453 hfmpi2c->State = HAL_FMPI2C_STATE_READY;
bogdanm 0:9b334a45a8ff 3454
bogdanm 0:9b334a45a8ff 3455 /* Check if Errors has been detected during transfer */
bogdanm 0:9b334a45a8ff 3456 if(hfmpi2c->ErrorCode != HAL_FMPI2C_ERROR_NONE)
bogdanm 0:9b334a45a8ff 3457 {
bogdanm 0:9b334a45a8ff 3458 HAL_FMPI2C_ErrorCallback(hfmpi2c);
bogdanm 0:9b334a45a8ff 3459 }
bogdanm 0:9b334a45a8ff 3460 else
bogdanm 0:9b334a45a8ff 3461 {
bogdanm 0:9b334a45a8ff 3462 HAL_FMPI2C_SlaveRxCpltCallback(hfmpi2c);
bogdanm 0:9b334a45a8ff 3463 }
bogdanm 0:9b334a45a8ff 3464 }
bogdanm 0:9b334a45a8ff 3465
bogdanm 0:9b334a45a8ff 3466 /**
bogdanm 0:9b334a45a8ff 3467 * @brief DMA FMPI2C Memory Write process complete callback
bogdanm 0:9b334a45a8ff 3468 * @param hdma : DMA handle
bogdanm 0:9b334a45a8ff 3469 * @retval None
bogdanm 0:9b334a45a8ff 3470 */
bogdanm 0:9b334a45a8ff 3471 static void FMPI2C_DMAMemTransmitCplt(DMA_HandleTypeDef *hdma)
bogdanm 0:9b334a45a8ff 3472 {
bogdanm 0:9b334a45a8ff 3473 uint16_t DevAddress;
bogdanm 0:9b334a45a8ff 3474 FMPI2C_HandleTypeDef* hfmpi2c = ( FMPI2C_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
bogdanm 0:9b334a45a8ff 3475
bogdanm 0:9b334a45a8ff 3476 /* Check if last DMA request was done with RELOAD */
bogdanm 0:9b334a45a8ff 3477 /* Set NBYTES to write and reload if size > 255 */
bogdanm 0:9b334a45a8ff 3478 if( (hfmpi2c->XferSize == 255) && (hfmpi2c->XferSize < hfmpi2c->XferCount) )
bogdanm 0:9b334a45a8ff 3479 {
bogdanm 0:9b334a45a8ff 3480 /* Wait until TCR flag is set */
bogdanm 0:9b334a45a8ff 3481 if(FMPI2C_WaitOnFlagUntilTimeout(hfmpi2c, FMPI2C_FLAG_TCR, RESET, FMPI2C_TIMEOUT_TCR) != HAL_OK)
bogdanm 0:9b334a45a8ff 3482 {
bogdanm 0:9b334a45a8ff 3483 hfmpi2c->ErrorCode |= HAL_FMPI2C_ERROR_TIMEOUT;
bogdanm 0:9b334a45a8ff 3484 }
bogdanm 0:9b334a45a8ff 3485
bogdanm 0:9b334a45a8ff 3486 /* Disable DMA Request */
bogdanm 0:9b334a45a8ff 3487 hfmpi2c->Instance->CR1 &= ~FMPI2C_CR1_TXDMAEN;
bogdanm 0:9b334a45a8ff 3488
bogdanm 0:9b334a45a8ff 3489 /* Check if Errors has been detected during transfer */
bogdanm 0:9b334a45a8ff 3490 if(hfmpi2c->ErrorCode != HAL_FMPI2C_ERROR_NONE)
bogdanm 0:9b334a45a8ff 3491 {
bogdanm 0:9b334a45a8ff 3492 /* No need to Check TC flag, with AUTOEND mode the stop is automatically generated */
bogdanm 0:9b334a45a8ff 3493 /* Wait until STOPF flag is reset */
bogdanm 0:9b334a45a8ff 3494 if(FMPI2C_WaitOnSTOPFlagUntilTimeout(hfmpi2c, FMPI2C_TIMEOUT_STOPF) != HAL_OK)
bogdanm 0:9b334a45a8ff 3495 {
bogdanm 0:9b334a45a8ff 3496 if(hfmpi2c->ErrorCode == HAL_FMPI2C_ERROR_AF)
bogdanm 0:9b334a45a8ff 3497 {
bogdanm 0:9b334a45a8ff 3498 hfmpi2c->ErrorCode |= HAL_FMPI2C_ERROR_AF;
bogdanm 0:9b334a45a8ff 3499 }
bogdanm 0:9b334a45a8ff 3500 else
bogdanm 0:9b334a45a8ff 3501 {
bogdanm 0:9b334a45a8ff 3502 hfmpi2c->ErrorCode |= HAL_FMPI2C_ERROR_TIMEOUT;
bogdanm 0:9b334a45a8ff 3503 }
bogdanm 0:9b334a45a8ff 3504 }
bogdanm 0:9b334a45a8ff 3505
bogdanm 0:9b334a45a8ff 3506 /* Clear STOP Flag */
bogdanm 0:9b334a45a8ff 3507 __HAL_FMPI2C_CLEAR_FLAG(hfmpi2c, FMPI2C_FLAG_STOPF);
bogdanm 0:9b334a45a8ff 3508
bogdanm 0:9b334a45a8ff 3509 /* Clear Configuration Register 2 */
bogdanm 0:9b334a45a8ff 3510 __HAL_FMPI2C_RESET_CR2(hfmpi2c);
bogdanm 0:9b334a45a8ff 3511
bogdanm 0:9b334a45a8ff 3512 hfmpi2c->XferCount = 0;
bogdanm 0:9b334a45a8ff 3513
bogdanm 0:9b334a45a8ff 3514 hfmpi2c->State = HAL_FMPI2C_STATE_READY;
bogdanm 0:9b334a45a8ff 3515 HAL_FMPI2C_ErrorCallback(hfmpi2c);
bogdanm 0:9b334a45a8ff 3516 }
bogdanm 0:9b334a45a8ff 3517 else
bogdanm 0:9b334a45a8ff 3518 {
bogdanm 0:9b334a45a8ff 3519 hfmpi2c->pBuffPtr += hfmpi2c->XferSize;
bogdanm 0:9b334a45a8ff 3520 hfmpi2c->XferCount -= hfmpi2c->XferSize;
bogdanm 0:9b334a45a8ff 3521 if(hfmpi2c->XferCount > 255)
bogdanm 0:9b334a45a8ff 3522 {
bogdanm 0:9b334a45a8ff 3523 hfmpi2c->XferSize = 255;
bogdanm 0:9b334a45a8ff 3524 }
bogdanm 0:9b334a45a8ff 3525 else
bogdanm 0:9b334a45a8ff 3526 {
bogdanm 0:9b334a45a8ff 3527 hfmpi2c->XferSize = hfmpi2c->XferCount;
bogdanm 0:9b334a45a8ff 3528 }
bogdanm 0:9b334a45a8ff 3529
bogdanm 0:9b334a45a8ff 3530 DevAddress = (hfmpi2c->Instance->CR2 & FMPI2C_CR2_SADD);
bogdanm 0:9b334a45a8ff 3531
bogdanm 0:9b334a45a8ff 3532 /* Enable the DMA channel */
bogdanm 0:9b334a45a8ff 3533 HAL_DMA_Start_IT(hfmpi2c->hdmatx, (uint32_t)hfmpi2c->pBuffPtr, (uint32_t)&hfmpi2c->Instance->TXDR, hfmpi2c->XferSize);
bogdanm 0:9b334a45a8ff 3534
bogdanm 0:9b334a45a8ff 3535 /* Send Slave Address */
bogdanm 0:9b334a45a8ff 3536 /* Set NBYTES to write and reload if size > 255 */
bogdanm 0:9b334a45a8ff 3537 if( (hfmpi2c->XferSize == 255) && (hfmpi2c->XferSize < hfmpi2c->XferCount) )
bogdanm 0:9b334a45a8ff 3538 {
bogdanm 0:9b334a45a8ff 3539 FMPI2C_TransferConfig(hfmpi2c,DevAddress,hfmpi2c->XferSize, FMPI2C_RELOAD_MODE, FMPI2C_NO_STARTSTOP);
bogdanm 0:9b334a45a8ff 3540 }
bogdanm 0:9b334a45a8ff 3541 else
bogdanm 0:9b334a45a8ff 3542 {
bogdanm 0:9b334a45a8ff 3543 FMPI2C_TransferConfig(hfmpi2c,DevAddress,hfmpi2c->XferSize, FMPI2C_AUTOEND_MODE, FMPI2C_NO_STARTSTOP);
bogdanm 0:9b334a45a8ff 3544 }
bogdanm 0:9b334a45a8ff 3545
bogdanm 0:9b334a45a8ff 3546 /* Wait until TXIS flag is set */
bogdanm 0:9b334a45a8ff 3547 if(FMPI2C_WaitOnTXISFlagUntilTimeout(hfmpi2c, FMPI2C_TIMEOUT_TXIS) != HAL_OK)
bogdanm 0:9b334a45a8ff 3548 {
bogdanm 0:9b334a45a8ff 3549 /* No need to Check TC flag, with AUTOEND mode the stop is automatically generated */
bogdanm 0:9b334a45a8ff 3550 /* Wait until STOPF flag is reset */
bogdanm 0:9b334a45a8ff 3551 if(FMPI2C_WaitOnSTOPFlagUntilTimeout(hfmpi2c, FMPI2C_TIMEOUT_STOPF) != HAL_OK)
bogdanm 0:9b334a45a8ff 3552 {
bogdanm 0:9b334a45a8ff 3553 if(hfmpi2c->ErrorCode == HAL_FMPI2C_ERROR_AF)
bogdanm 0:9b334a45a8ff 3554 {
bogdanm 0:9b334a45a8ff 3555 hfmpi2c->ErrorCode |= HAL_FMPI2C_ERROR_AF;
bogdanm 0:9b334a45a8ff 3556 }
bogdanm 0:9b334a45a8ff 3557 else
bogdanm 0:9b334a45a8ff 3558 {
bogdanm 0:9b334a45a8ff 3559 hfmpi2c->ErrorCode |= HAL_FMPI2C_ERROR_TIMEOUT;
bogdanm 0:9b334a45a8ff 3560 }
bogdanm 0:9b334a45a8ff 3561 }
bogdanm 0:9b334a45a8ff 3562
bogdanm 0:9b334a45a8ff 3563 /* Clear STOP Flag */
bogdanm 0:9b334a45a8ff 3564 __HAL_FMPI2C_CLEAR_FLAG(hfmpi2c, FMPI2C_FLAG_STOPF);
bogdanm 0:9b334a45a8ff 3565
bogdanm 0:9b334a45a8ff 3566 /* Clear Configuration Register 2 */
bogdanm 0:9b334a45a8ff 3567 __HAL_FMPI2C_RESET_CR2(hfmpi2c);
bogdanm 0:9b334a45a8ff 3568
bogdanm 0:9b334a45a8ff 3569 hfmpi2c->XferCount = 0;
bogdanm 0:9b334a45a8ff 3570
bogdanm 0:9b334a45a8ff 3571 hfmpi2c->State = HAL_FMPI2C_STATE_READY;
bogdanm 0:9b334a45a8ff 3572 HAL_FMPI2C_ErrorCallback(hfmpi2c);
bogdanm 0:9b334a45a8ff 3573 }
bogdanm 0:9b334a45a8ff 3574 else
bogdanm 0:9b334a45a8ff 3575 {
bogdanm 0:9b334a45a8ff 3576 /* Enable DMA Request */
bogdanm 0:9b334a45a8ff 3577 hfmpi2c->Instance->CR1 |= FMPI2C_CR1_TXDMAEN;
bogdanm 0:9b334a45a8ff 3578 }
bogdanm 0:9b334a45a8ff 3579 }
bogdanm 0:9b334a45a8ff 3580 }
bogdanm 0:9b334a45a8ff 3581 else
bogdanm 0:9b334a45a8ff 3582 {
bogdanm 0:9b334a45a8ff 3583 /* No need to Check TC flag, with AUTOEND mode the stop is automatically generated */
bogdanm 0:9b334a45a8ff 3584 /* Wait until STOPF flag is reset */
bogdanm 0:9b334a45a8ff 3585 if(FMPI2C_WaitOnSTOPFlagUntilTimeout(hfmpi2c, FMPI2C_TIMEOUT_STOPF) != HAL_OK)
bogdanm 0:9b334a45a8ff 3586 {
bogdanm 0:9b334a45a8ff 3587 if(hfmpi2c->ErrorCode == HAL_FMPI2C_ERROR_AF)
bogdanm 0:9b334a45a8ff 3588 {
bogdanm 0:9b334a45a8ff 3589 hfmpi2c->ErrorCode |= HAL_FMPI2C_ERROR_AF;
bogdanm 0:9b334a45a8ff 3590 }
bogdanm 0:9b334a45a8ff 3591 else
bogdanm 0:9b334a45a8ff 3592 {
bogdanm 0:9b334a45a8ff 3593 hfmpi2c->ErrorCode |= HAL_FMPI2C_ERROR_TIMEOUT;
bogdanm 0:9b334a45a8ff 3594 }
bogdanm 0:9b334a45a8ff 3595 }
bogdanm 0:9b334a45a8ff 3596
bogdanm 0:9b334a45a8ff 3597 /* Clear STOP Flag */
bogdanm 0:9b334a45a8ff 3598 __HAL_FMPI2C_CLEAR_FLAG(hfmpi2c, FMPI2C_FLAG_STOPF);
bogdanm 0:9b334a45a8ff 3599
bogdanm 0:9b334a45a8ff 3600 /* Clear Configuration Register 2 */
bogdanm 0:9b334a45a8ff 3601 __HAL_FMPI2C_RESET_CR2(hfmpi2c);
bogdanm 0:9b334a45a8ff 3602
bogdanm 0:9b334a45a8ff 3603 /* Disable DMA Request */
bogdanm 0:9b334a45a8ff 3604 hfmpi2c->Instance->CR1 &= ~FMPI2C_CR1_TXDMAEN;
bogdanm 0:9b334a45a8ff 3605
bogdanm 0:9b334a45a8ff 3606 hfmpi2c->XferCount = 0;
bogdanm 0:9b334a45a8ff 3607
bogdanm 0:9b334a45a8ff 3608 hfmpi2c->State = HAL_FMPI2C_STATE_READY;
bogdanm 0:9b334a45a8ff 3609
bogdanm 0:9b334a45a8ff 3610 /* Check if Errors has been detected during transfer */
bogdanm 0:9b334a45a8ff 3611 if(hfmpi2c->ErrorCode != HAL_FMPI2C_ERROR_NONE)
bogdanm 0:9b334a45a8ff 3612 {
bogdanm 0:9b334a45a8ff 3613 HAL_FMPI2C_ErrorCallback(hfmpi2c);
bogdanm 0:9b334a45a8ff 3614 }
bogdanm 0:9b334a45a8ff 3615 else
bogdanm 0:9b334a45a8ff 3616 {
bogdanm 0:9b334a45a8ff 3617 HAL_FMPI2C_MemTxCpltCallback(hfmpi2c);
bogdanm 0:9b334a45a8ff 3618 }
bogdanm 0:9b334a45a8ff 3619 }
bogdanm 0:9b334a45a8ff 3620 }
bogdanm 0:9b334a45a8ff 3621
bogdanm 0:9b334a45a8ff 3622 /**
bogdanm 0:9b334a45a8ff 3623 * @brief DMA FMPI2C Memory Read process complete callback
bogdanm 0:9b334a45a8ff 3624 * @param hdma: DMA handle
bogdanm 0:9b334a45a8ff 3625 * @retval None
bogdanm 0:9b334a45a8ff 3626 */
bogdanm 0:9b334a45a8ff 3627 static void FMPI2C_DMAMemReceiveCplt(DMA_HandleTypeDef *hdma)
bogdanm 0:9b334a45a8ff 3628 {
bogdanm 0:9b334a45a8ff 3629 FMPI2C_HandleTypeDef* hfmpi2c = ( FMPI2C_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
bogdanm 0:9b334a45a8ff 3630 uint16_t DevAddress;
bogdanm 0:9b334a45a8ff 3631
bogdanm 0:9b334a45a8ff 3632 /* Check if last DMA request was done with RELOAD */
bogdanm 0:9b334a45a8ff 3633 /* Set NBYTES to write and reload if size > 255 */
bogdanm 0:9b334a45a8ff 3634 if( (hfmpi2c->XferSize == 255) && (hfmpi2c->XferSize < hfmpi2c->XferCount) )
bogdanm 0:9b334a45a8ff 3635 {
bogdanm 0:9b334a45a8ff 3636 /* Wait until TCR flag is set */
bogdanm 0:9b334a45a8ff 3637 if(FMPI2C_WaitOnFlagUntilTimeout(hfmpi2c, FMPI2C_FLAG_TCR, RESET, FMPI2C_TIMEOUT_TCR) != HAL_OK)
bogdanm 0:9b334a45a8ff 3638 {
bogdanm 0:9b334a45a8ff 3639 hfmpi2c->ErrorCode |= HAL_FMPI2C_ERROR_TIMEOUT;
bogdanm 0:9b334a45a8ff 3640 }
bogdanm 0:9b334a45a8ff 3641
bogdanm 0:9b334a45a8ff 3642 /* Disable DMA Request */
bogdanm 0:9b334a45a8ff 3643 hfmpi2c->Instance->CR1 &= ~FMPI2C_CR1_RXDMAEN;
bogdanm 0:9b334a45a8ff 3644
bogdanm 0:9b334a45a8ff 3645 /* Check if Errors has been detected during transfer */
bogdanm 0:9b334a45a8ff 3646 if(hfmpi2c->ErrorCode != HAL_FMPI2C_ERROR_NONE)
bogdanm 0:9b334a45a8ff 3647 {
bogdanm 0:9b334a45a8ff 3648 /* No need to Check TC flag, with AUTOEND mode the stop is automatically generated */
bogdanm 0:9b334a45a8ff 3649 /* Wait until STOPF flag is reset */
bogdanm 0:9b334a45a8ff 3650 if(FMPI2C_WaitOnSTOPFlagUntilTimeout(hfmpi2c, FMPI2C_TIMEOUT_STOPF) != HAL_OK)
bogdanm 0:9b334a45a8ff 3651 {
bogdanm 0:9b334a45a8ff 3652 if(hfmpi2c->ErrorCode == HAL_FMPI2C_ERROR_AF)
bogdanm 0:9b334a45a8ff 3653 {
bogdanm 0:9b334a45a8ff 3654 hfmpi2c->ErrorCode |= HAL_FMPI2C_ERROR_AF;
bogdanm 0:9b334a45a8ff 3655 }
bogdanm 0:9b334a45a8ff 3656 else
bogdanm 0:9b334a45a8ff 3657 {
bogdanm 0:9b334a45a8ff 3658 hfmpi2c->ErrorCode |= HAL_FMPI2C_ERROR_TIMEOUT;
bogdanm 0:9b334a45a8ff 3659 }
bogdanm 0:9b334a45a8ff 3660 }
bogdanm 0:9b334a45a8ff 3661
bogdanm 0:9b334a45a8ff 3662 /* Clear STOP Flag */
bogdanm 0:9b334a45a8ff 3663 __HAL_FMPI2C_CLEAR_FLAG(hfmpi2c, FMPI2C_FLAG_STOPF);
bogdanm 0:9b334a45a8ff 3664
bogdanm 0:9b334a45a8ff 3665 /* Clear Configuration Register 2 */
bogdanm 0:9b334a45a8ff 3666 __HAL_FMPI2C_RESET_CR2(hfmpi2c);
bogdanm 0:9b334a45a8ff 3667
bogdanm 0:9b334a45a8ff 3668 hfmpi2c->XferCount = 0;
bogdanm 0:9b334a45a8ff 3669
bogdanm 0:9b334a45a8ff 3670 hfmpi2c->State = HAL_FMPI2C_STATE_READY;
bogdanm 0:9b334a45a8ff 3671 HAL_FMPI2C_ErrorCallback(hfmpi2c);
bogdanm 0:9b334a45a8ff 3672 }
bogdanm 0:9b334a45a8ff 3673 else
bogdanm 0:9b334a45a8ff 3674 {
bogdanm 0:9b334a45a8ff 3675 hfmpi2c->pBuffPtr += hfmpi2c->XferSize;
bogdanm 0:9b334a45a8ff 3676 hfmpi2c->XferCount -= hfmpi2c->XferSize;
bogdanm 0:9b334a45a8ff 3677 if(hfmpi2c->XferCount > 255)
bogdanm 0:9b334a45a8ff 3678 {
bogdanm 0:9b334a45a8ff 3679 hfmpi2c->XferSize = 255;
bogdanm 0:9b334a45a8ff 3680 }
bogdanm 0:9b334a45a8ff 3681 else
bogdanm 0:9b334a45a8ff 3682 {
bogdanm 0:9b334a45a8ff 3683 hfmpi2c->XferSize = hfmpi2c->XferCount;
bogdanm 0:9b334a45a8ff 3684 }
bogdanm 0:9b334a45a8ff 3685
bogdanm 0:9b334a45a8ff 3686 DevAddress = (hfmpi2c->Instance->CR2 & FMPI2C_CR2_SADD);
bogdanm 0:9b334a45a8ff 3687
bogdanm 0:9b334a45a8ff 3688 /* Enable the DMA channel */
bogdanm 0:9b334a45a8ff 3689 HAL_DMA_Start_IT(hfmpi2c->hdmarx, (uint32_t)&hfmpi2c->Instance->RXDR, (uint32_t)hfmpi2c->pBuffPtr, hfmpi2c->XferSize);
bogdanm 0:9b334a45a8ff 3690
bogdanm 0:9b334a45a8ff 3691 /* Send Slave Address */
bogdanm 0:9b334a45a8ff 3692 /* Set NBYTES to write and reload if size > 255 */
bogdanm 0:9b334a45a8ff 3693 if( (hfmpi2c->XferSize == 255) && (hfmpi2c->XferSize < hfmpi2c->XferCount) )
bogdanm 0:9b334a45a8ff 3694 {
bogdanm 0:9b334a45a8ff 3695 FMPI2C_TransferConfig(hfmpi2c,DevAddress,hfmpi2c->XferSize, FMPI2C_RELOAD_MODE, FMPI2C_NO_STARTSTOP);
bogdanm 0:9b334a45a8ff 3696 }
bogdanm 0:9b334a45a8ff 3697 else
bogdanm 0:9b334a45a8ff 3698 {
bogdanm 0:9b334a45a8ff 3699 FMPI2C_TransferConfig(hfmpi2c,DevAddress,hfmpi2c->XferSize, FMPI2C_AUTOEND_MODE, FMPI2C_NO_STARTSTOP);
bogdanm 0:9b334a45a8ff 3700 }
bogdanm 0:9b334a45a8ff 3701
bogdanm 0:9b334a45a8ff 3702 /* Wait until RXNE flag is set */
bogdanm 0:9b334a45a8ff 3703 if(FMPI2C_WaitOnFlagUntilTimeout(hfmpi2c, FMPI2C_FLAG_RXNE, RESET, FMPI2C_TIMEOUT_RXNE) != HAL_OK)
bogdanm 0:9b334a45a8ff 3704 {
bogdanm 0:9b334a45a8ff 3705 hfmpi2c->ErrorCode |= HAL_FMPI2C_ERROR_TIMEOUT;
bogdanm 0:9b334a45a8ff 3706 }
bogdanm 0:9b334a45a8ff 3707
bogdanm 0:9b334a45a8ff 3708 /* Check if Errors has been detected during transfer */
bogdanm 0:9b334a45a8ff 3709 if(hfmpi2c->ErrorCode != HAL_FMPI2C_ERROR_NONE)
bogdanm 0:9b334a45a8ff 3710 {
bogdanm 0:9b334a45a8ff 3711 /* No need to Check TC flag, with AUTOEND mode the stop is automatically generated */
bogdanm 0:9b334a45a8ff 3712 /* Wait until STOPF flag is reset */
bogdanm 0:9b334a45a8ff 3713 if(FMPI2C_WaitOnSTOPFlagUntilTimeout(hfmpi2c, FMPI2C_TIMEOUT_STOPF) != HAL_OK)
bogdanm 0:9b334a45a8ff 3714 {
bogdanm 0:9b334a45a8ff 3715 if(hfmpi2c->ErrorCode == HAL_FMPI2C_ERROR_AF)
bogdanm 0:9b334a45a8ff 3716 {
bogdanm 0:9b334a45a8ff 3717 hfmpi2c->ErrorCode |= HAL_FMPI2C_ERROR_AF;
bogdanm 0:9b334a45a8ff 3718 }
bogdanm 0:9b334a45a8ff 3719 else
bogdanm 0:9b334a45a8ff 3720 {
bogdanm 0:9b334a45a8ff 3721 hfmpi2c->ErrorCode |= HAL_FMPI2C_ERROR_TIMEOUT;
bogdanm 0:9b334a45a8ff 3722 }
bogdanm 0:9b334a45a8ff 3723 }
bogdanm 0:9b334a45a8ff 3724
bogdanm 0:9b334a45a8ff 3725 /* Clear STOP Flag */
bogdanm 0:9b334a45a8ff 3726 __HAL_FMPI2C_CLEAR_FLAG(hfmpi2c, FMPI2C_FLAG_STOPF);
bogdanm 0:9b334a45a8ff 3727
bogdanm 0:9b334a45a8ff 3728 /* Clear Configuration Register 2 */
bogdanm 0:9b334a45a8ff 3729 __HAL_FMPI2C_RESET_CR2(hfmpi2c);
bogdanm 0:9b334a45a8ff 3730
bogdanm 0:9b334a45a8ff 3731 hfmpi2c->XferCount = 0;
bogdanm 0:9b334a45a8ff 3732
bogdanm 0:9b334a45a8ff 3733 hfmpi2c->State = HAL_FMPI2C_STATE_READY;
bogdanm 0:9b334a45a8ff 3734 HAL_FMPI2C_ErrorCallback(hfmpi2c);
bogdanm 0:9b334a45a8ff 3735 }
bogdanm 0:9b334a45a8ff 3736 else
bogdanm 0:9b334a45a8ff 3737 {
bogdanm 0:9b334a45a8ff 3738 /* Enable DMA Request */
bogdanm 0:9b334a45a8ff 3739 hfmpi2c->Instance->CR1 |= FMPI2C_CR1_RXDMAEN;
bogdanm 0:9b334a45a8ff 3740 }
bogdanm 0:9b334a45a8ff 3741 }
bogdanm 0:9b334a45a8ff 3742 }
bogdanm 0:9b334a45a8ff 3743 else
bogdanm 0:9b334a45a8ff 3744 {
bogdanm 0:9b334a45a8ff 3745 /* No need to Check TC flag, with AUTOEND mode the stop is automatically generated */
bogdanm 0:9b334a45a8ff 3746 /* Wait until STOPF flag is reset */
bogdanm 0:9b334a45a8ff 3747 if(FMPI2C_WaitOnSTOPFlagUntilTimeout(hfmpi2c, FMPI2C_TIMEOUT_STOPF) != HAL_OK)
bogdanm 0:9b334a45a8ff 3748 {
bogdanm 0:9b334a45a8ff 3749 if(hfmpi2c->ErrorCode == HAL_FMPI2C_ERROR_AF)
bogdanm 0:9b334a45a8ff 3750 {
bogdanm 0:9b334a45a8ff 3751 hfmpi2c->ErrorCode |= HAL_FMPI2C_ERROR_AF;
bogdanm 0:9b334a45a8ff 3752 }
bogdanm 0:9b334a45a8ff 3753 else
bogdanm 0:9b334a45a8ff 3754 {
bogdanm 0:9b334a45a8ff 3755 hfmpi2c->ErrorCode |= HAL_FMPI2C_ERROR_TIMEOUT;
bogdanm 0:9b334a45a8ff 3756 }
bogdanm 0:9b334a45a8ff 3757 }
bogdanm 0:9b334a45a8ff 3758
bogdanm 0:9b334a45a8ff 3759 /* Clear STOP Flag */
bogdanm 0:9b334a45a8ff 3760 __HAL_FMPI2C_CLEAR_FLAG(hfmpi2c, FMPI2C_FLAG_STOPF);
bogdanm 0:9b334a45a8ff 3761
bogdanm 0:9b334a45a8ff 3762 /* Clear Configuration Register 2 */
bogdanm 0:9b334a45a8ff 3763 __HAL_FMPI2C_RESET_CR2(hfmpi2c);
bogdanm 0:9b334a45a8ff 3764
bogdanm 0:9b334a45a8ff 3765 /* Disable DMA Request */
bogdanm 0:9b334a45a8ff 3766 hfmpi2c->Instance->CR1 &= ~FMPI2C_CR1_RXDMAEN;
bogdanm 0:9b334a45a8ff 3767
bogdanm 0:9b334a45a8ff 3768 hfmpi2c->XferCount = 0;
bogdanm 0:9b334a45a8ff 3769
bogdanm 0:9b334a45a8ff 3770 hfmpi2c->State = HAL_FMPI2C_STATE_READY;
bogdanm 0:9b334a45a8ff 3771
bogdanm 0:9b334a45a8ff 3772 /* Check if Errors has been detected during transfer */
bogdanm 0:9b334a45a8ff 3773 if(hfmpi2c->ErrorCode != HAL_FMPI2C_ERROR_NONE)
bogdanm 0:9b334a45a8ff 3774 {
bogdanm 0:9b334a45a8ff 3775 HAL_FMPI2C_ErrorCallback(hfmpi2c);
bogdanm 0:9b334a45a8ff 3776 }
bogdanm 0:9b334a45a8ff 3777 else
bogdanm 0:9b334a45a8ff 3778 {
bogdanm 0:9b334a45a8ff 3779 HAL_FMPI2C_MemRxCpltCallback(hfmpi2c);
bogdanm 0:9b334a45a8ff 3780 }
bogdanm 0:9b334a45a8ff 3781 }
bogdanm 0:9b334a45a8ff 3782 }
bogdanm 0:9b334a45a8ff 3783
bogdanm 0:9b334a45a8ff 3784 /**
bogdanm 0:9b334a45a8ff 3785 * @brief DMA FMPI2C communication error callback.
bogdanm 0:9b334a45a8ff 3786 * @param hdma : DMA handle
bogdanm 0:9b334a45a8ff 3787 * @retval None
bogdanm 0:9b334a45a8ff 3788 */
bogdanm 0:9b334a45a8ff 3789 static void FMPI2C_DMAError(DMA_HandleTypeDef *hdma)
bogdanm 0:9b334a45a8ff 3790 {
bogdanm 0:9b334a45a8ff 3791 FMPI2C_HandleTypeDef* hfmpi2c = ( FMPI2C_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
bogdanm 0:9b334a45a8ff 3792
bogdanm 0:9b334a45a8ff 3793 /* Disable Acknowledge */
bogdanm 0:9b334a45a8ff 3794 hfmpi2c->Instance->CR2 |= FMPI2C_CR2_NACK;
bogdanm 0:9b334a45a8ff 3795
bogdanm 0:9b334a45a8ff 3796 hfmpi2c->XferCount = 0;
bogdanm 0:9b334a45a8ff 3797
bogdanm 0:9b334a45a8ff 3798 hfmpi2c->State = HAL_FMPI2C_STATE_READY;
bogdanm 0:9b334a45a8ff 3799
bogdanm 0:9b334a45a8ff 3800 hfmpi2c->ErrorCode |= HAL_FMPI2C_ERROR_DMA;
bogdanm 0:9b334a45a8ff 3801
bogdanm 0:9b334a45a8ff 3802 HAL_FMPI2C_ErrorCallback(hfmpi2c);
bogdanm 0:9b334a45a8ff 3803 }
bogdanm 0:9b334a45a8ff 3804
bogdanm 0:9b334a45a8ff 3805 /**
bogdanm 0:9b334a45a8ff 3806 * @brief This function handles FMPI2C Communication Timeout.
bogdanm 0:9b334a45a8ff 3807 * @param hfmpi2c : Pointer to a FMPI2C_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 3808 * the configuration information for the specified FMPI2C.
bogdanm 0:9b334a45a8ff 3809 * @param Flag: specifies the FMPI2C flag to check.
bogdanm 0:9b334a45a8ff 3810 * @param Status: The new Flag status (SET or RESET).
bogdanm 0:9b334a45a8ff 3811 * @param Timeout: Timeout duration
bogdanm 0:9b334a45a8ff 3812 * @retval HAL status
bogdanm 0:9b334a45a8ff 3813 */
bogdanm 0:9b334a45a8ff 3814 static HAL_StatusTypeDef FMPI2C_WaitOnFlagUntilTimeout(FMPI2C_HandleTypeDef *hfmpi2c, uint32_t Flag, FlagStatus Status, uint32_t Timeout)
bogdanm 0:9b334a45a8ff 3815 {
bogdanm 0:9b334a45a8ff 3816 uint32_t tickstart = HAL_GetTick();
bogdanm 0:9b334a45a8ff 3817
bogdanm 0:9b334a45a8ff 3818 /* Wait until flag is set */
bogdanm 0:9b334a45a8ff 3819 if(Status == RESET)
bogdanm 0:9b334a45a8ff 3820 {
bogdanm 0:9b334a45a8ff 3821 while(__HAL_FMPI2C_GET_FLAG(hfmpi2c, Flag) == RESET)
bogdanm 0:9b334a45a8ff 3822 {
bogdanm 0:9b334a45a8ff 3823 /* Check for the Timeout */
bogdanm 0:9b334a45a8ff 3824 if(Timeout != HAL_MAX_DELAY)
bogdanm 0:9b334a45a8ff 3825 {
bogdanm 0:9b334a45a8ff 3826 if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout))
bogdanm 0:9b334a45a8ff 3827 {
bogdanm 0:9b334a45a8ff 3828 hfmpi2c->State= HAL_FMPI2C_STATE_READY;
bogdanm 0:9b334a45a8ff 3829 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 3830 __HAL_UNLOCK(hfmpi2c);
bogdanm 0:9b334a45a8ff 3831 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 3832 }
bogdanm 0:9b334a45a8ff 3833 }
bogdanm 0:9b334a45a8ff 3834 }
bogdanm 0:9b334a45a8ff 3835 }
bogdanm 0:9b334a45a8ff 3836 else
bogdanm 0:9b334a45a8ff 3837 {
bogdanm 0:9b334a45a8ff 3838 while(__HAL_FMPI2C_GET_FLAG(hfmpi2c, Flag) != RESET)
bogdanm 0:9b334a45a8ff 3839 {
bogdanm 0:9b334a45a8ff 3840 /* Check for the Timeout */
bogdanm 0:9b334a45a8ff 3841 if(Timeout != HAL_MAX_DELAY)
bogdanm 0:9b334a45a8ff 3842 {
bogdanm 0:9b334a45a8ff 3843 if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout))
bogdanm 0:9b334a45a8ff 3844 {
bogdanm 0:9b334a45a8ff 3845 hfmpi2c->State= HAL_FMPI2C_STATE_READY;
bogdanm 0:9b334a45a8ff 3846 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 3847 __HAL_UNLOCK(hfmpi2c);
bogdanm 0:9b334a45a8ff 3848 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 3849 }
bogdanm 0:9b334a45a8ff 3850 }
bogdanm 0:9b334a45a8ff 3851 }
bogdanm 0:9b334a45a8ff 3852 }
bogdanm 0:9b334a45a8ff 3853 return HAL_OK;
bogdanm 0:9b334a45a8ff 3854 }
bogdanm 0:9b334a45a8ff 3855
bogdanm 0:9b334a45a8ff 3856 /**
bogdanm 0:9b334a45a8ff 3857 * @brief This function handles FMPI2C Communication Timeout for specific usage of TXIS flag.
bogdanm 0:9b334a45a8ff 3858 * @param hfmpi2c : Pointer to a FMPI2C_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 3859 * the configuration information for the specified FMPI2C.
bogdanm 0:9b334a45a8ff 3860 * @param Timeout: Timeout duration
bogdanm 0:9b334a45a8ff 3861 * @retval HAL status
bogdanm 0:9b334a45a8ff 3862 */
bogdanm 0:9b334a45a8ff 3863 static HAL_StatusTypeDef FMPI2C_WaitOnTXISFlagUntilTimeout(FMPI2C_HandleTypeDef *hfmpi2c, uint32_t Timeout)
bogdanm 0:9b334a45a8ff 3864 {
bogdanm 0:9b334a45a8ff 3865 uint32_t tickstart = HAL_GetTick();
bogdanm 0:9b334a45a8ff 3866
bogdanm 0:9b334a45a8ff 3867 while(__HAL_FMPI2C_GET_FLAG(hfmpi2c, FMPI2C_FLAG_TXIS) == RESET)
bogdanm 0:9b334a45a8ff 3868 {
bogdanm 0:9b334a45a8ff 3869 /* Check if a NACK is detected */
bogdanm 0:9b334a45a8ff 3870 if(FMPI2C_IsAcknowledgeFailed(hfmpi2c, Timeout) != HAL_OK)
bogdanm 0:9b334a45a8ff 3871 {
bogdanm 0:9b334a45a8ff 3872 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 3873 }
bogdanm 0:9b334a45a8ff 3874
bogdanm 0:9b334a45a8ff 3875 /* Check for the Timeout */
bogdanm 0:9b334a45a8ff 3876 if(Timeout != HAL_MAX_DELAY)
bogdanm 0:9b334a45a8ff 3877 {
bogdanm 0:9b334a45a8ff 3878 if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout))
bogdanm 0:9b334a45a8ff 3879 {
bogdanm 0:9b334a45a8ff 3880 hfmpi2c->ErrorCode |= HAL_FMPI2C_ERROR_TIMEOUT;
bogdanm 0:9b334a45a8ff 3881 hfmpi2c->State= HAL_FMPI2C_STATE_READY;
bogdanm 0:9b334a45a8ff 3882
bogdanm 0:9b334a45a8ff 3883 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 3884 __HAL_UNLOCK(hfmpi2c);
bogdanm 0:9b334a45a8ff 3885
bogdanm 0:9b334a45a8ff 3886 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 3887 }
bogdanm 0:9b334a45a8ff 3888 }
bogdanm 0:9b334a45a8ff 3889 }
bogdanm 0:9b334a45a8ff 3890 return HAL_OK;
bogdanm 0:9b334a45a8ff 3891 }
bogdanm 0:9b334a45a8ff 3892
bogdanm 0:9b334a45a8ff 3893 /**
bogdanm 0:9b334a45a8ff 3894 * @brief This function handles FMPI2C Communication Timeout for specific usage of STOP flag.
bogdanm 0:9b334a45a8ff 3895 * @param hfmpi2c : Pointer to a FMPI2C_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 3896 * the configuration information for the specified FMPI2C.
bogdanm 0:9b334a45a8ff 3897 * @param Timeout: Timeout duration
bogdanm 0:9b334a45a8ff 3898 * @retval HAL status
bogdanm 0:9b334a45a8ff 3899 */
bogdanm 0:9b334a45a8ff 3900 static HAL_StatusTypeDef FMPI2C_WaitOnSTOPFlagUntilTimeout(FMPI2C_HandleTypeDef *hfmpi2c, uint32_t Timeout)
bogdanm 0:9b334a45a8ff 3901 {
bogdanm 0:9b334a45a8ff 3902 uint32_t tickstart = 0x00;
bogdanm 0:9b334a45a8ff 3903 tickstart = HAL_GetTick();
bogdanm 0:9b334a45a8ff 3904
bogdanm 0:9b334a45a8ff 3905 while(__HAL_FMPI2C_GET_FLAG(hfmpi2c, FMPI2C_FLAG_STOPF) == RESET)
bogdanm 0:9b334a45a8ff 3906 {
bogdanm 0:9b334a45a8ff 3907 /* Check if a NACK is detected */
bogdanm 0:9b334a45a8ff 3908 if(FMPI2C_IsAcknowledgeFailed(hfmpi2c, Timeout) != HAL_OK)
bogdanm 0:9b334a45a8ff 3909 {
bogdanm 0:9b334a45a8ff 3910 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 3911 }
bogdanm 0:9b334a45a8ff 3912
bogdanm 0:9b334a45a8ff 3913 /* Check for the Timeout */
bogdanm 0:9b334a45a8ff 3914 if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout))
bogdanm 0:9b334a45a8ff 3915 {
bogdanm 0:9b334a45a8ff 3916 hfmpi2c->ErrorCode |= HAL_FMPI2C_ERROR_TIMEOUT;
bogdanm 0:9b334a45a8ff 3917 hfmpi2c->State= HAL_FMPI2C_STATE_READY;
bogdanm 0:9b334a45a8ff 3918
bogdanm 0:9b334a45a8ff 3919 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 3920 __HAL_UNLOCK(hfmpi2c);
bogdanm 0:9b334a45a8ff 3921
bogdanm 0:9b334a45a8ff 3922 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 3923 }
bogdanm 0:9b334a45a8ff 3924 }
bogdanm 0:9b334a45a8ff 3925 return HAL_OK;
bogdanm 0:9b334a45a8ff 3926 }
bogdanm 0:9b334a45a8ff 3927
bogdanm 0:9b334a45a8ff 3928 /**
bogdanm 0:9b334a45a8ff 3929 * @brief This function handles FMPI2C Communication Timeout for specific usage of RXNE flag.
bogdanm 0:9b334a45a8ff 3930 * @param hfmpi2c : Pointer to a FMPI2C_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 3931 * the configuration information for the specified FMPI2C.
bogdanm 0:9b334a45a8ff 3932 * @param Timeout: Timeout duration
bogdanm 0:9b334a45a8ff 3933 * @retval HAL status
bogdanm 0:9b334a45a8ff 3934 */
bogdanm 0:9b334a45a8ff 3935 static HAL_StatusTypeDef FMPI2C_WaitOnRXNEFlagUntilTimeout(FMPI2C_HandleTypeDef *hfmpi2c, uint32_t Timeout)
bogdanm 0:9b334a45a8ff 3936 {
bogdanm 0:9b334a45a8ff 3937 uint32_t tickstart = 0x00;
bogdanm 0:9b334a45a8ff 3938 tickstart = HAL_GetTick();
bogdanm 0:9b334a45a8ff 3939
bogdanm 0:9b334a45a8ff 3940 while(__HAL_FMPI2C_GET_FLAG(hfmpi2c, FMPI2C_FLAG_RXNE) == RESET)
bogdanm 0:9b334a45a8ff 3941 {
bogdanm 0:9b334a45a8ff 3942 /* Check if a STOPF is detected */
bogdanm 0:9b334a45a8ff 3943 if(__HAL_FMPI2C_GET_FLAG(hfmpi2c, FMPI2C_FLAG_STOPF) == SET)
bogdanm 0:9b334a45a8ff 3944 {
bogdanm 0:9b334a45a8ff 3945 /* Clear STOP Flag */
bogdanm 0:9b334a45a8ff 3946 __HAL_FMPI2C_CLEAR_FLAG(hfmpi2c, FMPI2C_FLAG_STOPF);
bogdanm 0:9b334a45a8ff 3947
bogdanm 0:9b334a45a8ff 3948 /* Clear Configuration Register 2 */
bogdanm 0:9b334a45a8ff 3949 __HAL_FMPI2C_RESET_CR2(hfmpi2c);
bogdanm 0:9b334a45a8ff 3950
bogdanm 0:9b334a45a8ff 3951 hfmpi2c->ErrorCode = HAL_FMPI2C_ERROR_NONE;
bogdanm 0:9b334a45a8ff 3952 hfmpi2c->State= HAL_FMPI2C_STATE_READY;
bogdanm 0:9b334a45a8ff 3953
bogdanm 0:9b334a45a8ff 3954 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 3955 __HAL_UNLOCK(hfmpi2c);
bogdanm 0:9b334a45a8ff 3956
bogdanm 0:9b334a45a8ff 3957 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 3958 }
bogdanm 0:9b334a45a8ff 3959
bogdanm 0:9b334a45a8ff 3960 /* Check for the Timeout */
bogdanm 0:9b334a45a8ff 3961 if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout))
bogdanm 0:9b334a45a8ff 3962 {
bogdanm 0:9b334a45a8ff 3963 hfmpi2c->ErrorCode |= HAL_FMPI2C_ERROR_TIMEOUT;
bogdanm 0:9b334a45a8ff 3964 hfmpi2c->State= HAL_FMPI2C_STATE_READY;
bogdanm 0:9b334a45a8ff 3965
bogdanm 0:9b334a45a8ff 3966 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 3967 __HAL_UNLOCK(hfmpi2c);
bogdanm 0:9b334a45a8ff 3968
bogdanm 0:9b334a45a8ff 3969 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 3970 }
bogdanm 0:9b334a45a8ff 3971 }
bogdanm 0:9b334a45a8ff 3972 return HAL_OK;
bogdanm 0:9b334a45a8ff 3973 }
bogdanm 0:9b334a45a8ff 3974
bogdanm 0:9b334a45a8ff 3975 /**
bogdanm 0:9b334a45a8ff 3976 * @brief This function handles Acknowledge failed detection during an FMPI2C Communication.
bogdanm 0:9b334a45a8ff 3977 * @param hfmpi2c : Pointer to a FMPI2C_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 3978 * the configuration information for the specified FMPI2C.
bogdanm 0:9b334a45a8ff 3979 * @param Timeout: Timeout duration
bogdanm 0:9b334a45a8ff 3980 * @retval HAL status
bogdanm 0:9b334a45a8ff 3981 */
bogdanm 0:9b334a45a8ff 3982 static HAL_StatusTypeDef FMPI2C_IsAcknowledgeFailed(FMPI2C_HandleTypeDef *hfmpi2c, uint32_t Timeout)
bogdanm 0:9b334a45a8ff 3983 {
bogdanm 0:9b334a45a8ff 3984 uint32_t tickstart = 0x00;
bogdanm 0:9b334a45a8ff 3985 tickstart = HAL_GetTick();
bogdanm 0:9b334a45a8ff 3986
bogdanm 0:9b334a45a8ff 3987 if(__HAL_FMPI2C_GET_FLAG(hfmpi2c, FMPI2C_FLAG_AF) == SET)
bogdanm 0:9b334a45a8ff 3988 {
bogdanm 0:9b334a45a8ff 3989 /* Generate stop if necessary only in case of FMPI2C peripheral in MASTER mode */
bogdanm 0:9b334a45a8ff 3990 if((hfmpi2c->State == HAL_FMPI2C_STATE_MASTER_BUSY_TX) || (hfmpi2c->State == HAL_FMPI2C_STATE_MEM_BUSY_TX)
bogdanm 0:9b334a45a8ff 3991 || (hfmpi2c->State == HAL_FMPI2C_STATE_MEM_BUSY_RX))
bogdanm 0:9b334a45a8ff 3992 {
bogdanm 0:9b334a45a8ff 3993 /* No need to generate the STOP condition if AUTOEND mode is enabled */
bogdanm 0:9b334a45a8ff 3994 /* Generate the STOP condition only in case of SOFTEND mode is enabled */
bogdanm 0:9b334a45a8ff 3995 if((hfmpi2c->Instance->CR2 & FMPI2C_AUTOEND_MODE) != FMPI2C_AUTOEND_MODE)
bogdanm 0:9b334a45a8ff 3996 {
bogdanm 0:9b334a45a8ff 3997 /* Generate Stop */
bogdanm 0:9b334a45a8ff 3998 hfmpi2c->Instance->CR2 |= FMPI2C_CR2_STOP;
bogdanm 0:9b334a45a8ff 3999 }
bogdanm 0:9b334a45a8ff 4000 }
bogdanm 0:9b334a45a8ff 4001
bogdanm 0:9b334a45a8ff 4002 /* Wait until STOP Flag is reset */
bogdanm 0:9b334a45a8ff 4003 /* AutoEnd should be initiate after AF */
bogdanm 0:9b334a45a8ff 4004 while(__HAL_FMPI2C_GET_FLAG(hfmpi2c, FMPI2C_FLAG_STOPF) == RESET)
bogdanm 0:9b334a45a8ff 4005 {
bogdanm 0:9b334a45a8ff 4006 /* Check for the Timeout */
bogdanm 0:9b334a45a8ff 4007 if(Timeout != HAL_MAX_DELAY)
bogdanm 0:9b334a45a8ff 4008 {
bogdanm 0:9b334a45a8ff 4009 if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout))
bogdanm 0:9b334a45a8ff 4010 {
bogdanm 0:9b334a45a8ff 4011 hfmpi2c->State= HAL_FMPI2C_STATE_READY;
bogdanm 0:9b334a45a8ff 4012 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 4013 __HAL_UNLOCK(hfmpi2c);
bogdanm 0:9b334a45a8ff 4014 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 4015 }
bogdanm 0:9b334a45a8ff 4016 }
bogdanm 0:9b334a45a8ff 4017 }
bogdanm 0:9b334a45a8ff 4018
bogdanm 0:9b334a45a8ff 4019 /* Clear NACKF Flag */
bogdanm 0:9b334a45a8ff 4020 __HAL_FMPI2C_CLEAR_FLAG(hfmpi2c, FMPI2C_FLAG_AF);
bogdanm 0:9b334a45a8ff 4021
bogdanm 0:9b334a45a8ff 4022 /* Clear STOP Flag */
bogdanm 0:9b334a45a8ff 4023 __HAL_FMPI2C_CLEAR_FLAG(hfmpi2c, FMPI2C_FLAG_STOPF);
bogdanm 0:9b334a45a8ff 4024
bogdanm 0:9b334a45a8ff 4025 /* Clear Configuration Register 2 */
bogdanm 0:9b334a45a8ff 4026 __HAL_FMPI2C_RESET_CR2(hfmpi2c);
bogdanm 0:9b334a45a8ff 4027
bogdanm 0:9b334a45a8ff 4028 hfmpi2c->ErrorCode = HAL_FMPI2C_ERROR_AF;
bogdanm 0:9b334a45a8ff 4029 hfmpi2c->State= HAL_FMPI2C_STATE_READY;
bogdanm 0:9b334a45a8ff 4030
bogdanm 0:9b334a45a8ff 4031 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 4032 __HAL_UNLOCK(hfmpi2c);
bogdanm 0:9b334a45a8ff 4033
bogdanm 0:9b334a45a8ff 4034 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 4035 }
bogdanm 0:9b334a45a8ff 4036 return HAL_OK;
bogdanm 0:9b334a45a8ff 4037 }
bogdanm 0:9b334a45a8ff 4038
bogdanm 0:9b334a45a8ff 4039 /**
bogdanm 0:9b334a45a8ff 4040 * @brief Handles FMPI2Cx communication when starting transfer or during transfer (TC or TCR flag are set).
bogdanm 0:9b334a45a8ff 4041 * @param hfmpi2c: FMPI2C handle.
bogdanm 0:9b334a45a8ff 4042 * @param DevAddress: specifies the slave address to be programmed.
bogdanm 0:9b334a45a8ff 4043 * @param Size: specifies the number of bytes to be programmed.
bogdanm 0:9b334a45a8ff 4044 * This parameter must be a value between 0 and 255.
bogdanm 0:9b334a45a8ff 4045 * @param Mode: new state of the FMPI2C START condition generation.
bogdanm 0:9b334a45a8ff 4046 * This parameter can be one of the following values:
bogdanm 0:9b334a45a8ff 4047 * @arg FMPI2C_RELOAD_MODE: Enable Reload mode .
bogdanm 0:9b334a45a8ff 4048 * @arg FMPI2C_AUTOEND_MODE: Enable Automatic end mode.
bogdanm 0:9b334a45a8ff 4049 * @arg FMPI2C_SOFTEND_MODE: Enable Software end mode.
bogdanm 0:9b334a45a8ff 4050 * @param Request: new state of the FMPI2C START condition generation.
bogdanm 0:9b334a45a8ff 4051 * This parameter can be one of the following values:
bogdanm 0:9b334a45a8ff 4052 * @arg FMPI2C_NO_STARTSTOP: Don't Generate stop and start condition.
bogdanm 0:9b334a45a8ff 4053 * @arg FMPI2C_GENERATE_STOP: Generate stop condition (Size should be set to 0).
bogdanm 0:9b334a45a8ff 4054 * @arg FMPI2C_GENERATE_START_READ: Generate Restart for read request.
bogdanm 0:9b334a45a8ff 4055 * @arg FMPI2C_GENERATE_START_WRITE: Generate Restart for write request.
bogdanm 0:9b334a45a8ff 4056 * @retval None
bogdanm 0:9b334a45a8ff 4057 */
bogdanm 0:9b334a45a8ff 4058 static void FMPI2C_TransferConfig(FMPI2C_HandleTypeDef *hfmpi2c, uint16_t DevAddress, uint8_t Size, uint32_t Mode, uint32_t Request)
bogdanm 0:9b334a45a8ff 4059 {
bogdanm 0:9b334a45a8ff 4060 uint32_t tmpreg = 0;
bogdanm 0:9b334a45a8ff 4061
bogdanm 0:9b334a45a8ff 4062 /* Check the parameters */
bogdanm 0:9b334a45a8ff 4063 assert_param(IS_FMPI2C_ALL_INSTANCE(hfmpi2c->Instance));
bogdanm 0:9b334a45a8ff 4064 assert_param(IS_TRANSFER_MODE(Mode));
bogdanm 0:9b334a45a8ff 4065 assert_param(IS_TRANSFER_REQUEST(Request));
bogdanm 0:9b334a45a8ff 4066
bogdanm 0:9b334a45a8ff 4067 /* Get the CR2 register value */
bogdanm 0:9b334a45a8ff 4068 tmpreg = hfmpi2c->Instance->CR2;
bogdanm 0:9b334a45a8ff 4069
bogdanm 0:9b334a45a8ff 4070 /* clear tmpreg specific bits */
bogdanm 0:9b334a45a8ff 4071 tmpreg &= (uint32_t)~((uint32_t)(FMPI2C_CR2_SADD | FMPI2C_CR2_NBYTES | FMPI2C_CR2_RELOAD | FMPI2C_CR2_AUTOEND | FMPI2C_CR2_RD_WRN | FMPI2C_CR2_START | FMPI2C_CR2_STOP));
bogdanm 0:9b334a45a8ff 4072
bogdanm 0:9b334a45a8ff 4073 /* update tmpreg */
bogdanm 0:9b334a45a8ff 4074 tmpreg |= (uint32_t)(((uint32_t)DevAddress & FMPI2C_CR2_SADD) | (((uint32_t)Size << 16 ) & FMPI2C_CR2_NBYTES) | \
bogdanm 0:9b334a45a8ff 4075 (uint32_t)Mode | (uint32_t)Request);
bogdanm 0:9b334a45a8ff 4076
bogdanm 0:9b334a45a8ff 4077 /* update CR2 register */
bogdanm 0:9b334a45a8ff 4078 hfmpi2c->Instance->CR2 = tmpreg;
bogdanm 0:9b334a45a8ff 4079 }
bogdanm 0:9b334a45a8ff 4080
bogdanm 0:9b334a45a8ff 4081 /**
bogdanm 0:9b334a45a8ff 4082 * @}
bogdanm 0:9b334a45a8ff 4083 */
bogdanm 0:9b334a45a8ff 4084
bogdanm 0:9b334a45a8ff 4085 /**
bogdanm 0:9b334a45a8ff 4086 * @}
bogdanm 0:9b334a45a8ff 4087 */
mbed_official 19:112740acecfa 4088 #endif /* STM32F410xx || STM32F446xx */
bogdanm 0:9b334a45a8ff 4089 #endif /* HAL_FMPI2C_MODULE_ENABLED */
bogdanm 0:9b334a45a8ff 4090 /**
bogdanm 0:9b334a45a8ff 4091 * @}
bogdanm 0:9b334a45a8ff 4092 */
bogdanm 0:9b334a45a8ff 4093
bogdanm 0:9b334a45a8ff 4094 /**
bogdanm 0:9b334a45a8ff 4095 * @}
bogdanm 0:9b334a45a8ff 4096 */
bogdanm 0:9b334a45a8ff 4097
bogdanm 0:9b334a45a8ff 4098 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/