Golikov 0 28 августа, 2015 Опубликовано 28 августа, 2015 · Жалоба Там данные из USB не по ДМА заполняются? Вы где то в структуре настройки этот буфер передаете, а дальше ДМА на него настраивается и поехали, не? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ilkz 0 28 августа, 2015 Опубликовано 28 августа, 2015 (изменено) · Жалоба Думаю, это единственное логичное объяснение. Но мне не удалось найти где делается эта привязка. Но очень хочется разобраться. Выкладываю проект, посмотрите по возможности незамыленным взглядом (сабж сидит в usbd_hid_core.c). __1.rar UPD: И еще, почему-то после первого приема данных буфер - пустой (это видно по мемори дампу). Начиная со второго приема - он заполняется валидными данными. Он был не готов принимать после инициализации. Проблема решилась добавлением DCD_EP_PrepareRx(pdev, HID_OUT_EP, rxbuf, MAX_DATA_LENGTH); в USBD_HID_Init() в место после открытия ендпоинтов. UPD2: Возможно, становится понятно поведение с "магическим" запонением приемного буфера. Насколько реален такой сценарий: 1. Объявлена переменная-буфер buf. 2. Т.к., во время инициализации не делается DCD_EP_PrepareRx(..., buf, ...), то буфер не трогается и он по дефолту равен нулю. 3. Возникает событие приема: буфер равен нулю (т.к. его никто не трогал). 4. Что-то делается в обработчике. 5. Последняя строчка - это как раз DCD_EP_PrepareRx(..., buf, ...), т.е. тут уже нормально передается ссылка на этот несчастный буфер. 6. Ну и на последующих приемах он уже получается прилинкован к приемнику, который заполняет его валидными данными. Я прав или не? Изменено 28 августа, 2015 пользователем ilkz Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться