Перейти к содержанию
    

Вопрос по реализации USB как виртуального COM порта

Уважаемые коллеги, здравствуйте!

Раньше не пользовался встроенным USB - мне порекомендовали и я решил попробовать. 
Может мне кто-нибудь порекомендовать годный топик или прям сходу рассказать, как настроить USB, как вирт. Ком порт?
У меня на руках две отладочные платки STM - одна нуклео с STM32H7, а другая простенький блю пилл.
Вот я хочу на втором в качестве примера реализовать обмен данными по ЮСБ.

Спасибо за внимание.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сгенерируйте под H7 кубом USB device - CDC - и добейтесь чстобы оно хотя бы опознавалось...
На W10 никакие "драйверы" не понадобятся.

 

тема тут: https://electronix.ru/forum/index.php?app=forums&module=forums&controller=topic&id=159050

тема тут: https://electronix.ru/forum/index.php?app=forums&module=forums&controller=topic&id=120845

 

 

Изменено пользователем GenaSPB

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

22 hours ago, GenaSPB said:

Сгенерируйте под H7 кубом USB device - CDC - и добейтесь чстобы оно хотя бы опознавалось...
На W10 никакие "драйверы" не понадобятся.

 

тема тут: https://electronix.ru/forum/index.php?app=forums&module=forums&controller=topic&id=159050

тема тут: https://electronix.ru/forum/index.php?app=forums&module=forums&controller=topic&id=120845

 

 

 

Спасибо большое!
Мне ещё очень помогла эта статья - https://habr.com/ru/post/335018/

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

6 часов назад, GenaSPB сказал:

А я вот такое развел в своем проекте...

И как, нормально все это работает на FS USB? 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да. Аудио там 2*16*48к - два и один 2*24*96к
Компорт данные только один передавет и не скоростные. А DFU если работает остальное может даже и пропускать. Да, FIFO нужно большое (4 килобайт). OTG_HS на FS скорости

 

Изменено пользователем GenaSPB

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

22.02.2021 в 00:09, GenaSPB сказал:

Да. Аудио там 2*16*48к - два и один 2*24*96к

Странно то, что когда использовал усб-колонки, звук там бывало да "булькал", тогда, как на штатной звуковухе все норм...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Уважаемые коллеги - пляс с бубном у меня продолжается.
Я заранее оговорюсь, что ни на что большое пока что не претендую - просто пытаюсь поднять приёмопередатчик на ЮСБихе, чтобы не прикручивать к отладочным комплектам преобразователи интерфейсов.
Короче говоря, собрал запустил я проект. 
Данные Хосту я отправляю успешно - Терминал их ловит и выводит.
Но, если я пытаюсь послать данные наоборот - от Хоста к плате, то терминал виснет намертво. 
В функцию CDC_Receive_FS их подключенной либы я не попадаю...
Уйму сайтов перелазал - вот такое находил например:
https://www.cyberforum.ru/arm/thread2229504.html
Но как он вис так и виснет - помогите пожалуйста.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, IRBaboon сказал:

В функцию CDC_Receive_FS их подключенной либы я не попадаю...

Функцию

static int8_t CDC_Receive_FS(uint8_t* pbuf, uint32_t *Len);

нужно создавать самому в файле usbd_cdc_if.c, а потом подставить ее имя вот сюда:

 

USBD_CDC_ItfTypeDef USBD_Interface_fops_FS =
{
  CDC_Init_FS,
  CDC_DeInit_FS,
  CDC_Control_FS,
  CDC_Receive_FS,
  CDC_TransmitCplt_FS
};

 

Привязка идет не по именам, а в порядке упоминания имен функций в этом списке - функция приема данных от хоста в списке 4-ая. А потому вместо имени "CDC_Receive_FS" допустимо использовать любое другое.

 

Можете посмотреть, как это сделано у меня, это здесь:

http://89.175.255.52/temp/usbd_cdc_if.c

но это отнюдь не предложение скопировать этот файл буквально.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, Xenia said:

Функцию

static int8_t CDC_Receive_FS(uint8_t* pbuf, uint32_t *Len);

нужно создавать самому в файле usbd_cdc_if.c, а потом подставить ее имя вот сюда:

 

USBD_CDC_ItfTypeDef USBD_Interface_fops_FS =
{
  CDC_Init_FS,
  CDC_DeInit_FS,
  CDC_Control_FS,
  CDC_Receive_FS,
  CDC_TransmitCplt_FS
};

 

Привязка идет не по именам, а в порядке упоминания имен функций в этом списке - функция приема данных от хоста в списке 4-ая. А потому вместо имени "CDC_Receive_FS" допустимо использовать любое другое.

 

Можете посмотреть, как это сделано у меня, это здесь:

http://89.175.255.52/temp/usbd_cdc_if.c

но это отнюдь не предложение скопировать этот файл буквально.

Большое спасибо за ответ, стало понятнее, но при этому хочу заметить, что CDC_Receive_FS у меня есть в usbd_cdc_if.c.
В том числе перечислена в USBD_Interface_fops_FS. Прикладываю скрины и код.

/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file           : usbd_cdc_if.c
  * @version        : v2.0_Cube
  * @brief          : Usb device for Virtual Com Port.
  ******************************************************************************
  * @attention
  *
  * <h2><center>&copy; Copyright (c) 2021 STMicroelectronics.
  * All rights reserved.</center></h2>
  *
  * This software component is licensed by ST under Ultimate Liberty license
  * SLA0044, the "License"; You may not use this file except in compliance with
  * the License. You may obtain a copy of the License at:
  *                             www.st.com/SLA0044
  *
  ******************************************************************************
  */
/* USER CODE END Header */

/* Includes ------------------------------------------------------------------*/
#include "usbd_cdc_if.h"

/* USER CODE BEGIN INCLUDE */

/* USER CODE END INCLUDE */

/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/

/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/

/* USER CODE END PV */

/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY
  * @brief Usb device library.
  * @{
  */

/** @addtogroup USBD_CDC_IF
  * @{
  */

/** @defgroup USBD_CDC_IF_Private_TypesDefinitions USBD_CDC_IF_Private_TypesDefinitions
  * @brief Private types.
  * @{
  */

/* USER CODE BEGIN PRIVATE_TYPES */

/* USER CODE END PRIVATE_TYPES */

/**
  * @}
  */

/** @defgroup USBD_CDC_IF_Private_Defines USBD_CDC_IF_Private_Defines
  * @brief Private defines.
  * @{
  */

/* USER CODE BEGIN PRIVATE_DEFINES */
/* USER CODE END PRIVATE_DEFINES */

/**
  * @}
  */

/** @defgroup USBD_CDC_IF_Private_Macros USBD_CDC_IF_Private_Macros
  * @brief Private macros.
  * @{
  */

/* USER CODE BEGIN PRIVATE_MACRO */

/* USER CODE END PRIVATE_MACRO */

/**
  * @}
  */

/** @defgroup USBD_CDC_IF_Private_Variables USBD_CDC_IF_Private_Variables
  * @brief Private variables.
  * @{
  */
/* Create buffer for reception and transmission           */
/* It's up to user to redefine and/or remove those define */
/** Received data over USB are stored in this buffer      */
uint8_t UserRxBufferFS[APP_RX_DATA_SIZE];

/** Data to send over USB CDC are stored in this buffer   */
uint8_t UserTxBufferFS[APP_TX_DATA_SIZE];

/* USER CODE BEGIN PRIVATE_VARIABLES */

/* USER CODE END PRIVATE_VARIABLES */

/**
  * @}
  */

/** @defgroup USBD_CDC_IF_Exported_Variables USBD_CDC_IF_Exported_Variables
  * @brief Public variables.
  * @{
  */

extern USBD_HandleTypeDef hUsbDeviceFS;

/* USER CODE BEGIN EXPORTED_VARIABLES */

/* USER CODE END EXPORTED_VARIABLES */

/**
  * @}
  */

/** @defgroup USBD_CDC_IF_Private_FunctionPrototypes USBD_CDC_IF_Private_FunctionPrototypes
  * @brief Private functions declaration.
  * @{
  */

static int8_t CDC_Init_FS(void);
static int8_t CDC_DeInit_FS(void);
static int8_t CDC_Control_FS(uint8_t cmd, uint8_t* pbuf, uint16_t length);
static int8_t CDC_Receive_FS(uint8_t* pbuf, uint32_t *Len);

/* USER CODE BEGIN PRIVATE_FUNCTIONS_DECLARATION */

/* USER CODE END PRIVATE_FUNCTIONS_DECLARATION */

/**
  * @}
  */

USBD_CDC_ItfTypeDef USBD_Interface_fops_FS =
{
  CDC_Init_FS,
  CDC_DeInit_FS,
  CDC_Control_FS,
  CDC_Receive_FS
};

/* Private functions ---------------------------------------------------------*/
/**
  * @brief  Initializes the CDC media low layer over the FS USB IP
  * @retval USBD_OK if all operations are OK else USBD_FAIL
  */
static int8_t CDC_Init_FS(void)
{
  /* USER CODE BEGIN 3 */
  /* Set Application Buffers */
  USBD_CDC_SetTxBuffer(&hUsbDeviceFS, UserTxBufferFS, 0);
  USBD_CDC_SetRxBuffer(&hUsbDeviceFS, UserRxBufferFS);
  return (USBD_OK);
  /* USER CODE END 3 */
}

/**
  * @brief  DeInitializes the CDC media low layer
  * @retval USBD_OK if all operations are OK else USBD_FAIL
  */
static int8_t CDC_DeInit_FS(void)
{
  /* USER CODE BEGIN 4 */
  return (USBD_OK);
  /* USER CODE END 4 */
}

/**
  * @brief  Manage the CDC class requests
  * @param  cmd: Command code
  * @param  pbuf: Buffer containing command data (request parameters)
  * @param  length: Number of data to be sent (in bytes)
  * @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL
  */
static int8_t CDC_Control_FS(uint8_t cmd, uint8_t* pbuf, uint16_t length)
{
  /* USER CODE BEGIN 5 */
  switch(cmd)
  {
    case CDC_SEND_ENCAPSULATED_COMMAND:

    break;

    case CDC_GET_ENCAPSULATED_RESPONSE:

    break;

    case CDC_SET_COMM_FEATURE:

    break;

    case CDC_GET_COMM_FEATURE:

    break;

    case CDC_CLEAR_COMM_FEATURE:

    break;

  /*******************************************************************************/
  /* Line Coding Structure                                                       */
  /*-----------------------------------------------------------------------------*/
  /* Offset | Field       | Size | Value  | Description                          */
  /* 0      | dwDTERate   |   4  | Number |Data terminal rate, in bits per second*/
  /* 4      | bCharFormat |   1  | Number | Stop bits                            */
  /*                                        0 - 1 Stop bit                       */
  /*                                        1 - 1.5 Stop bits                    */
  /*                                        2 - 2 Stop bits                      */
  /* 5      | bParityType |  1   | Number | Parity                               */
  /*                                        0 - None                             */
  /*                                        1 - Odd                              */
  /*                                        2 - Even                             */
  /*                                        3 - Mark                             */
  /*                                        4 - Space                            */
  /* 6      | bDataBits  |   1   | Number Data bits (5, 6, 7, 8 or 16).          */
  /*******************************************************************************/
    case CDC_SET_LINE_CODING:

    break;

    case CDC_GET_LINE_CODING:

    break;

    case CDC_SET_CONTROL_LINE_STATE:

    break;

    case CDC_SEND_BREAK:

    break;

  default:
    break;
  }

  return (USBD_OK);
  /* USER CODE END 5 */
}

/**
  * @brief  Data received over USB OUT endpoint are sent over CDC interface
  *         through this function.
  *
  *         @note
  *         This function will issue a NAK packet on any OUT packet received on
  *         USB endpoint until exiting this function. If you exit this function
  *         before transfer is complete on CDC interface (ie. using DMA controller)
  *         it will result in receiving more data while previous ones are still
  *         not sent.
  *
  * @param  Buf: Buffer of data to be received
  * @param  Len: Number of data received (in bytes)
  * @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL
  */
static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len)
{
  /* USER CODE BEGIN 6 */
  USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]);
  USBD_CDC_ReceivePacket(&hUsbDeviceFS);

  return (USBD_OK);
  /* USER CODE END 6 */
}

/**
  * @brief  CDC_Transmit_FS
  *         Data to send over USB IN endpoint are sent over CDC interface
  *         through this function.
  *         @note
  *
  *
  * @param  Buf: Buffer of data to be sent
  * @param  Len: Number of data to be sent (in bytes)
  * @retval USBD_OK if all operations are OK else USBD_FAIL or USBD_BUSY
  */
uint8_t CDC_Transmit_FS(uint8_t* Buf, uint16_t Len)
{
  uint8_t result = USBD_OK;
  /* USER CODE BEGIN 7 */
  USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef*)hUsbDeviceFS.pClassData;
  if (hcdc->TxState != 0){
    return USBD_BUSY;
  }
  USBD_CDC_SetTxBuffer(&hUsbDeviceFS, Buf, Len);
  result = USBD_CDC_TransmitPacket(&hUsbDeviceFS);
  /* USER CODE END 7 */
  return result;
}

/* USER CODE BEGIN PRIVATE_FUNCTIONS_IMPLEMENTATION */

/* USER CODE END PRIVATE_FUNCTIONS_IMPLEMENTATION */

/**
  * @}
  */

/**
  * @}
  */

/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

Я очень благодарен вам за ваш код в качестве примера, могу сказать, что мне, как человеку, которому это нужно срочно и в качестве прикладного инструмента для отладки своих модулей это был бы лучший вариант.

2021-02-23_21-32-29.png

2021-02-23_21-32-38.png

Хочу ещё раз отметить, что у меня именно зависает терминал, а в режиме дебага, на метку в эту функцию CDC_Receive_FS, я так и не попадаю.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

30 минут назад, IRBaboon сказал:

Хочу ещё раз отметить, что у меня именно зависает терминал, а в режиме дебага, на метку в эту функцию CDC_Receive_FS, я так и не попадаю.

Тогда советую вам проверить размеры буферов (я, помнится, что-то в них ковыряла, пока не заработало). У меня в CubeMX это выглядит так:

1695276363_.thumb.png.60390b061b83d083ac10922b8d0359c0.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо большое за помощь - проблема была в том, что я пытался работать по SWD интерфейсу в режиме дебага. Терминал при этом виснет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...