Не понимаю, почему не приходит второй RESET? В регистре EP0 после отправки дескриптора выставляется следующее (всё верно вроде). Есть флаг успешной отправки. TX автоматически перевелся в NAK. Скрин во вложении
Карма: 29
Рейтинг сообщений: 651
Зарегистрирован: Сб май 14, 2011 21:16:04 Сообщений: 2708 Откуда: г. Чайковский
Рейтинг сообщения:0 Медали: 1
Serg1987 писал(а):
Ну тогда может вы объясните... В Кейле всё прекрасно.
Не знаю. Но сначала я подумал что это какой то нюанс периферии и отладки. Так что я буфер USB просто копировал в другую область памяти. Работайте в той среде, которая Вам больше нравится.
Serg1987 писал(а):
Поэтому хост резет и не давал.
Честно сказать странно, резет все равно должен быть если хосту что-то там не понравилось.
Serg1987 писал(а):
SET_ADRESS приходят. Как на последний реагировать то?
Да уже писали об этом и в этом топике и в другом, ссылка которого где-то тут тоже есть.
_________________ Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Писать то писали. Я знаю, что в ответ на SET_ADDRESS нужно отправить ZLP. Ну отправляю, а в ответ тишина. USB_EP0R выставляется в 0x0000ea60 . И больше ни слуху ни духу.
Как известно транзакция по USB состоит из трех или двух частей (Setup stage-Data stage (опционально)-Status stage). Удалось выяснить что у меня на запрос дескриптора конфигурации МК не отвечает вообще - ни NAK ни ACK (отсутствует Status stage). Похоже что у меня STAT_RX - DISABLED. Или нет? От чего еще мк может молчать на запросы? Ведь запрос дескриптора девайса по новому адресу обрабатывается.
Карма: 29
Рейтинг сообщений: 651
Зарегистрирован: Сб май 14, 2011 21:16:04 Сообщений: 2708 Откуда: г. Чайковский
Рейтинг сообщения:0 Медали: 1
Да хрен его знает. Если хост дескриптор схавал, он перед тем как сделать новый запрос отправит ZLP, я так понимаю это означает что хост не только принял дескриптор телом, но и душой. Я ж выкладывал в ехселе все то, что хост отправлял МК на стадии выяснения что к нему подключено, поглядите, там сплошные ZLP от хоста. Вы как то на них реагируете?
_________________ Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Ну что? Получилось у кого чего? А меня, скажем, небольшая смена профиля. Потребовалось сейчас разбираться с STM32F429ZIT. А там всё по другому, регистры другие, всё не так. И ещё.. OTG USB.
Ниче у меня вообще не получается . Пока грешу на корявую сборку stm32F3xx.h в Keil5 (тот, что с дефайнами). Пробую bit banding - вроде малость разобрался.
По поводу функции Set_Status_EPR. На стадии, когда я только изучал периферию USB, думал придется регистры EPnR самому взводить в одно из 4 состояний. Поэтому хотел сделать функцию, чтобы устанавливала любое состояние из любого. И кажется в состояние Valid так и будет работать. Когда добавлял состояние Stall, понял что надо взводить из состояния Nack и другого мне не надо. Т.е. в состояние Stall функция взведет регистр только из NAck. А остальные два состояния вручную взводить вообще не понадобилось, потому и делать не стал.
_________________ Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Немного продвинулся вперед. Проблема была в том, что я забыл про ZLP от хоста и не обрабатывал это событие корректно. На анализаторе это было почему то не очевидно. МК вместо NAK не отвечал вовсе. Ладно, проехали. Теперь надо раздобыть всю цепочку дескрипторов. Не хочется бездумно копипастить из чужих проектов. Может где есть это дело разжеванное до мелочей?
Карма: 29
Рейтинг сообщений: 651
Зарегистрирован: Сб май 14, 2011 21:16:04 Сообщений: 2708 Откуда: г. Чайковский
Рейтинг сообщения:0 Медали: 1
У Агурова вроде как расписано, не очень хорошо, но есть. Вот с этого сайта я что-то нужное подчерпул, не помню что, но помню с чем-то разобрался именно там.
Чикунов в журнале СОВРЕМЕННАЯ ЭЛЕКТРОНИКА постился, там что-то подчерпнул.
ручками не приходится - пользуюсь оригинальной утилитой от Saleae. Она сама определяет протокол и подписывает где и что. Есть поиск - можно найти необходимый запрос. На рисунке указана та самая неочевидность о чем я говорил. Точно Чекунова надо глянуть, где то были у меня в pdf
Появилось время - вернулся к проекту. Рассмотрел Bit Banding - вроде все понятно. Стал использовать для настройки регистров USB, но появилась непонятная ситуация. Вот пример кода:
Код:
test5 = USB->EP0R; *(__IO uint32_t*)(0x420B8030) = 1; // set bit 0 регистра STAT_RX test2 = USB->EP0R; break;
Поставил точку останова на брейк. Значение test5 = 0x00002200 (STAT_RX = 10), test2 = 0x00001200 (STAT_RX = 01). Получилось, что я устанавливал с состояния NAK в VALID, но почему-то первый бит регистра сбросился и я оказался в STALL. Даже с Bit Banding-ом не получается установить эти ср**ные регисторы в нужное состояние
Карма: 29
Рейтинг сообщений: 651
Зарегистрирован: Сб май 14, 2011 21:16:04 Сообщений: 2708 Откуда: г. Чайковский
Рейтинг сообщения:0 Медали: 1
Попробовал. Действительно. Попробовал вот еще что. Если писать в чистый регистр, то все работает, если писать в регистр с установленными битами тогл, то все они сбрасываются. Делаю вывод, Bit Banding это аппаратный |= и по факту нет доступа к конкретному биту.
Функция, что я выложил устанавливающая эти биты, Вас не устроила?
_________________ Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения