IRBaboon 0 20 февраля, 2021 Опубликовано 20 февраля, 2021 · Жалоба Уважаемые коллеги, здравствуйте! Раньше не пользовался встроенным USB - мне порекомендовали и я решил попробовать. Может мне кто-нибудь порекомендовать годный топик или прям сходу рассказать, как настроить USB, как вирт. Ком порт? У меня на руках две отладочные платки STM - одна нуклео с STM32H7, а другая простенький блю пилл. Вот я хочу на втором в качестве примера реализовать обмен данными по ЮСБ. Спасибо за внимание. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 20 февраля, 2021 Опубликовано 20 февраля, 2021 (изменено) · Жалоба Сгенерируйте под 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 Изменено 20 февраля, 2021 пользователем GenaSPB Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
IRBaboon 0 21 февраля, 2021 Опубликовано 21 февраля, 2021 · Жалоба 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/ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 21 февраля, 2021 Опубликовано 21 февраля, 2021 · Жалоба А я вот такое развел в своем проекте... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Vasily_ 59 21 февраля, 2021 Опубликовано 21 февраля, 2021 · Жалоба Может кому пригодится. http://we.easyelectronics.ru/tag/at91sam7s/ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 53 21 февраля, 2021 Опубликовано 21 февраля, 2021 · Жалоба 6 часов назад, GenaSPB сказал: А я вот такое развел в своем проекте... И как, нормально все это работает на FS USB? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 21 февраля, 2021 Опубликовано 21 февраля, 2021 (изменено) · Жалоба Да. Аудио там 2*16*48к - два и один 2*24*96к Компорт данные только один передавет и не скоростные. А DFU если работает остальное может даже и пропускать. Да, FIFO нужно большое (4 килобайт). OTG_HS на FS скорости Изменено 21 февраля, 2021 пользователем GenaSPB Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 53 23 февраля, 2021 Опубликовано 23 февраля, 2021 · Жалоба 22.02.2021 в 00:09, GenaSPB сказал: Да. Аудио там 2*16*48к - два и один 2*24*96к Странно то, что когда использовал усб-колонки, звук там бывало да "булькал", тогда, как на штатной звуковухе все норм... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
IRBaboon 0 23 февраля, 2021 Опубликовано 23 февраля, 2021 · Жалоба Уважаемые коллеги - пляс с бубном у меня продолжается. Я заранее оговорюсь, что ни на что большое пока что не претендую - просто пытаюсь поднять приёмопередатчик на ЮСБихе, чтобы не прикручивать к отладочным комплектам преобразователи интерфейсов. Короче говоря, собрал запустил я проект. Данные Хосту я отправляю успешно - Терминал их ловит и выводит. Но, если я пытаюсь послать данные наоборот - от Хоста к плате, то терминал виснет намертво. В функцию CDC_Receive_FS их подключенной либы я не попадаю... Уйму сайтов перелазал - вот такое находил например:https://www.cyberforum.ru/arm/thread2229504.html Но как он вис так и виснет - помогите пожалуйста. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Xenia 45 23 февраля, 2021 Опубликовано 23 февраля, 2021 · Жалоба 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 но это отнюдь не предложение скопировать этот файл буквально. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
IRBaboon 0 23 февраля, 2021 Опубликовано 23 февраля, 2021 · Жалоба 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>© 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****/ Я очень благодарен вам за ваш код в качестве примера, могу сказать, что мне, как человеку, которому это нужно срочно и в качестве прикладного инструмента для отладки своих модулей это был бы лучший вариант. Хочу ещё раз отметить, что у меня именно зависает терминал, а в режиме дебага, на метку в эту функцию CDC_Receive_FS, я так и не попадаю. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Xenia 45 23 февраля, 2021 Опубликовано 23 февраля, 2021 · Жалоба 30 минут назад, IRBaboon сказал: Хочу ещё раз отметить, что у меня именно зависает терминал, а в режиме дебага, на метку в эту функцию CDC_Receive_FS, я так и не попадаю. Тогда советую вам проверить размеры буферов (я, помнится, что-то в них ковыряла, пока не заработало). У меня в CubeMX это выглядит так: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
IRBaboon 0 27 февраля, 2021 Опубликовано 27 февраля, 2021 · Жалоба Спасибо большое за помощь - проблема была в том, что я пытался работать по SWD интерфейсу в режиме дебага. Терминал при этом виснет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться