c - stm32f4板上的usb otg与i2c冲突

标签 c embedded i2c stm32f4discovery usb-otg

我有 stm32f429 discovery board,但我遇到了 usb otg hs 和 i2c3 之间的冲突。我使用 cdc usb 库,当它自己初始化时,它可以作为虚拟 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(&hUsbDeviceHS, &HS_Desc, DEVICE_HS) != USBD_OK)
  {
    Error_Handler();
  }
  if (USBD_RegisterClass(&hUsbDeviceHS, &USBD_CDC) != USBD_OK)
  {
    Error_Handler();
  }
  if (USBD_CDC_RegisterInterface(&hUsbDeviceHS, &USBD_Interface_fops_HS) != USBD_OK)
  {
    Error_Handler();
  }
  if (USBD_Start(&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(&hi2c3) != HAL_OK)
  {
    Error_Handler();
  }
  /** Configure Analogue filter 
  */
  if (HAL_I2CEx_ConfigAnalogFilter(&hi2c3, I2C_ANALOGFILTER_ENABLE) != HAL_OK)
  {
    Error_Handler();
  }
  /** Configure Digital filter 
  */
  if (HAL_I2CEx_ConfigDigitalFilter(&hi2c3, 0) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN I2C3_Init 2 */

  /* USER CODE END I2C3_Init 2 */

}

我认为这是一个 ISR 优先级问题,所以我为 2 个外设尝试了不同的 ISR 优先级,但没有成功。另外,我没有明确为 I2C 外设启用 ISR。 HAL 初始化例程中发生了一些事情,但我无法理解是什么。

其他人也经历过这种情况吗?

最佳答案

对于感兴趣的人,Windows 获取和设置 USB 通信的 cdc 线路编码存在一个已知问题,该问题已在此处解决:

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

关于c - stm32f4板上的usb otg与i2c冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55658449/

相关文章:

embedded - 微 Controller 之间处理器间通信的 UART、I2C 与 SPI

c - 使用 Unity 进行单元测试时模拟 C 函数

java - 在java中通过i2c向寄存器写入0x80或-128时有区别吗

c - 将 ASCII 字节流发送到管道

c++ - C++ 11-修改结构 vector 中的结构成员

linux - Linux中有没有类似NanoBSD的东西

c - Bash 路径变量,权限被拒绝

C - 在 1021 次迭代时出现段错误,并且在 1020 次迭代时无法打开 i2c

计算元素在固定点的位置以进行 TFT 绘图

c - 使用全局变量最优雅的方法是什么?