ST意法半导体
直播中

石玉兰

8年用户 1526经验值
私信 关注
[问答]

是否可以在没有X-NUCLEO-53L0A1扩展板的情况下使用VL53L0x,通过I2C直接连接到我的F302R8板?


我的代码和控制台如下所示。控制台上的值是固定的,即使我在传感器前面移动一个物体,它们也不会改变。我也不明白我应该在数据表中显示的“索引”字节中放入什么。
  • /* USER CODE BEGIN Header */
  • /**
  •   ******************************************************************************
  •   * @file           : main.c
  •   * @brief          : Main program body
  •   ******************************************************************************
  •   * @attention
  •   *
  •   *

    © Copyright (c) 2021 STMicroelectronics.
  •   * All rights reserved.
  •   *
  •   * This software component is licensed by ST under BSD 3-Clause license,
  •   * the "License"; You may not use this file except in compliance with the
  •   * License. You may obtain a copy of the License at:
  •   *                        opensource.org/licenses/BSD-3-Clause
  •   *
  •   ******************************************************************************
  •   */
  • /* USER CODE END Header */
  • /* Includes ------------------------------------------------------------------*/
  • #include "main.h"
  • #include
  • #include
  • /* Private includes ----------------------------------------------------------*/
  • /* USER CODE BEGIN Includes */
  • /* USER CODE END Includes */
  • /* Private typedef -----------------------------------------------------------*/
  • /* USER CODE BEGIN PTD */
  • /* USER CODE END PTD */
  • /* Private define ------------------------------------------------------------*/
  • /* USER CODE BEGIN PD */
  • /* USER CODE END PD */
  • /* Private macro -------------------------------------------------------------*/
  • /* USER CODE BEGIN PM */
  • /* USER CODE END PM */
  • /* Private variables ---------------------------------------------------------*/
  • I2C_HandleTypeDef hi2c1;
  • UART_HandleTypeDef huart2;
  • /* USER CODE BEGIN PV */
  • static const uint8_t VL53L0_I2C_ADDR = 0x52;
  • /* USER CODE END PV */
  • /* Private function prototypes -----------------------------------------------*/
  • void SystemClock_Config(void);
  • static void MX_GPIO_Init(void);
  • static void MX_I2C1_Init(void);
  • static void MX_USART2_UART_Init(void);
  • /* USER CODE BEGIN PFP */
  • /* USER CODE END PFP */
  • /* Private user code ---------------------------------------------------------*/
  • /* USER CODE BEGIN 0 */
  • /* USER CODE END 0 */
  • /**
  •   * @brief  The application entry point.
  •   * @retval int
  •   */
  • int main(void)
  • {
  •   /* USER CODE BEGIN 1 */
  •          HAL_StatusTypeDef ret;
  •          uint8_t buf[12];
  •          uint16_t distance;
  •   /* USER CODE END 1 */
  •   /* MCU Configuration--------------------------------------------------------*/
  •   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  •   HAL_Init();
  •   /* USER CODE BEGIN Init */
  •   /* USER CODE END Init */
  •   /* Configure the system clock */
  •   SystemClock_Config();
  •   /* USER CODE BEGIN SysInit */
  •   /* USER CODE END SysInit */
  •   /* Initialize all configured peripherals */
  •   MX_GPIO_Init();
  •   MX_I2C1_Init();
  •   MX_USART2_UART_Init();
  •   /* USER CODE BEGIN 2 */
  •   /* USER CODE END 2 */
  •   /* Infinite loop */
  •   /* USER CODE BEGIN WHILE */
  •   while (1)
  •   {
  •     /* USER CODE END WHILE */
  •                     ret = HAL_I2C_IsDeviceReady(&hi2c1, VL53L0_I2C_ADDR, 1, HAL_MAX_DELAY);
  •                     if ( ret != HAL_OK ){
  •                             strcpy((char*)buf,"Error adr
    ");
  •                     } else {
  •                             ret = HAL_I2C_Master_Transmit(&hi2c1, VL53L0_I2C_ADDR, buf, 1, HAL_MAX_DELAY);
  •           //                  ret = HAL_I2C_Mem_Write(&hi2c1, VL53L0X, reg, 1, buf, 1, HAL_MAX_DELAY);
  •                       if ( ret != HAL_OK ) {
  •                               strcpy((char*)buf,"Error tx
    ");
  •                       } else {
  •                               ret = HAL_I2C_Master_Receive(&hi2c1, VL53L0_I2C_ADDR|0x01, buf, 1, HAL_MAX_DELAY);
  •           //                    ret = HAL_I2C_Mem_Read(&hi2c1, VL53L0X, reg, 1, buf, 1, HAL_MAX_DELAY);
  •                         if ( ret != HAL_OK ) {
  •                                 strcpy((char*)buf,"Error rx
    ");
  •                         } else {
  •                                 distance = buf[0];
  •                                 sprintf((char*)buf,"%u
    ",(unsigned int)distance);
  •                         }
  •                       }
  •                     }
  •                           // Send out buffer (distance or error message)
  •                                       HAL_Delay(500);
  •                                       printf("Distance=%u
    ",distance);
  •                                       HAL_UART_Transmit(&huart2, buf, strlen((char*)buf), HAL_MAX_DELAY);
  •     /* USER CODE BEGIN 3 */
  •   }
  •   /* USER CODE END 3 */
  • }
  • /**
  •   * @brief System Clock Configuration
  •   * @retval None
  •   */
  • void SystemClock_Config(void)
  • {
  •   RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  •   RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
  •   RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
  •   /** Initializes the RCC Oscillators according to the specified parameters
  •   * in the RCC_OscInitTypeDef structure.
  •   */
  •   RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
  •   RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  •   RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
  •   RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
  •   if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  •   {
  •     Error_Handler();
  •   }
  •   /** Initializes the CPU, AHB and APB buses clocks
  •   */
  •   RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
  •                               |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  •   RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
  •   RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  •   RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
  •   RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
  •   if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
  •   {
  •     Error_Handler();
  •   }
  •   PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_I2C1;
  •   PeriphClkInit.I2c1ClockSelection = RCC_I2C1CLKSOURCE_HSI;
  •   if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
  •   {
  •     Error_Handler();
  •   }
  • }
  • /**
  •   * @brief I2C1 Initialization Function
  •   * @param None
  •   * @retval None
  •   */
  • static void MX_I2C1_Init(void)
  • {
  •   /* USER CODE BEGIN I2C1_Init 0 */
  •   /* USER CODE END I2C1_Init 0 */
  •   /* USER CODE BEGIN I2C1_Init 1 */
  •   /* USER CODE END I2C1_Init 1 */
  •   hi2c1.Instance = I2C1;
  •   hi2c1.Init.Timing = 0x2000090E;
  •   hi2c1.Init.OwnAddress1 = 0;
  •   hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
  •   hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
  •   hi2c1.Init.OwnAddress2 = 0;
  •   hi2c1.Init.OwnAddress2Masks = I2C_OA2_NOMASK;
  •   hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
  •   hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
  •   if (HAL_I2C_Init(&hi2c1) != HAL_OK)
  •   {
  •     Error_Handler();
  •   }
  •   /** Configure Analogue filter
  •   */
  •   if (HAL_I2CEx_ConfigAnalogFilter(&hi2c1, I2C_ANALOGFILTER_ENABLE) != HAL_OK)
  •   {
  •     Error_Handler();
  •   }
  •   /** Configure Digital filter
  •   */
  •   if (HAL_I2CEx_ConfigDigitalFilter(&hi2c1, 0) != HAL_OK)
  •   {
  •     Error_Handler();
  •   }
  •   /* USER CODE BEGIN I2C1_Init 2 */
  •   /* USER CODE END I2C1_Init 2 */
  • }
  • /**
  •   * @brief USART2 Initialization Function
  •   * @param None
  •   * @retval None
  •   */
  • static void MX_USART2_UART_Init(void)
  • {
  •   /* USER CODE BEGIN USART2_Init 0 */
  •   /* USER CODE END USART2_Init 0 */
  •   /* USER CODE BEGIN USART2_Init 1 */
  •   /* USER CODE END USART2_Init 1 */
  •   huart2.Instance = USART2;
  •   huart2.Init.BaudRate = 115200;
  •   huart2.Init.WordLength = UART_WORDLENGTH_8B;
  •   huart2.Init.StopBits = UART_STOPBITS_1;
  •   huart2.Init.Parity = UART_PARITY_NONE;
  •   huart2.Init.Mode = UART_MODE_TX_RX;
  •   huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  •   huart2.Init.OverSampling = UART_OVERSAMPLING_16;
  •   huart2.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
  •   huart2.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
  •   if (HAL_UART_Init(&huart2) != HAL_OK)
  •   {
  •     Error_Handler();
  •   }
  •   /* USER CODE BEGIN USART2_Init 2 */
  •   /* USER CODE END USART2_Init 2 */
  • }
  • /**
  •   * @brief GPIO Initialization Function
  •   * @param None
  •   * @retval None
  •   */
  • static void MX_GPIO_Init(void)
  • {
  •   /* GPIO Ports Clock Enable */
  •   __HAL_RCC_GPIOA_CLK_ENABLE();
  •   __HAL_RCC_GPIOB_CLK_ENABLE();
  • }
  • /* USER CODE BEGIN 4 */
  • /* USER CODE END 4 */
  • /**
  •   * @brief  This function is executed in case of error occurrence.
  •   * @retval None
  •   */
  • void Error_Handler(void)
  • {
  •   /* USER CODE BEGIN Error_Handler_Debug */
  •   /* User can add his own implementation to report the HAL error return state */
  •   __disable_irq();
  •   while (1)
  •   {
  •   }
  •   /* USER CODE END Error_Handler_Debug */
  • }
  • #ifdef  USE_FULL_ASSERT
  • /**
  •   * @brief  Reports the name of the source file and the source line number
  •   *         where the assert_param error has occurred.
  •   * @param  file: pointer to the source file name
  •   * @param  line: assert_param error line source number
  •   * @retval None
  •   */
  • void assert_failed(uint8_t *file, uint32_t line)
  • {
  •   /* USER CODE BEGIN 6 */
  •   /* User can add his own implementation to report the file name and line number,
  •      ex: printf("Wrong parameters value: file %s on line %d
    ", file, line) */
  •   /* USER CODE END 6 */
  • }
  • #endif /* USE_FULL_ASSERT */
  • /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/








回帖(1)

李浩

2023-1-3 15:06:32
很可能将卫星板连接到任何 STM32 - 或者实际上,任何具有 I2C 接口的 MCU 或 CPU。
但问题是你正在与一个非常复杂的传感器对话。
它太复杂了,我们不给你寄存器映射。我不会告诉您您不能编写自己的代码,但如果您这样做了,将需要大量工作,以至于您最终会在余生中讨厌 ST。
所以,下载API。它可以从 ST 网站免费获得。
STSW-IMG005
VL53L0X API(应用程序编程接口和文档)
里面有使用说明书。
只需打几个电话就可以让它运行起来。
但是有一个窍门。
API 以 RdByte 和 WrWord 等调用结束。
因此,您可以很高兴地将这些调用连接到 MCU 的调用(如 HAL_I2C_Master_Transmit)。
您可以通过重写 platform.c 层来完成此操作。
或者你可以搜索 GitHub 并下载它。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分