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

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

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


Вы здесь » Микроконтроллеры » CERGEI » Потрошим STM32_USB-FS-Device_Lib_V4.1.0 под stm32f103c8t6


Потрошим STM32_USB-FS-Device_Lib_V4.1.0 под stm32f103c8t6

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

1

Начал изучать и ковырять STM32_USB-FS-Device_Lib_V4.1.0 под stm32f103c8t6 под Custom HID для начало.
Смотрю usb работает чисто через прерывания.
Стм написало пример под свои платы чисто,начал чистить понемногу код и сразу стало интересно как шину подтягивают через другой вывод. Думал можно внутренними подтяжками применять,чтоб не ставить лишний транзистор и вывод :

http://s8.uploads.ru/t/3Fdof.png
http://sh.uploads.ru/t/QlsEf.png

2

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

. Думал можно внутренними подтяжками применять,чтоб не ставить лишний транзистор и вывод :

чет мне кажется что нельзя.
кстати , а зачем там транзистор ? я без него обходился.

3

Резистор подтягивает шину указывая хосту,что подключено устройство и в зависимости какую шину,такая и скорость будет.
Запускал тоже пару проектов с hid,резистор не нужен был. Хорошо настроим,прерывания жесткие для usb,нужно изучать прерывания по rm подробно.

Код:
/*******************************************************************************
* Function Name  : USB_Istr
* Description    : ISTR events interrupt service routine
* Input          : None.
* Output         : None.
* Return         : None.
*******************************************************************************/
void USB_Istr(void)
{
    uint32_t i=0;
 __IO uint32_t EP[8];
  
  wIstr = _GetISTR();

#if (IMR_MSK & ISTR_CTR)
  if (wIstr & ISTR_CTR & wInterrupt_Mask)
  {
    /* servicing of the endpoint correct transfer interrupt */
    /* clear of the CTR flag into the sub */
    CTR_LP();
#ifdef CTR_CALLBACK
    CTR_Callback();
#endif
  }
#endif
  /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/  
#if (IMR_MSK & ISTR_RESET)
  if (wIstr & ISTR_RESET & wInterrupt_Mask)
  {
    _SetISTR((uint16_t)CLR_RESET);
    Device_Property.Reset();
#ifdef RESET_CALLBACK
    RESET_Callback();
#endif
  }
#endif
  /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
#if (IMR_MSK & ISTR_DOVR)
  if (wIstr & ISTR_DOVR & wInterrupt_Mask)
  {
    _SetISTR((uint16_t)CLR_DOVR);
#ifdef DOVR_CALLBACK
    DOVR_Callback();
#endif
  }
#endif
  /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
#if (IMR_MSK & ISTR_ERR)
  if (wIstr & ISTR_ERR & wInterrupt_Mask)
  {
    _SetISTR((uint16_t)CLR_ERR);
#ifdef ERR_CALLBACK
    ERR_Callback();
#endif
  }
#endif
  /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
#if (IMR_MSK & ISTR_WKUP)
  if (wIstr & ISTR_WKUP & wInterrupt_Mask)
  {
    _SetISTR((uint16_t)CLR_WKUP);
    Resume(RESUME_EXTERNAL);
#ifdef WKUP_CALLBACK
    WKUP_Callback();
#endif
  }
#endif
  /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
#if (IMR_MSK & ISTR_SUSP)
  if (wIstr & ISTR_SUSP & wInterrupt_Mask)
  {

    /* check if SUSPEND is possible */
    if (fSuspendEnabled)
    {
      Suspend();
    }
    else
    {
      /* if not possible then resume after xx ms */
      Resume(RESUME_LATER);
    }
    /* clear of the ISTR bit must be done after setting of CNTR_FSUSP */
    _SetISTR((uint16_t)CLR_SUSP);
#ifdef SUSP_CALLBACK
    SUSP_Callback();
#endif
  }
#endif
  /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
#if (IMR_MSK & ISTR_SOF)
  if (wIstr & ISTR_SOF & wInterrupt_Mask)
  {
    _SetISTR((uint16_t)CLR_SOF);
    bIntPackSOF++;

#ifdef SOF_CALLBACK
    SOF_Callback();
#endif
  }
#endif
  /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
#if (IMR_MSK & ISTR_ESOF)
  if (wIstr & ISTR_ESOF & wInterrupt_Mask)
  {
    /* clear ESOF flag in ISTR */
    _SetISTR((uint16_t)CLR_ESOF);
    
    if ((_GetFNR()&FNR_RXDP)!=0)
    {
      /* increment ESOF counter */
      esof_counter ++;
      
      /* test if we enter in ESOF more than 3 times with FSUSP =0 and RXDP =1=>> possible missing SUSP flag*/
      if ((esof_counter >3)&&((_GetCNTR()&CNTR_FSUSP)==0))
      {           
        /* this a sequence to apply a force RESET*/
      
        /*Store CNTR value */
        wCNTR = _GetCNTR(); 
      
        /*Store endpoints registers status */
        for (i=0;i<8;i++) EP[i] = _GetENDPOINT(i);
      
        /*apply FRES */
        wCNTR|=CNTR_FRES;
        _SetCNTR(wCNTR);
 
        /*clear FRES*/
        wCNTR&=~CNTR_FRES;
        _SetCNTR(wCNTR);
      
        /*poll for RESET flag in ISTR*/
        while((_GetISTR()&ISTR_RESET) == 0);
  
        /* clear RESET flag in ISTR */
        _SetISTR((uint16_t)CLR_RESET);
   
       /*restore Enpoints*/
        for (i=0;i<8;i++)
        _SetENDPOINT(i, EP[i]);
      
        esof_counter = 0;
      }
    }
    else
    {
        esof_counter = 0;
    }
    
    /* resume handling timing is made with ESOFs */
    Resume(RESUME_ESOF); /* request without change of the machine state */

#ifdef ESOF_CALLBACK
    ESOF_Callback();
#endif
  }
#endif
} /* USB_Istr */

4

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

езистор подтягивает шину указывая хосту,что подключено устройство

в моем случае запускался бут с VCP, а потом шел прыжок на основную программу c VCP. и системе нужно было передергивать эту подтяжку. без этого не получалось. Вообще без подтяжки очень нестабильно должно работать, по крайней мере у меня так было

5

Сделал внешнюю подтяжку шину по примеру

http://s5.uploads.ru/t/G8yjX.png

Немного почистил и запустил пока с драйверами STDPERIPH_DRIVER. Нужно убрать эти драйвера SPL и разобраться с отправкой репортов и приемов их.

Создается две точки с размерностью по 2 байта и репортов там 7 штук.

http://sg.uploads.ru/t/6FanO.png
http://sd.uploads.ru/t/V0MwQ.png

Интересно почему при подключении в диспетчере устройств появляются два устройства ?
Может просто подобрала два драйвера под них винда?

http://s8.uploads.ru/t/a5quW.png

6

Почистил от библиотек SPL,теперь можно заняться настройкой и обменом ))

http://s5.uploads.ru/t/LsZzk.png

Проект

7

Продолжаем грызть usb, начал копать чем можно управлять с помощью python. Нашел пока адекватную работу с libusb, генерировал автоматически драйвер,нужно разбираться по управлению.

Если сравнивать с tcp/ip , то от usb осадок остается. Как то все так мудрено,особенно с кучей дескрипторов и начальной инициализации...

http://s5.uploads.ru/t/reZVa.png

http://sh.uploads.ru/t/gPYHQ.png

Также замечено,что после установки драйвера libusb пропал запрос на репорты с устройства. Теперь видать надо отдельно запрашивать репорты и по ним работать с устройством. С CDC наверно было бы легче работать как с обычным COM ....

http://s5.uploads.ru/t/YqV9s.png

8

Понравилась статья про usb от сюда http://www.gaw.ru/html.cgi/txt/interfac … /index.htm

9

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

Также замечено,что после установки драйвера libusb пропал запрос на репорты с устройства. Теперь видать надо отдельно запрашивать репорты и по ним работать с устройством. С CDC наверно было бы легче работать как с обычным COM ....

Я ручками в диспетчере устройств драйверок удалял, и запросы появлялись опять. До следующей установки. В винде.

10

Сейчас покопаюсь в стеке стм,нужно понять когда отправляется репорт или принимается. Там еще конфигурацию нужно установить,чтоб устройство перешло из адресовано в Сконфигурировано.

http://sh.uploads.ru/t/pUPMu.png

11

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

Понравилась статья про usb от сюда http://www.gaw.ru/html.cgi/txt/interfac … /index.htm

Автор - linuxbergi

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

Нашел пока адекватную работу с libusb, генерировал автоматически драйвер,нужно разбираться по управлению.

libusb - библиотека, не драйвер - https://libusb.info

12

Да сбежал он от нас, если интересна с ним связь вот его группа в вк https://vk.com/protocols.

13

Перехожу сразу на CDC от alexsam, смысла ковыряться с питоном и HID не хочу. А чистить драйвера от stm32  не вижу смысла и так погряз в этом надолго. Тему удалю или по желанию могу продолжить....

14

на форумах лучше вообще никогда ничего не удалять. Ну естественно кроме откровенного спама с рекламой.


Вы здесь » Микроконтроллеры » CERGEI » Потрошим STM32_USB-FS-Device_Lib_V4.1.0 под stm32f103c8t6