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