реклама на сайте
подробности

 
 
10 страниц V  < 1 2 3 4 5 > »   
Reply to this topicStart new topic
> STM32 USB FS OTG
Immortal_Buka
сообщение Sep 22 2015, 12:52
Сообщение #31


Участник
*

Группа: Участник
Сообщений: 18
Регистрация: 17-06-14
Пользователь №: 81 969



Может подскажет кто:
В соответствии с вот этой штукой: http://blogs.msdn.com/b/usbcoreblog/archiv...e-a-device.aspx
дохожу до п.6, отправляю дескриптор, и хост меня ресетит. Вероятно туплю с фазой статуса контрольной передачи.
STM32F429
Вопрос - мы получаем от хоста токен OUT и нулевой пакет данных. Чтобы ответить мы должны сделать так:

DIEPTSIZ0 |= 0x00080000;
DIEPCTL0 |= (USB_OTG_DIEPCTL_CNAK|USB_OTG_DIEPCTL_EPENA);

Или нет?
Или где в RM прочитать?
Go to the top of the page
 
+Quote Post
prottoss
сообщение Oct 25 2015, 12:30
Сообщение #32


Гуру
******

Группа: Свой
Сообщений: 2 694
Регистрация: 24-03-05
Пользователь №: 3 659



Доброго времени суток.
Тоже решил освоить STM32 OTG_FS в качестве Device. Тоже не нравится библиотека от ST и решил написать свой драйвер. Тоже проблема с отправкой пакетов. Прочитал всю тему. Все исправил. Но хост так и не получает отравляемые данные в ходе энумерации.

Стратегия у меня такая:
1. В прерывании OTG_FS_GINTSTS_RXFLVL читаю регистр OTG_FS_GRXSTSP.
2. Жду прерывание от OUT Точки. Если прерывание от точки 0, и есть флаг OTG_FS_DOEPINTx_STUP вычитываю данные из RX FIFO и обрабатываю SETUP пакет от хоста.
3. Разрешаю прерывание OTG_FS_DIEPINTx_TXFE - IN FIFO путст.
4. В прерывании от IN точки по OTG_FS_DIEPINTx_TXFE отправляю данные хосту.

Данные вроде отправляются, судя по количеству прерываний (п. 4) но хост ресетит девай после отправки двух пакетов и далее все по новой.
Еще наблюдаю не систематическое возникновение прерываний по OTG_FS_GINTSTS_RXFLVL.

Вопрос - нужно ли, в обработчике OTG_FS_GINTSTS_RXFLVL вычитывать данные (что я не делаю)сразу или можно дожидаться прихода прерывания от OUT точки с флагом OTG_FS_DOEPINTx_STUP?

Спасибо.


--------------------
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Oct 25 2015, 13:07
Сообщение #33


Гуру
******

Группа: Свой
Сообщений: 10 217
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(prottoss @ Oct 25 2015, 15:30) *
Данные вроде отправляются, судя по количеству прерываний (п. 4) но хост ресетит девай после отправки двух пакетов и далее все по новой.

Хост сначала запрашивает 8 байт дескриптора устройства, поэтому фраза "количество прерываний" несколько настораживает. Можете рассказать подробнее, что и в какой последовательности происходит?

Цитата(prottoss @ Oct 25 2015, 15:30) *
Вопрос - нужно ли, в обработчике OTG_FS_GINTSTS_RXFLVL вычитывать данные (что я не делаю)сразу или можно дожидаться прихода прерывания от OUT точки с флагом OTG_FS_DOEPINTx_STUP?

Я ориентировался по полю PKTSTS регистра OTG_FS_GRXSTSP - чтение по "SETUP data packet received", обработка по "SETUP transaction completed".
Go to the top of the page
 
+Quote Post
prottoss
сообщение Oct 25 2015, 13:37
Сообщение #34


Гуру
******

Группа: Свой
Сообщений: 2 694
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(aaarrr @ Oct 25 2015, 19:07) *
Хост сначала запрашивает 8 байт дескриптора устройства, поэтому фраза "количество прерываний" несколько настораживает. Можете рассказать подробнее, что и в какой последовательности происходит?

Не совсем так по поводу запроса дескриптора устройства. Хост не может запрашивать 8 байт. Он запрашивает намного больше. Но после отправки первых 8 байт (для Windows) должен сделать USB Reset. За тем, по новой, запрос дескриптора устройства, если все в порядке, установка адреса и за тем уже все прочее.

У меня вот такой порядок прерываний (флаги OTG_FS):
1. OTG_FS_GINTSTS_USBRST /* USB device bus reset */
2. OTG_FS_GINTSTS_ENUMDNE /* Enumeration done */
3. OTG_FS_GINTSTS_RXFLVL /* Receive FIFO non-empty */
4. OTG_FS_GINTSTS_RXFLVL /* Receive FIFO non-empty */
5. OTG_FS_GINTSTS_USBRST /* USB device bus reset */
6. OTG_FS_GINTSTS_RXFLVL /* Receive FIFO non-empty */
7. OTG_FS_GINTSTS_RXFLVL /* Receive FIFO non-empty */
8. OTG_FS_GINTSTS_OEPINT /* EP OUT event */
8.1. OTG_FS_DOEPINTx_STUP/* Setup Phase Done (control EPs) */ - Здесь обрабатывам запрос и разрешаем прерывание TX FIFO empty */
9. OTG_FS_GINTSTS_RXFLVL /* Receive FIFO non-empty */
10. OTG_FS_GINTSTS_IEPINT /* EP IN event */
10.1 OTG_FS_DIEPINTx_TXFE /* IN endpoint FIFO empty */ - Здесь отправляем данные хосту - дескриптор устройтсва, первые 8 байт */
11. OTG_FS_GINTSTS_RXFLVL /* Receive FIFO non-empty */ - Не понял че такое???
10. OTG_FS_GINTSTS_IEPINT /* EP IN event */ -ага! данные улетели. Наверное...
12. OTG_FS_GINTSTS_OEPINT /* EP OUT event */ - вы че творите???
12.1. 8.1. OTG_FS_DOEPINTx_STUP/* Setup Phase Done (control EPs) */ - Это че за запрос??? В поле bRequest = 0 */

Потом куча прерываний OTG_FS_GINTSTS_RXFLVL.
Потом сброс шины.
Потом все по новой





Отредактировал

В каждом прерывании нужный флаг закрывается - пишется единица в соответствующий бит/регистр


--------------------
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Oct 25 2015, 13:46
Сообщение #35


Гуру
******

Группа: Свой
Сообщений: 10 217
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(prottoss @ Oct 25 2015, 16:29) *
Хост не может запрашивать 8 байт.

Как это не может? Может, запрашивает, и сбасывает шину при попытке передать больше, например.

Цитата(prottoss @ Oct 25 2015, 16:29) *
У меня вот такой порядок прерываний (флаги OTG_FS):

Подозрительно уже начиная с п.5, какой промежуток времени проходит между пп.4-5?
Go to the top of the page
 
+Quote Post
prottoss
сообщение Oct 25 2015, 14:17
Сообщение #36


Гуру
******

Группа: Свой
Сообщений: 2 694
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(aaarrr @ Oct 25 2015, 19:46) *
Как это не может? Может, запрашивает, и сбасывает шину при попытке передать больше, например.

Не может запрашивать меньше байт чем размер Device Descriptor. Обычно запрашивает 256 байт. Но после приема первой посылки отрубает. Т.е. отправил первые 8 байт (если ЕР0 размер равен 8 байт). Получаешь событие, что отправлены 8 байт. Далее приходит BusReset.

Цитата(aaarrr @ Oct 25 2015, 19:46) *
Подозрительно уже начиная с п.5, какой промежуток времени проходит между пп.4-5?
Да. Подозрительно.
1. OTG_FS_GINTSTS_USBRST /* USB device bus reset */ time = 559
2. OTG_FS_GINTSTS_ENUMDNE /* Enumeration done */ time = 569
3. OTG_FS_GINTSTS_RXFLVL /* Receive FIFO non-empty */ time = 596
4. OTG_FS_GINTSTS_RXFLVL /* Receive FIFO non-empty */ time = 596
5. OTG_FS_GINTSTS_USBRST /* USB device bus reset */ time = 6564

Время в миллисекундах от старта МК.

Вопрос мой такой - я должен вычитывать OUT FIFO сразу при приходе OTG_FS_GINTSTS_RXFLVL?
Моя программа при приходе этого прерывания просто считывает вершину OTG_FS_GRXSTSP. Ждет прерывание SETUP и там уже обрабатывает пакет. Но после обработки и отправки ответа начинается какая то каша... ПРи том что OTG_FS_GINTSTS_RXFLVL сыплется постоянно хотя я квитирую это прерывание.


--------------------
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Oct 25 2015, 15:18
Сообщение #37


Гуру
******

Группа: Свой
Сообщений: 10 217
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(prottoss @ Oct 25 2015, 17:17) *
Не может запрашивать меньше байт чем размер Device Descriptor.

Может.

Цитата(prottoss @ Oct 25 2015, 17:17) *
4. OTG_FS_GINTSTS_RXFLVL /* Receive FIFO non-empty */ time = 596
5. OTG_FS_GINTSTS_USBRST /* USB device bus reset */ time = 6564

Тут хост явно чего-то безуспешно ждет. Странно только, что так долго.

Цитата(prottoss @ Oct 25 2015, 17:17) *
Вопрос мой такой - я должен вычитывать OUT FIFO сразу при приходе OTG_FS_GINTSTS_RXFLVL?
Моя программа при приходе этого прерывания просто считывает вершину OTG_FS_GRXSTSP. Ждет прерывание SETUP и там уже обрабатывает пакет.

Выше уже ответил.
Go to the top of the page
 
+Quote Post
prottoss
сообщение Oct 25 2015, 15:30
Сообщение #38


Гуру
******

Группа: Свой
Сообщений: 2 694
Регистрация: 24-03-05
Пользователь №: 3 659



А OTG_FS_GINTSTS_RXFLVL, как я понял из даташита, не квитируется? Или квитируется... В документации так много путаницы.


--------------------
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Oct 25 2015, 15:37
Сообщение #39


Гуру
******

Группа: Свой
Сообщений: 10 217
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(prottoss @ Oct 25 2015, 18:30) *
А OTG_FS_GINTSTS_RXFLVL, как я понял из даташита, не квитируется? Или квитируется... В документации так много путаницы.

Нет, нужно просто прочитать OTG_FS_GRXSTSP.
Go to the top of the page
 
+Quote Post
prottoss
сообщение Oct 25 2015, 15:44
Сообщение #40


Гуру
******

Группа: Свой
Сообщений: 2 694
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(aaarrr @ Oct 25 2015, 21:37) *
Нет, нужно просто прочитать OTG_FS_GRXSTSP.


хм... ну я так и делаю - толку нет. Происходит то что сказал выше.

1.Читаю GRXSTSP.
2. Жду STUP от OUT EP.
3.Разрешаю IN FIFIO empty.
4. по приходу п.3 отправляю данные.


--------------------
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Oct 25 2015, 16:11
Сообщение #41


Гуру
******

Группа: Свой
Сообщений: 10 217
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(prottoss @ Oct 25 2015, 18:44) *
1.Читаю GRXSTSP.
2. Жду STUP от OUT EP.

1. Что в PKTSTS?
2. Не ждите STUP, ориентируйтесь на PKTSTS.
Go to the top of the page
 
+Quote Post
prottoss
сообщение Oct 25 2015, 16:19
Сообщение #42


Гуру
******

Группа: Свой
Сообщений: 2 694
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(aaarrr @ Oct 25 2015, 22:11) *
1. Что в PKTSTS?
2. Не ждите STUP, ориентируйтесь на PKTSTS.


Зачем тогда вообще нужен бит STUP в регистре OTG_FS_DOEPINT0???


--------------------
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Oct 25 2015, 16:26
Сообщение #43


Гуру
******

Группа: Свой
Сообщений: 10 217
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(prottoss @ Oct 25 2015, 19:19) *
Зачем тогда вообще нужен бит STUP в регистре OTG_FS_DOEPINT0???

Не знаю, но факт в том, что точно можно обойтись без него.
Go to the top of the page
 
+Quote Post
prottoss
сообщение Oct 25 2015, 16:50
Сообщение #44


Гуру
******

Группа: Свой
Сообщений: 2 694
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(aaarrr @ Oct 25 2015, 22:26) *
Не знаю, но факт в том, что точно можно обойтись без него.


Интересно:

Bits 20:17PKTSTS:Packet status
Indicates the status of the received packet
0001: Global OUT NAK (triggers an interrupt)
0010: OUT data packet received
0011: OUT transfer completed (triggers an interrupt)
0100: SETUP transaction completed (triggers an interrupt)
0110: SETUP data packet received
Others: Reserved

А что тогда означает фраза "triggers an interrupt"?


--------------------
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Oct 25 2015, 17:25
Сообщение #45


Гуру
******

Группа: Свой
Сообщений: 10 217
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(prottoss @ Oct 25 2015, 19:50) *
А что тогда означает фраза "triggers an interrupt"?

Загадка.

Цитата
0100: SETUP transaction completed (triggers an interrupt)
0110: SETUP data packet received

Оба статуса вызывают прерывание.
Go to the top of the page
 
+Quote Post

10 страниц V  < 1 2 3 4 5 > » 
Reply to this topicStart new topic
4 чел. читают эту тему (гостей: 4, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th October 2017 - 12:42
Рейтинг@Mail.ru


Страница сгенерированна за 0.01344 секунд с 7
ELECTRONIX ©2004-2016