STM32F469I-Discovery BSP User Manual: stm32469i_discovery.c Source File

STM32F469I-Discovery BSP Drivers

stm32469i_discovery.c
Go to the documentation of this file.
00001 /**
00002   ******************************************************************************
00003   * @file    stm32469i_discovery.c
00004   * @author  MCD Application Team
00005   * @version V1.0.2
00006   * @date    13-January-2016
00007   * @brief   This file provides a set of firmware functions to manage LEDs,
00008   *          push-buttons, external SDRAM, external QSPI Flash, RF EEPROM,
00009   *          available on STM32469I-Discovery
00010   *          board (MB1189) RevA/B from STMicroelectronics.
00011   ******************************************************************************
00012   * @attention
00013   *
00014   * <h2><center>&copy; COPYRIGHT(c) 2015 STMicroelectronics</center></h2>
00015   *
00016   * Redistribution and use in source and binary forms, with or without modification,
00017   * are permitted provided that the following conditions are met:
00018   *   1. Redistributions of source code must retain the above copyright notice,
00019   *      this list of conditions and the following disclaimer.
00020   *   2. Redistributions in binary form must reproduce the above copyright notice,
00021   *      this list of conditions and the following disclaimer in the documentation
00022   *      and/or other materials provided with the distribution.
00023   *   3. Neither the name of STMicroelectronics nor the names of its contributors
00024   *      may be used to endorse or promote products derived from this software
00025   *      without specific prior written permission.
00026   *
00027   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
00028   * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00029   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
00030   * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
00031   * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
00032   * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
00033   * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
00034   * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
00035   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
00036   * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00037   *
00038   ******************************************************************************
00039   */
00040 
00041 /* Includes ------------------------------------------------------------------*/
00042 #include "stm32469i_discovery.h"
00043 
00044 /** @defgroup BSP BSP
00045   * @{
00046   */
00047 
00048 /** @defgroup STM32469I_Discovery STM32469I Discovery
00049   * @{
00050   */
00051 
00052 /** @defgroup STM32469I_Discovery_LOW_LEVEL STM32469I Discovery LOW LEVEL
00053   * @{
00054   */
00055 
00056 /** @defgroup STM32469I_Discovery_LOW_LEVEL_Private_TypesDefinitions STM32469I Discovery LOW LEVEL Private TypesDefinitions
00057   * @{
00058   */
00059 /**
00060   * @}
00061   */
00062 
00063 /** @defgroup STM32469I_Discovery_LOW_LEVEL_Private_Defines STM32469I Discovery LOW LEVEL Private Defines
00064   * @{
00065   */
00066 /**
00067  * @brief STM32469I Discovery BSP Driver version number V1.0.2
00068    */
00069 #define __STM32469I_DISCOVERY_BSP_VERSION_MAIN   (0x01) /*!< [31:24] main version */
00070 #define __STM32469I_DISCOVERY_BSP_VERSION_SUB1   (0x00) /*!< [23:16] sub1 version */
00071 #define __STM32469I_DISCOVERY_BSP_VERSION_SUB2   (0x02) /*!< [15:8]  sub2 version */
00072 #define __STM32469I_DISCOVERY_BSP_VERSION_RC     (0x00) /*!< [7:0]  release candidate */
00073 #define __STM32469I_DISCOVERY_BSP_VERSION        ((__STM32469I_DISCOVERY_BSP_VERSION_MAIN << 24)\
00074                                                  |(__STM32469I_DISCOVERY_BSP_VERSION_SUB1 << 16)\
00075                                                  |(__STM32469I_DISCOVERY_BSP_VERSION_SUB2 << 8 )\
00076                                                  |(__STM32469I_DISCOVERY_BSP_VERSION_RC))
00077 /**
00078   * @}
00079   */
00080 
00081 /** @defgroup STM32469I_Discovery_LOW_LEVEL_Private_Macros  STM32469I Discovery LOW LEVEL Private Macros
00082   * @{
00083   */
00084 /**
00085   * @}
00086   */
00087 
00088 /** @defgroup STM32469I_Discovery_LOW_LEVEL_Private_Variables STM32469I Discovery LOW LEVEL Private Variables
00089   * @{
00090   */
00091 uint32_t GPIO_PIN[LEDn] = {LED1_PIN,
00092                            LED2_PIN,
00093                            LED3_PIN,
00094                            LED4_PIN};
00095 
00096 GPIO_TypeDef* GPIO_PORT[LEDn] = {LED1_GPIO_PORT,
00097                                  LED2_GPIO_PORT,
00098                                  LED3_GPIO_PORT,
00099                                  LED4_GPIO_PORT};
00100 
00101 GPIO_TypeDef* BUTTON_PORT[BUTTONn] = {WAKEUP_BUTTON_GPIO_PORT };
00102 
00103 const uint16_t BUTTON_PIN[BUTTONn] = {WAKEUP_BUTTON_PIN };
00104 
00105 const uint16_t BUTTON_IRQn[BUTTONn] = {WAKEUP_BUTTON_EXTI_IRQn };
00106 
00107 
00108 static I2C_HandleTypeDef heval_I2c1;
00109 static I2C_HandleTypeDef heval_I2c2;
00110 
00111 /**
00112   * @}
00113   */
00114 
00115 /** @defgroup STM32469I_Discovery_LOW_LEVEL_Private_FunctionPrototypes STM32469I Discovery LOW LEVEL Private FunctionPrototypes
00116   * @{
00117   */
00118 static void            I2C1_MspInit(void);
00119 static void            I2C2_MspInit(void);
00120 static void            I2C1_Init(void);
00121 static void            I2C2_Init(void);
00122 
00123 #if defined(USE_IOEXPANDER)
00124 static void            I2C1_Write(uint8_t Addr, uint8_t Reg, uint8_t Value);
00125 static uint8_t       I2C1_Read(uint8_t Addr, uint8_t Reg);
00126 #endif /* USE_IOEXPANDER */
00127 static HAL_StatusTypeDef I2C1_ReadMultiple(uint8_t Addr, uint16_t Reg, uint16_t MemAddSize, uint8_t *Buffer, uint16_t Length);
00128 static HAL_StatusTypeDef I2C2_ReadMultiple(uint8_t Addr, uint16_t Reg, uint16_t MemAddSize, uint8_t *Buffer, uint16_t Length);
00129 static HAL_StatusTypeDef I2C1_WriteMultiple(uint8_t Addr, uint16_t Reg, uint16_t MemAddSize, uint8_t *Buffer, uint16_t Length);
00130 static HAL_StatusTypeDef I2C2_WriteMultiple(uint8_t Addr, uint16_t Reg, uint16_t MemAddSize, uint8_t *Buffer, uint16_t Length);
00131 static HAL_StatusTypeDef I2C1_IsDeviceReady(uint16_t DevAddress, uint32_t Trials);
00132 static void              I2C1_Error(uint8_t Addr);
00133 static void              I2C2_Error(uint8_t Addr);
00134 
00135 /* AUDIO IO functions */
00136 void              AUDIO_IO_Init(void);
00137 void              AUDIO_IO_DeInit(void);
00138 void              AUDIO_IO_Write(uint8_t Addr, uint8_t Reg, uint8_t Value);
00139 uint8_t           AUDIO_IO_Read(uint8_t Addr, uint8_t Reg);
00140 void              AUDIO_IO_Delay(uint32_t Delay);
00141 
00142 
00143 /* I2C EEPROM IO function */
00144 void                EEPROM_IO_Init(void);
00145 HAL_StatusTypeDef   EEPROM_IO_WriteData(uint16_t DevAddress, uint16_t MemAddress, uint8_t* pBuffer, uint32_t BufferSize);
00146 HAL_StatusTypeDef   EEPROM_IO_ReadData(uint16_t DevAddress, uint16_t MemAddress, uint8_t* pBuffer, uint32_t BufferSize);
00147 HAL_StatusTypeDef   EEPROM_IO_IsDeviceReady(uint16_t DevAddress, uint32_t Trials);
00148 
00149 /* TouchScreen (TS) IO functions */
00150 void    TS_IO_Init(void);
00151 void    TS_IO_Write(uint8_t Addr, uint8_t Reg, uint8_t Value);
00152 uint8_t  TS_IO_Read(uint8_t Addr, uint8_t Reg);
00153 uint16_t TS_IO_ReadMultiple(uint8_t Addr, uint8_t Reg, uint8_t *Buffer, uint16_t Length);
00154 void    TS_IO_WriteMultiple(uint8_t Addr, uint8_t Reg, uint8_t *Buffer, uint16_t Length);
00155 void    TS_IO_Delay(uint32_t Delay);
00156 void     OTM8009A_IO_Delay(uint32_t Delay);
00157 /**
00158   * @}
00159   */
00160 
00161 /** @defgroup STM32469I_Discovery_BSP_Public_Functions STM32469I Discovery BSP Public Functions
00162   * @{
00163   */
00164 
00165   /**
00166   * @brief  This method returns the STM32469I Discovery BSP Driver revision
00167   * @retval version: 0xXYZR (8bits for each decimal, R for RC)
00168   */
00169 uint32_t BSP_GetVersion(void)
00170 {
00171   return __STM32469I_DISCOVERY_BSP_VERSION;
00172 }
00173 
00174 /**
00175   * @brief  Configures LED GPIO.
00176   * @param  Led: LED to be configured.
00177   *          This parameter can be one of the following values:
00178   *            @arg  LED1
00179   *            @arg  LED2
00180   *            @arg  LED3
00181   *            @arg  LED4
00182   */
00183 void BSP_LED_Init(Led_TypeDef Led)
00184 {
00185   GPIO_InitTypeDef  gpio_init_structure;
00186 
00187   if (Led <= LED4)
00188   {
00189     /* Configure the GPIO_LED pin */
00190     gpio_init_structure.Pin   = GPIO_PIN[Led];
00191     gpio_init_structure.Mode  = GPIO_MODE_OUTPUT_PP;
00192     gpio_init_structure.Pull  = GPIO_PULLUP;
00193     gpio_init_structure.Speed = GPIO_SPEED_HIGH;
00194 
00195     switch(Led)
00196     {
00197     case LED1 :
00198       LED1_GPIO_CLK_ENABLE();
00199       break;
00200     case LED2 :
00201       LED2_GPIO_CLK_ENABLE();
00202       break;
00203     case LED3 :
00204       LED3_GPIO_CLK_ENABLE();
00205       break;
00206     case LED4 :
00207       LED4_GPIO_CLK_ENABLE();
00208       break;
00209     default :
00210       break;
00211 
00212     } /* end switch */
00213 
00214     HAL_GPIO_Init(GPIO_PORT[Led], &gpio_init_structure);
00215 
00216     /* By default, turn off LED by setting a high level on corresponding GPIO */
00217     HAL_GPIO_WritePin(GPIO_PORT[Led], GPIO_PIN[Led], GPIO_PIN_SET);
00218 
00219   } /* of if (Led <= LED4) */
00220 
00221 }
00222 
00223 
00224 /**
00225   * @brief  DeInit LEDs.
00226   * @param  Led: LED to be configured.
00227   *          This parameter can be one of the following values:
00228   *            @arg  LED1
00229   *            @arg  LED2
00230   *            @arg  LED3
00231   *            @arg  LED4
00232   * @note Led DeInit does not disable the GPIO clock nor disable the Mfx
00233   */
00234 void BSP_LED_DeInit(Led_TypeDef Led)
00235 {
00236   GPIO_InitTypeDef  gpio_init_structure;
00237 
00238   if (Led <= LED4)
00239   {
00240     /* DeInit the GPIO_LED pin */
00241     gpio_init_structure.Pin = GPIO_PIN[Led];
00242 
00243     /* Turn off LED */
00244     HAL_GPIO_WritePin(GPIO_PORT[Led], GPIO_PIN[Led], GPIO_PIN_SET);
00245     HAL_GPIO_DeInit(GPIO_PORT[Led], gpio_init_structure.Pin);
00246   }
00247 
00248 }
00249 
00250 /**
00251   * @brief  Turns selected LED On.
00252   * @param  Led: LED to be set on
00253   *          This parameter can be one of the following values:
00254   *            @arg  LED1
00255   *            @arg  LED2
00256   *            @arg  LED3
00257   *            @arg  LED4
00258   */
00259 void BSP_LED_On(Led_TypeDef Led)
00260 {
00261   if (Led <= LED4)
00262   {
00263      HAL_GPIO_WritePin(GPIO_PORT[Led], GPIO_PIN[Led], GPIO_PIN_RESET);
00264   }
00265 
00266 }
00267 
00268 /**
00269   * @brief  Turns selected LED Off.
00270   * @param  Led: LED to be set off
00271   *          This parameter can be one of the following values:
00272   *            @arg  LED1
00273   *            @arg  LED2
00274   *            @arg  LED3
00275   *            @arg  LED4
00276   */
00277 void BSP_LED_Off(Led_TypeDef Led)
00278 {
00279   if (Led <= LED4)
00280   {
00281     HAL_GPIO_WritePin(GPIO_PORT[Led], GPIO_PIN[Led], GPIO_PIN_SET);
00282   }
00283 }
00284 
00285 /**
00286   * @brief  Toggles the selected LED.
00287   * @param  Led: LED to be toggled
00288   *          This parameter can be one of the following values:
00289   *            @arg  LED1
00290   *            @arg  LED2
00291   *            @arg  LED3
00292   *            @arg  LED4
00293   */
00294 void BSP_LED_Toggle(Led_TypeDef Led)
00295 {
00296   if (Led <= LED4)
00297   {
00298      HAL_GPIO_TogglePin(GPIO_PORT[Led], GPIO_PIN[Led]);
00299   }
00300 }
00301 
00302 /**
00303   * @brief  Configures button GPIO and EXTI Line.
00304   * @param  Button: Button to be configured
00305   *          This parameter can be one of the following values:
00306   *            @arg  BUTTON_WAKEUP: Wakeup Push Button
00307   *            @arg  BUTTON_USER: User Push Button
00308   * @param  Button_Mode: Button mode
00309   *          This parameter can be one of the following values:
00310   *            @arg  BUTTON_MODE_GPIO: Button will be used as simple IO
00311   *            @arg  BUTTON_MODE_EXTI: Button will be connected to EXTI line
00312   *                                    with interrupt generation capability
00313   */
00314 void BSP_PB_Init(Button_TypeDef Button, ButtonMode_TypeDef Button_Mode)
00315 {
00316   GPIO_InitTypeDef gpio_init_structure;
00317 
00318   /* Enable the BUTTON clock */
00319   BUTTON_GPIO_CLK_ENABLE();
00320 
00321   if(Button_Mode == BUTTON_MODE_GPIO)
00322   {
00323     /* Configure Button pin as input */
00324     gpio_init_structure.Pin = BUTTON_PIN[Button];
00325     gpio_init_structure.Mode = GPIO_MODE_INPUT;
00326     gpio_init_structure.Pull = GPIO_NOPULL;
00327     gpio_init_structure.Speed = GPIO_SPEED_FAST;
00328     HAL_GPIO_Init(BUTTON_PORT[Button], &gpio_init_structure);
00329   }
00330 
00331   if(Button_Mode == BUTTON_MODE_EXTI)
00332   {
00333     /* Configure Button pin as input with External interrupt */
00334     gpio_init_structure.Pin = BUTTON_PIN[Button];
00335     gpio_init_structure.Pull = GPIO_NOPULL;
00336     gpio_init_structure.Speed = GPIO_SPEED_FAST;
00337 
00338     gpio_init_structure.Mode = GPIO_MODE_IT_RISING;
00339 
00340     HAL_GPIO_Init(BUTTON_PORT[Button], &gpio_init_structure);
00341 
00342     /* Enable and set Button EXTI Interrupt to the lowest priority */
00343     HAL_NVIC_SetPriority((IRQn_Type)(BUTTON_IRQn[Button]), 0x0F, 0x00);
00344     HAL_NVIC_EnableIRQ((IRQn_Type)(BUTTON_IRQn[Button]));
00345   }
00346 }
00347 
00348 /**
00349   * @brief  Push Button DeInit.
00350   * @param  Button: Button to be configured
00351   *          This parameter can be one of the following values:
00352   *            @arg  BUTTON_WAKEUP: Wakeup Push Button
00353   *            @arg  BUTTON_USER: User Push Button
00354   * @note PB DeInit does not disable the GPIO clock
00355   */
00356 void BSP_PB_DeInit(Button_TypeDef Button)
00357 {
00358     GPIO_InitTypeDef gpio_init_structure;
00359 
00360     gpio_init_structure.Pin = BUTTON_PIN[Button];
00361     HAL_NVIC_DisableIRQ((IRQn_Type)(BUTTON_IRQn[Button]));
00362     HAL_GPIO_DeInit(BUTTON_PORT[Button], gpio_init_structure.Pin);
00363 }
00364 
00365 
00366 /**
00367   * @brief  Returns the selected button state.
00368   * @param  Button: Button to be checked
00369   *          This parameter can be one of the following values:
00370   *            @arg  BUTTON_WAKEUP: Wakeup Push Button
00371   *            @arg  BUTTON_USER: User Push Button
00372   * @retval The Button GPIO pin value
00373   */
00374 uint32_t BSP_PB_GetState(Button_TypeDef Button)
00375 {
00376   return HAL_GPIO_ReadPin(BUTTON_PORT[Button], BUTTON_PIN[Button]);
00377 }
00378 
00379 /**
00380   * @}
00381   */
00382 
00383 /** @defgroup STM32469I_Discovery_LOW_LEVEL_Private_Functions STM32469I Discovery LOW LEVEL Private Functions
00384   * @{
00385   */
00386 
00387 
00388 /*******************************************************************************
00389                             BUS OPERATIONS
00390 *******************************************************************************/
00391 
00392 /******************************* I2C Routines *********************************/
00393 /**
00394   * @brief  Initializes I2C MSP.
00395   */
00396 static void I2C1_MspInit(void)
00397 {
00398   GPIO_InitTypeDef  gpio_init_structure;
00399 
00400   /*** Configure the GPIOs ***/
00401   /* Enable GPIO clock */
00402   DISCO_I2C1_SCL_SDA_GPIO_CLK_ENABLE();
00403 
00404   /* Configure I2C Tx as alternate function */
00405   gpio_init_structure.Pin = DISCO_I2C1_SCL_PIN;
00406   gpio_init_structure.Mode = GPIO_MODE_AF_OD;
00407   gpio_init_structure.Pull = GPIO_NOPULL;
00408   gpio_init_structure.Speed = GPIO_SPEED_FAST;
00409   gpio_init_structure.Alternate = DISCO_I2C1_SCL_SDA_AF;
00410   HAL_GPIO_Init(DISCO_I2C1_SCL_SDA_GPIO_PORT, &gpio_init_structure);
00411 
00412   /* Configure I2C Rx as alternate function */
00413   gpio_init_structure.Pin = DISCO_I2C1_SDA_PIN;
00414   HAL_GPIO_Init(DISCO_I2C1_SCL_SDA_GPIO_PORT, &gpio_init_structure);
00415 
00416   /*** Configure the I2C peripheral ***/
00417   /* Enable I2C clock */
00418   DISCO_I2C1_CLK_ENABLE();
00419 
00420   /* Force the I2C peripheral clock reset */
00421   DISCO_I2C1_FORCE_RESET();
00422 
00423   /* Release the I2C peripheral clock reset */
00424   DISCO_I2C1_RELEASE_RESET();
00425 
00426   /* Enable and set I2C1 Interrupt to a lower priority */
00427   HAL_NVIC_SetPriority(DISCO_I2C1_EV_IRQn, 0x05, 0);
00428   HAL_NVIC_EnableIRQ(DISCO_I2C1_EV_IRQn);
00429 
00430   /* Enable and set I2C1 Interrupt to a lower priority */
00431   HAL_NVIC_SetPriority(DISCO_I2C1_ER_IRQn, 0x05, 0);
00432   HAL_NVIC_EnableIRQ(DISCO_I2C1_ER_IRQn);
00433 }
00434 
00435 /**
00436   * @brief  Initializes I2C MSP.
00437   */
00438 static void I2C2_MspInit(void)
00439 {
00440   GPIO_InitTypeDef  gpio_init_structure;
00441 
00442   /*** Configure the GPIOs ***/
00443   /* Enable GPIO clock */
00444   DISCO_I2C2_SCL_SDA_GPIO_CLK_ENABLE();
00445 
00446   /* Configure I2C Tx as alternate function */
00447   gpio_init_structure.Pin = DISCO_I2C2_SCL_PIN;
00448   gpio_init_structure.Mode = GPIO_MODE_AF_OD;
00449   gpio_init_structure.Pull = GPIO_NOPULL;
00450   gpio_init_structure.Speed = GPIO_SPEED_FAST;
00451   gpio_init_structure.Alternate = DISCO_I2C2_SCL_SDA_AF;
00452   HAL_GPIO_Init(DISCO_I2C2_SCL_SDA_GPIO_PORT, &gpio_init_structure);
00453 
00454   /* Configure I2C Rx as alternate function */
00455   gpio_init_structure.Pin = DISCO_I2C2_SDA_PIN;
00456   HAL_GPIO_Init(DISCO_I2C2_SCL_SDA_GPIO_PORT, &gpio_init_structure);
00457 
00458   /*** Configure the I2C peripheral ***/
00459   /* Enable I2C clock */
00460   DISCO_I2C2_CLK_ENABLE();
00461 
00462   /* Force the I2C peripheral clock reset */
00463   DISCO_I2C2_FORCE_RESET();
00464 
00465   /* Release the I2C peripheral clock reset */
00466   DISCO_I2C2_RELEASE_RESET();
00467 
00468   /* Enable and set I2C1 Interrupt to a lower priority */
00469   HAL_NVIC_SetPriority(DISCO_I2C2_EV_IRQn, 0x05, 0);
00470   HAL_NVIC_EnableIRQ(DISCO_I2C2_EV_IRQn);
00471 
00472   /* Enable and set I2C1 Interrupt to a lower priority */
00473   HAL_NVIC_SetPriority(DISCO_I2C2_ER_IRQn, 0x05, 0);
00474   HAL_NVIC_EnableIRQ(DISCO_I2C2_ER_IRQn);
00475 }
00476 
00477 /**
00478   * @brief  Initializes I2C HAL.
00479   */
00480 static void I2C1_Init(void)
00481 {
00482   if(HAL_I2C_GetState(&heval_I2c1) == HAL_I2C_STATE_RESET)
00483   {
00484     heval_I2c1.Instance = I2C1;
00485     heval_I2c1.Init.ClockSpeed      = I2C1_SCL_FREQ_KHZ;
00486     heval_I2c1.Init.DutyCycle       = I2C_DUTYCYCLE_2;
00487     heval_I2c1.Init.OwnAddress1     = 0;
00488     heval_I2c1.Init.AddressingMode  = I2C_ADDRESSINGMODE_7BIT;
00489     heval_I2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
00490     heval_I2c1.Init.OwnAddress2     = 0;
00491     heval_I2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
00492     heval_I2c1.Init.NoStretchMode   = I2C_NOSTRETCH_DISABLE;
00493 
00494     /* Init the I2C */
00495     I2C1_MspInit();
00496     HAL_I2C_Init(&heval_I2c1);
00497   }
00498 }
00499 
00500 /**
00501   * @brief  Initializes I2C HAL.
00502   */
00503 static void I2C2_Init(void)
00504 {
00505   if(HAL_I2C_GetState(&heval_I2c2) == HAL_I2C_STATE_RESET)
00506   {
00507     heval_I2c2.Instance = I2C2;
00508     heval_I2c2.Init.ClockSpeed      = I2C2_SCL_FREQ_KHZ;
00509     heval_I2c2.Init.DutyCycle       = I2C_DUTYCYCLE_2;
00510     heval_I2c2.Init.OwnAddress1     = 0;
00511     heval_I2c2.Init.AddressingMode  = I2C_ADDRESSINGMODE_7BIT;
00512     heval_I2c2.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
00513     heval_I2c2.Init.OwnAddress2     = 0;
00514     heval_I2c2.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
00515     heval_I2c2.Init.NoStretchMode   = I2C_NOSTRETCH_DISABLE;
00516 
00517     /* Init the I2C */
00518     I2C2_MspInit();
00519     HAL_I2C_Init(&heval_I2c2);
00520   }
00521 }
00522 
00523 /**
00524   * @brief  Writes a single data.
00525   * @param  Addr: I2C address
00526   * @param  Reg: Register address
00527   * @param  Value: Data to be written
00528   */
00529 static void I2C1_Write(uint8_t Addr, uint8_t Reg, uint8_t Value)
00530 {
00531   HAL_StatusTypeDef status = HAL_OK;
00532 
00533   status = HAL_I2C_Mem_Write(&heval_I2c1,
00534                          Addr,
00535                          (uint16_t)Reg,
00536                          I2C_MEMADD_SIZE_8BIT,
00537                          &Value,
00538                          1,
00539                          100);
00540 
00541   /* Check the communication status */
00542   if(status != HAL_OK)
00543   {
00544     /* Execute user timeout callback */
00545     I2C1_Error(Addr);
00546   }
00547 }
00548 
00549 /**
00550   * @brief  Reads a single data.
00551   * @param  Addr: I2C address
00552   * @param  Reg: Register address
00553   * @retval Read data
00554   */
00555 static uint8_t I2C1_Read(uint8_t Addr, uint8_t Reg)
00556 {
00557   HAL_StatusTypeDef status = HAL_OK;
00558   uint8_t Value = 0;
00559 
00560   status = HAL_I2C_Mem_Read(&heval_I2c1,
00561                         Addr,
00562                         Reg,
00563                         I2C_MEMADD_SIZE_8BIT,
00564                         &Value,
00565                         1,
00566                         1000);
00567 
00568   /* Check the communication status */
00569   if(status != HAL_OK)
00570   {
00571     /* Execute user timeout callback */
00572     I2C1_Error(Addr);
00573   }
00574   return Value;
00575 }
00576 
00577 /**
00578   * @brief  Reads multiple data.
00579   * @param  Addr: I2C address
00580   * @param  Reg: Reg address
00581   * @param  MemAddress: memory address
00582   * @param  Buffer: Pointer to data buffer
00583   * @param  Length: Length of the data
00584   * @retval HAL status
00585   */
00586 static HAL_StatusTypeDef I2C1_ReadMultiple(uint8_t Addr,
00587                                        uint16_t Reg,
00588                                        uint16_t MemAddress,
00589                                        uint8_t *Buffer,
00590                                        uint16_t Length)
00591 {
00592   HAL_StatusTypeDef status = HAL_OK;
00593 
00594   status = HAL_I2C_Mem_Read(&heval_I2c1,
00595                         Addr,
00596                         (uint16_t)Reg,
00597                         MemAddress,
00598                         Buffer,
00599                         Length,
00600                         1000);
00601 
00602   /* Check the communication status */
00603   if(status != HAL_OK)
00604   {
00605     /* I2C error occured */
00606     I2C1_Error(Addr);
00607   }
00608   return status;
00609 }
00610 
00611 static HAL_StatusTypeDef I2C2_ReadMultiple(uint8_t Addr,
00612                                        uint16_t Reg,
00613                                        uint16_t MemAddress,
00614                                        uint8_t *Buffer,
00615                                        uint16_t Length)
00616 {
00617   HAL_StatusTypeDef status = HAL_OK;
00618 
00619   status = HAL_I2C_Mem_Read(&heval_I2c2,
00620                         Addr,
00621                         (uint16_t)Reg,
00622                         MemAddress,
00623                         Buffer,
00624                         Length,
00625                         1000);
00626 
00627   /* Check the communication status */
00628   if(status != HAL_OK)
00629   {
00630     /* I2C2 error occured */
00631     I2C2_Error(Addr);
00632   }
00633   return status;
00634 }
00635 
00636 /**
00637   * @brief  Writes a value in a register of the device through BUS in using DMA mode.
00638   * @param  Addr: Device address on BUS Bus.
00639   * @param  Reg: The target register address to write
00640   * @param  MemAddress: memory address
00641   * @param  Buffer: The target register value to be written
00642   * @param  Length: buffer size to be written
00643   * @retval HAL status
00644   */
00645 static HAL_StatusTypeDef I2C1_WriteMultiple(uint8_t Addr,
00646                                         uint16_t Reg,
00647                                         uint16_t MemAddress,
00648                                         uint8_t *Buffer,
00649                                         uint16_t Length)
00650 {
00651   HAL_StatusTypeDef status = HAL_OK;
00652 
00653   status = HAL_I2C_Mem_Write(&heval_I2c1,
00654                          Addr,
00655                          (uint16_t)Reg,
00656                          MemAddress,
00657                          Buffer,
00658                          Length,
00659                          1000);
00660 
00661   /* Check the communication status */
00662   if(status != HAL_OK)
00663   {
00664     /* Re-Initiaize the I2C Bus */
00665     I2C1_Error(Addr);
00666   }
00667   return status;
00668 }
00669 
00670 static HAL_StatusTypeDef I2C2_WriteMultiple(uint8_t Addr,
00671                                         uint16_t Reg,
00672                                         uint16_t MemAddress,
00673                                         uint8_t *Buffer,
00674                                         uint16_t Length)
00675 {
00676   HAL_StatusTypeDef status = HAL_OK;
00677 
00678   status = HAL_I2C_Mem_Write(&heval_I2c2,
00679                          Addr,
00680                          (uint16_t)Reg,
00681                          MemAddress,
00682                          Buffer,
00683                          Length,
00684                          1000);
00685 
00686   /* Check the communication status */
00687   if(status != HAL_OK)
00688   {
00689     /* Re-Initiaize the I2C2 Bus */
00690     I2C2_Error(Addr);
00691   }
00692   return status;
00693 }
00694 
00695 /**
00696   * @brief  Checks if target device is ready for communication.
00697   * @note   This function is used with Memory devices
00698   * @param  DevAddress: Target device address
00699   * @param  Trials: Number of trials
00700   * @retval HAL status
00701   */
00702 static HAL_StatusTypeDef I2C1_IsDeviceReady(uint16_t DevAddress, uint32_t Trials)
00703 {
00704   return (HAL_I2C_IsDeviceReady(&heval_I2c1, DevAddress, Trials, 1000));
00705 }
00706 
00707 /**
00708   * @brief  Manages error callback by re-initializing I2C.
00709   * @param  Addr: I2C Address
00710   */
00711 static void I2C1_Error(uint8_t Addr)
00712 {
00713   /* De-initialize the I2C comunication bus */
00714   HAL_I2C_DeInit(&heval_I2c1);
00715 
00716   /* Re-Initiaize the I2C comunication bus */
00717   I2C1_Init();
00718 }
00719 
00720 static void I2C2_Error(uint8_t Addr)
00721 {
00722   /* De-initialize the I2C2 comunication bus */
00723   HAL_I2C_DeInit(&heval_I2c2);
00724 
00725   /* Re-Initiaize the I2C2 comunication bus */
00726   I2C2_Init();
00727 }
00728 
00729 /**
00730   * @}
00731   */
00732 
00733 /*******************************************************************************
00734                             LINK OPERATIONS
00735 *******************************************************************************/
00736 
00737 /********************************* LINK AUDIO *********************************/
00738 
00739 /**
00740   * @brief  Initializes Audio low level.
00741   */
00742 void AUDIO_IO_Init(void)
00743 {
00744   I2C2_Init();
00745 }
00746 
00747 /**
00748   * @brief  DeInitializes Audio low level.
00749   */
00750 void AUDIO_IO_DeInit(void)
00751 {
00752 
00753 }
00754 
00755 /**
00756   * @brief  Writes a single data.
00757   * @param  Addr: I2C address
00758   * @param  Reg: Reg address
00759   * @param  Value: Data to be written
00760   */
00761 void AUDIO_IO_Write(uint8_t Addr, uint8_t Reg, uint8_t Value)
00762 {
00763   I2C2_WriteMultiple(Addr, (uint16_t) Reg, I2C_MEMADD_SIZE_8BIT, (uint8_t*)&Value, 1);
00764 }
00765 
00766 /**
00767   * @brief  Reads a single data.
00768   * @param  Addr: I2C address
00769   * @param  Reg: Reg address
00770   * @retval Data to be read
00771   */
00772 uint8_t AUDIO_IO_Read(uint8_t Addr, uint8_t Reg)
00773 {
00774   uint8_t read_value = 0;
00775 
00776   I2C2_ReadMultiple(Addr, (uint16_t) Reg, I2C_MEMADD_SIZE_8BIT, (uint8_t*)&read_value, 1);
00777 
00778   return read_value;
00779 }
00780 
00781 /**
00782   * @brief  AUDIO Codec delay
00783   * @param  Delay: Delay in ms
00784   */
00785 void AUDIO_IO_Delay(uint32_t Delay)
00786 {
00787   HAL_Delay(Delay);
00788 }
00789 
00790 /******************************** LINK I2C EEPROM *****************************/
00791 
00792 /**
00793   * @brief  Initializes peripherals used by the I2C EEPROM driver.
00794   */
00795 void EEPROM_IO_Init(void)
00796 {
00797   I2C1_Init();
00798 }
00799 
00800 /**
00801   * @brief  Write data to I2C EEPROM driver in using DMA channel.
00802   * @param  DevAddress: Target device address
00803   * @param  MemAddress: Internal memory address
00804   * @param  pBuffer: Pointer to data buffer
00805   * @param  BufferSize: Amount of data to be sent
00806   * @retval HAL status
00807   */
00808 HAL_StatusTypeDef EEPROM_IO_WriteData(uint16_t DevAddress, uint16_t MemAddress, uint8_t* pBuffer, uint32_t BufferSize)
00809 {
00810   return (I2C1_WriteMultiple(DevAddress, MemAddress, I2C_MEMADD_SIZE_16BIT, pBuffer, BufferSize));
00811 }
00812 
00813 /**
00814   * @brief  Read data from I2C EEPROM driver in using DMA channel.
00815   * @param  DevAddress: Target device address
00816   * @param  MemAddress: Internal memory address
00817   * @param  pBuffer: Pointer to data buffer
00818   * @param  BufferSize: Amount of data to be read
00819   * @retval HAL status
00820   */
00821 HAL_StatusTypeDef EEPROM_IO_ReadData(uint16_t DevAddress, uint16_t MemAddress, uint8_t* pBuffer, uint32_t BufferSize)
00822 {
00823   return (I2C1_ReadMultiple(DevAddress, MemAddress, I2C_MEMADD_SIZE_16BIT, pBuffer, BufferSize));
00824 }
00825 
00826 /**
00827   * @brief  Checks if target device is ready for communication.
00828   * @note   This function is used with Memory devices
00829   * @param  DevAddress: Target device address
00830   * @param  Trials: Number of trials
00831   * @retval HAL status
00832   */
00833 HAL_StatusTypeDef EEPROM_IO_IsDeviceReady(uint16_t DevAddress, uint32_t Trials)
00834 {
00835   return (I2C1_IsDeviceReady(DevAddress, Trials));
00836 }
00837 
00838 /******************************** LINK TS (TouchScreen) ***********************/
00839 
00840 /**
00841   * @brief  Initialize I2C communication
00842   *         channel from MCU to TouchScreen (TS).
00843   */
00844 void TS_IO_Init(void)
00845 {
00846   I2C1_Init();
00847 }
00848 
00849 /**
00850   * @brief  Writes single data with I2C communication
00851   *         channel from MCU to TouchScreen.
00852   * @param  Addr: I2C address
00853   * @param  Reg: Register address
00854   * @param  Value: Data to be written
00855   */
00856 void TS_IO_Write(uint8_t Addr, uint8_t Reg, uint8_t Value)
00857 {
00858   I2C1_Write(Addr, Reg, Value);
00859 }
00860 
00861 /**
00862   * @brief  Reads single data with I2C communication
00863   *         channel from TouchScreen.
00864   * @param  Addr: I2C address
00865   * @param  Reg: Register address
00866   * @retval Read data
00867   */
00868 uint8_t TS_IO_Read(uint8_t Addr, uint8_t Reg)
00869 {
00870   return I2C1_Read(Addr, Reg);
00871 }
00872 
00873 /**
00874   * @brief  Reads multiple data with I2C communication
00875   *         channel from TouchScreen.
00876   * @param  Addr: I2C address
00877   * @param  Reg: Register address
00878   * @param  Buffer: Pointer to data buffer
00879   * @param  Length: Length of the data
00880   * @retval Number of read data
00881   */
00882 uint16_t TS_IO_ReadMultiple(uint8_t Addr, uint8_t Reg, uint8_t *Buffer, uint16_t Length)
00883 {
00884  return I2C1_ReadMultiple(Addr, (uint16_t)Reg, I2C_MEMADD_SIZE_8BIT, Buffer, Length);
00885 }
00886 
00887 /**
00888   * @brief  Writes multiple data with I2C communication
00889   *         channel from MCU to TouchScreen.
00890   * @param  Addr: I2C address
00891   * @param  Reg: Register address
00892   * @param  Buffer: Pointer to data buffer
00893   * @param  Length: Length of the data
00894   */
00895 void TS_IO_WriteMultiple(uint8_t Addr, uint8_t Reg, uint8_t *Buffer, uint16_t Length)
00896 {
00897   I2C1_WriteMultiple(Addr, (uint16_t)Reg, I2C_MEMADD_SIZE_8BIT, Buffer, Length);
00898 }
00899 
00900 /**
00901   * @brief  Delay function used in TouchScreen low level driver.
00902   * @param  Delay: Delay in ms
00903   */
00904 void TS_IO_Delay(uint32_t Delay)
00905 {
00906   HAL_Delay(Delay);
00907 }
00908 
00909 /**************************** LINK OTM8009A (Display driver) ******************/
00910 /**
00911   * @brief  OTM8009A delay
00912   * @param  Delay: Delay in ms
00913   */
00914 void OTM8009A_IO_Delay(uint32_t Delay)
00915 {
00916   HAL_Delay(Delay);
00917 }
00918 
00919 /**
00920   * @}
00921   */
00922 
00923 /**
00924   * @}
00925   */
00926 
00927 /**
00928   * @}
00929   */
00930 
00931 /**
00932   * @}
00933   */
00934 
00935 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
Generated on Wed Jan 13 2016 10:58:45 for STM32F469I-Discovery BSP User Manual by   doxygen 1.7.6.1