Easyelectronics.ru

Электроника для всех
Текущее время: 23 сен 2018, 19:33

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



    • JLCPCB - Прототипы 10 PCBs всего за 2$ (100*100mm, 2-layer)
    • Как мы делаем платы, смотрите на YouTube
    • Крупнейшая китайская фабрика прототипов. 300000+ заказчиков и 10000+ заказов в день!
    • LCSC - Крупнейший китайский онлайн магазин комплектующих.

Начать новую тему Ответить на тему  [ Сообщений: 79 ]  На страницу Пред.  1, 2, 3, 4  След.
Автор Сообщение
 Заголовок сообщения: Re: STM32F407 и USB
СообщениеДобавлено: 26 июн 2018, 11:55 
Старожил
Аватара пользователя

Зарегистрирован: 13 янв 2018, 21:36
Сообщения: 385
Она громадна только из-за большого количества стандартных классов. Сам по себе интерфейс не такой уж сложный. Если один раз победить enumeration, то потом уже легче пойдёт.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32F407 и USB
СообщениеДобавлено: 26 июн 2018, 12:00 
Старожил

Зарегистрирован: 16 ноя 2012, 07:47
Сообщения: 2676
Это да, но до enumeration еще дойти надо) Плюс не такое большое количество сносных средств для отладки интерфейса. Пользовались USBlyzer, немало часов провели на вылавливании всех событий.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32F407 и USB
СообщениеДобавлено: 26 июн 2018, 12:10 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 642
ElecDron писал(а):
у меня нет битовых полей в контексте языка C++.

Выше был union для USB_OTG_DIEPMSK_TypeDef на битовых полях, в стандартных хедерах такого нет, разве что в каких-то очень старых, но я видел либы где все регистры так объявлены и весь доступ именно через битовые поля и идет...

Цитата:
Та функция, после включения оптимизации -O превратиться в это:
Одна (или две) asm инструкции в итоге.

А до включения оптимизации, если функция явно не объявлена как always_inline, она отожрет 120 байт. Если знать, то добавить always_inline не проблема, но тогда мы усложняем отладку такого кода. Ну и сама функция же сложнее, конечно есть variadic templates и даже fold expressions, но зачем это все тут, если битовые операции можно перегрузить для всех перечислений сразу и останется функция с одним параметром, в силу чего следует задуматься нужна ли она совсем... У меня, например, такого нет, как и классов описывающих каждый регистр.

Цитата:
А знак доллара - это, ну как сказать. Имя класса и имя переменной не могут совпадать. В данном случае имя класса, который описывает регистр GINTMSK имеет название "GINTMSK". И переменная тоже имеет такое же имя. Вроде как наименование регистров в коде принято писать заглавными буквами (CR1, SR, MODER, SPEEDR, GINTMSK...). А доллар можно использовать как символ в имени переменной - тогда конфликт имен разрешится.

В контексте простых имен $ выглядит странно. В С++20 должна быть рефлексия и там как раз синтаксис с $, что сделает твой код еще более неоднозначным.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32F407 и USB
СообщениеДобавлено: 02 июл 2018, 20:30 
Старожил

Зарегистрирован: 11 фев 2016, 18:17
Сообщения: 333
Когда приходят SETUP пакеты, откуда я их должен считывать? Обычно в приемопередающей переферии есть специальные регистры для этого, например в SPI это регистр DR. Тут ничего подобного нет. Однако в RM видел раздел 34.10 USB data FIFOs. Как я понял из описания, это некоторая своя память, встроенная в USB контроллер. Мол, туда идут и оттуда уходят данные.
В библиотеке от ST происходит считывание этой памяти по некоторому адресу, который завязан на тип USB (FS или HS), номер конечной точки, её размер и смещение:
Код:
pdev->regs.DFIFO[i] = (uint32_t *)(baseAddress + USB_OTG_DATA_FIFO_OFFSET + (i * USB_OTG_DATA_FIFO_SIZE));

Константы USB_OTG_DATA_FIFO_OFFSET и USB_OTG_DATA_FIFO_SIZE равно 0x1000.
1. Откуда взято это число и почему именно столько?
2. Единственный ли это способ для расчета адреса FIFO?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32F407 и USB
СообщениеДобавлено: 02 июл 2018, 22:51 
Старожил
Аватара пользователя

Зарегистрирован: 13 янв 2018, 21:36
Сообщения: 385
ElecDron писал(а):
Когда приходят SETUP пакеты, откуда я их должен считывать?
Из FIFO нулевой конечной точки. Вы же инициализировали FIFO прежде чем принимать данные, правда? :)

Show Инициализация FIFO

Show Чтение SETUP


ElecDron писал(а):
Константы USB_OTG_DATA_FIFO_OFFSET и USB_OTG_DATA_FIFO_SIZE равно 0x1000.
1. Откуда взято это число и почему именно столько?
Из RM вестимо.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32F407 и USB
СообщениеДобавлено: 03 июл 2018, 00:22 
Старожил

Зарегистрирован: 11 фев 2016, 18:17
Сообщения: 333
Спасибо, такой код есть.
Да, в самом деле - константы берутся отсюда: 34.16.1 CSR memory map.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32F407 и USB
СообщениеДобавлено: 03 июл 2018, 00:45 
Старожил
Аватара пользователя

Зарегистрирован: 13 янв 2018, 21:36
Сообщения: 385
Дабы закончить с FIFO, их ещё в обработчике RESET очищать надо.
Код:
   //Сбросить все TXFIFO
   USB_OTG_GLOBAL->GRSTCTL = USB_OTG_GRSTCTL_TXFFLSH | USB_OTG_GRSTCTL_TXFNUM_ALL;
   while (USB_OTG_GLOBAL->GRSTCTL & USB_OTG_GRSTCTL_TXFFLSH);
   //Сбросить RXFIFO
   USB_OTG_GLOBAL->GRSTCTL = USB_OTG_GRSTCTL_RXFFLSH;
   while (USB_OTG_GLOBAL->GRSTCTL & USB_OTG_GRSTCTL_RXFFLSH);


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32F407 и USB
СообщениеДобавлено: 03 июл 2018, 10:09 
Старожил

Зарегистрирован: 11 фев 2016, 18:17
Сообщения: 333
Благодарю.
Вопрос по STALL. У ST для этого есть функция:
Код:
USB_OTG_STS USB_OTG_EPSetStall(USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep)
{
  USB_OTG_STS status = USB_OTG_OK;
  USB_OTG_DEPCTL_TypeDef  depctl;
  __IO uint32_t *depctl_addr;
 
  depctl.d32 = 0;
  if (ep->is_in == 1)
  {
    depctl_addr = &(pdev->regs.INEP_REGS[ep->num]->DIEPCTL);
    depctl.d32 = USB_OTG_READ_REG32(depctl_addr);
    /* set the disable and stall bits */
    if (depctl.b.epena)
    {
      depctl.b.epdis = 1;
    }
    depctl.b.stall = 1;
    USB_OTG_WRITE_REG32(depctl_addr, depctl.d32);
  }
  else
  {
    depctl_addr = &(pdev->regs.OUTEP_REGS[ep->num]->DOEPCTL);
    depctl.d32 = USB_OTG_READ_REG32(depctl_addr);
    /* set the stall bit */
    depctl.b.stall = 1;
    USB_OTG_WRITE_REG32(depctl_addr, depctl.d32);
  }
  return status;
}
Видно, что для OUT-точки устанавливается только бит depctl.b.stall. Тогда как для IN-точки еще проверяется "активированность" и может быть установлено два бита. Вопрос: такое поведение для IN-точки всегда должно быть? Почему просто не писать один бит depctl.b.stall как в случае OUT-точки?
Или это выдумки ST?

Иными словами, как следует правильно отправлять STALL пакет?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32F407 и USB
СообщениеДобавлено: 03 июл 2018, 13:12 
Старожил
Аватара пользователя

Зарегистрирован: 13 янв 2018, 21:36
Сообщения: 385
Да обычный индусский код. Если точка уже disable, то и не надо ничего делать. Думаю можно забить.

Не спешите STALL-ми швыряться, enumration и без них можно пройти. Это всё же обработка ошибочных состояний. Например,
Цитата:
Special case: stalling the control OUT endpoint
The core must stall IN/OUT tokens if, during the data stage of a control transfer, the host
sends more IN/OUT tokens than are specified in the SETUP packet. In this case, the
application must enable the ITTXFE interrupt in OTG_FS_DIEPINTx and the OTEPDIS
interrupt in OTG_FS_DOEPINTx during the data stage of the control transfer, after the core
has transferred the amount of data specified in the SETUP packet. Then, when the
application receives this interrupt, it must set the STALL bit in the corresponding endpoint
control register, and clear this interrupt.


ЗЫ: Вот такую реализацию от ST нашёл. Так что, индусы они такие :)
Show SetStall


Последний раз редактировалось VladislavS 03 июл 2018, 14:09, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32F407 и USB
СообщениеДобавлено: 03 июл 2018, 13:50 
Старожил

Зарегистрирован: 11 фев 2016, 18:17
Сообщения: 333
И такой индусский код там везде... Сидишь и думаешь, а нужно ли это... VladislavS, а можете выложить Ваш какой-нибудь полноценный пример работы с USB? Вот Вы копировали в одном из предыдущих сообщений часть кода, целиком можно посмотреть?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32F407 и USB
СообщениеДобавлено: 03 июл 2018, 14:12 
Старожил
Аватара пользователя

Зарегистрирован: 13 янв 2018, 21:36
Сообщения: 385
ElecDron писал(а):
VladislavS, а можете выложить Ваш какой-нибудь полноценный пример работы с USB? Вот Вы копировали в одном из предыдущих сообщений часть кода, целиком можно посмотреть?

Извини, нет. По разным причинам. Да и нет там ничего ценного, поверь. Я лучше на те вопросы что точно знаю отвечу.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32F407 и USB
СообщениеДобавлено: 03 июл 2018, 17:53 
Старожил

Зарегистрирован: 11 фев 2016, 18:17
Сообщения: 333
А как Вы ловите прерывание для SETUP? Я воспользовался примером из библиотеки:
Код:
if($USBFS.$GINISTS.containsBit(USB::GINISTS::OEPINT))
{
   if($USBFS.$DAINT.containsBit(USB::DAINT::OEP0))
   {
      /* Setup Phase Done (control EPs) */
      if($USBFS.$DOEPINT0.containsBit(USB::DOEPINT0::STUP))
      {
         // прочитать FIFO конечной точки 0 для получения пакета
         Packet packet = $USBFS.$DFIFO0.read();
         switch(packet.type.reciever())
         {
            case standarts::usb::setup::Device:   
               handleDeviceRequest(packet);
               break;
            case standarts::usb::setup::Interface:     
               handleInterfaceRequest(packet);
               break;
            case standarts::usb::setup::Endpoint:         
               handleEndpointRequest(packet);
               break;
            default:           
               // Обработать ошибку - STALL
               break;
         }
         
         $USBFS.$DOEPINT0.clearBits(USB::DOEPINT0::STUP);
      }
      
      // ... проверить другие прерывания
      
   }
   
   // ... другие конечные точки
}
Или можно лучше?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32F407 и USB
СообщениеДобавлено: 03 июл 2018, 20:17 
Старожил
Аватара пользователя

Зарегистрирован: 13 янв 2018, 21:36
Сообщения: 385
Я не так делаю. У меня "двухходовочка"

Сначала копирую пакет в буфер
Show PKTSTS_DATA_UPDT

А вторым заходом уже его начинаю разгребать
Show USB_OTG_DOEPINT_STUP


И SETUP разгребать можно немного проще
Show SETUP


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32F407 и USB
СообщениеДобавлено: 04 июл 2018, 11:44 
Старожил

Зарегистрирован: 11 фев 2016, 18:17
Сообщения: 333
Интересно.
А пишите непосредственно в функции WriteINEP()? У ST вместо прямой записи, сначала идет подготовка регистров, потом, видимо, случается прерывание для IN точки, и только затем происходит непосредственная запись в FIFO буфер.

Еще вопрос: в их библиотеке запись данных производится как uint32, т.е. за раз пишется 4 байта. Вот их функция:
Код:
USB_OTG_STS USB_OTG_WritePacket(USB_OTG_CORE_HANDLE *pdev, uint8_t *src, uint8_t ch_ep_num, uint16_t len)
{
  USB_OTG_STS status = USB_OTG_OK;
  if (pdev->cfg.dma_enable == 0)
  {
    uint32_t count32b= 0 , i= 0;
    __IO uint32_t *fifo;
   
    count32b =  (len + 3) / 4;
    fifo = pdev->regs.DFIFO[ch_ep_num];
    for (i = 0; i < count32b; i++, src+=4)
    {
      USB_OTG_WRITE_REG32( fifo, *((__packed uint32_t *)src) );
    }
  }
  return status;
}
Почему бы просто не писать побайтово, без этого *((__packed uint32_t *)src) преобразования? В RM вроде не нашел указаний на именно 4-байтную запись.

Еще вопрос: каким образом нужно контролировать длину отправляемых данных? Допустим хочу отправить сто мегабайт данных - я же их не могу просто так взять и в цикле непрерывно писать...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32F407 и USB
СообщениеДобавлено: 04 июл 2018, 19:00 
Старожил
Аватара пользователя

Зарегистрирован: 13 янв 2018, 21:36
Сообщения: 385
ElecDron писал(а):
А пишите непосредственно в функции WriteINEP()?
Если точка свободна, то сразу. Иначе в очередь ставлю. И если размер передаваемых данных больше размера конечной точки, то остаток в очередь ставится.

ElecDron писал(а):
Еще вопрос: в их библиотеке запись данных производится как uint32, т.е. за раз пишется 4 байта.
Я тоже по 4 байта пишу. Ну так тупо быстрее. Наверное можно и побайтно, но зачем?
Show WriteFIFO

ElecDron писал(а):
В RM вроде не нашел указаний на именно 4-байтную запись.
Это хорошо. Вон в F103-м камне FIFO можно было писать только по 16 бит и с дырками в 16 бит. Вот то веселуха была.

ElecDron писал(а):
Еще вопрос: каким образом нужно контролировать длину отправляемых данных? Допустим хочу отправить сто мегабайт данных - я же их не могу просто так взять и в цикле непрерывно писать...
Да, просто брать и в цикле писать, разбивая на кусочки не превышающие размера конечной точки.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32F407 и USB
СообщениеДобавлено: 04 июл 2018, 22:21 
Старожил

Зарегистрирован: 11 фев 2016, 18:17
Сообщения: 333
VladislavS писал(а):
Да, просто брать и в цикле писать, разбивая на кусочки не превышающие размера конечной точки.
Положим записал в цикле первый кусок. Далее, видимо, нужно подождать, пока TxFIFO этой конечной точки станет снова доступной. Делать это нужно через проверку бита TXFE из регистра DIEPINTx, например так (конечная точка 1)?
Код:
for(int i = 0; i < dataSize; i += TX_EP1_FIFO_SIZE)
{
   DFIFO1.write(data + i, TX_EP1_FIFO_SIZE);         // пишем в FIFO. Для простоты считаем, что данные кратны TX_EP1_FIFO_SIZE
   while(DIEPINT1.containsBit(DIEPINT1::TXFE) == false);   // ждет установки бита
}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32F407 и USB
СообщениеДобавлено: 04 июл 2018, 22:33 
Старожил
Аватара пользователя

Зарегистрирован: 13 янв 2018, 21:36
Сообщения: 385
Не, так не надо. Прерывание надо задействовать. Пока данные отправляются можно ещё что-то полезное делать.
Show Отправка из очереди в прерывании


ЗЫ: Оставляю вам на исследование вопрос. Если размер передаваемых данных кратен размеру конечной точки, то после последнего пакета в каких-то чипах надо ZLP отправлять, а в каких-то нет. Поэкспериментируйте.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32F407 и USB
СообщениеДобавлено: 04 июл 2018, 23:14 
Старожил

Зарегистрирован: 11 фев 2016, 18:17
Сообщения: 333
Хм, а есть что полезное делать в промежуток между двумя отправками?
Через прерывания - отправка данных "размазана" по коду получается. А так было бы все в одном месте.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32F407 и USB
СообщениеДобавлено: 04 июл 2018, 23:38 
Старожил
Аватара пользователя

Зарегистрирован: 13 янв 2018, 21:36
Сообщения: 385
На F407 больше не чем заняться? Оригинально.

Что там размазано то? В одном месте кладёте в очередь, во втором скармливайте в конечную точку.

Да и повиснете вы в этом цикле, если хост забьёт на вас.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32F407 и USB
СообщениеДобавлено: 05 июл 2018, 22:23 
Старожил

Зарегистрирован: 11 фев 2016, 18:17
Сообщения: 333
Хочу поинтересоваться также у других участников форума, кто работает с USB - как у вас сделана запись данных в буфер? Синхронно, на прерываниях..?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32F407 и USB
СообщениеДобавлено: 06 июл 2018, 00:09 
Старожил
Аватара пользователя

Зарегистрирован: 13 янв 2018, 21:36
Сообщения: 385
А чего вы так испугались прерываний? Их и так до чёрта, одним больше, одним меньше... какая разница?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32F407 и USB
СообщениеДобавлено: 06 июл 2018, 15:07 
Старожил

Зарегистрирован: 11 фев 2016, 18:17
Сообщения: 333
Стараюсь без надобности не использовать прерывания.
Вот Вы говорите, что синхронная запись данных - плохая затея, мол, компьютер может забить. А как это может проявиться? Я вижу три возможности - выдернули шнур USB, выключился компьютер, сделали безопасное извлечение устройства в Шиндоус. Есть что-то еще?

И еще: а как можно детектировать подобные события? Вот в режиме хоста есть бит DISCINT в региcтре GINTSTS. А в режиме device?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32F407 и USB
СообщениеДобавлено: 06 июл 2018, 15:29 
Старожил
Аватара пользователя

Зарегистрирован: 13 янв 2018, 21:36
Сообщения: 385
ElecDron писал(а):
Стараюсь без надобности не использовать прерывания.
Все нормальные люди наоборот стараются их использовать. А ещё DMA там где возможно.

ElecDron писал(а):
Вот Вы говорите, что синхронная запись данных - плохая затея
Не знаю что вы понимаете под синхронной записью и каким она тут боком...
Мне сильно не понравилось ожидание бита, который может не появиться никогда, в глухом цикле. Он может не вскочить просто без причин и всё, вы повисли.

Хотя, я кажется догадываюсь. Чтобы отправлять по прерываниям надо очередь сделать. Лениво, правда? Иначе непонятно, почему остальные события вы без прерываний не стараетесь обрабатывать...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32F407 и USB
СообщениеДобавлено: 06 июл 2018, 16:00 
Старожил

Зарегистрирован: 11 фев 2016, 18:17
Сообщения: 333
VladislavS писал(а):
Мне сильно не понравилось ожидание бита, который может не появиться никогда, в глухом цикле. Он может не вскочить просто без причин и всё, вы повисли.
И какой бит можно ожидать? INEPTFSAV из регистра DTXFSTS?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32F407 и USB
СообщениеДобавлено: 06 июл 2018, 16:06 
Старожил
Аватара пользователя

Зарегистрирован: 13 янв 2018, 21:36
Сообщения: 385
ElecDron писал(а):
И какой бит можно ожидать? INEPTFSAV из регистра DTXFSTS?

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

Напишите очередь, это не сложно - один указатель и счётчик.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 79 ]  На страницу Пред.  1, 2, 3, 4  След.

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


Кто сейчас на конференции

Сейчас этот форум просматривают: //Mt, 45893569365, osetroff


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

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

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB