代码之家  ›  专栏  ›  技术社区  ›  Soleil Anker-Baril

试图与我的BNO055 IMU进行一些i2c通信,但似乎无法通过MX\U I2C1\U Init函数

  •  0
  • Soleil Anker-Baril  · 技术社区  · 7 年前

    我一直在尝试与我的BNO055 IMU进行一些i2c通信,但当我在调试中运行MX\U I2C1\U Init函数时,它似乎无法通过。

    它给了我这个错误:

    Error: jtag status contains invalid mode value - communication failure
    Polling target STM32F303RETx.cpu failed, trying to reexamine
    Examination failed, GDB will be halted. Polling again in 6300ms
    Info : Previous state query failed, trying to reconnect
    Error: jtag status contains invalid mode value - communication failure
    Polling target STM32F303RETx.cpu failed, trying to reexamine
    Examination failed, GDB will be halted. Polling again in 6300ms
    shutdown command invoked
    

    我目前使用的是NucleoSTM32F303RE板,基本代码由cubemx生成。它为hal函数、i2c1引脚、uart4引脚创建了代码。这是我的密码。

    /* Includes ------------------------------------------------------------------*/
    #include "main.h"
    #include "stm32f3xx_hal.h"
    
    /* USER CODE BEGIN Includes */
    #define DEV_ADD          (0x28<<1)
    #define UNIT_SELECT_ADD  0x3B
    #define UNIT_SELECT_DATA 0x68
    #define OPR_MODE_ADD     0x3D
    #define OPR_MODE_DATA    0xFC
    #define EUL_X_ADD        0x1A
    #define EUL_Y_ADD        0x1C
    #define EUL_Z_ADD        0x1E
    #define LIA_X_ADD        0x28
    #define LIA_Y_ADD        0x2A
    #define LIA_Z_ADD        0x2C
    /* USER CODE END Includes */
    
    /* Private variables ---------------------------------------------------------*/
    I2C_HandleTypeDef hi2c1;
    
    UART_HandleTypeDef huart4;
    
    /* USER CODE BEGIN PV */
    /* Private variables ---------------------------------------------------------*/
    
    unsigned char eul_x_msb = 0, eul_x_lsb = 0, eul_y_msb = 0, eul_y_lsb = 0, eul_z_msb = 0, eul_z_lsb = 0;
    unsigned char lia_x_msb = 0, lia_x_lsb = 0, lia_y_msb = 0, lia_y_lsb = 0, lia_z_msb = 0, lia_z_lsb = 0;
    
    /* 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_UART4_Init(void);
    
    /* USER CODE BEGIN PFP */
    /* Private function prototypes -----------------------------------------------*/
    
    void i2c_init_function(void){
        unsigned char aRxBuffer[3], txBuffer[3];
        HAL_I2C_Mem_Read(&hi2c1, DEV_ADD, UNIT_SELECT_ADD, I2C_MEMADD_SIZE_8BIT, aRxBuffer, 1, 100);
        aRxBuffer[0] = aRxBuffer[0] & UNIT_SELECT_DATA;
        txBuffer[0] = UNIT_SELECT_ADD;
        txBuffer[1] = aRxBuffer[0];
        HAL_I2C_Master_Transmit(&hi2c1, DEV_ADD, txBuffer, 1, 100);
    
    
        HAL_I2C_Mem_Read(&hi2c1, DEV_ADD, OPR_MODE_ADD, I2C_MEMADD_SIZE_8BIT, aRxBuffer, 1, 100);
        aRxBuffer[0] = aRxBuffer[0] & OPR_MODE_DATA;
        txBuffer[0] = OPR_MODE_ADD;
        txBuffer[1] = aRxBuffer[0];
        HAL_I2C_Master_Transmit(&hi2c1, DEV_ADD, txBuffer, 1, 100);
    }
    
    void eul_x_read(unsigned char * tab){
        HAL_I2C_Mem_Read(&hi2c1, DEV_ADD, EUL_X_ADD, I2C_MEMADD_SIZE_8BIT, tab, 2, 100);
    }
    
    void eul_y_read(unsigned char * tab){
        HAL_I2C_Mem_Read(&hi2c1, DEV_ADD, EUL_Y_ADD, I2C_MEMADD_SIZE_8BIT, tab, 2, 100);
    }
    
    void eul_z_read(unsigned char * tab){
        HAL_I2C_Mem_Read(&hi2c1, DEV_ADD, EUL_Z_ADD, I2C_MEMADD_SIZE_8BIT, tab, 2, 100);
    }
    
    void lia_x_read(unsigned char * tab){
        HAL_I2C_Mem_Read(&hi2c1, DEV_ADD, LIA_X_ADD, I2C_MEMADD_SIZE_8BIT, tab, 2, 100);
    }
    
    void lia_y_read(unsigned char * tab){
        HAL_I2C_Mem_Read(&hi2c1, DEV_ADD, LIA_Y_ADD, I2C_MEMADD_SIZE_8BIT, tab, 2, 100);
    }
    
    void lia_z_read(unsigned char * tab){
        HAL_I2C_Mem_Read(&hi2c1, DEV_ADD, LIA_Z_ADD, I2C_MEMADD_SIZE_8BIT, tab, 2, 100);
    }
    
    /* USER CODE END PFP */
    
    /* USER CODE BEGIN 0 */
    
    /* USER CODE END 0 */
    
    /**
      * @brief  The application entry point.
      *
      * @retval None
      */
    int main(void)
    {
      /* USER CODE BEGIN 1 */
    
      /* 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_UART4_Init();
      /* USER CODE BEGIN 2 */
    
    
      i2c_init_function();
      /* USER CODE END 2 */
    
      /* Infinite loop */
      /* USER CODE BEGIN WHILE */
      while (1)
      {
    
      /* USER CODE END WHILE */
          unsigned char buff[3];
    
          eul_x_read(buff);
          HAL_Delay(25);
          eul_x_lsb = buff[0];
          eul_x_msb = buff[1];
    
          eul_y_read(buff);
          HAL_Delay(25);
          eul_y_lsb = buff[0];
          eul_y_msb = buff[1];
    
          eul_z_read(buff);
          HAL_Delay(25);
          eul_z_lsb = buff[0];
          eul_z_msb = buff[1];
    
          lia_x_read(buff);
          HAL_Delay(25);
          lia_x_lsb = buff[0];
          lia_x_msb = buff[1];
    
          lia_y_read(buff);
          HAL_Delay(25);
          lia_y_lsb = buff[0];
          lia_y_msb = buff[1];
    
          lia_z_read(buff);
          HAL_Delay(25);
          lia_z_lsb = buff[0];
          lia_z_msb = buff[1];
    
    
          unsigned char mapping[12] = {eul_x_msb, eul_x_lsb, eul_y_msb, eul_y_lsb, eul_z_msb, eul_z_lsb,
                                       lia_x_msb, lia_x_lsb, lia_y_msb, lia_y_lsb, lia_z_msb, lia_z_lsb};
    
    
          HAL_UART_Transmit(&huart4, mapping, 12, 100);
      /* USER CODE BEGIN 3 */
    
      }
      /* USER CODE END 3 */
    
    }
    
    /**
      * @brief System Clock Configuration
      * @retval None
      */
    void SystemClock_Config(void)
    {
    
      RCC_OscInitTypeDef RCC_OscInitStruct;
      RCC_ClkInitTypeDef RCC_ClkInitStruct;
      RCC_PeriphCLKInitTypeDef PeriphClkInit;
    
        /**Initializes the CPU, AHB and APB busses clocks 
        */
      RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
      RCC_OscInitStruct.HSIState = RCC_HSI_ON;
      RCC_OscInitStruct.HSICalibrationValue = 16;
      RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
      RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
      RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
      RCC_OscInitStruct.PLL.PREDIV = RCC_PREDIV_DIV1;
      if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
      {
        _Error_Handler(__FILE__, __LINE__);
      }
    
        /**Initializes the CPU, AHB and APB busses clocks 
        */
      RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                                  |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
      RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
      RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
      RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
      RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
    
      if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
      {
        _Error_Handler(__FILE__, __LINE__);
      }
    
      PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_UART4|RCC_PERIPHCLK_I2C1;
      PeriphClkInit.Uart4ClockSelection = RCC_UART4CLKSOURCE_PCLK1;
      PeriphClkInit.I2c1ClockSelection = RCC_I2C1CLKSOURCE_HSI;
      if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
      {
        _Error_Handler(__FILE__, __LINE__);
      }
    
        /**Configure the Systick interrupt time 
        */
      HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);
    
        /**Configure the Systick 
        */
      HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
    
      /* SysTick_IRQn interrupt configuration */
      HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
    }
    
    /* I2C1 init function */
    static void MX_I2C1_Init(void)
    {
    
      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(__FILE__, __LINE__);
      }
    
        /**Configure Analogue filter 
        */
      if (HAL_I2CEx_ConfigAnalogFilter(&hi2c1, I2C_ANALOGFILTER_ENABLE) != HAL_OK)
      {
        _Error_Handler(__FILE__, __LINE__);
      }
    
        /**Configure Digital filter 
        */
      if (HAL_I2CEx_ConfigDigitalFilter(&hi2c1, 0) != HAL_OK)
      {
        _Error_Handler(__FILE__, __LINE__);
      }
    
    }
    
    /* UART4 init function */
    static void MX_UART4_Init(void)
    {
    
      huart4.Instance = UART4;
      huart4.Init.BaudRate = 115200;
      huart4.Init.WordLength = UART_WORDLENGTH_8B;
      huart4.Init.StopBits = UART_STOPBITS_1;
      huart4.Init.Parity = UART_PARITY_NONE;
      huart4.Init.Mode = UART_MODE_TX_RX;
      huart4.Init.HwFlowCtl = UART_HWCONTROL_NONE;
      huart4.Init.OverSampling = UART_OVERSAMPLING_16;
      huart4.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
      huart4.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
      if (HAL_UART_Init(&huart4) != HAL_OK)
      {
        _Error_Handler(__FILE__, __LINE__);
      }
    
    }
    
    /** Configure pins as 
            * Analog 
            * Input 
            * Output
            * EVENT_OUT
            * EXTI
    */
    static void MX_GPIO_Init(void)
    {
    
      GPIO_InitTypeDef GPIO_InitStruct;
    
      /* GPIO Ports Clock Enable */
      __HAL_RCC_GPIOF_CLK_ENABLE();
      __HAL_RCC_GPIOA_CLK_ENABLE();
      __HAL_RCC_GPIOC_CLK_ENABLE();
    
      /*Configure GPIO pins : PA0 PA1 PA2 PA3 
                               PA4 */
      GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3 
                              |GPIO_PIN_4;
      GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
      GPIO_InitStruct.Pull = GPIO_NOPULL;
      HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    
    }
    
    /* USER CODE BEGIN 4 */
    
    /* USER CODE END 4 */
    
    /**
      * @brief  This function is executed in case of error occurrence.
      * @param  file: The file name as string.
      * @param  line: The line in file as a number.
      * @retval None
      */
    void _Error_Handler(char *file, int line)
    {
      /* USER CODE BEGIN Error_Handler_Debug */
      /* User can add his own implementation to report the HAL error return state */
      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,
         tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
      /* USER CODE END 6 */
    }
    #endif /* USE_FULL_ASSERT */
    
    /**
      * @}
      */
    
    /**
      * @}
      */
    
    /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
    
    1 回复  |  直到 7 年前
        1
  •  0
  •   Soleil Anker-Baril    7 年前

    我发现XD我无意中使用了JTags时钟引脚进行I2C通信,因此当它进入GPIO初始化时,调试器将停止工作XD我最初使用的是引脚PA14和PA15。PA14是JTAG时钟。因此,我将其更改为PB8和PB9,这是I2C1通信的替代引脚选择。 here's the pin out description that enlightened me