Пн дек 26, 2011 11:14:57
void GetDescriptor(void)
{
u8 Request_Desc;
BYTE data_to_transfer;
uint16_t wLength;
unsigned char zlp;
BYTE *pbuffer;
zlp=FALSE;
Request_Desc = Cam_Bufer[3]; //определяем, какой дескриптор просит хост (в Cam_Bufer[3] - старший байт поля wValue)
switch (Request_Desc)
{
case DEVICE:
{
data_to_transfer = sizeof(usb_device_descriptor);
pbuffer=&(usb_device_descriptor.bLength);
break;
}
case CONFIGURATION:
{
data_to_transfer = sizeof(usb_configuration);
pbuffer = &(usb_configuration.cfg.bLength);
break;
}
}
wLength=ToWord(Cam_Bufer[7],Cam_Bufer[6]); //объединяем в слово байты поля wLength
if (wLength>data_to_transfer) //если длина пакета хоста больше размера дескриптора
{
if ((data_to_transfer % EP_CONTROL_LENGTH) == 0) //и если длина дескриптора делится на макс. размер пакета КТ
{zlp = TRUE;} //то нужно будет послать пакет данных нулевой длины
else
{zlp = FALSE;} // если нет, то пакет нулевой длины не потребуется
}
else
{data_to_transfer=wLength;}
while (data_to_transfer>EP_CONTROL_LENGTH) //пока объем данных для пересылки больше пакета нулевой КТ
{
UserToPMABufferCopy(pbuffer,_GetEPTxAddr(ENDP0),EP_CONTROL_LENGTH); //копируем в PMA 8 байт дескриптора
SetEPTxCount(ENDP0,EP_CONTROL_LENGTH); //устанавливаем счетчик для отправки=8 байт
SetEPTxValid(ENDP0); //разрешаем передачу КТ
pbuffer+=EP_CONTROL_LENGTH; //смещаем указатель на 8
data_to_transfer-=EP_CONTROL_LENGTH; //уменьшаем размер данных к передаче на 8
while (!(USB->USB_EP0R&USB_EP0R_CTR_TX)) {} //ждем, пока не пройдет передача
USB->USB_EP0R &= ~USB_EP0R_CTR_TX; //чистим бит успешной передачи
}
//отсылаем остаточный пакет данных
UserToPMABufferCopy(pbuffer,_GetEPTxAddr(ENDP0),EP_CONTROL_LENGTH);
SetEPTxCount(ENDP0,EP_CONTROL_LENGTH);
SetEPTxValid(ENDP0);
data_to_transfer=0;
while (!(USB->USB_EP0R&USB_EP0R_CTR_TX)) {}
USB->USB_EP0R &= ~USB_EP0R_CTR_TX;
//если требуется пакет данных нулевой длины, то отправляем его
if (zlp==TRUE)
{
Send0LengthData();
while (!(USB->USB_EP0R&USB_EP0R_CTR_TX)){}
USB->USB_EP0R &= ~USB_EP0R_CTR_TX;
}
//разрешаем прием нулевой КТ
SetEPRxCount(ENDP0,8);
SetEPRxStatus(ENDP0,EP_RX_VALID);
return;
}
Ср дек 28, 2011 11:35:37
Ср дек 28, 2011 11:57:18
SubDia писал(а):И еще пришла в голову мысль не бороться с ветряными мельницами и использовать готовую библиотеку от производителя в своих проектах.
Ср дек 28, 2011 12:14:18
Satyr писал(а):Только с осторожностью - на первую ошибку я там наткнулся на второй день разбирательств.
Satyr писал(а):USB очень чувствительно к тактовке. Про RC сразу можно забыть, про 99% керамических резонаторов тоже. Только кварцы.
Ср дек 28, 2011 12:21:42
SubDia писал(а):Satyr писал(а):Только с осторожностью - на первую ошибку я там наткнулся на второй день разбирательств.
Позвольте полюбопытствовать - что за ошибка?
Содрал у STM на сайте занимательную штуку для L15x - Clock Configuration Tool зовется. О ней Вы наверняка знаете.
Пт янв 06, 2012 12:08:56
Пт янв 06, 2012 17:28:33
Пт янв 06, 2012 17:36:43
Satyr писал(а):Все что на или около Junko WinDriver - глюк нечеловеческий.
Ср июл 04, 2012 13:08:44
Чт июл 05, 2012 03:01:47
Сб июл 07, 2012 20:37:56
Вс ноя 11, 2012 11:05:33
Вс ноя 11, 2012 13:41:46
ВитГо писал(а):есть stm32f407 которая должна общаться с компьютером..
FT232 и различные USB-UART использовать не хочу (в чипе есть железный USB)
что мне нужно чтобы организовать двустороннюю передачу данных устройства\ПК ?
подскажите простой способ, где что почитать...?
еще интересует есть ли например в Винде какое нить стандартное устройство чтобы не приходилось дополнительно ставить драйвера ?
может есть способ получать данные как например это происходит при подключении мыши (ведь какую не воткни - сразу работает !)
Сб июл 06, 2013 22:31:34