Конфликт Usb otg с i2c на плате stm32f4

#c #embedded #i2c #stm32f4discovery #usb-otg

#c #встроенный #i2c #обнаружение stm32f4 #usb-otg

Вопрос:

У меня есть плата обнаружения stm32f429, и я испытываю конфликт между usb otg hs и i2c3. Я использую библиотеку usb cdc, которая при собственной инициализации отлично работает как виртуальный com-порт, и я могу общаться в Windows. Когда инициализируется любое другое периферийное устройство связи, такое как I2C или USART, usb vcp все еще виден в Windows, но я не могу подключиться с помощью putty или realterm. Вот код инициализации USB и I2C. Когда I2C закомментирован, связь работает нормально:

 void MX_USB_DEVICE_Init(void)
{
  /* USER CODE BEGIN USB_DEVICE_Init_PreTreatment */

  /* USER CODE END USB_DEVICE_Init_PreTreatment */

  /* Init Device Library, add supported class and start the library. */
  if (USBD_Init(amp;hUsbDeviceHS, amp;HS_Desc, DEVICE_HS) != USBD_OK)
  {
    Error_Handler();
  }
  if (USBD_RegisterClass(amp;hUsbDeviceHS, amp;USBD_CDC) != USBD_OK)
  {
    Error_Handler();
  }
  if (USBD_CDC_RegisterInterface(amp;hUsbDeviceHS, amp;USBD_Interface_fops_HS) != USBD_OK)
  {
    Error_Handler();
  }
  if (USBD_Start(amp;hUsbDeviceHS) != USBD_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN USB_DEVICE_Init_PostTreatment */

  /* USER CODE END USB_DEVICE_Init_PostTreatment */
}

static void MX_I2C3_Init(void)
{

  /* USER CODE BEGIN I2C3_Init 0 */

  /* USER CODE END I2C3_Init 0 */

  /* USER CODE BEGIN I2C3_Init 1 */

  /* USER CODE END I2C3_Init 1 */
  hi2c3.Instance = I2C3;
  hi2c3.Init.ClockSpeed = 100000;
  hi2c3.Init.DutyCycle = I2C_DUTYCYCLE_2;
  hi2c3.Init.OwnAddress1 = 0;
  hi2c3.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
  hi2c3.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
  hi2c3.Init.OwnAddress2 = 0;
  hi2c3.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
  hi2c3.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
  if (HAL_I2C_Init(amp;hi2c3) != HAL_OK)
  {
    Error_Handler();
  }
  /** Configure Analogue filter 
  */
  if (HAL_I2CEx_ConfigAnalogFilter(amp;hi2c3, I2C_ANALOGFILTER_ENABLE) != HAL_OK)
  {
    Error_Handler();
  }
  /** Configure Digital filter 
  */
  if (HAL_I2CEx_ConfigDigitalFilter(amp;hi2c3, 0) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN I2C3_Init 2 */

  /* USER CODE END I2C3_Init 2 */

}
  

Я думал, что это была проблема с приоритетом ISR, поэтому я безуспешно играл с разными приоритетами ISR для 2 периферийных устройств. Кроме того, я явно не включаю ISR для периферийного устройства I2C. Что-то происходит в процедурах инициализации HAL, но я не смог понять, что именно.

Кто-нибудь еще сталкивался с этим?

Ответ №1:

Для всех, кто интересуется, существует известная проблема с получением и установкой Windows кодирования строки cdc для связи по usb, которая решается здесь:

https://github.com/Ant1882/STM32F429-Tracealyzer-Demo/commit/4cf6591b3bdff098292349874f8c0c8df7802986#diff-ecfa63e2067d22f9ae74145176a1b736R283