Когда отправляется репорт, первым байтом идет идентификатор репорта.
Но у меня только один репорт, и вроде как в этом случае report Id не указывается в дескриптору репорта. Пробовал изменить количество отсылается байт и изменить первый байт на 0. Все так же. Анализатором не удалось глянуть, т.к. шина usb почему то хранила молчание. Короче так или иначе нужен hid клиент
Ребят, помогите прояснить один момент: 1. После успешной энумерации хост постоянно шлет PID IN в 1-ю КТ. Устройство отвечает 0xAA, 0xBB. Причем хост производит опрос с периодом меньше, чем указано в поле bInterval. Чей то? Сделал прошивку таким образом, чтобы по приему данных контроллер менял пакет на 0xCC, 0xDD. На стороне компа в программе видно, что отправка успешна и теперь по readfile должен принять новый пакет, а принимаю старый. А если прочитать два раза подряд, то второй раз получаю то что надо. такое ощущение, что некий буфер заполняется и не обнуления пока не будет команды на чтение. Почему так?
Качественное и безопасное устройство, работающее от аккумулятора, должно учитывать его физические и химические свойства, профили заряда и разряда, их изменение во времени и под влиянием различных условий, таких как температура и ток нагрузки. Мы расскажем о литий-ионных аккумуляторных батареях EVE и нескольких решениях от различных китайских компаний, рекомендуемых для разработок приложений с использованием этих АКБ. Представленные в статье китайские аналоги помогут заменить продукцию западных брендов с оптимизацией цены без потери качества.
Здравствуйте, тоже начал разбираться с USB. И возникли некоторые трудности. Как мне кажется, не могу правильно настроить нулевую контрольную точку. При возникновении прерывания USB_LP_CAN1_RX0_IRQHandler. В обработчик события SE0, заходит, где и происходит настройка конечной точки.
// СОбытие сброса 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; }
А вот в событие удачной транзакции(USB->ISTR & USB_ISTR_CTR) упорно заходить не хочет.
Логический анализатор показывает, что конечная точа не отвечает.(См. во вложениях)
Комментарий к файлу: Приходит 3 таких запроса, но конечная точка молчит. После чего происходит еще 2 события SE0, с такими же 3 попытками запроса. И в конце мне выдается, что устройство не опознано. 3_Zaprosa_Hosta.JPG [46.03 KiB]
Скачиваний: 539
Комментарий к файлу: Запрос от хоста Zapros_Hosta.JPG [49.99 KiB]
Скачиваний: 521
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Карма: 29
Рейтинг сообщений: 645
Зарегистрирован: Сб май 14, 2011 21:16:04 Сообщений: 2694 Откуда: г. Чайковский
Рейтинг сообщения:0 Медали: 1
Сколько раз у Вас происходит событие SE0 , прежде чем хост скажет что не опознал устройство? Если один раз то это от FRES. Если я еще не забыл, то хост три раза пытается достучаться до устройства.
_________________ Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Сколько раз у Вас происходит событие SE0 , прежде чем хост скажет что не опознал устройство? Если один раз то это от FRES. Если я еще не забыл, то хост три раза пытается достучаться до устройства.
3 раза SE0, затем вылетает сообщение "Неопознаное устройство"
Вложения:
Комментарий к файлу: 3 раза. Снимок.JPG [32.74 KiB]
Скачиваний: 546
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 есть? Если есть, то попробуйте в него выводить что нибудь для отладки. Если нет, то дрыгайте ногой и смотрите эту ногу на анализаторе.
Я имел ввиду не сколько раз посылает хост, а сколько раз возникает событие SE0 в МК. Можно счетчик поставить в МК для отладки.
1 раз по FRES, и 4 раза пытался достучаться хост. Всего счетчик показал цифру 5.
Добавлено after 7 minutes 53 seconds:
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 есть? Если есть, то попробуйте в него выводить что нибудь для отладки. Если нет, то дрыгайте ногой и смотрите эту ногу на анализаторе.
Попробовал Ваш код, но контрольная точка не отзывается.
Novosib_3000 а чем смотрите что на шине происходит? Анализатором? Давайте посчитаем сколько раз вообще контроллер входит в прерывание. И сколько из них по резету? И тактирование верно настроено? Могут просто-напросто не совпадать рабочие частоты.
Возможно имеет смысл поглядеть другие флаги событий. Может с сопротивлениями в линиях USB что-то не так?
Мне кажется, что с сопротивлениями, всё в порядке, т.к. сгенерированный Кубом проект работает. Да и на другой плате, тоже такой же косяк, значит ошибка в программе.
Добавлено after 29 minutes 1 second:
Radist_M писал(а):
Novosib_3000 а чем смотрите что на шине происходит? Анализатором? Давайте посчитаем сколько раз вообще контроллер входит в прерывание. И сколько из них по резету? И тактирование верно настроено? Могут просто-напросто не совпадать рабочие частоты.
Смотрю анализатором, в прерывание по резету заходит 4 раза(см. вложения)
Функция тактирования:
Код:
unsigned char HSE_72Mhz_Init(void) { int TimeOut = 10000;
Вы вроде как не обозначили контроллер, но в RM008 включение этого бита отключает деление совсем.
Странно в моем F103 это именно деление в 1,5 раза. МБ это зависит от контроллера? Если прикинуть частоту тактирования USB Novosib_3000 и если ядро заводится на 72 мГц, то 72/2/1,5=24 МГц. А надо сколько? По даташиту на мой контроллер частота тактирования USB 48МГц.
Я так понял, кварц на 8 МГц.
Код:
RCC->CFGR |= RCC_CFGR_PLLMULL9; // Умножитель на 9 RCC->CFGR |= RCC_CFGR_PPRE1_DIV2; // Предделитель на 2 RCC->CFGR |= RCC_CFGR_USBPRE; // Устанавливаем делитель на 1,5
Микроконтроллер 103, кварц на 8 Мгц, вы оказались правы, ошибка закрались в системе тактирования. Как раз именно, в предделителе USB. Нужно было сбрость бит USBPRE, а не устанавливать. Переписал функцию системы тактирования, и теперь в прерывание заходит. Буду дальше пробираться сквозь тернии. Огромное спасибо, что помогли, очень Вам за это благодарен.
// Не забываем включать блок защиты 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
Всем, привет, появилось время, и снова возвращаюсь к изучению USB. Появился маленький вопрос. После сброса.
Вначале, всё хорошо.
Хост отправляет пакет SETUP контрольной точке 0, затем отправляет запрос на получение дескриптора, затем контрольная точка отвечаем ACK, говоря тем самым, что она получила пакеты.
А вот дальше всё ломается, хост, отправляем пакет IN, за ним следует непонятный пакет(смотри во вложениях ), то ли это ответ контрольной точки 0, то ли хост шлет какие-то данные?
Дальше вроде бы всё налаживается.
Хост отправляет пакет IN, за ним идет очень длинный пакет: поля, которого у меня обозначены как Error, я так понимаю, это как раз дескриптор устройства, который, отправляет конечная точка, и после этого пакета приходит пакет квитирования ACK, это видимо хост отвечает, что принял данные.
Вопрос? Что это за непонятный пакет(смотри во вложениях), может быть это контрольная точка так отвечает, говоря хосту, что сейчас она занята и не может ответить. Или это еще что-то? Прошу помощи.
Карма: 29
Рейтинг сообщений: 645
Зарегистрирован: Сб май 14, 2011 21:16:04 Сообщений: 2694 Откуда: г. Чайковский
Рейтинг сообщения:0 Медали: 1
По внешнему виду, ИМХО, какой-то кривой пакет Когда точка занята, она отвечает NACKом.
---------- Еще хочу на счет анализатора протокола добавить. Я вчера потерял пол дня времени, пытаясь разобраться с I2C. Первая часть пакета отображалась все нормально. Вторая часть (через 100 мс) сплошные старты и стопы вместо данных. В итоге оказалось второй пакет данных был нормальным, почему то анализатор протокола только половину правильно декодировал. Справедливости ради хочу добавить, что сама диаграмма то была правильной во обоих пакетах (я потом разглядел), а у Вас какой-то узкий импульс, вроде таких не должно быть. Я не хочу сказать что у Вас анализатор врет, но оказалось полностью доверять ему особо тоже не стоит.
_________________ Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 10
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения