Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of BSP_DISCO_F429ZI by
stm32f429i_discovery.c
00001 /** 00002 ****************************************************************************** 00003 * @file stm32f429i_discovery.c 00004 * @author MCD Application Team 00005 * @version V2.1.5 00006 * @date 27-January-2017 00007 * @brief This file provides set of firmware functions to manage Leds and 00008 * push-button available on STM32F429I-Discovery Kit from STMicroelectronics. 00009 ****************************************************************************** 00010 * @attention 00011 * 00012 * <h2><center>© COPYRIGHT(c) 2017 STMicroelectronics</center></h2> 00013 * 00014 * Redistribution and use in source and binary forms, with or without modification, 00015 * are permitted provided that the following conditions are met: 00016 * 1. Redistributions of source code must retain the above copyright notice, 00017 * this list of conditions and the following disclaimer. 00018 * 2. Redistributions in binary form must reproduce the above copyright notice, 00019 * this list of conditions and the following disclaimer in the documentation 00020 * and/or other materials provided with the distribution. 00021 * 3. Neither the name of STMicroelectronics nor the names of its contributors 00022 * may be used to endorse or promote products derived from this software 00023 * without specific prior written permission. 00024 * 00025 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 00026 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 00027 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 00028 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 00029 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 00030 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 00031 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 00032 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 00033 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 00034 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 00035 * 00036 ****************************************************************************** 00037 */ 00038 00039 /* Includes ------------------------------------------------------------------*/ 00040 #include "stm32f429i_discovery.h" 00041 #include "cmsis_nvic.h" // // Added for mbed 00042 00043 // Added for mbed. This function replaces HAL_Delay() 00044 void wait_ms(int ms); 00045 00046 /** @defgroup BSP BSP 00047 * @{ 00048 */ 00049 00050 /** @defgroup STM32F429I_DISCOVERY STM32F429I DISCOVERY 00051 * @{ 00052 */ 00053 00054 /** @defgroup STM32F429I_DISCOVERY_LOW_LEVEL STM32F429I DISCOVERY LOW LEVEL 00055 * @brief This file provides set of firmware functions to manage Leds and push-button 00056 * available on STM32F429I-Discovery Kit from STMicroelectronics. 00057 * @{ 00058 */ 00059 00060 /** @defgroup STM32F429I_DISCOVERY_LOW_LEVEL_Private_TypesDefinitions STM32F429I DISCOVERY LOW LEVEL Private TypesDefinitions 00061 * @{ 00062 */ 00063 /** 00064 * @} 00065 */ 00066 00067 /** @defgroup STM32F429I_DISCOVERY_LOW_LEVEL_Private_Defines STM32F429I DISCOVERY LOW LEVEL Private Defines 00068 * @{ 00069 */ 00070 00071 /** 00072 * @brief STM32F429I DISCO BSP Driver version number V2.1.5 00073 */ 00074 #define __STM32F429I_DISCO_BSP_VERSION_MAIN (0x02) /*!< [31:24] main version */ 00075 #define __STM32F429I_DISCO_BSP_VERSION_SUB1 (0x01) /*!< [23:16] sub1 version */ 00076 #define __STM32F429I_DISCO_BSP_VERSION_SUB2 (0x05) /*!< [15:8] sub2 version */ 00077 #define __STM32F429I_DISCO_BSP_VERSION_RC (0x00) /*!< [7:0] release candidate */ 00078 #define __STM32F429I_DISCO_BSP_VERSION ((__STM32F429I_DISCO_BSP_VERSION_MAIN << 24)\ 00079 |(__STM32F429I_DISCO_BSP_VERSION_SUB1 << 16)\ 00080 |(__STM32F429I_DISCO_BSP_VERSION_SUB2 << 8 )\ 00081 |(__STM32F429I_DISCO_BSP_VERSION_RC)) 00082 /** 00083 * @} 00084 */ 00085 00086 /** @defgroup STM32F429I_DISCOVERY_LOW_LEVEL_Private_Macros STM32F429I DISCOVERY LOW LEVEL Private Macros 00087 * @{ 00088 */ 00089 /** 00090 * @} 00091 */ 00092 00093 /** @defgroup STM32F429I_DISCOVERY_LOW_LEVEL_Private_Variables STM32F429I DISCOVERY LOW LEVEL Private Variables 00094 * @{ 00095 */ 00096 GPIO_TypeDef* GPIO_PORT[LEDn] = {LED3_GPIO_PORT, 00097 LED4_GPIO_PORT}; 00098 00099 const uint16_t GPIO_PIN[LEDn] = {LED3_PIN, 00100 LED4_PIN}; 00101 00102 GPIO_TypeDef* BUTTON_PORT[BUTTONn] = {KEY_BUTTON_GPIO_PORT}; 00103 const uint16_t BUTTON_PIN[BUTTONn] = {KEY_BUTTON_PIN}; 00104 const uint8_t BUTTON_IRQn[BUTTONn] = {KEY_BUTTON_EXTI_IRQn}; 00105 00106 uint32_t I2cxTimeout = I2Cx_TIMEOUT_MAX; /*<! Value of Timeout when I2C communication fails */ 00107 uint32_t SpixTimeout = SPIx_TIMEOUT_MAX; /*<! Value of Timeout when SPI communication fails */ 00108 00109 I2C_HandleTypeDef EEP_I2cHandle; 00110 static SPI_HandleTypeDef SpiHandle; 00111 static uint8_t Is_LCD_IO_Initialized = 0; 00112 00113 /** 00114 * @} 00115 */ 00116 00117 /** @defgroup STM32F429I_DISCOVERY_LOW_LEVEL_Private_FunctionPrototypes STM32F429I DISCOVERY LOW LEVEL Private FunctionPrototypes 00118 * @{ 00119 */ 00120 /* I2Cx bus function */ 00121 static void I2Cx_Init(void); 00122 static void I2Cx_ITConfig(void); 00123 static void I2Cx_WriteData(uint8_t Addr, uint8_t Reg, uint8_t Value); 00124 static void I2Cx_WriteBuffer(uint8_t Addr, uint8_t Reg, uint8_t *pBuffer, uint16_t Length); 00125 static uint8_t I2Cx_ReadData(uint8_t Addr, uint8_t Reg); 00126 static uint8_t I2Cx_ReadBuffer(uint8_t Addr, uint8_t Reg, uint8_t *pBuffer, uint16_t Length); 00127 static void I2Cx_Error(void); 00128 static void I2Cx_MspInit(I2C_HandleTypeDef *hi2c); 00129 #ifdef EE_M24LR64 00130 static HAL_StatusTypeDef I2Cx_WriteBufferDMA(uint8_t Addr, uint16_t Reg, uint8_t *pBuffer, uint16_t Length); 00131 static HAL_StatusTypeDef I2Cx_ReadBufferDMA(uint8_t Addr, uint16_t Reg, uint8_t *pBuffer, uint16_t Length); 00132 static HAL_StatusTypeDef I2Cx_IsDeviceReady(uint16_t DevAddress, uint32_t Trials); 00133 static void EEPROM_I2C_DMA_TX_IRQHandler(void); 00134 static void EEPROM_I2C_DMA_RX_IRQHandler(void); 00135 #endif /* EE_M24LR64 */ 00136 00137 /* SPIx bus function */ 00138 static void SPIx_Init(void); 00139 static void SPIx_Write(uint16_t Value); 00140 static uint32_t SPIx_Read(uint8_t ReadSize); 00141 static uint8_t SPIx_WriteRead(uint8_t Byte); 00142 static void SPIx_Error(void); 00143 static void SPIx_MspInit(SPI_HandleTypeDef *hspi); 00144 00145 /* Link function for LCD peripheral */ 00146 void LCD_IO_Init(void); 00147 void LCD_IO_WriteData(uint16_t RegValue); 00148 void LCD_IO_WriteReg(uint8_t Reg); 00149 uint32_t LCD_IO_ReadData(uint16_t RegValue, uint8_t ReadSize); 00150 void LCD_Delay(uint32_t delay); 00151 00152 /* IOExpander IO functions */ 00153 void IOE_Init(void); 00154 void IOE_ITConfig(void); 00155 void IOE_Delay(uint32_t Delay); 00156 void IOE_Write(uint8_t Addr, uint8_t Reg, uint8_t Value); 00157 uint8_t IOE_Read(uint8_t Addr, uint8_t Reg); 00158 uint16_t IOE_ReadMultiple(uint8_t Addr, uint8_t Reg, uint8_t *pBuffer, uint16_t Length); 00159 void IOE_WriteMultiple(uint8_t Addr, uint8_t Reg, uint8_t *pBuffer, uint16_t Length); 00160 00161 /* Link function for GYRO peripheral */ 00162 void GYRO_IO_Init(void); 00163 void GYRO_IO_Write(uint8_t* pBuffer, uint8_t WriteAddr, uint16_t NumByteToWrite); 00164 void GYRO_IO_Read(uint8_t* pBuffer, uint8_t ReadAddr, uint16_t NumByteToRead); 00165 00166 #ifdef EE_M24LR64 00167 /* Link function for I2C EEPROM peripheral */ 00168 void EEPROM_IO_Init(void); 00169 HAL_StatusTypeDef EEPROM_IO_WriteData(uint16_t DevAddress, uint16_t MemAddress, uint8_t* pBuffer, uint32_t BufferSize); 00170 HAL_StatusTypeDef EEPROM_IO_ReadData(uint16_t DevAddress, uint16_t MemAddress, uint8_t* pBuffer, uint32_t BufferSize); 00171 HAL_StatusTypeDef EEPROM_IO_IsDeviceReady(uint16_t DevAddress, uint32_t Trials); 00172 #endif /* EE_M24LR64 */ 00173 00174 /** 00175 * @} 00176 */ 00177 00178 /** @defgroup STM32F429I_DISCOVERY_LOW_LEVEL_Private_Functions STM32F429I DISCOVERY LOW LEVEL Private Functions 00179 * @{ 00180 */ 00181 00182 /** 00183 * @brief This method returns the STM32F429I DISCO BSP Driver revision 00184 * @retval version: 0xXYZR (8bits for each decimal, R for RC) 00185 */ 00186 uint32_t BSP_GetVersion(void) 00187 { 00188 return __STM32F429I_DISCO_BSP_VERSION; 00189 } 00190 00191 /** 00192 * @brief Configures LED GPIO. 00193 * @param Led: Specifies the Led to be configured. 00194 * This parameter can be one of following parameters: 00195 * @arg LED3 00196 * @arg LED4 00197 */ 00198 void BSP_LED_Init(Led_TypeDef Led) 00199 { 00200 GPIO_InitTypeDef GPIO_InitStruct; 00201 00202 /* Enable the GPIO_LED Clock */ 00203 LEDx_GPIO_CLK_ENABLE(Led); 00204 00205 /* Configure the GPIO_LED pin */ 00206 GPIO_InitStruct.Pin = GPIO_PIN[Led]; 00207 GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; 00208 GPIO_InitStruct.Pull = GPIO_PULLUP; 00209 GPIO_InitStruct.Speed = GPIO_SPEED_FAST; 00210 00211 HAL_GPIO_Init(GPIO_PORT[Led], &GPIO_InitStruct); 00212 00213 HAL_GPIO_WritePin(GPIO_PORT[Led], GPIO_PIN[Led], GPIO_PIN_RESET); 00214 } 00215 00216 /** 00217 * @brief Turns selected LED On. 00218 * @param Led: Specifies the Led to be set on. 00219 * This parameter can be one of following parameters: 00220 * @arg LED3 00221 * @arg LED4 00222 */ 00223 void BSP_LED_On(Led_TypeDef Led) 00224 { 00225 HAL_GPIO_WritePin(GPIO_PORT[Led], GPIO_PIN[Led], GPIO_PIN_SET); 00226 } 00227 00228 /** 00229 * @brief Turns selected LED Off. 00230 * @param Led: Specifies the Led to be set off. 00231 * This parameter can be one of following parameters: 00232 * @arg LED3 00233 * @arg LED4 00234 */ 00235 void BSP_LED_Off(Led_TypeDef Led) 00236 { 00237 HAL_GPIO_WritePin(GPIO_PORT[Led], GPIO_PIN[Led], GPIO_PIN_RESET); 00238 } 00239 00240 /** 00241 * @brief Toggles the selected LED. 00242 * @param Led: Specifies the Led to be toggled. 00243 * This parameter can be one of following parameters: 00244 * @arg LED3 00245 * @arg LED4 00246 */ 00247 void BSP_LED_Toggle(Led_TypeDef Led) 00248 { 00249 HAL_GPIO_TogglePin(GPIO_PORT[Led], GPIO_PIN[Led]); 00250 } 00251 00252 /** 00253 * @brief Configures Button GPIO and EXTI Line. 00254 * @param Button: Specifies the Button to be configured. 00255 * This parameter should be: BUTTON_KEY 00256 * @param ButtonMode: Specifies Button mode. 00257 * This parameter can be one of following parameters: 00258 * @arg BUTTON_MODE_GPIO: Button will be used as simple IO 00259 * @arg BUTTON_MODE_EXTI: Button will be connected to EXTI line with interrupt 00260 * generation capability 00261 */ 00262 void BSP_PB_Init(Button_TypeDef Button, ButtonMode_TypeDef ButtonMode) 00263 { 00264 GPIO_InitTypeDef GPIO_InitStruct; 00265 00266 /* Enable the BUTTON Clock */ 00267 BUTTONx_GPIO_CLK_ENABLE(Button); 00268 00269 if (ButtonMode == BUTTON_MODE_GPIO) 00270 { 00271 /* Configure Button pin as input */ 00272 GPIO_InitStruct.Pin = BUTTON_PIN[Button]; 00273 GPIO_InitStruct.Mode = GPIO_MODE_INPUT; 00274 GPIO_InitStruct.Pull = GPIO_PULLDOWN; 00275 GPIO_InitStruct.Speed = GPIO_SPEED_FAST; 00276 HAL_GPIO_Init(BUTTON_PORT[Button], &GPIO_InitStruct); 00277 } 00278 00279 if (ButtonMode == BUTTON_MODE_EXTI) 00280 { 00281 /* Configure Button pin as input with External interrupt */ 00282 GPIO_InitStruct.Pin = BUTTON_PIN[Button]; 00283 GPIO_InitStruct.Pull = GPIO_NOPULL; 00284 GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING; 00285 HAL_GPIO_Init(BUTTON_PORT[Button], &GPIO_InitStruct); 00286 00287 /* Enable and set Button EXTI Interrupt to the lowest priority */ 00288 HAL_NVIC_SetPriority((IRQn_Type)(BUTTON_IRQn[Button]), 0x0F, 0x00); 00289 HAL_NVIC_EnableIRQ((IRQn_Type)(BUTTON_IRQn[Button])); 00290 } 00291 } 00292 00293 /** 00294 * @brief Returns the selected Button state. 00295 * @param Button: Specifies the Button to be checked. 00296 * This parameter should be: BUTTON_KEY 00297 * @retval The Button GPIO pin value. 00298 */ 00299 uint32_t BSP_PB_GetState(Button_TypeDef Button) 00300 { 00301 return HAL_GPIO_ReadPin(BUTTON_PORT[Button], BUTTON_PIN[Button]); 00302 } 00303 00304 /******************************************************************************* 00305 BUS OPERATIONS 00306 *******************************************************************************/ 00307 00308 /******************************* I2C Routines *********************************/ 00309 00310 /** 00311 * @brief I2Cx MSP Initialization 00312 * @param hi2c: I2C handle 00313 */ 00314 static void I2Cx_MspInit(I2C_HandleTypeDef *hi2c) 00315 { 00316 GPIO_InitTypeDef GPIO_InitStruct; 00317 #ifdef EE_M24LR64 00318 static DMA_HandleTypeDef hdma_tx; 00319 static DMA_HandleTypeDef hdma_rx; 00320 00321 I2C_HandleTypeDef* pI2cHandle; 00322 pI2cHandle = &EEP_I2cHandle; 00323 #endif /* EE_M24LR64 */ 00324 00325 if (hi2c->Instance == DISCOVERY_I2Cx) 00326 { 00327 /* Configure the GPIOs ---------------------------------------------------*/ 00328 /* Enable GPIO clock */ 00329 DISCOVERY_I2Cx_SDA_GPIO_CLK_ENABLE(); 00330 DISCOVERY_I2Cx_SCL_GPIO_CLK_ENABLE(); 00331 00332 /* Configure I2C Tx as alternate function */ 00333 GPIO_InitStruct.Pin = DISCOVERY_I2Cx_SCL_PIN; 00334 GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; 00335 GPIO_InitStruct.Pull = GPIO_NOPULL; 00336 GPIO_InitStruct.Speed = GPIO_SPEED_FAST; 00337 GPIO_InitStruct.Alternate = DISCOVERY_I2Cx_SCL_SDA_AF; 00338 HAL_GPIO_Init(DISCOVERY_I2Cx_SCL_GPIO_PORT, &GPIO_InitStruct); 00339 00340 /* Configure I2C Rx as alternate function */ 00341 GPIO_InitStruct.Pin = DISCOVERY_I2Cx_SDA_PIN; 00342 HAL_GPIO_Init(DISCOVERY_I2Cx_SDA_GPIO_PORT, &GPIO_InitStruct); 00343 00344 00345 /* Configure the Discovery I2Cx peripheral -------------------------------*/ 00346 /* Enable I2C3 clock */ 00347 DISCOVERY_I2Cx_CLOCK_ENABLE(); 00348 00349 /* Force the I2C Peripheral Clock Reset */ 00350 DISCOVERY_I2Cx_FORCE_RESET(); 00351 00352 /* Release the I2C Peripheral Clock Reset */ 00353 DISCOVERY_I2Cx_RELEASE_RESET(); 00354 00355 /* Enable and set Discovery I2Cx Interrupt to the lowest priority */ 00356 HAL_NVIC_SetPriority(DISCOVERY_I2Cx_EV_IRQn, 0x0F, 0); 00357 HAL_NVIC_EnableIRQ(DISCOVERY_I2Cx_EV_IRQn); 00358 00359 /* Enable and set Discovery I2Cx Interrupt to the lowest priority */ 00360 HAL_NVIC_SetPriority(DISCOVERY_I2Cx_ER_IRQn, 0x0F, 0); 00361 HAL_NVIC_EnableIRQ(DISCOVERY_I2Cx_ER_IRQn); 00362 00363 #ifdef EE_M24LR64 00364 /* I2C DMA TX and RX channels configuration */ 00365 /* Enable the DMA clock */ 00366 EEPROM_I2C_DMA_CLK_ENABLE(); 00367 00368 /* Configure the DMA stream for the EE I2C peripheral TX direction */ 00369 /* Configure the DMA Stream */ 00370 hdma_tx.Instance = EEPROM_I2C_DMA_STREAM_TX; 00371 /* Set the parameters to be configured */ 00372 hdma_tx.Init.Channel = EEPROM_I2C_DMA_CHANNEL; 00373 hdma_tx.Init.Direction = DMA_MEMORY_TO_PERIPH; 00374 hdma_tx.Init.PeriphInc = DMA_PINC_DISABLE; 00375 hdma_tx.Init.MemInc = DMA_MINC_ENABLE; 00376 hdma_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; 00377 hdma_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; 00378 hdma_tx.Init.Mode = DMA_NORMAL; 00379 hdma_tx.Init.Priority = DMA_PRIORITY_VERY_HIGH; 00380 hdma_tx.Init.FIFOMode = DMA_FIFOMODE_ENABLE; 00381 hdma_tx.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL; 00382 hdma_tx.Init.MemBurst = DMA_MBURST_SINGLE; 00383 hdma_tx.Init.PeriphBurst = DMA_PBURST_SINGLE; 00384 00385 /* Associate the initilalized hdma_tx handle to the the pI2cHandle handle */ 00386 __HAL_LINKDMA(pI2cHandle, hdmatx, hdma_tx); 00387 00388 /* Configure the DMA Stream */ 00389 HAL_DMA_Init(&hdma_tx); 00390 00391 // Added for mbed 00392 /* Configure and enable I2C DMA TX Channel interrupt */ 00393 //HAL_NVIC_SetPriority((IRQn_Type)(EEPROM_I2C_DMA_TX_IRQn), EEPROM_I2C_DMA_PREPRIO, 0); 00394 //HAL_NVIC_EnableIRQ((IRQn_Type)(EEPROM_I2C_DMA_TX_IRQn)); 00395 // Enable interrupt 00396 IRQn_Type irqn = (IRQn_Type)(EEPROM_I2C_DMA_TX_IRQn); 00397 NVIC_ClearPendingIRQ(irqn); 00398 NVIC_DisableIRQ(irqn); 00399 NVIC_SetPriority(irqn, EEPROM_I2C_DMA_PREPRIO); 00400 NVIC_SetVector(irqn, (uint32_t)EEPROM_I2C_DMA_TX_IRQHandler); 00401 NVIC_EnableIRQ(irqn); 00402 00403 /* Configure the DMA stream for the EE I2C peripheral TX direction */ 00404 /* Configure the DMA Stream */ 00405 hdma_rx.Instance = EEPROM_I2C_DMA_STREAM_RX; 00406 /* Set the parameters to be configured */ 00407 hdma_rx.Init.Channel = EEPROM_I2C_DMA_CHANNEL; 00408 hdma_rx.Init.Direction = DMA_PERIPH_TO_MEMORY; 00409 hdma_rx.Init.PeriphInc = DMA_PINC_DISABLE; 00410 hdma_rx.Init.MemInc = DMA_MINC_ENABLE; 00411 hdma_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; 00412 hdma_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; 00413 hdma_rx.Init.Mode = DMA_NORMAL; 00414 hdma_rx.Init.Priority = DMA_PRIORITY_VERY_HIGH; 00415 hdma_rx.Init.FIFOMode = DMA_FIFOMODE_ENABLE; 00416 hdma_rx.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL; 00417 hdma_rx.Init.MemBurst = DMA_MBURST_SINGLE; 00418 hdma_rx.Init.PeriphBurst = DMA_PBURST_SINGLE; 00419 00420 /* Associate the initilalized hdma_rx handle to the the pI2cHandle handle*/ 00421 __HAL_LINKDMA(pI2cHandle, hdmarx, hdma_rx); 00422 00423 /* Configure the DMA Stream */ 00424 HAL_DMA_Init(&hdma_rx); 00425 00426 // Added for mbed 00427 /* Configure and enable I2C DMA RX Channel interrupt */ 00428 //HAL_NVIC_SetPriority((IRQn_Type)(EEPROM_I2C_DMA_RX_IRQn), EEPROM_I2C_DMA_PREPRIO, 0); 00429 //HAL_NVIC_EnableIRQ((IRQn_Type)(EEPROM_I2C_DMA_RX_IRQn)); 00430 // Enable interrupt 00431 irqn = (IRQn_Type)(EEPROM_I2C_DMA_RX_IRQn); 00432 NVIC_ClearPendingIRQ(irqn); 00433 NVIC_DisableIRQ(irqn); 00434 NVIC_SetPriority(irqn, EEPROM_I2C_DMA_PREPRIO); 00435 NVIC_SetVector(irqn, (uint32_t)EEPROM_I2C_DMA_RX_IRQHandler); 00436 NVIC_EnableIRQ(irqn); 00437 00438 #endif /* EE_M24LR64 */ 00439 } 00440 } 00441 00442 /** 00443 * @brief I2Cx Bus initialization. 00444 */ 00445 static void I2Cx_Init(void) 00446 { 00447 if(HAL_I2C_GetState(&EEP_I2cHandle) == HAL_I2C_STATE_RESET) 00448 { 00449 EEP_I2cHandle.Instance = DISCOVERY_I2Cx; 00450 EEP_I2cHandle.Init.ClockSpeed = BSP_I2C_SPEED; 00451 EEP_I2cHandle.Init.DutyCycle = I2C_DUTYCYCLE_2; 00452 EEP_I2cHandle.Init.OwnAddress1 = 0; 00453 EEP_I2cHandle.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; 00454 EEP_I2cHandle.Init.DualAddressMode = I2C_DUALADDRESS_DISABLED; 00455 EEP_I2cHandle.Init.OwnAddress2 = 0; 00456 EEP_I2cHandle.Init.GeneralCallMode = I2C_GENERALCALL_DISABLED; 00457 EEP_I2cHandle.Init.NoStretchMode = I2C_NOSTRETCH_DISABLED; 00458 00459 /* Init the I2C */ 00460 I2Cx_MspInit(&EEP_I2cHandle); 00461 HAL_I2C_Init(&EEP_I2cHandle); 00462 } 00463 } 00464 00465 /** 00466 * @brief Configures Interruption pin for I2C communication. 00467 */ 00468 static void I2Cx_ITConfig(void) 00469 { 00470 GPIO_InitTypeDef GPIO_InitStruct; 00471 00472 /* Enable the GPIO EXTI Clock */ 00473 STMPE811_INT_CLK_ENABLE(); 00474 00475 GPIO_InitStruct.Pin = STMPE811_INT_PIN; 00476 GPIO_InitStruct.Pull = GPIO_PULLUP; 00477 GPIO_InitStruct.Speed = GPIO_SPEED_LOW; 00478 GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING; 00479 HAL_GPIO_Init(STMPE811_INT_GPIO_PORT, &GPIO_InitStruct); 00480 00481 /* Enable and set GPIO EXTI Interrupt to the highest priority */ 00482 HAL_NVIC_SetPriority((IRQn_Type)(STMPE811_INT_EXTI), 0x0F, 0x00); 00483 HAL_NVIC_EnableIRQ((IRQn_Type)(STMPE811_INT_EXTI)); 00484 } 00485 00486 /** 00487 * @brief Writes a value in a register of the device through BUS. 00488 * @param Addr: Device address on BUS Bus. 00489 * @param Reg: The target register address to write 00490 * @param Value: The target register value to be written 00491 */ 00492 static void I2Cx_WriteData(uint8_t Addr, uint8_t Reg, uint8_t Value) 00493 { 00494 HAL_StatusTypeDef status = HAL_OK; 00495 00496 status = HAL_I2C_Mem_Write(&EEP_I2cHandle, Addr, (uint16_t)Reg, I2C_MEMADD_SIZE_8BIT, &Value, 1, I2cxTimeout); 00497 00498 /* Check the communication status */ 00499 if(status != HAL_OK) 00500 { 00501 /* Re-Initialize the BUS */ 00502 I2Cx_Error(); 00503 } 00504 } 00505 00506 /** 00507 * @brief Writes a value in a register of the device through BUS. 00508 * @param Addr: Device address on BUS Bus. 00509 * @param Reg: The target register address to write 00510 * @param pBuffer: The target register value to be written 00511 * @param Length: buffer size to be written 00512 */ 00513 static void I2Cx_WriteBuffer(uint8_t Addr, uint8_t Reg, uint8_t *pBuffer, uint16_t Length) 00514 { 00515 HAL_StatusTypeDef status = HAL_OK; 00516 00517 status = HAL_I2C_Mem_Write(&EEP_I2cHandle, Addr, (uint16_t)Reg, I2C_MEMADD_SIZE_8BIT, pBuffer, Length, I2cxTimeout); 00518 00519 /* Check the communication status */ 00520 if(status != HAL_OK) 00521 { 00522 /* Re-Initialize the BUS */ 00523 I2Cx_Error(); 00524 } 00525 } 00526 00527 /** 00528 * @brief Reads a register of the device through BUS. 00529 * @param Addr: Device address on BUS Bus. 00530 * @param Reg: The target register address to write 00531 * @retval Data read at register address 00532 */ 00533 static uint8_t I2Cx_ReadData(uint8_t Addr, uint8_t Reg) 00534 { 00535 HAL_StatusTypeDef status = HAL_OK; 00536 uint8_t value = 0; 00537 00538 status = HAL_I2C_Mem_Read(&EEP_I2cHandle, Addr, Reg, I2C_MEMADD_SIZE_8BIT, &value, 1, I2cxTimeout); 00539 00540 /* Check the communication status */ 00541 if(status != HAL_OK) 00542 { 00543 /* Re-Initialize the BUS */ 00544 I2Cx_Error(); 00545 00546 } 00547 return value; 00548 } 00549 00550 /** 00551 * @brief Reads multiple data on the BUS. 00552 * @param Addr: I2C Address 00553 * @param Reg: Reg Address 00554 * @param pBuffer: pointer to read data buffer 00555 * @param Length: length of the data 00556 * @retval 0 if no problems to read multiple data 00557 */ 00558 static uint8_t I2Cx_ReadBuffer(uint8_t Addr, uint8_t Reg, uint8_t *pBuffer, uint16_t Length) 00559 { 00560 HAL_StatusTypeDef status = HAL_OK; 00561 00562 status = HAL_I2C_Mem_Read(&EEP_I2cHandle, Addr, (uint16_t)Reg, I2C_MEMADD_SIZE_8BIT, pBuffer, Length, I2cxTimeout); 00563 00564 /* Check the communication status */ 00565 if(status == HAL_OK) 00566 { 00567 return 0; 00568 } 00569 else 00570 { 00571 /* Re-Initialize the BUS */ 00572 I2Cx_Error(); 00573 00574 return 1; 00575 } 00576 } 00577 00578 #ifdef EE_M24LR64 00579 /** 00580 * @brief Writes a value in a register of the device through BUS in using DMA mode. 00581 * @param Addr: Device address on BUS Bus. 00582 * @param Reg: The target register address to write 00583 * @param pBuffer: The target register value to be written 00584 * @param Length: buffer size to be written 00585 * @retval HAL status 00586 */ 00587 static HAL_StatusTypeDef I2Cx_WriteBufferDMA(uint8_t Addr, uint16_t Reg, uint8_t *pBuffer, uint16_t Length) 00588 { 00589 HAL_StatusTypeDef status = HAL_OK; 00590 00591 status = HAL_I2C_Mem_Write_DMA(&EEP_I2cHandle, Addr, Reg, I2C_MEMADD_SIZE_16BIT, pBuffer, Length); 00592 00593 /* Check the communication status */ 00594 if(status != HAL_OK) 00595 { 00596 /* Re-Initialize the BUS */ 00597 I2Cx_Error(); 00598 } 00599 00600 return status; 00601 } 00602 00603 /** 00604 * @brief Reads multiple data on the BUS in using DMA mode. 00605 * @param Addr: I2C Address 00606 * @param Reg: Reg Address 00607 * @param pBuffer: pointer to read data buffer 00608 * @param Length: length of the data 00609 * @retval HAL status 00610 */ 00611 static HAL_StatusTypeDef I2Cx_ReadBufferDMA(uint8_t Addr, uint16_t Reg, uint8_t *pBuffer, uint16_t Length) 00612 { 00613 HAL_StatusTypeDef status = HAL_OK; 00614 00615 status = HAL_I2C_Mem_Read_DMA(&EEP_I2cHandle, Addr, Reg, I2C_MEMADD_SIZE_16BIT, pBuffer, Length); 00616 00617 /* Check the communication status */ 00618 if(status != HAL_OK) 00619 { 00620 /* Re-Initialize the BUS */ 00621 I2Cx_Error(); 00622 } 00623 00624 return status; 00625 } 00626 00627 /** 00628 * @brief Checks if target device is ready for communication. 00629 * @note This function is used with Memory devices 00630 * @param DevAddress: Target device address 00631 * @param Trials: Number of trials 00632 * @retval HAL status 00633 */ 00634 static HAL_StatusTypeDef I2Cx_IsDeviceReady(uint16_t DevAddress, uint32_t Trials) 00635 { 00636 return (HAL_I2C_IsDeviceReady(&EEP_I2cHandle, DevAddress, Trials, I2cxTimeout)); 00637 } 00638 #endif /* EE_M24LR64 */ 00639 00640 /** 00641 * @brief I2Cx error treatment function 00642 */ 00643 static void I2Cx_Error(void) 00644 { 00645 /* De-initialize the I2C communication BUS */ 00646 HAL_I2C_DeInit(&EEP_I2cHandle); 00647 00648 /* Re-Initialize the I2C communication BUS */ 00649 I2Cx_Init(); 00650 } 00651 00652 /******************************* SPI Routines *********************************/ 00653 00654 /** 00655 * @brief SPIx Bus initialization 00656 */ 00657 static void SPIx_Init(void) 00658 { 00659 if(HAL_SPI_GetState(&SpiHandle) == HAL_SPI_STATE_RESET) 00660 { 00661 /* SPI configuration -----------------------------------------------------*/ 00662 SpiHandle.Instance = DISCOVERY_SPIx; 00663 /* SPI baudrate is set to 5.6 MHz (PCLK2/SPI_BaudRatePrescaler = 90/16 = 5.625 MHz) 00664 to verify these constraints: 00665 - ILI9341 LCD SPI interface max baudrate is 10MHz for write and 6.66MHz for read 00666 - l3gd20 SPI interface max baudrate is 10MHz for write/read 00667 - PCLK2 frequency is set to 90 MHz 00668 */ 00669 SpiHandle.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_16; 00670 00671 /* On STM32F429I-Discovery, LCD ID cannot be read then keep a common configuration */ 00672 /* for LCD and GYRO (SPI_DIRECTION_2LINES) */ 00673 /* Note: To read a register a LCD, SPI_DIRECTION_1LINE should be set */ 00674 SpiHandle.Init.Direction = SPI_DIRECTION_2LINES; 00675 SpiHandle.Init.CLKPhase = SPI_PHASE_1EDGE; 00676 SpiHandle.Init.CLKPolarity = SPI_POLARITY_LOW; 00677 SpiHandle.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLED; 00678 SpiHandle.Init.CRCPolynomial = 7; 00679 SpiHandle.Init.DataSize = SPI_DATASIZE_8BIT; 00680 SpiHandle.Init.FirstBit = SPI_FIRSTBIT_MSB; 00681 SpiHandle.Init.NSS = SPI_NSS_SOFT; 00682 SpiHandle.Init.TIMode = SPI_TIMODE_DISABLED; 00683 SpiHandle.Init.Mode = SPI_MODE_MASTER; 00684 00685 SPIx_MspInit(&SpiHandle); 00686 HAL_SPI_Init(&SpiHandle); 00687 } 00688 } 00689 00690 /** 00691 * @brief Reads 4 bytes from device. 00692 * @param ReadSize: Number of bytes to read (max 4 bytes) 00693 * @retval Value read on the SPI 00694 */ 00695 static uint32_t SPIx_Read(uint8_t ReadSize) 00696 { 00697 HAL_StatusTypeDef status = HAL_OK; 00698 uint32_t readvalue; 00699 00700 status = HAL_SPI_Receive(&SpiHandle, (uint8_t*) &readvalue, ReadSize, SpixTimeout); 00701 00702 /* Check the communication status */ 00703 if(status != HAL_OK) 00704 { 00705 /* Re-Initialize the BUS */ 00706 SPIx_Error(); 00707 } 00708 00709 return readvalue; 00710 } 00711 00712 /** 00713 * @brief Writes a byte to device. 00714 * @param Value: value to be written 00715 */ 00716 static void SPIx_Write(uint16_t Value) 00717 { 00718 HAL_StatusTypeDef status = HAL_OK; 00719 00720 status = HAL_SPI_Transmit(&SpiHandle, (uint8_t*) &Value, 1, SpixTimeout); 00721 00722 /* Check the communication status */ 00723 if(status != HAL_OK) 00724 { 00725 /* Re-Initialize the BUS */ 00726 SPIx_Error(); 00727 } 00728 } 00729 00730 /** 00731 * @brief Sends a Byte through the SPI interface and return the Byte received 00732 * from the SPI bus. 00733 * @param Byte: Byte send. 00734 * @retval The received byte value 00735 */ 00736 static uint8_t SPIx_WriteRead(uint8_t Byte) 00737 { 00738 uint8_t receivedbyte = 0; 00739 00740 /* Send a Byte through the SPI peripheral */ 00741 /* Read byte from the SPI bus */ 00742 if(HAL_SPI_TransmitReceive(&SpiHandle, (uint8_t*) &Byte, (uint8_t*) &receivedbyte, 1, SpixTimeout) != HAL_OK) 00743 { 00744 SPIx_Error(); 00745 } 00746 00747 return receivedbyte; 00748 } 00749 00750 /** 00751 * @brief SPIx error treatment function. 00752 */ 00753 static void SPIx_Error(void) 00754 { 00755 /* De-initialize the SPI communication BUS */ 00756 HAL_SPI_DeInit(&SpiHandle); 00757 00758 /* Re- Initialize the SPI communication BUS */ 00759 SPIx_Init(); 00760 } 00761 00762 /** 00763 * @brief SPI MSP Init. 00764 * @param hspi: SPI handle 00765 */ 00766 static void SPIx_MspInit(SPI_HandleTypeDef *hspi) 00767 { 00768 GPIO_InitTypeDef GPIO_InitStructure; 00769 00770 /* Enable SPIx clock */ 00771 DISCOVERY_SPIx_CLK_ENABLE(); 00772 00773 /* Enable DISCOVERY_SPI GPIO clock */ 00774 DISCOVERY_SPIx_GPIO_CLK_ENABLE(); 00775 00776 /* configure SPI SCK, MOSI and MISO */ 00777 GPIO_InitStructure.Pin = (DISCOVERY_SPIx_SCK_PIN | DISCOVERY_SPIx_MOSI_PIN | DISCOVERY_SPIx_MISO_PIN); 00778 GPIO_InitStructure.Mode = GPIO_MODE_AF_PP; 00779 GPIO_InitStructure.Pull = GPIO_PULLDOWN; 00780 GPIO_InitStructure.Speed = GPIO_SPEED_MEDIUM; 00781 GPIO_InitStructure.Alternate = DISCOVERY_SPIx_AF; 00782 HAL_GPIO_Init(DISCOVERY_SPIx_GPIO_PORT, &GPIO_InitStructure); 00783 } 00784 00785 /********************************* LINK LCD ***********************************/ 00786 00787 /** 00788 * @brief Configures the LCD_SPI interface. 00789 */ 00790 void LCD_IO_Init(void) 00791 { 00792 GPIO_InitTypeDef GPIO_InitStructure; 00793 00794 if(Is_LCD_IO_Initialized == 0) 00795 { 00796 Is_LCD_IO_Initialized = 1; 00797 00798 /* Configure NCS in Output Push-Pull mode */ 00799 LCD_WRX_GPIO_CLK_ENABLE(); 00800 GPIO_InitStructure.Pin = LCD_WRX_PIN; 00801 GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP; 00802 GPIO_InitStructure.Pull = GPIO_NOPULL; 00803 GPIO_InitStructure.Speed = GPIO_SPEED_FAST; 00804 HAL_GPIO_Init(LCD_WRX_GPIO_PORT, &GPIO_InitStructure); 00805 00806 LCD_RDX_GPIO_CLK_ENABLE(); 00807 GPIO_InitStructure.Pin = LCD_RDX_PIN; 00808 GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP; 00809 GPIO_InitStructure.Pull = GPIO_NOPULL; 00810 GPIO_InitStructure.Speed = GPIO_SPEED_FAST; 00811 HAL_GPIO_Init(LCD_RDX_GPIO_PORT, &GPIO_InitStructure); 00812 00813 /* Configure the LCD Control pins ----------------------------------------*/ 00814 LCD_NCS_GPIO_CLK_ENABLE(); 00815 00816 /* Configure NCS in Output Push-Pull mode */ 00817 GPIO_InitStructure.Pin = LCD_NCS_PIN; 00818 GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP; 00819 GPIO_InitStructure.Pull = GPIO_NOPULL; 00820 GPIO_InitStructure.Speed = GPIO_SPEED_FAST; 00821 HAL_GPIO_Init(LCD_NCS_GPIO_PORT, &GPIO_InitStructure); 00822 00823 /* Set or Reset the control line */ 00824 LCD_CS_LOW(); 00825 LCD_CS_HIGH(); 00826 00827 SPIx_Init(); 00828 } 00829 } 00830 00831 /** 00832 * @brief Writes register value. 00833 */ 00834 void LCD_IO_WriteData(uint16_t RegValue) 00835 { 00836 /* Set WRX to send data */ 00837 LCD_WRX_HIGH(); 00838 00839 /* Reset LCD control line(/CS) and Send data */ 00840 LCD_CS_LOW(); 00841 SPIx_Write(RegValue); 00842 00843 /* Deselect: Chip Select high */ 00844 LCD_CS_HIGH(); 00845 } 00846 00847 /** 00848 * @brief Writes register address. 00849 */ 00850 void LCD_IO_WriteReg(uint8_t Reg) 00851 { 00852 /* Reset WRX to send command */ 00853 LCD_WRX_LOW(); 00854 00855 /* Reset LCD control line(/CS) and Send command */ 00856 LCD_CS_LOW(); 00857 SPIx_Write(Reg); 00858 00859 /* Deselect: Chip Select high */ 00860 LCD_CS_HIGH(); 00861 } 00862 00863 /** 00864 * @brief Reads register value. 00865 * @param RegValue Address of the register to read 00866 * @param ReadSize Number of bytes to read 00867 * @retval Content of the register value 00868 */ 00869 uint32_t LCD_IO_ReadData(uint16_t RegValue, uint8_t ReadSize) 00870 { 00871 uint32_t readvalue = 0; 00872 00873 /* Select: Chip Select low */ 00874 LCD_CS_LOW(); 00875 00876 /* Reset WRX to send command */ 00877 LCD_WRX_LOW(); 00878 00879 SPIx_Write(RegValue); 00880 00881 readvalue = SPIx_Read(ReadSize); 00882 00883 /* Set WRX to send data */ 00884 LCD_WRX_HIGH(); 00885 00886 /* Deselect: Chip Select high */ 00887 LCD_CS_HIGH(); 00888 00889 return readvalue; 00890 } 00891 00892 /** 00893 * @brief Wait for loop in ms. 00894 * @param Delay in ms. 00895 */ 00896 void LCD_Delay(uint32_t Delay) 00897 { 00898 //HAL_Delay(Delay); 00899 wait_ms(Delay); 00900 } 00901 00902 /******************************************************************************* 00903 LINK OPERATIONS 00904 *******************************************************************************/ 00905 00906 /********************************* LINK IOE ***********************************/ 00907 00908 /** 00909 * @brief IOE Low Level Initialization. 00910 */ 00911 void IOE_Init(void) 00912 { 00913 I2Cx_Init(); 00914 } 00915 00916 /** 00917 * @brief IOE Low Level Interrupt configuration. 00918 */ 00919 void IOE_ITConfig(void) 00920 { 00921 I2Cx_ITConfig(); 00922 } 00923 00924 /** 00925 * @brief IOE Writes single data operation. 00926 * @param Addr: I2C Address 00927 * @param Reg: Reg Address 00928 * @param Value: Data to be written 00929 */ 00930 void IOE_Write(uint8_t Addr, uint8_t Reg, uint8_t Value) 00931 { 00932 I2Cx_WriteData(Addr, Reg, Value); 00933 } 00934 00935 /** 00936 * @brief IOE Reads single data. 00937 * @param Addr: I2C Address 00938 * @param Reg: Reg Address 00939 * @retval The read data 00940 */ 00941 uint8_t IOE_Read(uint8_t Addr, uint8_t Reg) 00942 { 00943 return I2Cx_ReadData(Addr, Reg); 00944 } 00945 00946 /** 00947 * @brief IOE Writes multiple data. 00948 * @param Addr: I2C Address 00949 * @param Reg: Reg Address 00950 * @param pBuffer: pointer to data buffer 00951 * @param Length: length of the data 00952 */ 00953 void IOE_WriteMultiple(uint8_t Addr, uint8_t Reg, uint8_t *pBuffer, uint16_t Length) 00954 { 00955 I2Cx_WriteBuffer(Addr, Reg, pBuffer, Length); 00956 } 00957 00958 /** 00959 * @brief IOE Reads multiple data. 00960 * @param Addr: I2C Address 00961 * @param Reg: Reg Address 00962 * @param pBuffer: pointer to data buffer 00963 * @param Length: length of the data 00964 * @retval 0 if no problems to read multiple data 00965 */ 00966 uint16_t IOE_ReadMultiple(uint8_t Addr, uint8_t Reg, uint8_t *pBuffer, uint16_t Length) 00967 { 00968 return I2Cx_ReadBuffer(Addr, Reg, pBuffer, Length); 00969 } 00970 00971 /** 00972 * @brief IOE Delay. 00973 * @param Delay in ms 00974 */ 00975 void IOE_Delay(uint32_t Delay) 00976 { 00977 //HAL_Delay(Delay); 00978 wait_ms(Delay); 00979 } 00980 00981 /********************************* LINK GYROSCOPE *****************************/ 00982 00983 /** 00984 * @brief Configures the Gyroscope SPI interface. 00985 */ 00986 void GYRO_IO_Init(void) 00987 { 00988 GPIO_InitTypeDef GPIO_InitStructure; 00989 00990 /* Configure the Gyroscope Control pins ------------------------------------*/ 00991 /* Enable CS GPIO clock and Configure GPIO PIN for Gyroscope Chip select */ 00992 GYRO_CS_GPIO_CLK_ENABLE(); 00993 GPIO_InitStructure.Pin = GYRO_CS_PIN; 00994 GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP; 00995 GPIO_InitStructure.Pull = GPIO_NOPULL; 00996 GPIO_InitStructure.Speed = GPIO_SPEED_MEDIUM; 00997 HAL_GPIO_Init(GYRO_CS_GPIO_PORT, &GPIO_InitStructure); 00998 00999 /* Deselect: Chip Select high */ 01000 GYRO_CS_HIGH(); 01001 01002 /* Enable INT1, INT2 GPIO clock and Configure GPIO PINs to detect Interrupts */ 01003 GYRO_INT_GPIO_CLK_ENABLE(); 01004 GPIO_InitStructure.Pin = GYRO_INT1_PIN | GYRO_INT2_PIN; 01005 GPIO_InitStructure.Mode = GPIO_MODE_INPUT; 01006 GPIO_InitStructure.Speed = GPIO_SPEED_FAST; 01007 GPIO_InitStructure.Pull= GPIO_NOPULL; 01008 HAL_GPIO_Init(GYRO_INT_GPIO_PORT, &GPIO_InitStructure); 01009 01010 SPIx_Init(); 01011 } 01012 01013 /** 01014 * @brief Writes one byte to the Gyroscope. 01015 * @param pBuffer: Pointer to the buffer containing the data to be written to the Gyroscope. 01016 * @param WriteAddr: Gyroscope's internal address to write to. 01017 * @param NumByteToWrite: Number of bytes to write. 01018 */ 01019 void GYRO_IO_Write(uint8_t* pBuffer, uint8_t WriteAddr, uint16_t NumByteToWrite) 01020 { 01021 /* Configure the MS bit: 01022 - When 0, the address will remain unchanged in multiple read/write commands. 01023 - When 1, the address will be auto incremented in multiple read/write commands. 01024 */ 01025 if(NumByteToWrite > 0x01) 01026 { 01027 WriteAddr |= (uint8_t)MULTIPLEBYTE_CMD; 01028 } 01029 /* Set chip select Low at the start of the transmission */ 01030 GYRO_CS_LOW(); 01031 01032 /* Send the Address of the indexed register */ 01033 SPIx_WriteRead(WriteAddr); 01034 01035 /* Send the data that will be written into the device (MSB First) */ 01036 while(NumByteToWrite >= 0x01) 01037 { 01038 SPIx_WriteRead(*pBuffer); 01039 NumByteToWrite--; 01040 pBuffer++; 01041 } 01042 01043 /* Set chip select High at the end of the transmission */ 01044 GYRO_CS_HIGH(); 01045 } 01046 01047 /** 01048 * @brief Reads a block of data from the Gyroscope. 01049 * @param pBuffer: Pointer to the buffer that receives the data read from the Gyroscope. 01050 * @param ReadAddr: Gyroscope's internal address to read from. 01051 * @param NumByteToRead: Number of bytes to read from the Gyroscope. 01052 */ 01053 void GYRO_IO_Read(uint8_t* pBuffer, uint8_t ReadAddr, uint16_t NumByteToRead) 01054 { 01055 if(NumByteToRead > 0x01) 01056 { 01057 ReadAddr |= (uint8_t)(READWRITE_CMD | MULTIPLEBYTE_CMD); 01058 } 01059 else 01060 { 01061 ReadAddr |= (uint8_t)READWRITE_CMD; 01062 } 01063 /* Set chip select Low at the start of the transmission */ 01064 GYRO_CS_LOW(); 01065 01066 /* Send the Address of the indexed register */ 01067 SPIx_WriteRead(ReadAddr); 01068 01069 /* Receive the data that will be read from the device (MSB First) */ 01070 while(NumByteToRead > 0x00) 01071 { 01072 /* Send dummy byte (0x00) to generate the SPI clock to Gyroscope (Slave device) */ 01073 *pBuffer = SPIx_WriteRead(DUMMY_BYTE); 01074 NumByteToRead--; 01075 pBuffer++; 01076 } 01077 01078 /* Set chip select High at the end of the transmission */ 01079 GYRO_CS_HIGH(); 01080 } 01081 01082 01083 #ifdef EE_M24LR64 01084 01085 /******************************** LINK I2C EEPROM *****************************/ 01086 01087 /** 01088 * @brief Initializes peripherals used by the I2C EEPROM driver. 01089 */ 01090 void EEPROM_IO_Init(void) 01091 { 01092 I2Cx_Init(); 01093 } 01094 01095 /** 01096 * @brief Writes data to I2C EEPROM driver in using DMA channel. 01097 * @param DevAddress: Target device address 01098 * @param MemAddress: Internal memory address 01099 * @param pBuffer: Pointer to data buffer 01100 * @param BufferSize: Amount of data to be sent 01101 * @retval HAL status 01102 */ 01103 HAL_StatusTypeDef EEPROM_IO_WriteData(uint16_t DevAddress, uint16_t MemAddress, uint8_t* pBuffer, uint32_t BufferSize) 01104 { 01105 return (I2Cx_WriteBufferDMA(DevAddress, MemAddress, pBuffer, BufferSize)); 01106 } 01107 01108 /** 01109 * @brief Reads data from I2C EEPROM driver in using DMA channel. 01110 * @param DevAddress: Target device address 01111 * @param MemAddress: Internal memory address 01112 * @param pBuffer: Pointer to data buffer 01113 * @param BufferSize: Amount of data to be read 01114 * @retval HAL status 01115 */ 01116 HAL_StatusTypeDef EEPROM_IO_ReadData(uint16_t DevAddress, uint16_t MemAddress, uint8_t* pBuffer, uint32_t BufferSize) 01117 { 01118 return (I2Cx_ReadBufferDMA(DevAddress, MemAddress, pBuffer, BufferSize)); 01119 } 01120 01121 /** 01122 * @brief Checks if target device is ready for communication. 01123 * @note This function is used with Memory devices 01124 * @param DevAddress: Target device address 01125 * @param Trials: Number of trials 01126 * @retval HAL status 01127 */ 01128 HAL_StatusTypeDef EEPROM_IO_IsDeviceReady(uint16_t DevAddress, uint32_t Trials) 01129 { 01130 return (I2Cx_IsDeviceReady(DevAddress, Trials)); 01131 } 01132 01133 // Added for mbed 01134 /** 01135 * @brief This function handles sEE DMA TX interrupt request. 01136 * @param None 01137 * @retval None 01138 */ 01139 static void EEPROM_I2C_DMA_TX_IRQHandler(void) 01140 { 01141 HAL_DMA_IRQHandler(EEP_I2cHandle.hdmatx); 01142 } 01143 01144 /** 01145 * @brief This function handles sEE DMA RX interrupt request. 01146 * @param None 01147 * @retval None 01148 */ 01149 static void EEPROM_I2C_DMA_RX_IRQHandler(void) 01150 { 01151 HAL_DMA_IRQHandler(EEP_I2cHandle.hdmarx); 01152 } 01153 01154 #endif /* EE_M24LR64 */ 01155 01156 /** 01157 * @} 01158 */ 01159 01160 /** 01161 * @} 01162 */ 01163 01164 /** 01165 * @} 01166 */ 01167 01168 /** 01169 * @} 01170 */ 01171 01172 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
Generated on Tue Jul 12 2022 19:08:44 by
