Микроконтроллеры

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Микроконтроллеры » Архив » USB CDC для STM32F103


USB CDC для STM32F103

Сообщений 1 страница 30 из 98

1

Всем привет!
Столкнулся с неприятным косяком при поднятии USB CDC. Устройство проходит энумерацию в винде, появляется устройство, ставится дефолтный драйвер, и вроде все хорошо, винда говорит что работает нормально, но когда пытаюсь подключится к COM порту через любую терминальную прогу, то она зависает на подключении, как только вытаскиваю устройство из компа прога сразу оживает.
В чем может быть косяк?
Ссылка на проект (может кто попробует или просто глянуть)
https://github.com/saewave/STM32F103-USB-CDC-CMSIS
Windows 7, терминал Termite 3.2

Отредактировано alexsam (2018-01-23 21:49:42)

2

alexsam, привет
На первый взгляд в твоём коде нет собственно самой реализации cdc [мало объявить endpoints для cdc, надо их ещё и обслуживать в соотв. со спецификацией cdc]
CDC и другие стандартные классы выходят за рамки этого топика, это чисто софтовый верхний уровень, а топик про usb и-фейс в мк
Может быть завести тут отдельный топик про cdc, может это ещё кому-то будет интересно [мне - нет, но вроде Eddy_Em интересовался]

Выделил в отдельный топик

Отредактировано vt (2018-07-09 10:09:09)

3

Ну чтоб обслуживать CDC нужно получать от хоста запросы на это самое обслуживание, а они почему-то не приходят. Структуру я обьявил, точки все в btable прописаны с адресами. Думаю что что-то с дескрипторами не то, ибо не хочет подключаться сама прога к порту чтоб что-то передать.

4

USB_DEVICE_DESC[] посмотри там версия USB 2.0 должна  быть 00  02 а у тебя 02 00. Это не значит что в этом косяк просто первое что на глаза попалось.

p.s. СDC не реализовывал но в масс сторадж у меня после SET_CONFIGURATION(  те STANDART_REQUEST) пошли CLASS_REQUEST один через EP0 а остальные специфичные для класса уже через EP1 и EP2. Не увидел у тебя реализацию для CDC класса(поправь может оно и не надо) и обработка принятия и отправка каких либо байт не через нулевую EP.

Отредактировано pvo125 (2018-01-24 18:17:52)

5

Ну что ж, поборол я CDC. Все работает, косяков вроде не замечено. Если кому нужно будет - берите :)
STM32F103-USB-CDC-CMSIS

6

alexsam, а в двух словах -в чем была проблема?

7

alexsam
Отличный эталонно минималистичный cdc получился [всего четыре (?) классово специфичных запроса]

dosikus
По ссылке на github глянь коммиты и увидишь во всех подробностях что менялось )

8

Да, проблема была в том, что провтыкал отправку ответа на установку битрейта и при подключении, когда драйвер присылал фрейм с USB_DEVICE_CDC_REQUEST_SET_LINE_CODING я ему не отправлял подтверждения. Ну и хост висел и ждал. Потом отваливался.
(нужно завязывать педалить после 2х часов ночи )) )
Сейчас в планах добавить вывод состояния подключения/отключения к COM порту приложения на хосте и, возможно стоит сделать отслеживание освобождениям буфера отправки. Но не уверен что это стоит делать в самой либе.

Отредактировано alexsam (2018-01-26 11:13:42)

9

Да я ж не для себя. Кто нибудь будет искать, а тут непонятки...
alexsam, спасибо.

10

alexsam написал(а):

Ну что ж, поборол я CDC. Все работает, косяков вроде не замечено. Если кому нужно будет - берите
STM32F103-USB-CDC-CMSIS

устройство не определилось. с каким кварцем тактовая выставляется?
на 12Mhz, тады все норм. надо на 8 пересчитать плл. вроде шесть будет.
определились. теперь драйвер надо родить. и схематику.
с драйвером затык. кто нибудь может чего посоветовать. в bluepill залит пример alexsam. настройка тактовой подправлена под 8 МГц кварц. а вот дальше затык. устр определяется, пытается ставить драйвер RemoteSwitchHUB, а дальше все... дрова не встают.
дичь какая то. nuvoton comport встал. все остальное нет. эх лыжи, лыжи... не помогли ноги, ноги...

Отредактировано RA (2018-07-08 21:08:09)

11

alexsam написал(а):

Ну что ж, поборол я CDC. Все работает, косяков вроде не замечено. Если кому нужно будет - берите
STM32F103-USB-CDC-CMSIS

прекрасно работает на bluepill. хороший стартовый проект + усбкомпорт.

12

в usblib.c есть вот такое

Код:
void USBLIB_Init(void)
{
    NVIC_DisableIRQ(USB_LP_CAN1_RX0_IRQn);
    RCC->APB1ENR = RCC_APB1ENR_USBEN;

    USB->CNTR   = USB_CNTR_FRES; /* Force USB Reset */
    USB->BTABLE = 0;
    USB->DADDR  = 0;
    USB->ISTR   = 0;
    USB->CNTR   = USB_CNTR_RESETM;
    NVIC_EnableIRQ(USB_LP_CAN1_RX0_IRQn);
}

после все что на APB1ENR падает, остается только usb.
лечится  RCC->APB1ENR |= RCC_APB1ENR_USBEN;

13

Ох, я сюда редко заглядываю, если что ищите меня на изиэлектроникс с тем же ником.
Да, проект был на 12МГц и чисто под USB. Код поправил в гитхабе для RCC->APB1ENR

14

А на 8 МГц кварца не поделитесь проектиком?

15

МимоПроходил написал(а):

А на 8 МГц кварца не поделитесь проектиком?

а что именно нужно настройка тактового модуля?
если память не изменяет, то там надо

Код:
RCC->CFGR |= RCC_CFGR_PLLMULL4;

поменять на

Код:
RCC->CFGR |= RCC_CFGR_PLLMULL6;

16

Код:
#include "stm32f10x.h"
#include "usblib.h"

USBLIB_WByte _LineState;

int main(void)
{

    /* ============ 48 MHz ============= */
    RCC->CFGR &= ~RCC_CFGR_SW; // Change System Clock to HSI
    while ((RCC->CFGR & RCC_CFGR_SWS) != 0x00) {
        __NOP();
    };
    RCC->CR &= ~RCC_CR_PLLON; // Disable Pll
    while ((RCC->CR & RCC_CR_PLLON)) {
        __NOP();
    };
    RCC->CFGR &= ~0x3C0000;
    RCC->CFGR |= RCC_CFGR_PLLMULL9; // 6
    /*тута можно поиграться чтоб на усб 48 МГц а клок 72МГц*/
  //  RCC->CFGR |= RCC_CFGR_USBPRE;
    RCC->CFGR |= RCC_CFGR_PLLSRC;
    RCC->CR |= RCC_CR_PLLON;
    while (!(RCC->CR & RCC_CR_PLLON)) {
        __NOP();
    };
    RCC->CFGR |= RCC_CFGR_SW_1; // Change System Clock to PLL
    while ((RCC->CFGR & RCC_CFGR_SWS) != RCC_CFGR_SWS_1) {
        __NOP();
    };

    RCC->APB2ENR |= RCC_APB2ENR_IOPAEN | RCC_APB2ENR_IOPBEN | RCC_APB2ENR_AFIOEN| RCC_APB2ENR_IOPCEN;
    /* ========= PB13 USB CONNECT ========= */
    /* PC13 - LED. Output PP */
    GPIOC->CRH |= GPIO_CRH_MODE13_0;
    GPIOC->CRH &= ~GPIO_CRH_CNF13;

    /* PA15 - USB EN. Output PP */
    GPIOB->CRH |= GPIO_CRH_MODE13_0;
    GPIOB->CRH &= ~GPIO_CRH_CNF13;
    GPIOC->BSRR = GPIO_BSRR_BS13;
    
    GPIOB->BSRR = GPIO_BSRR_BR13;//LOW
    for (int i = 0; i < 1000000; i++) {
        __NOP();
    };

    USBLIB_Init();
    GPIOB->BSRR = GPIO_BSRR_BS13;//UP
    while (1) {};
}

void uUSBLIB_DataReceivedHandler(uint16_t *Data, uint16_t Length)
{
	uint16_t i=0;
	uint16_t ii=Length;
	uint16_t bf=0;
	char RxBuff[64]={0};
	while(ii){
    bf = *Data;
    RxBuff[i++] = *Data++;
    RxBuff[i++] = bf>>8;
    ii--;    
	}
	if((RxBuff[0]=='x')&&(RxBuff[1]=='x')&&(RxBuff[2]=='x')){
    USBLIB_Transmit((uint16_t *)"Welcome to the club!\r\n", 22);
    GPIOC->BSRR = GPIO_BSRR_BR13;
    for (int i = 0; i < 1000000; i++) {
        __NOP();
    };
	}
	else{
    USBLIB_Transmit((uint16_t *)"Bye bye!\r\n", 10);
    for (int i = 0; i < 1000000; i++) {
        __NOP();
    };
    GPIOC->BSRR = GPIO_BSRR_BS13;
	}
	USBLIB_Transmit((uint16_t *)&RxBuff[0], Length);
}

void uUSBLIB_LineStateHandler(USBLIB_WByte LineState)
{
    if (LineState.L) {      //App connected to the virtual port
        _LineState = LineState;
    }
}

http://sh.uploads.ru/oeTP6.png

17

Мужики, киньте в меня, пожалуйста, ссылкой на внятное описание алгоритма действий при работе CDC. А то читать жирнючий стандарт никакого желания нет. Сейчас немного вермени на работе появилось, хочу добить CDC под STM32F042, но что-то лыжи не едут (взять код для STM32F103 и переделать под 042 - вряд ли хорошая идея, т.к. реализация USB у них разная).

18

19

20

Ссылки вообще ничем не помогли, в "USB in a NutShell" больше полезной информации, но тоже ее недостаточно.
Пока что не получается: я не понимаю, как отвечать на  vendor-запросы (ни одна конечная точка не реагирует на них), передача тоже почему-то не работает...
Пытаюсь эмулировать PL2303 как наиболее надежный преобразователь (с ch340 до сих пор в ядре какая-то каша творится, и в его полноценной работе я не уверен).

21

Что-то я не понял, а как же любимая песня "читайте документацию", вся документация в наличии )

22

А где найти документацию на протокол CDC для PL2303?
И вообще на CDC?
Это ж трешняк: в стандартах столько понамешано, что полезной информации извлечь — практически 0 вероятности!

23

vt, а почему ты против CDC? Много же случаев когда только он возможен.

24

Eddy_Em, PL2303 это не CDC, а про CDC всё написано в спецификациях классов USB
А то что спецификации - трешняк, ну, всё относительно - для тебя это трешняк, а для кого-то и модбас по уарту
Поэтому я и не люблю рецепт "RTFM" - не универсальный он, есть предел, причём у каждого свой, а твои мытартства как иллюстрация - за что боролись, на то и напоролись )

dosikus, да я не против, я не за
Замечаешь, что сколько бы кто ни сделал каких решений с usb, идущие следом в большинстве случаев всё равно или тупо копируют, или опять идут по граблям
Напрашивается предположение, что usb - видимо вообще область за среднестатистическими пределами разумного, где каждый шаг стоит больше, чем даёт, и чем дальше в лес, тем хуже
И какой тогда мотив упираться - только повышение самооценки, типа "я смогу" ?
Ну, изнутри процесса может это и прикольно, но со стороны - не очень )

25

Да пофиг уже, я бы и обычный CDC запилил, если бы психанул. Но вот: прием-передача уже работают, но проблема с SET_LINE_CODING: нихрена не могу понять, откуда считывать информацию об этом. В случае GET_LINE_CODING нормально работает вот это:

Код:
                case GET_LINE_CODING:
                    EP_WriteIRQ(0, (uint8_t*)&lineCoding, sizeof(lineCoding));
                break;

Но SET... Нихрена не понимаю! Как оно в других библиотеках работает? Поковыряться что ли в opencm3...

26

Эту бы энергию да в мирных целях )
Вот книжка, там всё расписано про CDC
http://s7.uploads.ru/EtIiK.jpg

27

Спасибо, почитаю!
Но мне уже надоело убивать время на всякую хренотень. Хоть библиотека от ST и больше на 1кБ, лучше я ее прилеплю к своим железякам.
Нихрена не вышло у меня. Смотрю в книгу - а вижу фигу!!! Добыть параметры из пакета SET_LINE_CODING я так и не смог ☹
Расписываюсь в собственном невежестве!

28

Eddy_Em написал(а):

Добыть параметры из пакета SET_LINE_CODING я так и не смог

Ты имеешь в виду 8-байтный setup-пакет?
Там нет данных, они придут в следующем пакете
А в setup-пакете про это должно быть указание - в двух последних байтах число 7 - кол-во байт в следующем пакете данных
И после получения от хоста пакета с данными, девайс должен ответить хосту нулевым пакетом
http://sh.uploads.ru/7K2wi.jpg

29

Wireshark говорит, что данные содержатся прямо в этом SETUP пакете. Мониторинг пришедших пакетов (не зря ж я забульбенил на STM32 USART с двойной выходной буферизацией и 256-байтным буфером!) подтверждает это.
В коде от ST я так и не разобрался: они данные для SET_LINE_CODING почему-то берут из предыдущего OUT пакета! Либо там что-то эдакое мутят, но вот эта свистопляска с перескоком из функции в функцию превращает код в нечитаемое месиво!

30

Eddy_Em написал(а):

Wireshark говорит, что данные содержатся прямо в этом SETUP пакете. Мониторинг пришедших пакетов (не зря ж я забульбенил на STM32 USART с двойной выходной буферизацией и 256-байтным буфером!) подтверждает это.

Не верь им, они обманывают )
Верь картинке постом выше, она отсюда, если что - http://janaxelson.com/usb_virtual_com_port.htm


Вы здесь » Микроконтроллеры » Архив » USB CDC для STM32F103