Чт сен 29, 2016 16:05:12
Когда отправляется репорт, первым байтом идет идентификатор репорта.Radist_M писал(а):Причем прога говорит ,что длина репорта 13 байт, а Report count 12 байт.
Чт сен 29, 2016 17:19:54
Z_h_e писал(а):Когда отправляется репорт, первым байтом идет идентификатор репорта.
Пн окт 17, 2016 18:02:28
Пт окт 28, 2016 21:29:40
Вс мар 12, 2017 14:13:21
#define EP_RX_NAK 0x2000 /* NAKed */
#define EP_RX_VALID 0x3000 /* Valid */
#define EP_CONTROL 0x0200 /* CONTROL EndPoint */
// СОбытие сброса
if (USB->ISTR & USB_ISTR_RESET)
{
// Здесь необходимо настроить контрольгую точку, которая всегда равна 0
// Сбрасываем флаги прерываний
USB->ISTR = 0;
// Разрешаем генерировать прерывание по событию удачной передачи и по SE0
USB->CNTR |= USB_CNTR_CTRM | USB_CNTR_RESETM;
// таблица начинается с 0x0000 USB (или 0x40006000 Flash)
USB->BTABLE = 0x0000;
// Настраиваем конечную точку
*(__IO uint32_t*)(0x40006000) = (uint16_t) 0x40; // начальный адрес USB_ADDR0_TX (такой адрес позволяет в дальнейшем добавить все 8 возможных контрольных точек, каждая имеет размер 1 байт)
*(__IO uint32_t*)(0x40006004) = (uint16_t) 0x00; // размер исходящих данных - 32 байта USB_COUNT0TX
*(__IO uint32_t*)(0x40006008) = (uint16_t) 0x100; // начальный адрес USB_ADDR0_RX
*(__IO uint32_t*)(0x4000600C) = (uint16_t) 0x8400; // 32 байта входящих данных USB_ USB_COUNT0RX_BL_SIZE
USB->EP0R = EP_CONTROL | // Тип - control
EP_RX_VALID; // Включена на прием
USB->DADDR |= USB_DADDR_EF; // Включаем функцию USB
// Сбрасываем флаг прерывания
USB->ISTR &= ~USB_ISTR_RESET;
}
void USB_Init(void)
{
NVIC_DisableIRQ(USB_LP_CAN1_RX0_IRQn);
RCC->APB1RSTR |= RCC_APB1RSTR_USBRST;
RCC->APB2ENR |= (RCC_APB2ENR_AFIOEN | RCC_APB2ENR_IOPAEN);
RCC->APB1ENR |= (RCC_APB1ENR_USBEN);
RCC->APB1RSTR &= ~RCC_APB1RSTR_USBRST;
/* Turn on analog part */
USB->CNTR &= ~USB_CNTR_PDWN;
for (k = 0; k < 240; k++) {} /* Wait at least 1us */
/* Release reset */
USB->CNTR &= ~USB_CNTR_FRES;
USB->ISTR = ~(USB_ISTR_PMAOVR |USB_ISTR_ERR | USB_ISTR_WKUP | USB_ISTR_SUSP | USB_ISTR_RESET);
USB->CNTR |= (USB_CNTR_CTRM |
/*USB_CNTR_PMAOVRM |*/
/*USB_CNTR_ERRM | */
/*USB_CNTR_WKUPM| */
/*USB_CNTR_SUSPM | */
USB_CNTR_RESETM);
USB->CNTR |= USB_CNTR_RESETM;
NVIC_EnableIRQ(USB_LP_CAN1_RX0_IRQn); // Разрешаем прерывания в NVIC
//NVIC_EnableIRQ(USBWakeUp_IRQn); // Разрешаем прерывание USBWakeUp
NVIC_SetPriority(USB_LP_CAN1_RX0_IRQn, 1); // Устанавливаем приоритет
}
Вс мар 12, 2017 14:41:20
Вс мар 12, 2017 21:13:17
Z_h_e писал(а):Сколько раз у Вас происходит событие SE0 , прежде чем хост скажет что не опознал устройство? Если один раз то это от FRES. Если я еще не забыл, то хост три раза пытается достучаться до устройства.
Вс мар 12, 2017 22:24:27
Пн мар 13, 2017 12:58:21
USB->ISTR = 0; //clear reset.
//if reset event is occur EP registers a reset and we need to config it's
USB->EP0R = USB_EP0R_EP_TYPE_0|USB_EP0R_STAT_RX|USB_EP0R_STAT_TX_1;//EP address 0, type - control, EP enable (stat_rx - valid), STAT_TX -NAK
USB->EP1R = USB_EP1R_STAT_RX|USB_EP1R_STAT_TX_1|USB_EP1R_EP_TYPE|0x01;//stat_tx-NAK, stat_rx-Valid interrupt ep, 0x01-address
USB->DADDR = USB_DADDR_EF;//EF enable receive address
if (((USB->EP0R)&USB_EP0R_CTR_TX)!=0){
...
}
Пн мар 13, 2017 17:38:33
Z_h_e писал(а):Я имел ввиду не сколько раз посылает хост, а сколько раз возникает событие SE0 в МК. Можно счетчик поставить в МК для отладки.
Radist_M писал(а):Novosib_3000, у меня вроде такая же инициализация при сбросе.
- Код:
USB->ISTR = 0; //clear reset.
//if reset event is occur EP registers a reset and we need to config it's
USB->EP0R = USB_EP0R_EP_TYPE_0|USB_EP0R_STAT_RX|USB_EP0R_STAT_TX_1;//EP address 0, type - control, EP enable (stat_rx - valid), STAT_TX -NAK
USB->EP1R = USB_EP1R_STAT_RX|USB_EP1R_STAT_TX_1|USB_EP1R_EP_TYPE|0x01;//stat_tx-NAK, stat_rx-Valid interrupt ep, 0x01-address
USB->DADDR = USB_DADDR_EF;//EF enable receive address
Но вот событие удачной транзакции у меня проверяется вот так:
- Код:
if (((USB->EP0R)&USB_EP0R_CTR_TX)!=0){
...
}
У Вас вроде тоже правильно написано. А UART есть? Если есть, то попробуйте в него выводить что нибудь для отладки. Если нет, то дрыгайте ногой и смотрите эту ногу на анализаторе.
Пн мар 13, 2017 19:29:31
Пн мар 13, 2017 19:30:10
Пн мар 13, 2017 21:59:15
Z_h_e писал(а):Возможно имеет смысл поглядеть другие флаги событий. Может с сопротивлениями в линиях USB что-то не так?
Radist_M писал(а):Novosib_3000 а чем смотрите что на шине происходит? Анализатором? Давайте посчитаем сколько раз вообще контроллер входит в прерывание. И сколько из них по резету?
И тактирование верно настроено? Могут просто-напросто не совпадать рабочие частоты.
unsigned char HSE_72Mhz_Init(void)
{
int TimeOut = 10000;
// Запускаем внешний тактовый генератор
RCC->CR |= RCC_CR_HSEON; // Включаем HSE OSC
while(((RCC->CR & RCC_CR_HSERDY) == 0) && (TimeOut > 0)) // Ожидаем готовности HSE
{
TimeOut--;
}
if(TimeOut == 0) return 1; // HSE не запустился
// Не забываем включать блок защиты CSS
// Включаем блок CSS, тем самым активируем защиту от сбоя
RCC->CR |= RCC_CR_CSSON; // Устанавливаем бит CSSON
// Так же не забываем включать предвыборку Flash
FLASH->ACR |= FLASH_ACR_PRFTBE; // Включаем буфер
FLASH->ACR &= ~(FLASH_ACR_LATENCY); // Предочистка регистра
FLASH->ACR |= FLASH_ACR_LATENCY_2; // Пропускать 2 такта
// Не используем делитель для HSE
RCC->CFGR &= (RCC_CFGR_PLLXTPRE_HSE_Div2); // Сбрасываем бит PLLXTPRE
// Источником тактового сигнала для PLL выбираем HSE
RCC->CFGR |= RCC_CFGR_PLLSRC; // Включаем бит PLLSRC
// Настройка делителей производится при выключенном PLL
// Настраиваем PLL
RCC->CR &= ~(RCC_CR_PLLON); // Выключаем PLL
RCC->CFGR &= ~(RCC_CFGR_PLLMULL); // Предочистка разрядов
RCC->CFGR |= RCC_CFGR_PLLMULL9; // Умножитель на 9
RCC->CR |= RCC_CR_PLLON; // Включить генератор
while(((RCC->CR) & RCC_CR_PLLRDY) == 0){} // Ожидаем готовности PLL
// Выбираем PLL, как источник тактового сигнала
RCC->CFGR &= ~(RCC_CFGR_SW); // Предочистка битов
RCC->CFGR |= RCC_CFGR_SW_PLL; // Выбираем PLL, как источник тактовой частоты
while((RCC->CFGR&RCC_CFGR_SWS)!=0x08){} //Ожидаем готовности
// Устанавливаем предделитель на шине APB1
RCC->CFGR &= ~(RCC_CFGR_PPRE1); // Отчишаем биты
RCC->CFGR |= RCC_CFGR_PPRE1_DIV2; // Предделитель на 2
// Устанавливаем предделитель для ADC
RCC->CFGR &= ~(RCC_CFGR_ADCPRE); // Отчищаем биты
RCC->CFGR |= RCC_CFGR_ADCPRE_DIV6; // Устанавливаем предделитель на 6
return 0; // Всё ок, работаем от HSE
}
void USB_Clock(void)
{
// Устанавливаем делитель для USB
RCC->CFGR &= ~(RCC_CFGR_USBPRE); // Предочистка регистра
RCC->CFGR |= RCC_CFGR_USBPRE; // Устанавливаем делитель на 1,5
RCC->APB2ENR |= (RCC_APB2ENR_IOPAEN | RCC_APB2ENR_AFIOEN);
// Подаем тактирование на модуль USB
RCC->APB1ENR |= RCC_APB1ENR_USBEN; // Устанавливаем бит USBEN
EXTI->RTSR |= EXTI_RTSR_TR18; // внешнее прерывание №18 (USBWakeUp) по возрастающему фронту
EXTI->EMR |= EXTI_EMR_MR18; // Включаем событие прерывания USBWakeUp
}
Вт мар 14, 2017 07:58:41
Вы вроде как не обозначили контроллер, но в RM008 включение этого бита отключает деление совсем.Novosib_3000 писал(а):RCC->CFGR |= RCC_CFGR_USBPRE; // Устанавливаем делитель на 1,5
Вт мар 14, 2017 09:08:48
Z_h_e писал(а): Вы вроде как не обозначили контроллер, но в RM008 включение этого бита отключает деление совсем.
RCC->CFGR |= RCC_CFGR_PLLMULL9; // Умножитель на 9
RCC->CFGR |= RCC_CFGR_PPRE1_DIV2; // Предделитель на 2
RCC->CFGR |= RCC_CFGR_USBPRE; // Устанавливаем делитель на 1,5
Вт мар 14, 2017 19:42:32
Вт мар 14, 2017 21:08:44
int TimeOut = 10000;
// Запускаем внешний тактовый генератор
RCC->CR |= RCC_CR_HSEON; // Включаем HSE OSC
while(((RCC->CR & RCC_CR_HSERDY) == 0) && (TimeOut > 0)) // Ожидаем готовности HSE
{
TimeOut--;
}
if(TimeOut == 0) return 1; // HSE не запустился
// Не забываем включать блок защиты CSS
// Включаем блок CSS, тем самым активируем защиту от сбоя
RCC->CR |= RCC_CR_CSSON; // Устанавливаем бит CSSON
// Так же не забываем включать предвыборку Flash, т.к. Flash
// не может работать на большой скорости. В reference manual написано, что
// буфер предвыборки Flash необходимо включать, когда системная частота меньше,
// чем 24 МГц и не используется ни один делитель.
FLASH->ACR |= FLASH_ACR_PRFTBE; // Включаем буфер
FLASH->ACR &= ~(FLASH_ACR_LATENCY); // Предочистка регистра
FLASH->ACR |= FLASH_ACR_LATENCY_2; // Пропускать 2 такта
// Не использовать делитель для HSE
RCC->CFGR &= ~RCC_CFGR_PLLXTPRE; // Сбрасываем бит PLLXTPRE
// Источником тактового сигнала для PLL выбираем HSE
RCC->CFGR |= RCC_CFGR_PLLSRC; // Включаем бит PLLSRC
// Настройка делителей производится при выключенном PLL
// Настраиваем PLL
RCC->CR &= ~(RCC_CR_PLLON); // Выключаем PLL
RCC->CFGR &= ~(RCC_CFGR_PLLMULL); // Предочистка разрядов
RCC->CFGR |= RCC_CFGR_PLLMULL9; // Умножитель на 9
RCC->CR |= RCC_CR_PLLON; // Включить генератор
while(((RCC->CR) & RCC_CR_PLLRDY) == 0){} // Ожидаем готовности PLL
// Выбираем PLL, как источник тактового сигнала
RCC->CFGR &= ~(RCC_CFGR_SW); // Предочистка битов
RCC->CFGR |= RCC_CFGR_SW_PLL; // Выбираем PLL, как источник тактовой частоты
while((RCC->CFGR&RCC_CFGR_SWS)!= RCC_CFGR_SWS_PLL){} //Ожидаем готовности
// Устанавливаем предделитель на шине APB1
RCC->CFGR &= ~(RCC_CFGR_PPRE1); // Отчишаем биты
RCC->CFGR |= RCC_CFGR_PPRE1_DIV2; // Предделитель на 2
// Устанавливаем предделитель для ADC
RCC->CFGR &= ~(RCC_CFGR_ADCPRE); // Отчищаем биты
RCC->CFGR |= RCC_CFGR_ADCPRE_DIV6; // Устанавливаем предделитель на 6
// Устанавливаем делитель для USB
RCC->CFGR &= ~(RCC_CFGR_USBPRE); // Устанавливаем делитель на 1,5
return 0;
Сб апр 15, 2017 17:23:29
Сб апр 15, 2017 18:07:37