Пн май 02, 2016 19:18:05
void Handle_USBAsynchXfer (void)
{
if (needToSend == 1)
{
uint8_t tempData;
tempData = 0x12;
USB_SIL_Write(EP1_IN, &tempData, 1);
SetEPTxValid(ENDP1);
}
}
/*******************************************************************************/
/*******************************************************************************/
void EP1_IN_Callback (void)
{
if (needToSend == 1)
{
uint8_t tempData;
tempData = 0x34;
USB_SIL_Write(EP1_IN, &tempData, 1);
SetEPTxValid(ENDP1);
needToSend = 0;
}
}
/*******************************************************************************/
Ср май 04, 2016 12:31:01
Чт май 05, 2016 10:03:02
Чт май 05, 2016 12:20:39
Чт май 05, 2016 12:55:03
Galizin писал(а):Наверняка это callback функции к каким либо событиям.
void SOF_Callback(void)
{
static uint32_t FrameCount = 0;
if(bDeviceState == CONFIGURED)
{
if (FrameCount++ == VCOMPORT_IN_FRAME_INTERVAL)
{
/* Reset the frame counter */
FrameCount = 0;
/* Check the data to be sent through IN pipe */
Handle_USBAsynchXfer();
}
}
}
BorisSPB писал(а): Так что в Handle_USBAsynchXfer заряжается буфер для первого IN запроса.
Чт май 05, 2016 14:01:01
Согласен, я тоже не нашел легко написанной книги по этому вопросу.isx писал(а):просто разрывает мозг
isx писал(а):какого фига данные, впихнутые через функцию SOF вообще отправляются?
SOF - это начало кадра, и не имеет прямого отношения к устройству.Как я понимаю, то пакет SOF отправляется хостом для того чтоб спросить устройство, хочет ли оно нам что-то передать.
Чт май 05, 2016 14:04:01
Чт май 05, 2016 15:06:52
Чт май 05, 2016 16:23:00
Z_h_e писал(а):Согласен, я тоже не нашел легко написанной книги по этому вопросу.
Z_h_e писал(а):SOF - это начало кадра, и не имеет прямого отношения к устройству.
Z_h_e писал(а):Я тоже потихоньку мучаю USB (т.е. он меня), только я не использую готовых библиотек.
Z_h_e писал(а):Если интересно, я в ехселе сделал частичный протокол обменамоего МК по USB/
BorisSPB писал(а):EP1_IN_Callback вызывается в прерывании USB, если есть данные, заряжаем буфер,
FireProoF писал(а):правда на STMF3
Чт май 05, 2016 16:39:14
Чт май 05, 2016 17:06:31
Вроде как допилить осталось чуток. И в божеский вид привести. Но это вроде. Я сначала через первую точку хотел обмен сделать, даже принял данные через winapi функцией READFILE. Но если данных нет, то там зависнешь. HidD_GetInputReport из библиотеки HID.dll отказалась читать, сейчас уже есть предположение почему.isx писал(а):У Вас уже реализован полный обмен данными МК с ПК в обе стороны или пока с дескрипторами разбираетесь?
Чт май 05, 2016 21:37:26
USB_SIL_Write(EP1_IN, &tempData, 1);
Пт май 06, 2016 12:52:52
EXTI_InitStructure.EXTI_Line = EXTI_Line18;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
Сб май 07, 2016 12:19:20
RCC->CFGR |= RCC_CFGR_USBPRE; // Настраиваем частоту USB (= частота ядра / 1.5)
RCC->APB2ENR |= RCC_APB1ENR_USBEN; // Включаем тактирование USB от шины APB1
Спустя ХХ минут.
NVIC_EnableIRQ(USB_LP_CAN1_RX0_IRQn);
// NVIC_SetPriority(USB_LP_CAN1_RX0_IRQn);
NVIC_EnableIRQ(USBWakeUp_IRQn);
// NVIC_SetPriority(USBWakeUp_IRQn, 3);
Вс май 15, 2016 13:08:19
// здесь должна быть подтяжка резистора
USB->CNTR &= ~USB_CNTR_PDWN; //подаем питание
USB->CNTR |= USB_CNTR_FRES; //На всякий случай устанавливаем флаг (хотя он итак должен стоять при включении)
USB->CNTR = 0; // в результате FRES сбрасывается в ноль, происходит ресет и генерируется прерывание USB_LP_IRQHandler.
void USB_LP_IRQHandler(void)
{
if(USB->ISTR & USB_ISTR_RESET)
{
USB->ISTR = 0; // сбрасываем флаги
USB->CNTR |= USB_CNTR_RESETM | USB_CNTR_SUSPM | USB_CNTR_WKUPM | USB_CNTR_CTRM; // настраиваем маски и включаем прерывание по завершению передачи
........
}
......
}
Вс май 15, 2016 13:32:44
Я FRES наоборот сбросил.Вот корявенький перевод REFERENCE, но мне помог.USB->CNTR |= USB_CNTR_FRES; //На всякий случай устанавливаем флаг (хотя он итак должен стоять при включении)
Вс май 15, 2016 15:01:06
Z_h_e писал(а):Я FRES наоборот сбросил
Z_h_e писал(а):Вот корявенький перевод REFERENCE, но мне помог
Z_h_e писал(а)://Настройка буфера EP0
DiscrTable->ADR0TX=0x0040;
DiscrTable->COUNT0TX=0x0000; //макс 0x80
DiscrTable->ADR0RX=0x0100;
DiscrTable->COUNT0RX=0b1011000000000000; //размер буфера 0x80 (128)байт
Вс май 15, 2016 16:12:21
Я их сам определил, т.е. сделал такими какие мне нужны. Есть область памятиisx писал(а):Вот пока главный вопрос - откуда берутся значения этих адресов?
DiscrTable->ADR0RX=0x0100;
Пт май 20, 2016 20:56:03
Z_h_e писал(а):Я их сам определил, т.е. сделал такими какие мне нужны. Есть область памяти
0x4000 6000- 0x4000 63FF. Именно с ней работает USB.
Z_h_e писал(а): Адрес таблицы указывается в регистре USB_REGISTR->BTABLE=0. Такая запись указывает что таблица находится по адресу 0x4000 6000+0*2.
Z_h_e писал(а):Это еще что, поглядите как устанавливаются биты регистров конечной точки USB_EPnR.
USB->CNTR |= USB_CNTR_RESETM | USB_CNTR_SUSPM | USB_CNTR_WKUPM;
Сб май 21, 2016 07:55:55
Очень даже можно. Только надо помнить, что там же таблица адресов.isx писал(а):Пока я не могу понять, почему нельзя просто сделать эти адреса друг за другом
Ну можно ж ее в конце памяти разместить, а буфера тогда можно с самого начала или несколько таблиц иметь и переключать их.isx писал(а):И зачем здесь вообще указывать что-то другое, если можно поставить ноль, и плясать от него?
Предствате что у Вас биты STAT_TX[1:0] устновлены в 10 (NACK). А Вам надо установить в состояние 11 (VALID) . Тогда такая конструкция EP|= STAT_TX1 | STAT_TX0 не прокатит.isx писал(а):Глядел. Пока все прозрачно вроде, но уверен,...
Дык маски ж прерываний. Но я включил только CTRM и RESETM. Мне хватило этого.isx писал(а):Что за "маски" тут настраиваются?
Прошел по USB пакет SOF. Тут же в регистре USB_ISTR устанавливается флаг SOF (он так и будет висеть пока не сбросите), но так как у меня маска SOFM не установлена, то прерывание не возникнет.Если нет, то что будет если включить прерывание, а маску нет?