Jump to content

    

USB CDC и STM32F103. Попытка передать байт всегда возвращает USBD_BUSY

Контроллер STM32F103C8T6

Проект (не плюйтесь) сгенерирован в кубе под Keil.

Quote

/* USER CODE BEGIN PV */
    uint8_t DataOut[400];
    uint8_t *pDataOut;
        char str_tx[21];
        unsigned int j;
    
void SystemClock_Config(void);
static void MX_GPIO_Init(void);

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  HAL_Init();

  SystemClock_Config();

  MX_GPIO_Init();
  MX_USB_DEVICE_Init();

    pDataOut=DataOut;
     sprintf(str_tx,"USB Transmit\r\n");
     
   
     
  while (1)
  {
        
        
        if (CDC_Transmit_FS((unsigned char*)str_tx, strlen(str_tx))==USBD_OK) 
        {    
        HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_12);
        }    
        HAL_Delay(500);
        
        
  }
  /* USER CODE END 3 */
}

ИнициализацияUSB

 

Quote

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. */
  USBD_Init(&hUsbDeviceFS, &FS_Desc, DEVICE_FS);

  USBD_RegisterClass(&hUsbDeviceFS, &USBD_CDC);

  USBD_CDC_RegisterInterface(&hUsbDeviceFS, &USBD_Interface_fops_FS);

  USBD_Start(&hUsbDeviceFS);

  /* USER CODE BEGIN USB_DEVICE_Init_PostTreatment */
  
  /* USER CODE END USB_DEVICE_Init_PostTreatment */
}
 

 

Да - само устройство в системе видится как COM порт, с этим проблем нет.

Но при попытке что-то передать - всегда возвращается USBD_BUSY.

Ну и в Терминале на компе ничего не принимается, етественно.

Куда копать? Что проверить?

Share this post


Link to post
Share on other sites

Ответ нашелся. Но он породил еще один вопрос.

Оказывается нужно всего лишь передергивать затвор. USB кабель в смысле.

То есть, к примеру, все работает, данные отправляются.

Перепрошиваю контроллер той же прошивкой - программа запускается, но данные не отправляются.

А вот если передернуть USB кабель - то отправка данных вновь возобновляется.

 

Как  с этим бороться? Понимаю, что в конечном устройстве этой проблемы не будет, но хочется освободить себя о лишних телодвижений при отладке.

Share this post


Link to post
Share on other sites
3 minutes ago, zheka said:

Как  с этим бороться? Понимаю, что в конечном устройстве этой проблемы не будет, но хочется освободить себя о лишних телодвижений при отладке.

Будет... :wink:  Ибо это сатанинское отродье - USB по природе своей таково.

Share this post


Link to post
Share on other sites
28 минут назад, zheka сказал:

Перепрошиваю контроллер той же прошивкой - программа запускается, но данные не отправляются.

А вот если передернуть USB кабель - то отправка данных вновь возобновляется.

Как  с этим бороться? Понимаю, что в конечном устройстве этой проблемы не будет, но хочется освободить себя о лишних телодвижений при отладке.

Выпрямлять своё ПО или руки разработчику схемы. Потому что нормально написанное ПО на правильной схеме сперва отключается от шины, посылая хосту уведомление, что устройство отключено, а потом через некоторое время подключается - уведомляя хоста о своём подключении и необходимости выполнить энумерацию заново.

Ну и COM-порт на ПК тоже при этом закрывать нужно.

Share this post


Link to post
Share on other sites

Гуру обычно берут один из 100500 проектов USB-CDC и минут 20 смотрят/используют.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now