Например TDA7294

Форум РадиоКот • Просмотр темы - STM32 и USB (практика)
Форум РадиоКот
Здесь можно немножко помяукать :)

Текущее время: Пн июл 28, 2025 06:00:20

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 583 ]     ... , , , 7, , , ...  
Автор Сообщение
Не в сети
 Заголовок сообщения: Re: STM32 и USB (практика)
СообщениеДобавлено: Ср июн 22, 2016 11:06:11 
Встал на лапы

Зарегистрирован: Пн июн 13, 2016 10:41:52
Сообщений: 129
Рейтинг сообщения: 0
Radist_M писал(а):
Serg1987 писал(а):
Вот у меня второй Reset и перестал идти. Правил код, что то не то сделал, видно.


Вообще должен быть. Ну давайте посмотрим код, мож чего найдем.


Вот. Привожу часть. Сразу инструкция switch
Код:
 switch (p.bmRequestType)
                   {
                      case (0x80):
                            send_massive(); //отправляем дескриптор в буфер передачи
                                                        txen();  //разрешаем передачу
                      break;
                   }

Функции send_massive и txen тут:
Спойлер
Код:
//Заполняем передающий буфер
//  Table->ADR0TX=0x0020;
//   Table->COUNT0TX=0x0020;
void send_massive (void)
{
   int cl=0;
   uint16_t TBuf;
   uint8_t ost=0;
//размер 18 байт. инкремент адреса на 2,
// т.к. будем записывать за каждый шаг (их будет 9) сразу по 2 байта
//сl - локальное смещение
   for (cl=0;cl<18;cl+=2)
   {
   ost=cl*2;   
    TBuf = HIDdevice[cl]+(HIDdevice[cl+1]<<8); //записываем 2 байта
    *(__IO uint16_t*)(0x40006040+ost) = TBuf;
   }
 
}


Спойлер
Код:
//Разрешить передачу
void txen (void)
{
   Table->COUNT0TX=0x0012;
    USB->EP0R = USB_EP0R_EP_TYPE_0|USB_EP0R_STAT_TX_0;
   while ((USB->EP0R & USB_EP0R_CTR_TX)==0){}
}


Не понимаю, почему не приходит второй RESET? :dont_know: В регистре EP0 после отправки дескриптора выставляется следующее (всё верно вроде). Есть флаг успешной отправки. TX автоматически перевелся в NAK. Скрин во вложении


Вложения:
ep0.png [14.41 KiB]
Скачиваний: 523
Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32 и USB (практика)
СообщениеДобавлено: Ср июн 22, 2016 11:47:40 
Встал на лапы

Зарегистрирован: Пн июн 13, 2016 10:41:52
Сообщений: 129
Рейтинг сообщения: 0
Уря. Получилось. ) Второй Reset и SET_ADRESS приходят. Как на последний реагировать то? :dont_know:


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32 и USB (практика)
СообщениеДобавлено: Ср июн 22, 2016 12:23:40 
Поставщик валерьянки для Кота
Аватар пользователя

Карма: 11
Рейтинг сообщений: 26
Зарегистрирован: Вс июн 26, 2011 20:03:21
Сообщений: 2316
Рейтинг сообщения: 0
А что было не так?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32 и USB (практика)
СообщениеДобавлено: Ср июн 22, 2016 13:19:14 
Встал на лапы

Зарегистрирован: Пн июн 13, 2016 10:41:52
Сообщений: 129
Рейтинг сообщения: 0
isx писал(а):
А что было не так?

Там в инициализации адреса передающего буфера была ошибка. Итого дескриптор записывался не туда куда нужно. Поэтому хост резет и не давал. :solder:


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32 и USB (практика)
СообщениеДобавлено: Ср июн 22, 2016 16:20:31 
Собутыльник Кота
Аватар пользователя

Карма: 29
Рейтинг сообщений: 651
Зарегистрирован: Сб май 14, 2011 21:16:04
Сообщений: 2708
Откуда: г. Чайковский
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
Serg1987 писал(а):
Ну тогда может вы объясните... В Кейле всё прекрасно.
Не знаю. Но сначала я подумал что это какой то нюанс периферии и отладки. Так что я буфер USB просто копировал в другую область памяти. Работайте в той среде, которая Вам больше нравится.
Serg1987 писал(а):
Поэтому хост резет и не давал.
Честно сказать странно, резет все равно должен быть если хосту что-то там не понравилось.
Serg1987 писал(а):
SET_ADRESS приходят. Как на последний реагировать то?
Да уже писали об этом и в этом топике и в другом, ссылка которого где-то тут тоже есть.

_________________
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32 и USB (практика)
СообщениеДобавлено: Ср июн 22, 2016 17:58:34 
Встал на лапы

Зарегистрирован: Пн июн 13, 2016 10:41:52
Сообщений: 129
Рейтинг сообщения: 0
Писать то писали. Я знаю, что в ответ на SET_ADDRESS нужно отправить ZLP. Ну отправляю, а в ответ тишина.
USB_EP0R выставляется в 0x0000ea60 . И больше ни слуху ни духу.
Код:
          case (0x0005):  //установка адреса

                                              Table->COUNT0TX=0x00;
                                                    USB->EP0R = USB_EP0R_EP_TYPE_0|USB_EP0R_STAT_TX_0; //разрешаем передачу
                                               while ((USB->EP0R & USB_EP0R_CTR_TX)==0){}                 //ждем подтверждения
                                               USB->EP0R = USB_EP0R_EP_TYPE_0|USB_EP0R_STAT_RX_0;//разрешаем прием
                                          USB->DADDR = 0x80 +p.wValue;                              //по адресу

                 break;

:dont_know:


Вернуться наверх
 
Распродажа паяльного оборудования ATTEN!
Паяльные станции, паяльники и аксессуары по самой выгодной цене.

По промокоду radiokot скидка 10%
Не в сети
 Заголовок сообщения: Re: STM32 и USB (практика)
СообщениеДобавлено: Ср июн 22, 2016 18:12:57 
Собутыльник Кота
Аватар пользователя

Карма: 29
Рейтинг сообщений: 651
Зарегистрирован: Сб май 14, 2011 21:16:04
Сообщений: 2708
Откуда: г. Чайковский
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
Может имеет смысл поменять местами эти строки :dont_know: ?
Код:
USB->EP0R = USB_EP0R_EP_TYPE_0|USB_EP0R_STAT_RX_0;//разрешаем прием
USB->DADDR = 0x80 +p.wValue;


Флаги нигде случайно не сбрасываете после выхода из "case 0005"?

Зависать в
Код:
while ((USB->EP0R & USB_EP0R_CTR_TX)==0){}
мне кажется не очень хорошим решением.

_________________
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.


Последний раз редактировалось Z_h_e Ср июн 22, 2016 18:15:08, всего редактировалось 1 раз.

Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32 и USB (практика)
СообщениеДобавлено: Ср июн 22, 2016 18:14:30 
Открыл глаза
Аватар пользователя

Зарегистрирован: Пн июн 14, 2010 17:09:55
Сообщений: 45
Откуда: Москва
Рейтинг сообщения: 0
Как известно транзакция по USB состоит из трех или двух частей (Setup stage-Data stage (опционально)-Status stage). Удалось выяснить что у меня на запрос дескриптора конфигурации МК не отвечает вообще - ни NAK ни ACK (отсутствует Status stage). Похоже что у меня STAT_RX - DISABLED. Или нет? От чего еще мк может молчать на запросы? Ведь запрос дескриптора девайса по новому адресу обрабатывается.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32 и USB (практика)
СообщениеДобавлено: Ср июн 22, 2016 18:31:24 
Собутыльник Кота
Аватар пользователя

Карма: 29
Рейтинг сообщений: 651
Зарегистрирован: Сб май 14, 2011 21:16:04
Сообщений: 2708
Откуда: г. Чайковский
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
Да хрен его знает. Если хост дескриптор схавал, он перед тем как сделать новый запрос отправит ZLP, я так понимаю это означает что хост не только принял дескриптор телом, но и душой. Я ж выкладывал в ехселе все то, что хост отправлял МК на стадии выяснения что к нему подключено, поглядите, там сплошные ZLP от хоста. Вы как то на них реагируете?

_________________
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32 и USB (практика)
СообщениеДобавлено: Ср июн 22, 2016 19:07:52 
Собутыльник Кота
Аватар пользователя

Карма: 29
Рейтинг сообщений: 651
Зарегистрирован: Сб май 14, 2011 21:16:04
Сообщений: 2708
Откуда: г. Чайковский
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
Serg1987, точно ж, Вы сбрасываете флаги такой записью:
Код:
USB->EP0R = USB_EP0R_EP_TYPE_0|USB_EP0R_STAT_RX_0;
Где-то может и зря.

_________________
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32 и USB (практика)
СообщениеДобавлено: Пт июн 24, 2016 15:18:18 
Встал на лапы

Зарегистрирован: Пн июн 13, 2016 10:41:52
Сообщений: 129
Рейтинг сообщения: 0
Ну что? Получилось у кого чего? А меня, скажем, небольшая смена профиля. Потребовалось сейчас разбираться с STM32F429ZIT. А там всё по другому, регистры другие, всё не так. :dont_know: И ещё.. OTG USB. :(


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32 и USB (практика)
СообщениеДобавлено: Пт июн 24, 2016 20:15:26 
Поставщик валерьянки для Кота
Аватар пользователя

Карма: 11
Рейтинг сообщений: 26
Зарегистрирован: Вс июн 26, 2011 20:03:21
Сообщений: 2316
Рейтинг сообщения: 0
Ниче у меня вообще не получается :))) . Пока грешу на корявую сборку stm32F3xx.h в Keil5 (тот, что с дефайнами). Пробую bit banding - вроде малость разобрался.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32 и USB (практика)
СообщениеДобавлено: Сб июн 25, 2016 06:10:57 
Собутыльник Кота
Аватар пользователя

Карма: 29
Рейтинг сообщений: 651
Зарегистрирован: Сб май 14, 2011 21:16:04
Сообщений: 2708
Откуда: г. Чайковский
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
Спойлер
Код:
typedef enum  {Disabled=0,Stall=1,NAK=2,Valid=3} Status;
typedef enum  {RX=bit15,TX=bit7} FlagType;


Код:
//----------
//Функция  сброса флага (флаги) регистра конечной точки
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. А остальные два состояния вручную взводить вообще не понадобилось, потому и делать не стал.

_________________
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32 и USB (практика)
СообщениеДобавлено: Пн июн 27, 2016 08:13:07 
Открыл глаза
Аватар пользователя

Зарегистрирован: Пн июн 14, 2010 17:09:55
Сообщений: 45
Откуда: Москва
Рейтинг сообщения: 0
Немного продвинулся вперед. Проблема была в том, что я забыл про ZLP от хоста и не обрабатывал это событие корректно. На анализаторе это было почему то не очевидно. МК вместо NAK не отвечал вовсе. Ладно, проехали. Теперь надо раздобыть всю цепочку дескрипторов. Не хочется бездумно копипастить из чужих проектов. Может где есть это дело разжеванное до мелочей?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32 и USB (практика)
СообщениеДобавлено: Пн июн 27, 2016 08:57:21 
Собутыльник Кота
Аватар пользователя

Карма: 29
Рейтинг сообщений: 651
Зарегистрирован: Сб май 14, 2011 21:16:04
Сообщений: 2708
Откуда: г. Чайковский
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
У Агурова вроде как расписано, не очень хорошо, но есть.
Вот с этого сайта я что-то нужное подчерпул, не помню что, но помню с чем-то разобрался именно там.

Чикунов в журнале СОВРЕМЕННАЯ ЭЛЕКТРОНИКА постился, там что-то подчерпнул.

А так, похоже Вам сюда http://www.usb.org/home, но там копец как много и все по буржуйски.


Что за анализатор у Вас?

_________________
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32 и USB (практика)
СообщениеДобавлено: Пн июн 27, 2016 12:45:47 
Открыл глаза
Аватар пользователя

Зарегистрирован: Пн июн 14, 2010 17:09:55
Сообщений: 45
Откуда: Москва
Рейтинг сообщения: 0
Китайский клон Saleae logic


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32 и USB (практика)
СообщениеДобавлено: Пн июн 27, 2016 13:02:16 
Собутыльник Кота
Аватар пользователя

Карма: 29
Рейтинг сообщений: 651
Зарегистрирован: Сб май 14, 2011 21:16:04
Сообщений: 2708
Откуда: г. Чайковский
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
Аааа, это логический анализатор. Я подумал что у Вас специальный для USB. Ну и как Ваш анализатор, хорошая вещица?

Вы получается ручками вычленяете USB пакеты по анализатору?

_________________
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32 и USB (практика)
СообщениеДобавлено: Пн июн 27, 2016 13:37:41 
Открыл глаза
Аватар пользователя

Зарегистрирован: Пн июн 14, 2010 17:09:55
Сообщений: 45
Откуда: Москва
Рейтинг сообщения: 0
ручками не приходится - пользуюсь оригинальной утилитой от Saleae. Она сама определяет протокол и подписывает где и что. Есть поиск - можно найти необходимый запрос. На рисунке указана та самая неочевидность о чем я говорил.
Точно Чекунова надо глянуть, где то были у меня в pdf


Вложения:
USB.png [43.68 KiB]
Скачиваний: 513
Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32 и USB (практика)
СообщениеДобавлено: Вс июл 17, 2016 20:56:32 
Поставщик валерьянки для Кота
Аватар пользователя

Карма: 11
Рейтинг сообщений: 26
Зарегистрирован: Вс июн 26, 2011 20:03:21
Сообщений: 2316
Рейтинг сообщения: 0
Появилось время - вернулся к проекту. Рассмотрел 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-ом не получается установить эти ср**ные регисторы в нужное состояние :kill:


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32 и USB (практика)
СообщениеДобавлено: Пн июл 18, 2016 06:17:48 
Собутыльник Кота
Аватар пользователя

Карма: 29
Рейтинг сообщений: 651
Зарегистрирован: Сб май 14, 2011 21:16:04
Сообщений: 2708
Откуда: г. Чайковский
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
Попробовал. Действительно. Попробовал вот еще что. Если писать в чистый регистр, то все работает, если писать в регистр с установленными битами тогл, то все они сбрасываются. Делаю вывод, Bit Banding это аппаратный |= и по факту нет доступа к конкретному биту.

Функция, что я выложил устанавливающая эти биты, Вас не устроила?

_________________
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 583 ]     ... , , , 7, , , ...  

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y