mbed library sources

Dependents:   Encrypted my_mbed lklk CyaSSL_DTLS_Cellular ... more

Superseded

This library was superseded by mbed-dev - https://os.mbed.com/users/mbed_official/code/mbed-dev/.

Development branch of the mbed library sources. This library is kept in synch with the latest changes from the mbed SDK and it is not guaranteed to work.

If you are looking for a stable and tested release, please import one of the official mbed library releases:

Import librarymbed

The official Mbed 2 C/C++ SDK provides the software platform and libraries to build your applications.

Committer:
mbed_official
Date:
Thu Aug 20 10:45:13 2015 +0100
Revision:
613:bc40b8d2aec4
Parent:
532:fe11edbda85c
Synchronized with git revision 92ca8c7b60a283b6bb60eb65b183dac1599f0ade

Full URL: https://github.com/mbedmicro/mbed/commit/92ca8c7b60a283b6bb60eb65b183dac1599f0ade/

Nordic: update application start address in GCC linker script

Who changed what in which revision?

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