Не понимаю, почему не приходит второй RESET? В регистре EP0 после отправки дескриптора выставляется следующее (всё верно вроде). Есть флаг успешной отправки. TX автоматически перевелся в NAK. Скрин во вложении
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. Или нет? От чего еще мк может молчать на запросы? Ведь запрос дескриптора девайса по новому адресу обрабатывается.
Да хрен его знает. Если хост дескриптор схавал, он перед тем как сделать новый запрос отправит ZLP, я так понимаю это означает что хост не только принял дескриптор телом, но и душой. Я ж выкладывал в ехселе все то, что хост отправлял МК на стадии выяснения что к нему подключено, поглядите, там сплошные ZLP от хоста. Вы как то на них реагируете?
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Ну что? Получилось у кого чего? А меня, скажем, небольшая смена профиля. Потребовалось сейчас разбираться с STM32F429ZIT. А там всё по другому, регистры другие, всё не так. И ещё.. OTG USB.
Ниче у меня вообще не получается . Пока грешу на корявую сборку stm32F3xx.h в Keil5 (тот, что с дефайнами). Пробую bit banding - вроде малость разобрался.
//------------------------------------------------------------------------------------------------
//Функция сброса флага (флаги) регистра конечной точки
void Clear_Flag_EPR(uint8_t NumReg,FlagType f){ //номер регистра EPnR, флаги CTR_RX CTR_TX
uint32_t buff;
buff=((uint32_t*)0x40005C00)[NumReg]; //0x40005C00 базовый адрес регистров юсб
buff&=~f; //погасим нужные флаги
buff&=0x8F8f;// но сбросим тоогл биты
((uint32_t*)0x40005C00)[NumReg]=buff;
}
//--------------------------------
//Функция установки состояния точки. Пока из состояния NACK
void Set_Status_EPR (uint8_t NumReg,Status S, FlagType f){ //номер регистра EPnR, S - Disabled,Stall,NAK,Valid, f - TX отправить RX прием
uint32_t buff;
buff=((uint32_t*)0x40005C00)[NumReg]; //0x40005C00 базовый адрес регистров юсб
switch (S) {
case Valid:{
if (f&TX){buff^=0x0030;buff&=0x8FBF;}
if (f&RX){buff^=0x3000;buff&=0xBF8F;}
break;}
case Stall:{
if (f&TX){buff^=0x0010;buff&=0x8FBF;}
if (f&RX){buff^=0x1000;buff&=0xBF8F;}
break;}
default: break;
}
((uint32_t*)0x40005C00)[NumReg]=buff;
}
По поводу функции Set_Status_EPR. На стадии, когда я только изучал периферию USB, думал придется регистры EPnR самому взводить в одно из 4 состояний. Поэтому хотел сделать функцию, чтобы устанавливала любое состояние из любого. И кажется в состояние Valid так и будет работать. Когда добавлял состояние Stall, понял что надо взводить из состояния Nack и другого мне не надо. Т.е. в состояние Stall функция взведет регистр только из NAck. А остальные два состояния вручную взводить вообще не понадобилось, потому и делать не стал.
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Немного продвинулся вперед. Проблема была в том, что я забыл про ZLP от хоста и не обрабатывал это событие корректно. На анализаторе это было почему то не очевидно. МК вместо NAK не отвечал вовсе. Ладно, проехали. Теперь надо раздобыть всю цепочку дескрипторов. Не хочется бездумно копипастить из чужих проектов. Может где есть это дело разжеванное до мелочей?
У Агурова вроде как расписано, не очень хорошо, но есть.
Вот с этого сайта я что-то нужное подчерпул, не помню что, но помню с чем-то разобрался именно там.
Чикунов в журнале СОВРЕМЕННАЯ ЭЛЕКТРОНИКА постился, там что-то подчерпнул.
ручками не приходится - пользуюсь оригинальной утилитой от 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-ом не получается установить эти ср**ные регисторы в нужное состояние
Попробовал. Действительно. Попробовал вот еще что. Если писать в чистый регистр, то все работает, если писать в регистр с установленными битами тогл, то все они сбрасываются. Делаю вывод, Bit Banding это аппаратный |= и по факту нет доступа к конкретному биту.
Функция, что я выложил устанавливающая эти биты, Вас не устроила?
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.