Доброго времени суток.
Пытаюсь запустить USB в режиме девайс на STM32F107 и что-то конкретно завис (я завис).
Вот
такая отладочная плата.
Стартап для серии Connectivity берет кварц на 25МГц, на плате 8. Поправил. На выходе MCO частота 72МГц
+0.0003 . Кстати, странная какая-то форма сигнала, я думал там должен быть прямоугольные импульсы. Если до 8МГц еще что-то похоже, то далее, чем выше частота, тем больше постоянная составляющая и меньше размах сигнала. Так например, если частота 40МГц, то размах меньше вольта при постоянной составляющей 1.7В.
А если на выход MCO пустить все 72МГц, то при той же постоянной составляющей размах всего-лишь 400мВ (но тут ладно, выше 50МГц и не должно работать).
Странно как-то, но частота 72МГц есть. Ну можно будет еще какой-нибудь ШИМ с таймера пустить на выход, но вроде как и так 72МГц, что еще проверять.
//-------------------------------------------------------------------
Теперь что касается USB.
Инициализирую так.
Спойлер
Код: Выделить всё
RCC->AHBENR|=RCC_AHBENR_OTGFSEN;
OTG_FS_GENERAL->AHBCFG|=
OTG_FS_GENERAL_AHBCFG_GINT |
OTG_FS_GENERAL_AHBCFG_PTXFELVL |
OTG_FS_GENERAL_AHBCFG_TXFELVL |
0;
OTG_FS_GENERAL->USBCFG=
OTG_FS_GENERAL_USBCFG_FDMOD | //Force device mode
//OTG_FS_GENERAL_USBCFG_HNPCAP |
//OTG_FS_GENERAL_USBCFG_SRPCAP |
(5<<OTG_FS_GENERAL_USBCFG_TRDT_POS) | //какое то время
(5<<OTG_FS_GENERAL_USBCFG_TOCAL_POS) |
0;
OTG_FS_DEVICE->CFG=
OTG_FS_DEVICE_CFG_DSPD | //48МГц
//OTG_FS_DEVICE_CFG_NZLSOHSK | //
0;
OTG_FS_GENERAL->INTSTS=0xFFFFFFFF;
OTG_FS_GENERAL->INTMSK =
OTG_FS_GENERAL_INTMSK_USBRSTM | //– USB reset
//OTG_FS_GENERAL_INTMSK_ENUMDNEM | //Enumeration done
//OTG_FS_GENERAL_INTMSK_USBSUSPM | //USB suspend
//OTG_FS_GENERAL_INTMSK_SOFM |
//OTG_FS_GENERAL_INTMSK_RXFLVLM | //буфер приема не пустой
//OTG_FS_GENERAL_INTMSK_OEPM | //прерывание от OUT EP
0;
//включаем подтягивающий резистор DP вернее сенсор VbusB
OTG_FS_GENERAL->CCFG|=
OTG_FS_GENERAL_CCFG_VBUSBSEN |
0;
NVIC_SetPriority(OTG_FS_IRQn,15);
NVIC_EnableIRQ(OTG_FS_IRQn);
При подключении шнурка вклчается подтягивающий резистор на линии DP и ловлю резет.
Спойлер
Код: Выделить всё
void USB_Reset(void)
{
//очистка FIFO
OTG_FS_GENERAL->RSTCTL=OTG_FS_GENERAL_RSTCTL_TXFFLSH | OTG_FS_GENERAL_RSTCTL_TXFNUM ;
while (OTG_FS_GENERAL->RSTCTL & OTG_FS_GENERAL_RSTCTL_TXFFLSH);
OTG_FS_GENERAL->RSTCTL=OTG_FS_GENERAL_RSTCTL_RXFFLSH;
while (OTG_FS_GENERAL->RSTCTL & OTG_FS_GENERAL_RSTCTL_RXFFLSH);
//------------------------------------------------------------
/*1. Set the NAK bit for all OUT endpoints
– SNAK = 1 in OTG_FS_DOEPCTLx (for all OUT endpoints)
*/
//OTG_FS_DEVICE->OUTEP[0].CTL=OTG_FS_DEVICE_ENDPOINT_CTL_SNAK;
OTG_FS_DEVICE->OUTEP[0].CTL=OTG_FS_DEVICE_ENDPOINT_CTL_CNAK;
OTG_FS_DEVICE->OUTEP[1].CTL=OTG_FS_DEVICE_ENDPOINT_CTL_SNAK;
OTG_FS_DEVICE->OUTEP[2].CTL=OTG_FS_DEVICE_ENDPOINT_CTL_SNAK;
OTG_FS_DEVICE->OUTEP[3].CTL=OTG_FS_DEVICE_ENDPOINT_CTL_SNAK;
//------------------------------------------------------------
/*
2. Unmask the following interrupt bits
– INEP0 = 1 in OTG_FS_DAINTMSK (control 0 IN endpoint)
– OUTEP0 = 1 in OTG_FS_DAINTMSK (control 0 OUT endpoint)
– STUP = 1 in DOEPMSK
– XFRC = 1 in DOEPMSK
– XFRC = 1 in DIEPMSK
– TOC = 1 in DIEPMSK
*/
OTG_FS_DEVICE->AINTMSK =
OTG_FS_DEVICE_AINTMSK_IEPINTM_0 |
OTG_FS_DEVICE_AINTMSK_OEPINTM_0 |
0;
OTG_FS_DEVICE->OEPMSK =
OTG_FS_DEVICE_OEPMSK_STUPM | //SETUP phase done mask
OTG_FS_DEVICE_OEPMSK_XFRCM | //XFRCM: Transfer completed interrupt mask
0;
OTG_FS_DEVICE->IEPMSK =
OTG_FS_DEVICE_IEPMSK_TOCM | //Timeout condition mask (Non-isochronous endpoints)
OTG_FS_DEVICE_IEPMSK_XFRCM | //XFRCM: Transfer completed interrupt mask
0;
//----------------------------------------------------------------------
/*
3. Set up the Data FIFO RAM for each of the FIFOs
– Program the OTG_FS_GRXFSIZ register, to be able to receive control OUT data
and setup data. If thresholding is not enabled, at a minimum, this must be equal to
1 max packet size of control endpoint 0 + 2 words (for the status of the control
OUT data packet) + 10 words (for setup packets).
– Program the OTG_FS_TX0FSIZ register (depending on the FIFO number chosen)
to be able to transmit control IN data. At a minimum, this must be equal to 1 max
packet size of control endpoint 0.
*/
OTG_FS_GENERAL->RXFSIZ = RX_FIFO_SIZE;//размер буфера для приема
OTG_FS_GENERAL->TX0FSIZ = (TX_EP0_FIFO_SIZE<<16) | RX_FIFO_SIZE;//размер буфера и адрес для передачи точки 0
//---------------------------------------------------------------------------
/*
4. Program the following fields in the endpoint-specific registers for control OUT endpoint
0 to receive a SETUP packet
– STUPCNT = 3 in OTG_FS_DOEPTSIZ0 (to receive up to 3 back-to-back SETUP
packets)
*/
OTG_FS_DEVICE->OUTEP[0].TSIZ =
OTG_FS_DEVICE_ENDPOINT_TSIZ_STUPCNT_OUT0 |
OTG_FS_DEVICE_ENDPOINT_TSIZ_PKTCNT_OUT0 |
OTG_FS_DEVICE_ENDPOINT_TSIZ_XFRSIZ_OUT0 |
0;
OTG_FS_DEVICE->OUTEP[0].CTL=
//OTG_FS_DEVICE_ENDPOINT_CTL_EPENA | //включить точку
OTG_FS_DEVICE_ENDPOINT_CTL_CNAK | //сбросить NAK
0;
OTG_FS_DEVICE->OUTEP[0].CTL=OTG_FS_DEVICE_ENDPOINT_CTL_EPENA ; //включить точку
//-------------------------
OTG_FS_GENERAL->INTMSK|=
//OTG_FS_GENERAL_INTMSK_USBRSTM | //– USB reset
OTG_FS_GENERAL_INTMSK_ENUMDNEM | //Enumeration done
//OTG_FS_GENERAL_INTMSK_USBSUSPM | //USB suspend
OTG_FS_GENERAL_INTMSK_SOFM |
OTG_FS_GENERAL_INTMSK_RXFLVLM | //буфер приема не пустой
OTG_FS_GENERAL_INTMSK_OEPM | //прерывание от OUT EP
0;
//---------------------------------
OTG_FS_DEVICE->OUTEP[0].CTL|=
OTG_FS_DEVICE_ENDPOINT_CTL_CNAK | //сбросить NAK
0;
};
Далее я должен поймать запрос дескриптора, хост этот запрос шлет, вижу я его лог. анализатором. Но никаких флагов установленных я не вижу, в том числе не вижу флага SOF.
С меня, за помощь, огромное спасибо.
