Например TDA7294

Форум РадиоКот • Просмотр темы - STM32 и USB (практика)
Форум РадиоКот
Здесь можно немножко помяукать :)

Текущее время: Пт авг 22, 2025 07:49:28

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 583 ]     ... , , , 9, , , ...  
Автор Сообщение
Не в сети
 Заголовок сообщения: Re: STM32 и USB (практика)
СообщениеДобавлено: Сб авг 20, 2016 09:37:21 
Собутыльник Кота
Аватар пользователя

Карма: 29
Рейтинг сообщений: 651
Зарегистрирован: Сб май 14, 2011 21:16:04
Сообщений: 2708
Откуда: г. Чайковский
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
По поводу IN.
Приходит от хоста запрос чего-то. Пускай какого-то дескриптора. Вы ложите копируете соответствующие данные в буфер и устанавливаете VALID. Если данные "уйдут", выставится соответствующий флаг об успешной отправки. Кроме того, если хосту понравятся данные, он отправит ZLP устройству, а не устройство хосту. И как мне кажется, это очень логично.

Вот Вам еще раз ссылка, на лог всех данных идущих от хоста. viewtopic.php?p=2698073#p2698073

_________________
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32 и USB (практика)
СообщениеДобавлено: Сб авг 20, 2016 10:11:51 
Поставщик валерьянки для Кота
Аватар пользователя

Карма: 11
Рейтинг сообщений: 26
Зарегистрирован: Вс июн 26, 2011 20:03:21
Сообщений: 2316
Рейтинг сообщения: 0
Про хост понятно, но тут речь вот о чем:
Radist_M писал(а):
отправить пакет нулевой длинны, чтоб комп понял, что мы приняли пакет.

То есть не ОН нам, а МЫ ему. Нужно ли это делать?
Z_h_e писал(а):
Если данные "уйдут", выставится соответствующий флаг об успешной отправки

Z_h_e писал(а):
Кроме того, если хосту понравятся данные, он отправит ZLP устройству

Данные уходят (флаг выставляется), но ZLP не приходит. И дело тут вряд ли в дескрипторе, так как я пробовал не один вариант и все сверял с Агуровым - сходилось... :dont_know:


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32 и USB (практика)
СообщениеДобавлено: Вс авг 21, 2016 11:59:50 
Собутыльник Кота
Аватар пользователя

Карма: 29
Рейтинг сообщений: 651
Зарегистрирован: Сб май 14, 2011 21:16:04
Сообщений: 2708
Откуда: г. Чайковский
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
Я выложил свой исходник. Что мешает поглядеть в каких случаях я отправляю zlp.

_________________
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32 и USB (практика)
СообщениеДобавлено: Вс авг 21, 2016 12:56:11 
Поставщик валерьянки для Кота
Аватар пользователя

Карма: 11
Рейтинг сообщений: 26
Зарегистрирован: Вс июн 26, 2011 20:03:21
Сообщений: 2316
Рейтинг сообщения: 0
ZLP не нужен... Я сдвинулся с мертвой точки и НАКОНЕЦ-ТО получил SET ADDRESS :kill: :music: :beer:
Добавил функцию сброса флагов:
Спойлер
Код:
void CTR_RXTXClear (uint8_t EPNum, uint16_t RXBitClear, uint16_t TXBitClear) //
  {
   //      RXTX           BitClear
   //      0 - RX       0 - no change
  //    1 - TX       1 - bit is clear
    uint16_t buff;
    buff=((uint16_t*)0x40005C00)[EPNum]; //0x40005C00 базовый адрес регистров юсб
   buff^=((uint16_t) (RXBitClear << 15) | (uint16_t) (TXBitClear << 7));
    buff&=0x0F0F;
   
    ((uint16_t*)0x40005C00)[EPNum]=buff;

   }


И самая главная ошибка- было:
Спойлер
Код:
 void SetRXTX (uint8_t EPNum, uint8_t EPStatus, uint8_t RXTX) //номер регистра EPnR, S - Disabled,Stall,NAK,Valid, f - TX отправить RX прием
  {
/*
    EPNum         EPStatus       RXTX     
    0 to 7     0 - Disable      0 - RX 
              1 - Stall       1 - TX 
               2 - NAK
              3 - VALID 
*/   
   
   
   uint16_t buff;
    uint8_t stat;
   buff = ((uint16_t*)0x40005C00)[EPNum]; //0x40005C00 базовый адрес регистров юсб
    test6 = *((uint16_t*)0x40005C00);

   
   if (RXTX == 1)////////////////////////////////RXTX = 1 = TX
    {
       stat = (buff>>4) & 3;
      switch (stat)
          {
         case 0: //DISABLE
               switch (EPStatus)
               {
                  case 0:
                    break;
                  case 1:
                     buff^=0x0010; buff&=0x8FBF; break; //TX
                  case 2:
                     buff^=0x0020; buff&=0x8FBF; break; //TX
                  case 3:
                     buff^=0x0030; buff&=0x8FBF; break; //TX
               }
            break;
...........................................................

нужно было:

Спойлер
Код:
 void SetRXTX (uint8_t EPNum, uint8_t EPStatus, uint8_t RXTX) //номер регистра EPnR, S - Disabled,Stall,NAK,Valid, f - TX отправить RX прием
  {
/*
    EPNum         EPStatus       RXTX     
    0 to 7     0 - Disable      0 - RX 
              1 - Stall       1 - TX 
               2 - NAK
              3 - VALID 
*/   
   
   
   uint16_t buff;
    uint8_t stat;
   buff = ((uint16_t*)0x40005C00)[EPNum]; //0x40005C00 базовый адрес регистров юсб
    test6 = *((uint16_t*)0x40005C00);

   
   if (RXTX == 1)////////////////////////////////RXTX = 1 = TX
    {
       stat = (buff>>4) & 3;
      switch (stat)
          {
         case 0: //DISABLE
               switch (EPStatus)
               {
                  case 0:
                    break;
                  case 1:
                     buff^=0x0010; buff&=0x8F9F; break; //TX
                  case 2:
                     buff^=0x0020; buff&=0x8FAF; break; //TX
                  case 3:
                     buff^=0x0030; buff&=0x8FBF; break; //TX
               }
            break;
.....................................................................

Отлаживал по шагам и случайно заметил, что при таком значении маски в некоторых случаях будет изменяться бит, который должен сохранить свое значение.
В итоге получились две функции отработки STAT битов:
Спойлер
Код:
 void SetTX (uint8_t EPNum, uint8_t EPStatus) //номер регистра EPnR, S - Disabled,Stall,NAK,Valid, f - TX отправить RX прием
  {
/*
    EPNum         EPStatus   
    0 to 7     0 - Disable
              1 - Stall   
               2 - NAK
              3 - VALID 
*/   
   
   
   uint16_t buff;
    uint8_t stat;
   buff = ((uint16_t*)0x40005C00)[EPNum]; //0x40005C00 базовый адрес регистров юсб

       stat = (buff>>4) & 3;
      switch (stat)
          {
         case 0: //DISABLE
               switch (EPStatus)
               {
                  case 0:
                    break;
                  case 1:
                     buff^=0x0010; buff&=0x8F9F; break; //TX
                  case 2:
                     buff^=0x0020; buff&=0x8FAF; break; //TX
                  case 3:
                     buff^=0x0030; buff&=0x8FBF; break; //TX
               }
            break;

         case 1: //STALL
               switch (EPStatus)
               {
                  case 0:
                    buff^=0x0010; buff&=0x8F9F; break; //TX
                  case 1:
                    break;
                  case 2:
                     buff^=0x0030; buff&=0x8FBF; break; //TX
                  case 3:
                     buff^=0x0020; buff&=0x8FAF; break; //TX
               }
            break;
               
         case 2: //NAK
               switch (EPStatus)
               {
                  case 0:
                    buff^=0x0020; buff&=0x8FAF; break; //TX
                  case 1:
                     buff^=0x0030; buff&=0x8FBF; break; //TX
                  case 2:
                     break;
                  case 3:
                     buff^=0x0010; buff&=0x8F9F; break; //TX
                  
              
               }
            break;
   
         case 3: //VALID
               switch (EPStatus)
               {
                  case 0:
                    buff^=0x0030; buff&=0x8FBF; break; //TX
                  case 1:
                     buff^=0x0020; buff&=0x8FAF; break; //TX
                  case 2:
                     buff^=0x0010; buff&=0x8F9F; break; //TX
                  case 3:
                     break;
               }
            break;

         default: break;
        }
    ((uint16_t*)0x40005C00)[EPNum]=buff;

 }
 void SetRX (uint8_t EPNum, uint8_t EPStatus) //номер регистра EPnR, S - Disabled,Stall,NAK,Valid, f - TX отправить RX прием
  {
      /*
    EPNum         EPStatus     
    0 to 7     0 - Disable 
              1 - Stall 
               2 - NAK
              3 - VALID 
*/   
       
   uint16_t buff;
    uint8_t stat;
   buff = ((uint16_t*)0x40005C00)[EPNum]; //0x40005C00 базовый адрес регистров юсб
      
       stat = (buff>>12) & 3;
      switch (stat)
          {
         case 0: //DISABLE
               switch (EPStatus)
               {
                  case 0:
                    break;
                  case 1:
                     buff^=0x1000; buff&=0x9F8F; break; //RX
                  case 2:
                     buff^=0x2000; buff&=0xAF8F; break; //RX
                  case 3:
                     buff^=0x3000; buff&=0xBF8F; break; //RX
               }
            break;

         case 1: //STALL
               switch (EPStatus)
               {
                  case 0:
                    buff^=0x1000; buff&=0x9F8F; break; //RX
                  case 1:
                    break;
                  case 2:
                     buff^=0x3000; buff&=0xBF8F; break; //RX
                  case 3:
                     buff^=0x2000; buff&=0xAF8F; break; //RX
               }
            break;
               
         case 2: //NAK
               switch (EPStatus)
               {
                  case 0:
                    buff^=0x2000; buff&=0xAF8F; break; //RX
                  case 1:
                     buff^=0x3000; buff&=0xBF8F; break; //RX
                  case 2:
                     break;
                  case 3:
                     buff^=0x1000; buff&=0x9F8F; break; //RX
               }
            break;
   
         case 3: //VALID
               switch (EPStatus)
               {
                  case 0:
                    buff^=0x3000; buff&=0xBF8F; break; //RX
                  case 1:
                     buff^=0x2000; buff&=0xAF8F; break; //RX
                  case 2:
                     buff^=0x1000; buff&=0x9F8F; break; //RX
                  case 3:
                     break;
               }
            break;

        }      
         
  ((uint16_t*)0x40005C00)[EPNum]=buff;
   
 }


Да, топорно, но зато очень наглядно и РАБОТАЕТ!!! :)))


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32 и USB (практика)
СообщениеДобавлено: Вс авг 21, 2016 15:03:30 
Собутыльник Кота
Аватар пользователя

Карма: 29
Рейтинг сообщений: 651
Зарегистрирован: Сб май 14, 2011 21:16:04
Сообщений: 2708
Откуда: г. Чайковский
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
Я конечно рад за Вас, что продвинулись дальше, очень скучно топтаться на месте. Однако подобные функции я выкладывал много постов назад и почему то они Вас не заинтересовали.

По поводу Вашей функции void CTR_RXTXClear (uint8_t EPNum, uint16_t RXBitClear, uint16_t TXBitClear). Оба флага будут сброшены при любых значениях 2 и 3 ого параметров функции.

_________________
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32 и USB (практика)
СообщениеДобавлено: Вс авг 21, 2016 15:29:22 
Собутыльник Кота
Аватар пользователя

Карма: 29
Рейтинг сообщений: 651
Зарегистрирован: Сб май 14, 2011 21:16:04
Сообщений: 2708
Откуда: г. Чайковский
Рейтинг сообщения: 1
Медали: 1
Получил миской по аватаре (1)
Вот еще, сразу не заметил. ((uint16_t*)0x40005C00)[EPNum]; Так Вы прочитаете/запишите правильно только нулевой регистр. Или считывайте 32 бита или используйте двойной индекс.

_________________
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32 и USB (практика)
СообщениеДобавлено: Вс авг 21, 2016 18:44:37 
Поставщик валерьянки для Кота
Аватар пользователя

Карма: 11
Рейтинг сообщений: 26
Зарегистрирован: Вс июн 26, 2011 20:03:21
Сообщений: 2316
Рейтинг сообщения: 0
Z_h_e писал(а):
Однако подобные функции я выкладывал много постов назад и почему то они Вас не заинтересовали

Не то чтобы не устроили, просто у Вас только в два состояния устанавливаются, а я хотел сделать все - чтоб наверняка, но не до конца все правильно рассчитал...
Z_h_e писал(а):
Вот еще, сразу не заметил. ((uint16_t*)0x40005C00)[EPNum]; Так Вы прочитаете/запишите правильно только нулевой регистр

Спасибо за замечание. Учту :) .
Пока продвинулся до запроса дескриптора конфигурации и напоролся на грабли. Взял дескриптор со страницы: http://badembed.ru/stm32l-usb-cdc-virtualnyj-com-port-nachalo/ Там 67 элементов, а буфер расчитан на 64. Как тогда быть? :dont_know:


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32 и USB (практика)
СообщениеДобавлено: Вс авг 21, 2016 20:53:27 
Поставщик валерьянки для Кота
Аватар пользователя

Карма: 11
Рейтинг сообщений: 26
Зарегистрирован: Вс июн 26, 2011 20:03:21
Сообщений: 2316
Рейтинг сообщения: 0
Разобрался... Сначала нужно 9 байт, а потом понемногу досылать остальное (по мере затребования хостом).


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32 и USB (практика)
СообщениеДобавлено: Пн авг 22, 2016 07:51:31 
Собутыльник Кота
Аватар пользователя

Карма: 29
Рейтинг сообщений: 651
Зарегистрирован: Сб май 14, 2011 21:16:04
Сообщений: 2708
Откуда: г. Чайковский
Рейтинг сообщения: 1
Медали: 1
Получил миской по аватаре (1)
isx писал(а):
Сначала нужно 9 байт, а потом понемногу досылать остальное (по мере затребования хостом).
Думаю Вы неправы. У меня тоже был длинный дескриптор и вроде как у меня удалось отправить его по частям. Затем он у меня уменьшился и необходимость в этом отпала. Когда дескриптор был еще длинным )), мое USB не работало еще полностью и это было давно, я напишу как я делал, но есть сомнения, что я правильно помню.

- хост запрашивает первые 9 байт дескриптора конфиг
+ устройство отправляет их.
- хост отправляет ZLP
- хост запрашивает то ли полный длинный дескриптор (например 67) то ли 64
+ устройство отпраляет первые 64 байта
- хост запрашивает остальные 3 байта
+ устройство отпраляет остаток.
- хост отпраляет ZLP

_________________
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32 и USB (практика)
СообщениеДобавлено: Пн авг 22, 2016 13:40:07 
Поставщик валерьянки для Кота
Аватар пользователя

Карма: 11
Рейтинг сообщений: 26
Зарегистрирован: Вс июн 26, 2011 20:03:21
Сообщений: 2316
Рейтинг сообщения: 0
Z_h_e писал(а):
void CTR_RXTXClear (uint8_t EPNum, uint16_t RXBitClear, uint16_t TXBitClear). Оба флага будут сброшены при любых значениях 2 и 3 ого параметров функции.

Исправил buff&=0x0F0F; на buff&=0x8F8F;.
Z_h_e писал(а):
((uint16_t*)0x40005C00)[EPNum]; Так Вы прочитаете/запишите правильно только нулевой регистр.

Исправил на ((uint16_t*)0x40005C00)[EPNum*2]


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32 и USB (практика)
СообщениеДобавлено: Пн авг 22, 2016 20:17:23 
Поставщик валерьянки для Кота
Аватар пользователя

Карма: 11
Рейтинг сообщений: 26
Зарегистрирован: Вс июн 26, 2011 20:03:21
Сообщений: 2316
Рейтинг сообщения: 0
Z_h_e писал(а):
- хост запрашивает первые 9 байт дескриптора конфиг
+ устройство отправляет их.
- хост отправляет ZLP
- хост запрашивает то ли полный длинный дескриптор (например 67) то ли 64
+ устройство отпраляет первые 64 байта
- хост запрашивает остальные 3 байта
+ устройство отпраляет остаток.
- хост отпраляет ZLP

Все почти так и происходит.
- хост запрашивает первые 9 байт дескриптора конфиг
+ устройство отправляет их.
- хост отправляет ZLP
- хост запрашивает то ли полный длинный дескриптор (например 67) то ли 64
(приходит 0680 0200 0000 0043)
+ устройство отпраляет первые 64 байта
и дальше ничего не происходит. В буфере приема так и остается 0680 0200 0000 0043.
Но, если отправлять не 64 байта, а отправить также 9 байт, то идут запросы строк, потом снова запрос 12-ти байт дескриптора, потом такой запрос:
0680 0200 0000 0109
и все. Если отправть 9 байт дескриптра конфигурации, то ничего не меняется...


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32 и USB (практика)
СообщениеДобавлено: Вт авг 23, 2016 08:18:43 
Собутыльник Кота
Аватар пользователя

Карма: 29
Рейтинг сообщений: 651
Зарегистрирован: Сб май 14, 2011 21:16:04
Сообщений: 2708
Откуда: г. Чайковский
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
Я ж говорю, я точно не помню как отправлял. Возможно нет запроса от хоста на вторую часть. Наверное тогда надо после успешной отправки 64 байт, не ждать запроса, а положить в буфер еще 3 байта и сразу выставить VALID.

_________________
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32 и USB (практика)
СообщениеДобавлено: Чт авг 25, 2016 13:37:06 
Родился

Зарегистрирован: Ср май 06, 2015 14:21:38
Сообщений: 9
Рейтинг сообщения: 0
в f429 для контрольной передачи:
1 - получаем, например, запрос гет-дескриптор
2 - отправляем этот дескриптор хосту
3 - получаем от хоста нулевой пакет.

Проблема с 3им пунктом.
Делаю вот так:
Код:
USB_OTG_HS_OUTEP(0)->DOEPTSIZ = (1 << 19)|64|USB_OTG_DOEPTSIZ_STUPCNT;
USB_OTG_HS_OUTEP(0)->DOEPDMA = (uint32_t)&rx_buf[0];
USB_OTG_HS_OUTEP(0)->DOEPCTL |= USB_OTG_DOEPCTL_CNAK|USB_OTG_DOEPCTL_EPENA;

Но в прерывание USB_OTG_DOEPINT_XFRC так и не попадаю.
Как правильно? =(


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32 и USB (практика)
СообщениеДобавлено: Чт авг 25, 2016 18:37:04 
Поставщик валерьянки для Кота
Аватар пользователя

Карма: 11
Рейтинг сообщений: 26
Зарегистрирован: Вс июн 26, 2011 20:03:21
Сообщений: 2316
Рейтинг сообщения: 0
Решил проблему топорно:
Код:
                     
case 0x0043:          
SendBuff (Virtual_Com_Port_ConfigDescriptor,64,0);
SetTX(0, 3); // to Valid TX                         
                     
while ((USB_EP0R & USB_EP_CTR_TX)==0)
{;}

for (i = 64; i < 68; i+=2) // i = 18
{
   TXBuff = Virtual_Com_Port_ConfigDescriptor[i] + (Virtual_Com_Port_ConfigDescriptor[i+1] << 8);   
   *(__IO uint16_t*)(0x40006080 + (i-64)*2) = TXBuff;
}

*(__IO uint16_t*)(0x40006004) = (uint16_t) 3;
SetTX(0, 3); // to Valid TX
break;

Вроде работает, но не всегда. Приходится несколько раз передергивать шнур и ресетить МК в отладчике, пока запрос дескриптора (см. шестой элемент массива в приложении) успешно отработается. Пока не могу понять, почему так происходит :dont_know: ....
Теперь зависаю после запроса 9-ти байт конфигурации (последний элемент массива). После отправки 9-ти байт приходит ZLP и все - больше никаких запросов.
Куда можно дальше копать :solder: ?

P.S. Значения в массив записываются по каждому срабатыванию прерывания по успешному приему данных (CTR_TX).


Вложения:
Скрин прерываний по приему данных.png [18.15 KiB]
Скачиваний: 548
Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32 и USB (практика)
СообщениеДобавлено: Пт авг 26, 2016 09:08:44 
Собутыльник Кота
Аватар пользователя

Карма: 29
Рейтинг сообщений: 651
Зарегистрирован: Сб май 14, 2011 21:16:04
Сообщений: 2708
Откуда: г. Чайковский
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
Может пока стоит попробовать сделать дескриптор покороче? У меня на этой стадии никаких проблем не было, однако когда я дошел до нее, у меня дескриптор не был уже длинным. Так то после запроса 9 байт, следующий запрос должен был быть запрос дескриптора конфигурации уже с точной длиной.

_________________
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32 и USB (практика)
СообщениеДобавлено: Пт авг 26, 2016 17:03:46 
Родился

Зарегистрирован: Ср май 06, 2015 14:21:38
Сообщений: 9
Рейтинг сообщения: 0
Цитата:
Делаю вот так:
Код:
USB_OTG_HS_OUTEP(0)->DOEPTSIZ = (1 << 19)|64|USB_OTG_DOEPTSIZ_STUPCNT;
USB_OTG_HS_OUTEP(0)->DOEPDMA = (uint32_t)&rx_buf[0];
USB_OTG_HS_OUTEP(0)->DOEPCTL |= USB_OTG_DOEPCTL_CNAK|USB_OTG_DOEPCTL_EPENA;

Но в прерывание USB_OTG_DOEPINT_XFRC так и не попадаю


Сам себя поправил, в ините забыл проинициализировать регистр USB_OTG_HS_DEVICE->DTHRCTL


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32 и USB (практика)
СообщениеДобавлено: Пт авг 26, 2016 20:54:51 
Поставщик валерьянки для Кота
Аватар пользователя

Карма: 11
Рейтинг сообщений: 26
Зарегистрирован: Вс июн 26, 2011 20:03:21
Сообщений: 2316
Рейтинг сообщения: 0
Вообщем, навертел, накрутил, но до конца не дошло ) .
Теперь энумерация устройства проходит нормально (см. до 21-го элемента массива включительно). Потом устройстве появляется в диспетчере устройств как виртуальный ком порт. Advanced Terminal его видит и при попытке подключиться к порту вылетает ещё куча запросов. Описать дальше я не могу нормально, так как сам толком не понимаю что происходит. Прикладываю код с обработкой прерываний и скрин со всеми прерываниями по CTR_RX с запросами.
Спойлер
Код:
   if (USB_EP0R & USB_EP_CTR_RX)
   {   
      
      uint16_t TXBuff = 0;            
      CTR_RXTXClear (0, 1, 0);
      
      
      EnterFuncCountRX++;

      if (EnterFuncCountRX == NumOfRepeatRX)
    {
         test4 = 0;
      }
      
      
   switch    (*(__IO uint16_t*)(0x40006100))   ///////////////////////// 32
    {
      
      case 0x0680:
         switch (*(__IO uint16_t*)(0x40006104))
            {
               case 0x0100:
                  SendBuff (Virtual_Com_Port_DeviceDescriptor,   (*(__IO uint8_t*)(0x4000610C)),0);
                  SetTX(0, 3); // to Valid TX                  
               break;
                     
               case 0x0200:
                  
                  
                  testCount++;
                  
                 switch (*(__IO uint16_t*)(0x4000610C))
                  {
                     case 0x0009:
                        SendBuff (Virtual_Com_Port_ConfigDescriptor,9,0);
                        SetTX(0, 3); // to Valid TX
                     break;
                  
                     case 0x00FF:
                        SendBuff (Virtual_Com_Port_ConfigDescriptor,9,0);
                       SetTX(0, 3); // to Valid TX
                     break;
                  
                     case 0x0043: /////////////////////////////////////////////////// DESC_SIZE 0x43
                  
                        SendBuff (Virtual_Com_Port_ConfigDescriptor,64,0);
                        SetTX(0, 3); // to Valid TX                         
                     
                        while ((USB_EP0R & USB_EP_CTR_TX)==0)
                        {;}
                        
                           
                        for (i = 64; i < 68; i+=2) // i = 18
                        {
                           *(__IO uint16_t*)(0x40006084) = 0;
                           TXBuff = Virtual_Com_Port_ConfigDescriptor[i] + (Virtual_Com_Port_ConfigDescriptor[i+1] << 8);   
                           *(__IO uint16_t*)(0x40006080 + (i-64)*2) = TXBuff;
                        }
                        *(__IO uint16_t*)(0x40006004) = 3;
                        
                        SetTX(0, 3); // to Valid TX
                        SetRX(0, 3);                        
                     
                     break;   
                        
                     case 0x0109:
                        SendBuff (Virtual_Com_Port_ConfigDescriptor,64,0);
                        SetTX(0, 3); // to Valid TX                         
                     
                        while ((USB_EP0R & USB_EP_CTR_TX)==0)
                        {;}
                        
                           
                        for (i = 64; i < 68; i+=2) // i = 18
                        {
                           TXBuff = Virtual_Com_Port_ConfigDescriptor[i] + (Virtual_Com_Port_ConfigDescriptor[i+1] << 8);   
                           *(__IO uint16_t*)(0x40006080 + (i-64)*2) = TXBuff;
                        }
                        *(__IO uint16_t*)(0x40006004) = 3;
                        
                        SetTX(0, 3); // to Valid TX
                        SetRX(0, 3);                        
                     break;                        
                     
                     }
               break;
               
               case 0x03EE:
                  SetTX(0, 1); // to Valid TX
               break;
               
               case 0x0303:
                  SendBuff (Virtual_Com_Port_StringSerial,12,0);
                  SetTX(0, 3); // to Valid TX
               break;
                              
               case 0x0300:
                  SendBuff (Virtual_Com_Port_StringLangID,4,0);
                  SetTX(0, 3); // to Valid TX
               break;
                              
               case 0x0302:
                  SendBuff (Virtual_Com_Port_StringProduct,12,0);
                  SetTX(0, 3); // to Valid TX
               break;
               
            }
         break;
            
     case 0x0500:
         AdressBuff =   *(__IO uint16_t*)(0x40006104);
      SendZLP(0);
      
         while ((USB_EP0R & USB_EP_CTR_TX)==0)
         {;}

         USB_DADDR = AdressBuff + 0x80;
         CTR_RXTXClear (0, 0, 1);
      break;
      
      case 0x0900:
      SendZLP(0);
      break;
      
      case 0x21A1:
          SendBuff (Virtual_Com_Port_GET_LINE_CODING,7,0);         
         SetTX(0, 3);
      break;
      
      case 0x2221:

         SendZLP(0);
            
      break;
      
      case 0x2122:
          SendBuff (Virtual_Com_Port_GET_LINE_CODING,7,0);         
         SetTX(0, 3);
      break;
      
      case 0x2021:
          SendBuff (Virtual_Com_Port_GET_LINE_CODING,7,0);         
         SetTX(0, 3);
      break;
                     
      case 0x0681:
         //*(__IO uint16_t*)(0x40006004) = (uint16_t) 0; // ZLP
         //SetTX(0, 3);
      break;
      
      
      default:
         test4 = *(__IO uint16_t*)(0x40006101);
         test4 = 0;      
       break;      
     }
   

                  
   return;
   }


Вложения:
Моя Энумерация.png [36.2 KiB]
Скачиваний: 602
Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32 и USB (практика)
СообщениеДобавлено: Сб авг 27, 2016 13:27:07 
Собутыльник Кота
Аватар пользователя

Карма: 29
Рейтинг сообщений: 651
Зарегистрирован: Сб май 14, 2011 21:16:04
Сообщений: 2708
Откуда: г. Чайковский
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
Попробовал разобрать значение поля bmRequestType=0x22.

7 - 0 хост что-то отправляет устройству (т.е. ничего не запрашивает)
6:5 - 01 специфический запрос для данного класса
4:0 - 00010 другой получатель

Кто такой другой получатель мне не понятно, а вот специфический это значит что надо смотреть запросы для класса CDC. Вот тут попробуйте порыть http://www.usb.org. Где-то в инете увидел, что надо смотреть в разделе 5, но не знаю какого документа, хотя самому интересно, но сейчас времени нет.

_________________
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32 и USB (практика)
СообщениеДобавлено: Сб авг 27, 2016 13:59:02 
Поставщик валерьянки для Кота
Аватар пользователя

Карма: 11
Рейтинг сообщений: 26
Зарегистрирован: Вс июн 26, 2011 20:03:21
Сообщений: 2316
Рейтинг сообщения: 0
Вот тут в конце статьи расписано не плохо http://www.softelectro.ru/usb.html , но у меня как-то не так проходит процесс. :dont_know:
Плюс прошелся сниффером по своей прошивке и по прошивке с Microtechnics.ru (тоже CDC и нормально подключается к программе терминалу). Думал, что мне это что-то прояснит, но ошибся. Может более опытные смогут что-то там разглядеть :) .
Процесс моей энумерации:
Спойлер000000: PnP Event: Device Connected (UP), 2016-08-25 19:20:37,4499617 (1. Device: STMicroelectronics Virtual COM Port (COM13))
The USB device has just been connected to the system.

000001: Get Descriptor Request (DOWN), 2016-08-25 19:20:37,4500336 +0,0000719 (1. Device: STMicroelectronics Virtual COM Port (COM13))
Descriptor Type: Device
Descriptor Index: 0x0
Transfer Buffer Size: 0x12 bytes

000002: Control Transfer (UP), 2016-08-25 19:20:37,4502671 +0,0002335. (1. Device: STMicroelectronics Virtual COM Port (COM13)) Status: 0x00000000
Pipe Handle: Control Pipe

12 01 00 02 02 00 00 40 83 04 40 57 00 02 01 02
03 01 .......@ѓ.@W....
..

Setup Packet

80 06 00 01 00 00 12 00 Ђ.......

Recipient: Device
Request Type: Standard
Direction: Device->Host
Request: 0x6 (GET_DESCRIPTOR)
Value: 0x100
Index: 0x0
Length: 0x12

000003: Get Descriptor Request (DOWN), 2016-08-25 19:20:37,4502729 +0,0000058 (1. Device: STMicroelectronics Virtual COM Port (COM13))
Descriptor Type: Configuration
Descriptor Index: 0x0
Transfer Buffer Size: 0x109 bytes


000004: Control Transfer (UP), 2016-08-25 19:20:37,4505108 +0,0002379. (1. Device: STMicroelectronics Virtual COM Port (COM13)) Status: 0x00000000
Pipe Handle: Control Pipe

09 02 43 00 02 01 00 C0 64 09 04 00 00 01 02 02
00 01 05 24 00 10 01 05 24 01 00 01 04 24 02 02
05 24 06 00 01 07 05 81 03 40 00 FF 09 04 01 00
02 0A 00 00 04 07 05 02 02 40 00 00 07 05 83 02
40 00 00 ..C....Аd.......
...$....$....$..
.$.....Ѓ.@.я....
.........@....ѓ.
@..

Setup Packet

80 06 00 02 00 00 09 01 Ђ.......

Recipient: Device
Request Type: Standard
Direction: Device->Host
Request: 0x6 (GET_DESCRIPTOR)
Value: 0x200
Index: 0x0
Length: 0x109

000005: Select Configuration (DOWN), 2016-08-25 19:20:37,4505156 +0,0000048 (1. Device: STMicroelectronics Virtual COM Port (COM13))
Configuration Index: 1

000006: Select Configuration (UP), 2016-08-25 19:20:37,4506974 +0,0000004. (1. Device: STMicroelectronics Virtual COM Port (COM13)) Status: 0x00000000
Configuration Index: 1
Configuration Handle: 0x3327b90

000007: Class-Specific Request (DOWN), 2016-08-25 19:20:37,4507124 +0,0000150 (1. Device: STMicroelectronics Virtual COM Port (COM13))
Destination: Interface, Index 0
Reserved Bits: 0
Request: 0x21
Value: 0x0
Get 0x7 bytes from the device


000008: Control Transfer (UP), 2016-08-25 19:20:37,4508854 +0,0001730. (1. Device: STMicroelectronics Virtual COM Port (COM13)) Status: 0x00000000
Pipe Handle: Control Pipe

00 C2 01 00 00 00 08 .В.....

Setup Packet

A1 21 00 00 00 00 07 00 Ў!......

Recipient: Interface
Request Type: Class
Direction: Device->Host
Request: 0x21 (Unknown)
Value: 0x0
Index: 0x0
Length: 0x7

000009: Class-Specific Request (DOWN), 2016-08-25 19:20:37,4509364 +0,0000510 (1. Device: STMicroelectronics Virtual COM Port (COM13))
Destination: Interface, Index 0
Reserved Bits: 0
Request: 0x22
Value: 0x0
Send 0x0 bytes to the device


000010: Control Transfer (UP), 2016-08-25 19:20:37,4511358 +0,0001994. (1. Device: STMicroelectronics Virtual COM Port (COM13)) Status: 0x00000000
Pipe Handle: Control Pipe

Setup Packet

21 22 00 00 00 00 00 00 !"......

Recipient: Interface
Request Type: Class
Direction: Host->Device
Request: 0x22 (Unknown)
Value: 0x0
Index: 0x0
Length: 0x0


000013: Bulk or Interrupt Transfer (UP), 2016-08-25 19:20:37,4512626 +0,0001045. (1. Device: STMicroelectronics Virtual COM Port (COM13)) Status: 0xc0000004
Pipe Handle: 0x35d2798 (Endpoint Address: 0x83)
Get 0x0 bytes from the device

000014: Bulk or Interrupt Transfer (UP), 2016-08-25 19:20:37,5474432 +0,0961806. (1. Device: STMicroelectronics Virtual COM Port (COM13)) Status: 0xc0000004
Pipe Handle: 0x57d3608 (Endpoint Address: 0x81)
Get 0x0 bytes from the device


При этом, Device Monitor Studio выделяет 13 и 14-е шаги красным цветом.

Процесс энумерации при использовании рабочей прошивки:
Спойлер000000: PnP Event: Device Connected (UP), 2016-08-25 19:07:39,5185216 (1. Device: STMicroelectronics Virtual COM Port (COM7))
The USB device has just been connected to the system.

000001: Get Descriptor Request (DOWN), 2016-08-25 19:07:39,5186023 +0,0000807 (1. Device: STMicroelectronics Virtual COM Port (COM7))
Descriptor Type: Device
Descriptor Index: 0x0
Transfer Buffer Size: 0x12 bytes

000002: Control Transfer (UP), 2016-08-25 19:07:39,5188247 +0,0002224. (1. Device: STMicroelectronics Virtual COM Port (COM7)) Status: 0x00000000
Pipe Handle: Control Pipe

12 01 00 02 02 00 00 40 83 04 40 57 00 02 01 02
03 01 .......@ѓ.@W....
..

Setup Packet

80 06 00 01 00 00 12 00 Ђ.......

Recipient: Device
Request Type: Standard
Direction: Device->Host
Request: 0x6 (GET_DESCRIPTOR)
Value: 0x100
Index: 0x0
Length: 0x12

000003: Get Descriptor Request (DOWN), 2016-08-25 19:07:39,5188306 +0,0000059 (1. Device: STMicroelectronics Virtual COM Port (COM7))
Descriptor Type: Configuration
Descriptor Index: 0x0
Transfer Buffer Size: 0x109 bytes


000004: Control Transfer (UP), 2016-08-25 19:07:39,5190714 +0,0002408. (1. Device: STMicroelectronics Virtual COM Port (COM7)) Status: 0x00000000
Pipe Handle: Control Pipe

09 02 43 00 02 01 00 C0 32 09 04 00 00 01 02 02
01 00 05 24 00 10 01 05 24 01 00 01 04 24 02 02
05 24 06 00 01 07 05 82 03 08 00 FF 09 04 01 00
02 0A 00 00 00 07 05 03 02 40 00 00 07 05 81 02
40 00 00 ..C....А2.......
...$....$....$..
.$.....‚...я....
.........@....Ѓ.
@..

Setup Packet

80 06 00 02 00 00 09 01 Ђ.......

Recipient: Device
Request Type: Standard
Direction: Device->Host
Request: 0x6 (GET_DESCRIPTOR)
Value: 0x200
Index: 0x0
Length: 0x109

000005: Select Configuration (DOWN), 2016-08-25 19:07:39,5190762 +0,0000048 (1. Device: STMicroelectronics Virtual COM Port (COM7))
Configuration Index: 1

000006: Select Configuration (UP), 2016-08-25 19:07:39,5192558 +0,0000004. (1. Device: STMicroelectronics Virtual COM Port (COM7)) Status: 0x00000000
Configuration Index: 1
Configuration Handle: 0x3618630

000007: Class-Specific Request (DOWN), 2016-08-25 19:07:39,5192694 +0,0000136 (1. Device: STMicroelectronics Virtual COM Port (COM7))
Destination: Interface, Index 0
Reserved Bits: 0
Request: 0x21
Value: 0x0
Get 0x7 bytes from the device


000008: Control Transfer (UP), 2016-08-25 19:07:39,5194453 +0,0001759. (1. Device: STMicroelectronics Virtual COM Port (COM7)) Status: 0x00000000
Pipe Handle: Control Pipe

00 C2 01 00 00 00 08 .В.....

Setup Packet

A1 21 00 00 00 00 07 00 Ў!......

Recipient: Interface
Request Type: Class
Direction: Device->Host
Request: 0x21 (Unknown)
Value: 0x0
Index: 0x0
Length: 0x7

000009: Class-Specific Request (DOWN), 2016-08-25 19:07:39,5195043 +0,0000590 (1. Device: STMicroelectronics Virtual COM Port (COM7))
Destination: Interface, Index 0
Reserved Bits: 0
Request: 0x22
Value: 0x0
Send 0x0 bytes to the device


000010: Control Transfer (UP), 2016-08-25 19:07:39,5196956 +0,0001913. (1. Device: STMicroelectronics Virtual COM Port (COM7)) Status: 0x00000000
Pipe Handle: Control Pipe

Setup Packet

21 22 00 00 00 00 00 00 !"......

Recipient: Interface
Request Type: Class
Direction: Host->Device
Request: 0x22 (Unknown)
Value: 0x0
Index: 0x0
Length: 0x0


000013: Class-Specific Request (DOWN), 2016-08-25 19:07:41,4999857 +1,9802684 (1. Device: STMicroelectronics Virtual COM Port (COM7))
Destination: Interface, Index 0
Reserved Bits: 0
Request: 0x21
Value: 0x0
Get 0x7 bytes from the device


000014: Control Transfer (UP), 2016-08-25 19:07:41,5001689 +0,0001832. (1. Device: STMicroelectronics Virtual COM Port (COM7)) Status: 0x00000000
Pipe Handle: Control Pipe

00 C2 01 00 00 00 08 .В.....

Setup Packet

A1 21 00 00 00 00 07 00 Ў!......

Recipient: Interface
Request Type: Class
Direction: Device->Host
Request: 0x21 (Unknown)
Value: 0x0
Index: 0x0
Length: 0x7

000015: Class-Specific Request (DOWN), 2016-08-25 19:07:41,5001847 +0,0000158 (1. Device: STMicroelectronics Virtual COM Port (COM7))
Destination: Interface, Index 0
Reserved Bits: 0
Request: 0x21
Value: 0x0
Get 0x7 bytes from the device


000016: Control Transfer (UP), 2016-08-25 19:07:41,5004090 +0,0002243. (1. Device: STMicroelectronics Virtual COM Port (COM7)) Status: 0x00000000
Pipe Handle: Control Pipe

00 C2 01 00 00 00 08 .В.....

Setup Packet

A1 21 00 00 00 00 07 00 Ў!......

Recipient: Interface
Request Type: Class
Direction: Device->Host
Request: 0x21 (Unknown)
Value: 0x0
Index: 0x0
Length: 0x7

000017: Class-Specific Request (DOWN), 2016-08-25 19:07:41,5005454 +0,0001364 (1. Device: STMicroelectronics Virtual COM Port (COM7))
Destination: Interface, Index 0
Reserved Bits: 0
Request: 0x22
Value: 0x1
Send 0x0 bytes to the device


000018: Control Transfer (UP), 2016-08-25 19:07:41,5006528 +0,0001074. (1. Device: STMicroelectronics Virtual COM Port (COM7)) Status: 0x00000000
Pipe Handle: Control Pipe

Setup Packet

21 22 01 00 00 00 00 00 !"......

Recipient: Interface
Request Type: Class
Direction: Host->Device
Request: 0x22 (Unknown)
Value: 0x1
Index: 0x0
Length: 0x0


000019: Class-Specific Request (DOWN), 2016-08-25 19:07:41,5007972 +0,0001444 (1. Device: STMicroelectronics Virtual COM Port (COM7))
Destination: Interface, Index 0
Reserved Bits: 0
Request: 0x21
Value: 0x0
Get 0x7 bytes from the device


000020: Control Transfer (UP), 2016-08-25 19:07:41,5009031 +0,0001059. (1. Device: STMicroelectronics Virtual COM Port (COM7)) Status: 0x00000000
Pipe Handle: Control Pipe

00 C2 01 00 00 00 08 .В.....

Setup Packet

A1 21 00 00 00 00 07 00 Ў!......

Recipient: Interface
Request Type: Class
Direction: Device->Host
Request: 0x21 (Unknown)
Value: 0x0
Index: 0x0
Length: 0x7

..... и т.д.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32 и USB (практика)
СообщениеДобавлено: Сб авг 27, 2016 18:22:49 
Собутыльник Кота
Аватар пользователя

Карма: 29
Рейтинг сообщений: 651
Зарегистрирован: Сб май 14, 2011 21:16:04
Сообщений: 2708
Откуда: г. Чайковский
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
Ничего не читал, поправлюсь. Не понял сразу что bmRequestType=0x21, соответсвенно не другое устройство, а интерфейс.

_________________
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 583 ]     ... , , , 9, , , ...  

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 14


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y