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

 
 
> STM32 USB FS OTG
V_M_Luck
сообщение Jul 8 2011, 13:24
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 55
Регистрация: 26-11-05
Пользователь №: 11 420



Разбираюсь с USB FS OTG на STM32F107. Есть плата с STM32F107 и USB. Мне нужен только device. Что то самостоятельно по даташиту не очень получилось. Попытался запустить пример HID от ST из STM32_USB-FS-Device_Lib_V3.3.0. Не работает. Попадает пару раз в прерывание по RESET, потом в ENUMDN и все. Больше никакой активности.
Смотрел USB TRACE - host даже не пытается запрашивать дескрипторы.
Вопрос - у кого-нибудь этот пример заработал?

Извините. Нашел у себя косяк - пример заработал.

Сообщение отредактировал V_M_Luck - Jul 8 2011, 15:32
Go to the top of the page
 
+Quote Post
10 страниц V   1 2 3 > »   
Start new topic
Ответов (1 - 99)
V_M_Luck
сообщение Jul 13 2011, 15:51
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 55
Регистрация: 26-11-05
Пользователь №: 11 420



Вновь поднимаю тему.
Пример-то заработал. Но тянуть к себе в проект дикий фреймворк из-за одного эндпоинта для HID совсем не хочется. Стал разбираться в регистрах по даташиту и примеру.
Инициализацию вроде-бы сделал. Получаю USBRST, ENUMDNE, потом получаю запрос GET_DEVICE_DESCRIPTOR.
И тут-то все начинается. Настраиваю DIEPTSIZ0, DIEPCTL0 .
Помещаю в фифо данные.
Получаю прерывание на IN endpoint XFRCM. Вроде все ОК. Но HOST этого дескриптора не видит. В результате, вместо SET_ADDRESS опять получаю GET_DEVICE_DESCRIPTOR и все по кругу. Так раз 5 и HOST прекращает енумерацию.

Уже два дня голову ломаю. Может кто-нибудь сталкивался? Подскажите, в какую сторону посмотреть.
Go to the top of the page
 
+Quote Post
SviMik
сообщение Sep 9 2012, 11:41
Сообщение #3





Группа: Участник
Сообщений: 11
Регистрация: 9-09-12
Пользователь №: 73 458



Ровно та же проблема, как и в последнем сообщении. XFRCM прерывание получаю, от компа на дескриптор ноль реакции.
Дескриптор заведомо рабочий, взят из проекта, который делал на МК другого производителя.
Пробовал делать как строго по даташиту, так и переставлять всё, что только возможно - не работает.

Если автор решил проблему - хотелось бы узнать как sm.gif
Go to the top of the page
 
+Quote Post
Forger
сообщение Sep 9 2012, 15:07
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



Цитата(V_M_Luck @ Jul 13 2011, 19:51) *
...Подскажите, в какую сторону посмотреть...

Попробуте все ваши дискрипторы вставить в заведомо рабочий проект, пусть даже с "толстым" фреймворком.
Далее можно просто записать все, что отправляется/принимается хостом (соот. прогой) и сравнивать уже с логами уже своего проекта.
Наверняка, будет в чем-то разница, оттуда и копать sm.gif


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
SviMik
сообщение Sep 9 2012, 16:10
Сообщение #5





Группа: Участник
Сообщений: 11
Регистрация: 9-09-12
Пользователь №: 73 458



В моём случае, дескриптор взят из заведомо рабочего проекта, но под другой МК (ARM от атмела, ATSAM3S). Там я писал полностью сам, без библиотек, так что в протоколе USB немного понимаю (как мне кажется).

Решил пересесть на STM, и вот такой затык.

Цитата
Далее можно просто записать все, что отправляется/принимается хостом (соот. прогой)

К сожалению, не всё. Я пробовал SniffUSB, но он начинает запись только после корректного опознания устройства, тоесть абсолютно бесполезен в моём случае.

Мой текущий дескриптор девайса выглядит так (как я уже сказал, он заведомо рабочий):
Код
static char device_descriptor[18]={
    /* Standard USB device descriptor for the CDC serial driver */
    sizeof(device_descriptor), // size
    1, // USBGenericDescriptor_DEVICE
    0x00,0x02, // USBDeviceDescriptor_USB2_00
    2, // CDCDeviceDescriptor_CLASS
    0, // CDCDeviceDescriptor_SUBCLASS
    0, // CDCDeviceDescriptor_PROTOCOL
    64, // BOARD_USB_ENDPOINTS_MAXPACKETSIZE
    0xEB,0x03, // CDCDSerialDriverDescriptors_VENDORID
    0x24,0x61, // CDCDSerialDriverDescriptors_PRODUCTID
    0x10,0x01, // CDCDSerialDriverDescriptors_RELEASE
    1, // Index of manufacturer description //0
    2, // Index of product description //0
    3, // Index of serial number description //0
    1, // One possible configuration
};

(остальные не привожу, т.к. до них вообще дело не доходит)

Что происходит на заведомо рабочей плате с SAM3S:
1. usb сброс
2. приходит setup пакет с запросом дескриптора девайса
3. МК отправляет дескриптор (18 байт)
4. usb сброс
5. приходит фрейм, назначающий адрес usb устройству
6. и т.д.

Что происходит с STM32F4: не работает.
1. usb сброс
2. приходит setup пакет с запросом дескриптора девайса
3. МК отправляет дескриптор (18 байт)
4. а дальше тишина, и через 3 секунды переходим к п.1

Приблизительный код для стм32 (упрощено до безобразия в целях отладки):
Код
volatile uint32_t * fifo=(uint32_t *)(OTG_FS_DFIFO0_BASE);
OTG_FS->DIEPTSIZ0=(1<<19)|18; // PKTCNT; XFRSIZ
OTG_FS->DIEPCTL0=(1<<31)|(1<<26); // EPENA; CNAK
*fifo=0x02000112;
*fifo=0x40000002;
*fifo=0x612403EB;
*fifo=0x02010110;
*fifo=0x00000103;


Работу с FIFO предполагаю, на основе того, что чтение работает таким образом:
Код
volatile uint32_t * fifo=(uint32_t *)OTG_FS_DFIFO0_BASE;
int i=0;
for(i=0;i<BCNT;i+=4){
    int data=*fifo;
    rbuf[i+0]=(data>>0)&0xFF;
    rbuf[i+1]=(data>>8)&0xFF;
    rbuf[i+2]=(data>>16)&0xFF;
    rbuf[i+3]=(data>>24)&0xFF;
    pprintf("< %02X%02X%02X%02X", rbuf[i+0], rbuf[i+1], rbuf[i+2], rbuf[i+3]);
}


Исходя из даташита, я делаю правильно.

1. DIEPTSIZ0 должен устанавливаться до того, как поставлю EPENA в DIEPCTL0
Цитата
The application must modify this register before enabling endpoint 0. Once endpoint 0 is
enabled using the endpoint enable bit in the device control endpoint 0 control registers
(EPENA in OTG_FS_DIEPCTL0), the core modifies this register. The application can only
read this register


2. EPENA в DIEPCTL0 должен устанавливаться до того, как начну писать данные в FIFO.
Цитата
1. Program the OTG_FS_DIEPCTLx register with the endpoint characteristics and set the
CNAK and EPENA bits.
2. Write the data to be transmitted in the next frame to the transmit FIFO.


Цитата
1. The application must set the transfer size and packet count fields in the endpointspecific
registers and enable the endpoint to transmit the data.
2. The application must also write the required data to the transmit FIFO for the endpoint.


Однако, я пробовал и другой порядок действий, безрезультатно.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Sep 9 2012, 19:54
Сообщение #6


Гуру
******

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



CNAK в DOEPCTL0 после обработки setup установить не забыли?
Go to the top of the page
 
+Quote Post
SviMik
сообщение Sep 9 2012, 22:19
Сообщение #7





Группа: Участник
Сообщений: 11
Регистрация: 9-09-12
Пользователь №: 73 458



Вот же однако... Заработало! Плюс вам в карму, если б она тут была sm.gif
А я CNAK только один раз при инициализации ставил, и думал оно так и будет...

Интересно, а когда "по правилам" его надо ставить? "после обработки setup" это когда
1. закончил приём setup запроса
2. только записал ответ на setup в FIFO
3. когда отправка моего ответа уже завершена

(сейчас я поставил от балды)
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Sep 9 2012, 22:51
Сообщение #8


Гуру
******

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



Цитата(SviMik @ Sep 10 2012, 02:19) *
Интересно, а когда "по правилам" его надо ставить? "после обработки setup" это когда
1. закончил приём setup запроса
2. только записал ответ на setup в FIFO
3. когда отправка моего ответа уже завершена

В общем-то в любой момент правильно, можно после п.1
Go to the top of the page
 
+Quote Post
SviMik
сообщение Sep 17 2012, 00:32
Сообщение #9





Группа: Участник
Сообщений: 11
Регистрация: 9-09-12
Пользователь №: 73 458



Пытаюсь реализовать CDC девайс. Что получилось:
1. Приём от компа к девайсу - без проблем, любое количество данных.
2. Отправка от девайса к компу - отправляется только первый пакет. Дальше ничего не шлётся.

Что я мог упустить?

Код
void hwtx(){
    volatile uint32_t * fifo=(uint32_t *)OTG_FS_DFIFO2_BASE;
    int i;
    int len=12;
    char data[]={"Hello world\n"};
    pprintf("1. FIFO: %i words free", OTG_FS->DTXFSTS2&0xFFFF);
    OTG_FS->DIEPTSIZ2=(1<<19)|(len<<0); // PKTCNT; XFRSIZ
    OTG_FS->DIEPCTL2|=(1UL<<31)|(1<<26); // EPENA; CNAK
    for(i=0;i<len;i+=4){
        *fifo=((data[i+0]&0xFF)<<0)|((data[i+1]&0xFF)<<8)|((data[i+2]&0xFF)<<16)|((data[i+3]&0xFF)<<24);
    }
    pprintf("2. FIFO: %i words free", OTG_FS->DTXFSTS2&0xFFFF);
}


попытка 1, строка приходит
1. FIFO: 64 words free
2. FIFO: 61 words free
IRQ: SOF
IRQ: EP2 IN XFRC (Transfer completed)

попытка 2:
1. FIFO: 64 words free
2. FIFO: 61 words free

попытка 3:
1. FIFO: 61 words free
2. FIFO: 58 words free

тоесть далее просто забивается FIFO, а отправка не идёт...

Сообщение отредактировал SviMik - Sep 17 2012, 00:35
Go to the top of the page
 
+Quote Post
SviMik
сообщение Sep 18 2012, 00:11
Сообщение #10





Группа: Участник
Сообщений: 11
Регистрация: 9-09-12
Пользователь №: 73 458



Вомзжно, я что-то не так понял с FIFO буфферами. Если верить даташиту, размер буффера указывается в word, т.е. по 4 байта.
Текущая инициализация FIFO выглядит так:
Код
OTG_FS->GRXFSIZ=64; // RX FIFO = x words
OTG_FS->DIEPTXF0=(128<<16) | 64; // TX FIFO 0 = x words; start=x
OTG_FS->DIEPTXF1=(64<<16) | 192; // TX FIFO 1 = x words; start=x
OTG_FS->DIEPTXF2=(64<<16) | 256; // TX FIFO 2 = x words; start=x


Это конфигурация, при которой девайс нормально инициализируется. При попытке уменьшить приёмный буффер, инициализация уже не проходит. Хотя 64 cлова (256 байт) явно избыточно для SETUP пакетов.

Инициализация эндпоинтов:

Код
/* CDC endpoints: 0:control, 1:bulk out, 2:bulk in, 3:int in */
/* OUT */
OTG_FS->DOEPCTL0=(1<<26)|(1<<15)|(0<<0); // CNAK; active endpoint; Maximum packet size=64;
OTG_FS->DOEPCTL1=(1<<26)|(2<<18)|(1<<15)|(64<<0); // CNAK; Endpoint type; active endpoint; Maximum packet size;
/* IN */
OTG_FS->DIEPCTL0=(0<<22)|(1<<15)|(0<<0); // TxFIFO number; active endpoint; Maximum packet size=64;
OTG_FS->DIEPCTL2=(2<<22)|(2<<18)|(1<<15)|(64<<0); // TxFIFO number; Endpoint type; active endpoint; Maximum packet size;
Go to the top of the page
 
+Quote Post
MBR
сообщение Sep 18 2012, 10:49
Сообщение #11


Частый гость
**

Группа: Участник
Сообщений: 107
Регистрация: 26-09-10
Пользователь №: 59 748



Цитата(SviMik @ Sep 18 2012, 04:11) *
Это конфигурация, при которой девайс нормально инициализируется.

receive fifo шареный. Он не только для setup-пакетов используется. Плюсом, не забываете DIEPTXFx offset сдвигать при уменьшении GRXFSIZ?

Еще чтение мануалов рулит:

10 locations must be reserved in the receive FIFO to receive SETUP packets on control
endpoint. The core does not use these locations, which are reserved for SETUP packets, to
write any other data. One location is to be allocated for Global OUT NAK. Status information
is written to the FIFO along with each received packet. Therefore, a minimum space of
(Largest Packet Size / 4) + 1 must be allocated to receive packets. If multiple isochronous
endpoints are enabled, then at least two (Largest Packet Size / 4) + 1 spaces must be
allocated to receive back-to-back packets. Typically, two (Largest Packet Size / 4) + 1
spaces are recommended so that when the previous packet is being transferred to the CPU,
the USB can receive the subsequent packet.

От себя добавлю, что рекомендация two (Largest Packet Size / 4) + 1 исходит из того, что, пока мы один буфер из FIFO забираем, железо уже принимает второй.

Сообщение отредактировал MBR - Sep 18 2012, 10:54
Go to the top of the page
 
+Quote Post
SviMik
сообщение Sep 18 2012, 13:48
Сообщение #12





Группа: Участник
Сообщений: 11
Регистрация: 9-09-12
Пользователь №: 73 458



Хорошо. Тоесть моя конфигурация выше впринципе правильная, и должна работать? Но почему же с отправкой у меня проблемы... При этом, в нулевой эндпоинт отправлять дескрипторы проблем нет, а отправить данные в второй эндпоинт - проходит только первый пакет и всё. Возможно, с bulk эндпоинтами как-то иначе поступать надо?

А документация уже утомила своими ляпами... В таблице одно, в тексте другое... Доходит до того, что в таблице бит подписан Reserved, а ниже в тексте даётся его нормальное описание. Или в таблице "r", а в описании сказано, что в него писать надо. IN и OUT тоже путают, приходится логически до всего доходить. Даже ссылки неправильные. кликаю в оглавлении на DIEPTSIZx, попадаю на DOEPTSIZx... такой вот тест на внимательность sad.gif
Извиняюсь, накипело...
Go to the top of the page
 
+Quote Post
MBR
сообщение Sep 18 2012, 14:05
Сообщение #13


Частый гость
**

Группа: Участник
Сообщений: 107
Регистрация: 26-09-10
Пользователь №: 59 748



Цитата(SviMik @ Sep 18 2012, 17:48) *
При этом, в нулевой эндпоинт отправлять дескрипторы проблем нет, а отправить данные в второй эндпоинт - проходит только первый пакет и всё. Возможно, с bulk эндпоинтами как-то иначе поступать надо?

А XFRC не забываете сбрасывать после приема пакета?
Go to the top of the page
 
+Quote Post
SviMik
сообщение Sep 18 2012, 14:27
Сообщение #14





Группа: Участник
Сообщений: 11
Регистрация: 9-09-12
Пользователь №: 73 458



Всмысле флаг прерывания? Да, как и все остальные прерывания, сбрасываю.

Код
    }else if(OTG_FS->DAINT&(1<<2)){ // IEPINT on EP 2
        //print("- DAINT_IRQ: EP2 IN");
        if(OTG_FS->DIEPINT2&(1<<0)){ // Data IN transaction completed
            OTG_FS->DIEPINT2=(1<<0);
            pprintf("EP_IRQ(IN): EP2 XFRC");
        }else if(OTG_FS->DIEPINT2&(1<<1)){ // Endpoint disabled interrupt
            OTG_FS->DIEPINT2=(1<<1);
            pprintf("EP_IRQ(IN): EP2 EPDISD");
        }else if(OTG_FS->DIEPINT2&(1<<3)){ // Timeout condition mask
            OTG_FS->DIEPINT2=(1<<3);
            pprintf("EP_IRQ(IN): EP2 TOC");
        }else if(OTG_FS->DIEPINT2&(1<<4)){ // IN token received when TxFIFO is empty
            OTG_FS->DIEPINT2=(1<<4);
            pprintf("EP_IRQ(IN): EP2 ITTXFE");
        }else if(OTG_FS->DIEPINT2&(1<<6)){ // IN endpoint NAK effective
            OTG_FS->DIEPINT2=(1<<6);
            pprintf("EP_IRQ(IN): EP2 INEPNE");
        }else if(OTG_FS->DIEPINT2&(1<<7)){ // Transmit FIFO empty
            OTG_FS->DIEPINT2=(1<<7);
            pprintf("EP_IRQ(IN): EP2 TXFE");
        }else{
            pprintf("EP_IRQ(IN): EP2 %i", OTG_FS->DIEPINT2);
        }
    }
Go to the top of the page
 
+Quote Post
MBR
сообщение Sep 18 2012, 15:03
Сообщение #15


Частый гость
**

Группа: Участник
Сообщений: 107
Регистрация: 26-09-10
Пользователь №: 59 748



А где запись данных после отправки очередного балка?
Go to the top of the page
 
+Quote Post
SviMik
сообщение Sep 18 2012, 15:11
Сообщение #16





Группа: Участник
Сообщений: 11
Регистрация: 9-09-12
Пользователь №: 73 458



Всмысле? Функция hwtx() выше, вызываю её вручную, по команде в UART консоль.

Код
    while(1){
        if((USART3->SR & USART_SR_RXNE)){ // data received
            char c=USART3->DR;
            //...
            if(c=='3'){hwtx();}
        }
Go to the top of the page
 
+Quote Post
SviMik
сообщение Sep 18 2012, 22:30
Сообщение #17





Группа: Участник
Сообщений: 11
Регистрация: 9-09-12
Пользователь №: 73 458



Кажется, чего-то я в этой жизни не понимаю sad.gif
Из девайса в комп через второй эндпоинт отправляется только один пакет, после чего этот эндпоинт наглухо виснет. Пробовал:
1. Сбрасывать FIFO через регистр GRSTCTL. Как выборочно, так и все.
2. Отключать-включать эндпоинт, ставить CNAK
3. Сбрасывать весь регистр DIEPCTL2 в ноль, и заново конфигурировать
4. Плясать с бубном

Идеи закончились. После успешной отправки "Hello world" на комп, второй раз отправить не удаётся. Только перетыкание кабеля срабатывает.
Go to the top of the page
 
+Quote Post
MBR
сообщение Sep 19 2012, 14:26
Сообщение #18


Частый гость
**

Группа: Участник
Сообщений: 107
Регистрация: 26-09-10
Пользователь №: 59 748



Раз все остальное вроде верно, что там в hwtx?
Go to the top of the page
 
+Quote Post
SviMik
сообщение Sep 19 2012, 15:01
Сообщение #19





Группа: Участник
Сообщений: 11
Регистрация: 9-09-12
Пользователь №: 73 458



(Назначение hwtx - слать Hello World. Исключительно для дебага, поэтому упрощена до безобразия)
Скорее всего, я упустил что-то важное, но не могу понять что sad.gif
Для общения через нулевой эндпоинт используется тот же алгоритм, и он работает. Разница только в типах эндпоинтов (control и bulk). И вот с bulk что-то не выходит.

Код
void hwtx(){
    volatile uint32_t * fifo=(uint32_t *)OTG_FS_DFIFO2_BASE;
    int i;
    int len=12;
    char data[]={"Hello world\n"};
    pprintf("1. FIFO: %i words free", OTG_FS->DTXFSTS2&0xFFFF);
    OTG_FS->DIEPTSIZ2=(1<<19)|(len<<0); // PKTCNT; XFRSIZ
    OTG_FS->DIEPCTL2|=(1UL<<31)|(1<<26); // EPENA; CNAK
    for(i=0;i<len;i+=4){
        *fifo=((data[i+0]&0xFF)<<0)|((data[i+1]&0xFF)<<8)|((data[i+2]&0xFF)<<16)|((data[i+3]&0xFF)<<24);
    }
    pprintf("2. FIFO: %i words free", OTG_FS->DTXFSTS2&0xFFFF);
}


Сообщение отредактировал SviMik - Sep 19 2012, 15:05
Go to the top of the page
 
+Quote Post
MBR
сообщение Sep 20 2012, 12:15
Сообщение #20


Частый гость
**

Группа: Участник
Сообщений: 107
Регистрация: 26-09-10
Пользователь №: 59 748



Собственно, я ошибок не вижу. Я делаю все примерно тоже самое, единственное, дополнительно устанавливаю NAK в конце отправки пакета. Но, по идее, он должен ставиться автоматом.
Go to the top of the page
 
+Quote Post
SviMik
сообщение Sep 22 2012, 22:15
Сообщение #21





Группа: Участник
Сообщений: 11
Регистрация: 9-09-12
Пользователь №: 73 458



Я сдаюсь sad.gif
Можете выложить какой-нибудь минимальный рабочий пример с USB?
Или может я выложу свой проект целиком?
Go to the top of the page
 
+Quote Post
NaughtyFreak
сообщение Feb 19 2013, 08:11
Сообщение #22


Частый гость
**

Группа: Участник
Сообщений: 90
Регистрация: 7-10-11
Из: Москва
Пользователь №: 67 593



Подниму тему.
Подскажите плз, все глаза стёр уже где узнать адрес Rx FIFO для STM32F4. Пишу собственный стек (на базе их либы правда), с Tx адресами мне всё понятно, а Rx у них один на всех насколько я понял, а вот как из него читать не доходит.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Mar 16 2015, 09:49
Сообщение #23


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Подниму древнюю тему.

STM32F107, родной стек из Cube напугал множеством лишних телодвижений. Почти 20 К кода за виртуальный COM мне кажется многовато. Пишу свой, запнулся на элементарном - не отсылаются данные (дескриптор). Получаю setup запрос на device descriptor размером 8 байт. Проверяю наличие места в FIFO (DTXFSTS0), там 0x40 слов. Прописываю в DIEPTSIZ0 количество пакетов (PKTCNT) = 1 и размер посылки (XFRSIZ) = 8. Прописываю в FIFO два слова. После записи каждого слова наблюдаю уменьшение на 1 содержимого DTXFSTS0. После записи обоих слов XFRSIZ становится равным нулю, а DTXFSTS0, соответственно, 0x3E. Запускаю обмен (одновременно выставляю CNAK и EPENA в DIEPCTL0). Попадаю в прерывание XFRC, то есть ядро думает, что пакет отправило. При этом PKTCNT становится равен нулю. Но комп посланного дескриптора не видит, а свободное место в FIFO увеличивается всего на одно слово (DTXFSTS0 становится равным 0x3F). Как будто ядро вместо восьми байтов отсылает не более четырех. Родной пример из Cube работает, и если никто не подскажет - буду вставлять отладочный вывод в пример Cube. Но, мало ли, кто-то знает что ему не нравится?
Такое ощущение, что ядро при передаче неправильно воспринимает записанный в XFRSIZ размер, но он уменьшается до нуля именно в момент записи в FIFO последнего слова, четко в соотвествии с руководством пользователя. В общем уже третий вечер перечитываю руководство, хожу по шагам по своей программе и по примеру из Cube, вроде все делаю так же, а каменный цветок не выходит хоть тресни. Отсылка пакета нулевого размера (ZLP) после установки адреса проходит нормально.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Mar 17 2015, 23:10
Сообщение #24


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Сергей Борщ @ Mar 16 2015, 11:49) *
Но комп посланного дескриптора не видит, а свободное место в FIFO увеличивается всего на одно слово (DTXFSTS0 становится равным 0x3F). Как будто ядро вместо восьми байтов отсылает не более четырех.
Разобрался. Нужно сначала запускать передачу установкой CNAK и EPENA, а уже потом запихивать данные в FIFO. Надо внимательнее читать документацию:
Цитата
Using one of the above mentioned methods, when the application determines that
there is enough space to write a transmit packet, the application must first write into the
endpoint control register, before writing the data into the data FIFO.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
esaulenka
сообщение Apr 7 2015, 09:57
Сообщение #25


Профессионал
*****

Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877



Ещё разик подниму тему.

На эти грабли: https://my.st.com/public/STe2ecommunities/m...rrentviews=1592 никто не наступал?

Прикрутил библиотеку libopencm3, сделал из неё HID. Обмен - по нулевому endpoint'у блоками в 32 байта.
setup-пакеты ходят нормально, а от data out пропадают первые 4 байта. Странный костыль в библиотеке - добавить тысячу NOP'ов перед считыванием - не помогает. Да и выглядит он некрасиво...


--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
Go to the top of the page
 
+Quote Post
johnshadow
сообщение Apr 8 2015, 13:57
Сообщение #26


Участник
*

Группа: Участник
Сообщений: 31
Регистрация: 25-09-08
Пользователь №: 40 477



Цитата(esaulenka @ Apr 7 2015, 12:57) *
Ещё разик подниму тему.

На эти грабли: https://my.st.com/public/STe2ecommunities/m...rrentviews=1592 никто не наступал?

Прикрутил библиотеку libopencm3, сделал из неё HID. Обмен - по нулевому endpoint'у блоками в 32 байта.
setup-пакеты ходят нормально, а от data out пропадают первые 4 байта. Странный костыль в библиотеке - добавить тысячу NOP'ов перед считыванием - не помогает. Да и выглядит он некрасиво...


Попробуйте стандартную от st - у меня вполне нормально завелась как CustomHID. Использовал STM32_USB-Host-Device_Lib_V2.1.0 на проце stm32f105, плюс FreeRtos. Делал CAN-USB сниффер - сливать дампы FMS j1939 с грузовиков. На стресс тестах правда пропускной способности USB не хватает - ограничение HID, но не хочется отказываться от использования дефолтных драйверов в windows. И я надеюсь что в реальных условиях такого потока не будет. sm.gif

Правда на текущий момент есть два "нюанса":
1) Не работает на одном из ноутбуков у сотрудника - устройство обнаруживается, но данные в программу от устройства не поступают.
Вполне возможно что проблемы не в либе - ноутбук этот ремонтный. Так же возможно проблема в компоненте HID для lazarus, который я использую в программе на большом брате. Все руки не доходят разобраться.
2) Несколько раз были замечены случаи переподключения устройства - внешне проявляется как будто устройство отключили и сразу подключили. Опять же склоняюсь к мысли, что это не из-за либы. Скорее всего это ошибки в моей реализации остального функционала - похоже что попадаю в HardFault и перегружаюсь по WDT. Проявляется этот глюк крайне редко - пока пытаюсь поймать.

libopencm3 мельком смотрел - смутила необходимость в цикличном выполнении функции usbd_poll. В библиотеке от st все callback'и из OTG_FS_IRQHandler дергаются.
Go to the top of the page
 
+Quote Post
esaulenka
сообщение Apr 14 2015, 10:58
Сообщение #27


Профессионал
*****

Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877



Рекомендацию библиотеки ST спасибо. Знать, что оно таки работоспособно, это хорошо :-)

Допилил этот CustomHID из крайней версии CubeMX (он там сломаный, просто куда-то потеряли кусок кода).
Да, действительно, работает. Да, действительно, данные не теряет.

При сравнении CubeMX и libopencm3 была обнаружена интересная особенность. Как известно, эндпоинт после завершения обмена становится неактивным, и его надо постоянно включать.
Авторы libopencm3 делают это при первой же возможности (для OUT-транзакции - сразу после вычитывания из FIFO), а в "родной" библиотеке - после многочисленных действий (обработать пакет, подумать, какой будет следующим, какого он размера...). В итоге, в в libopencm3 в один фрейм попадает и SETUP с указанием "а сейчас будет SET REPORT" и собственно данные этого report'а. Точнее, не все данные, а сдвинутые на 4 байта (и дополненные мусором в конце).

Подробности - с фоточками осциллографа (пардон за качество. флешки, которую он поймёт, под рукой нету..) и состоянием регистра прерываний, здесь (кликнуть по картинке, там две страницы).

Если по приему setup пакета ничего не делать и не разрешать обратно эндпоинт в течении 1 мс, всё начинает работать корректно. Но меееедленно.


Собственно, вопрос:
1) я правильно понимаю, что спецификация USB 2.0 Full Speed не запрещает посылать setup и out в один эндпоинт за один фрейм?
2) у кого-нибудь на этом FS OTG использовал возможность использовать несколько транзакций в одном фрейме?



Цитата(johnshadow @ Apr 8 2015, 16:57) *
2) Несколько раз были замечены случаи переподключения устройства - внешне проявляется как будто устройство отключили и сразу подключили. Опять же склоняюсь к мысли, что это не из-за либы. Скорее всего это ошибки в моей реализации остального функционала - похоже что попадаю в HardFault и перегружаюсь по WDT. Проявляется этот глюк крайне редко - пока пытаюсь поймать.

Возможно, это какие-то "электрические" проблемы. Если рядом есть грузовик, надо рассчитывать, что в любой момент с неожиданной стороны придёт помеха.

Цитата(johnshadow @ Apr 8 2015, 16:57) *
libopencm3 мельком смотрел - смутила необходимость в цикличном выполнении функции usbd_poll. В библиотеке от st все callback'и из OTG_FS_IRQHandler дергаются.

Не понимаю, почему так сделали, но там уже почти всё готово для оборачивания этого poll() в прерывание. Собственно, эта часть заработала почти сразу. Дальше - аналогично, штатными callback'оми (правда, тут они динамические - через указатели).


--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Apr 14 2015, 11:09
Сообщение #28


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



По спецификации USB 2.0 если мы говорим о SETUP то это control tranfer, а он описан так

Control transfers minimally have two transaction stages: Setup and Status. A control transfer may
optionally contain a Data stage between the Setup and Status stages.

то есть как бы да, данные опционально пихаются прямо в середину до статуса.

Но естественно пакеты разные, потому что как минимум должны иметь разные токены DATA0 всегда у сетапа и первые данные придут уже как DATA1
Go to the top of the page
 
+Quote Post
esaulenka
сообщение Apr 14 2015, 12:14
Сообщение #29


Профессионал
*****

Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877



Подумал-подумал, и окончательно запутался.

Два bulk-пакета подряд ведь повсеместно встречаются? Соответственно, если бы была проблема "теряется начало любого второго пакета", народ бы много где ругался.

А в control можно ведь засунуть длинный пакет, чтоб оно "само" резало-склеивало?.. Вроде б не запрещают.
Сейчас посмотрю, что происходит на границе второй-третий пакет...


--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Apr 14 2015, 12:35
Сообщение #30


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



окончанием данных служит пакет длинной меньше максимального
если надо передать данные кратной длине пакета, то за последним полным пакетом посылают пакет 0 длинны как признак окончания.

целостность пакета как я понимаю берет на себя железо. А вот деление на пакеты я встречал разные реализации. У кого-то надо прям руками заполнять по пакетно, у кого-то один здоровый буфер и железо контроллера само режет. Я не знаю реализации STM, у них USB какой-то чудной...
Go to the top of the page
 
+Quote Post
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 720
Регистрация: 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 713
Регистрация: 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 720
Регистрация: 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 713
Регистрация: 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 720
Регистрация: 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 713
Регистрация: 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 720
Регистрация: 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 713
Регистрация: 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 720
Регистрация: 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 713
Регистрация: 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 720
Регистрация: 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 713
Регистрация: 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 720
Регистрация: 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 713
Регистрация: 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
prottoss
сообщение Nov 7 2015, 18:41
Сообщение #46


Гуру
******

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



Продолжаю неспеша тупить с STM32. С Setup пакетами разобрался. Нужно вычитывать RX буфер сразу по приходу прерывания RXFLVL: RxFIFO non-empty.
Прикрутил свою либу верхнего уровня с реализованным протоколом USB CDC. Все работает за исключением обработки запроса от хоста SET LINE CODING.

В этом запросе две фазы.
Первая SETUP - хост присылает 8 байт собственно запрос.
Вторая DATA, где устройтсво должно принять собственно данные для установки порта - битрейт, четность и т.п. - 7 байт.
Принятие данных организовываю так же в прерывании RXFLVL. Читаю OTG_FS->GRXSTSP.
Количество байт - 7, статус - 0x02: /* OUT data packet received */. Все вроде четко. Вычитываю данные из FIFO, но вижу что данные не те, что нужно.

В чем подвох?


--------------------
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Nov 7 2015, 18:48
Сообщение #47


Гуру
******

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



Цитата(prottoss @ Nov 7 2015, 21:41) *
В чем подвох?

OTG_FS_DOEPCTL0.EPENA установлен?
Go to the top of the page
 
+Quote Post
prottoss
сообщение Nov 7 2015, 18:54
Сообщение #48


Гуру
******

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



Цитата(aaarrr @ Nov 8 2015, 00:48) *
OTG_FS_DOEPCTL0.EPENA установлен?


Прерывание по RXFLVL у меня построено сейчас вот так:
Код
static void ISRH_RxFifoNonEmpty(void)
{
    UINT32 status = OTG_FS->GRXSTSP;    /* Get the Status from the top of the FIFO */
    UINT8 ep_num = ((status & OTG_FS_GRXSTSP_EPNUM_MSK) >> OTG_FS_GRXSTSP_EPNUM_POS);
    INT data_len = ((status & OTG_FS_GRXSTSP_BCNT_MSK) >> OTG_FS_GRXSTSP_BCNT_POS);
    g_EP_Desc[0].data_len = data_len;
    UINT8 packet_status = ((status & OTG_FS_GRXSTSP_PKTSTS_MSK) >> OTG_FS_GRXSTSP_PKTSTS_POS);
    
    switch(packet_status)
    {
        case 0x01:    /* Global OUT NAK (triggers an interrupt) */
            break;
                    
        case 0x02:    /* OUT data packet received */
            if(0 == ep_num)
            {
                USBD_CTRL_STATE usbd_state = USBD_DataOut();    /* Process the setup request parse */
                if(USBD_CTRL_STAGE_DATA_IN == usbd_state)    /* DATA_IN stage */
                    OTG_FS->DIEPEMPMSK |= (UINT32)1;    /* Enable TX FIFO empy intr. from EP0 */
            }
            break;
                
        case 0x03:    /*  OUT transfer completed (triggers an interrupt) */
            break;
        
        case 0x04:    /* SETUP transaction completed (triggers an interrupt) */
            break;
                
        case 0x06:    /* SETUP data packet received */
            if(0 == ep_num)
            {
                USBD_CTRL_STATE usbd_state = USBD_Setup();    /* Process the setup request parse */
                if(USBD_CTRL_STAGE_DATA_IN == usbd_state)    /* DATA_IN stage */
                    OTG_FS->DIEPEMPMSK |= (UINT32)1;    /* Enable TX FIFO empy intr. from EP0 */
            }
            break;
                
        default:
            break;
    }
}


Функции верхнего уровня: USBD_Setup() и USBD_DataOut() для чтения из RX буфера используют одну и ту же функцию чтения:
Код
USBD_RESULT IUSBD_EP0_Read(P_UINT8 data, INT data_len, P_INT xfer)
{    
    if(data_len > g_EP_Desc[0].data_len)
        data_len = g_EP_Desc[0].data_len;
    g_EP_Desc[0].data_len = 0;
    
    EP_OUT_FIFO_SW_Get((void *)IUSBD_FIFO_BASE, (void *)data, data_len);    /* Read data from FIFO */
    
    OTG_FS->DOEPTSIZ0 =    /* Setup transfer size for ready to receive */
        OTG_FS_DOEPTSIZ0_XFRSIZ(USBD_CFG_DEVICE_EP0_SIZE * IUSBD_CFG_EP0_DOEPTSIZ_STUPCNT) |
        OTG_FS_DOEPTSIZ0_PKTCNT |
        OTG_FS_DOEPTSIZ0_STUPCNT(IUSBD_CFG_EP0_DOEPTSIZ_STUPCNT);
    OTG_FS->DOEPCTL0 |= (OTG_FS_DOEPCTL0_CNAK | OTG_FS_DOEPCTL0_EPENA);
    
    *xfer = data_len;
    return USBD_RES_OK;    /* OK */
}


Т.е. NAK и EPENA программируются сразу после вычитывания буфера.


--------------------
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Nov 7 2015, 19:02
Сообщение #49


Гуру
******

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



Цитата(prottoss @ Nov 7 2015, 21:54) *
Т.е. NAK и EPENA программируются сразу после вычитывания буфера.

Так выходит, что до получения первого пакета EPENA не установлен?
Go to the top of the page
 
+Quote Post
prottoss
сообщение Nov 7 2015, 19:08
Сообщение #50


Гуру
******

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



Цитата(aaarrr @ Nov 8 2015, 01:02) *
Так выходит, что до получения первого пакета EPENA не установлен?


Вот эта часть кода:
Код
OTG_FS->DOEPTSIZ0 =    /* Setup transfer size for ready to receive */
        OTG_FS_DOEPTSIZ0_XFRSIZ(USBD_CFG_DEVICE_EP0_SIZE * IUSBD_CFG_EP0_DOEPTSIZ_STUPCNT) |
        OTG_FS_DOEPTSIZ0_PKTCNT |
        OTG_FS_DOEPTSIZ0_STUPCNT(IUSBD_CFG_EP0_DOEPTSIZ_STUPCNT);
    OTG_FS->DOEPCTL0 |= (OTG_FS_DOEPCTL0_CNAK | OTG_FS_DOEPCTL0_EPENA);

Так же исполняется по приходу прерывания USB Bus Reset. Так что точка всегда готова к приему пакетов.
И, когда приходит прерывание о новом пакете, и это DATA OUT stage - количество данных в GRXSTSP верное - 7 байт.
Только данные почему то не те, которые послал хост...
В остальном все работает нормально.

Данные по OUT BULK точке я еще принимать не пробовал. Пока хочу разобраться почему в буфере не то что передал хост.


--------------------
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Nov 7 2015, 19:29
Сообщение #51


Гуру
******

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



Цитата(prottoss @ Nov 7 2015, 22:08) *
Так же исполняется по приходу прерывания USB Bus Reset. Так что точка всегда готова к приему пакетов.

EPENA сбрасывается при каждом SETUP'е, устанавливать надо непосредственно перед приемом пакета.
Go to the top of the page
 
+Quote Post
prottoss
сообщение Nov 7 2015, 19:44
Сообщение #52


Гуру
******

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



Цитата(aaarrr @ Nov 8 2015, 01:29) *
EPENA сбрасывается при каждом SETUP'е, устанавливать надо непосредственно перед приемом пакета.
Не понял, что значит "устанавливать надо непосредственно перед приемом пакета".



--------------------
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Nov 7 2015, 19:47
Сообщение #53


Гуру
******

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



Цитата(prottoss @ Nov 7 2015, 22:44) *
Не понял, что значит "устанавливать надо непосредственно перед приемом пакета".

Получили SETUP - узнали из него, что будет "продолжение" в виде OUT-транзакции - тут же на месте взвели EPENA.
Go to the top of the page
 
+Quote Post
prottoss
сообщение Nov 7 2015, 19:51
Сообщение #54


Гуру
******

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



Цитата(aaarrr @ Nov 8 2015, 01:47) *
Получили SETUP - узнали из него, что будет "продолжение" в виде OUT-транзакции - тут же на месте взвели EPENA.

Но я вроде так и делаю. В функции IUSBD_EP0_Read получаю SETUP: Вычитываю данные из RX FIFO и тут же взвожу EPENA и CNAK


--------------------
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Nov 7 2015, 19:55
Сообщение #55


Гуру
******

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



Цитата(prottoss @ Nov 7 2015, 22:51) *
Но я вроде так и делаю. В функции IUSBD_EP0_Read получаю SETUP: Вычитываю данные из RX FIFO и тут же взвожу EPENA и CNAK

Перенесите обработку SETUP сюда:
Код
case 0x04:    /* SETUP transaction completed (triggers an interrupt) */

Именно в этот момент EPENA и снимается.
Go to the top of the page
 
+Quote Post
prottoss
сообщение Nov 7 2015, 20:16
Сообщение #56


Гуру
******

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



Цитата(aaarrr @ Nov 8 2015, 01:55) *
Перенесите обработку SETUP сюда:
Код
case 0x04:    /* SETUP transaction completed (triggers an interrupt) */

Именно в этот момент EPENA и снимается.
Спасибо. Как всегда помогли быстро разобраться. a14.gif beer.gif

Правда взвод точки я воткнул не в том месте кода, как Вы сказали, а в обработчике от OUT точки по флагу STUP (SETUP phase done) в регистре DOEPINT0. Перечитал даташит про EPENA в DOEPCTL0:
Цитата
Bit 31EPENA:Endpoint enable
The application sets this bit to start transmitting data on endpoint 0.
The core clears this bit before setting any ofthe following interrupts on this endpoint:
– SETUP phase done
– Endpoint disabled
– Transfer completed


--------------------
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Nov 7 2015, 20:28
Сообщение #57


Гуру
******

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



Цитата(prottoss @ Nov 7 2015, 23:16) *
Спасибо.

Пожалуйста sm.gif Правда, веселый контроллер USB у STM?
Go to the top of the page
 
+Quote Post
prottoss
сообщение Nov 7 2015, 20:37
Сообщение #58


Гуру
******

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



Цитата(prottoss @ Nov 8 2015, 02:16) *
Правда взвод точки я воткнул
Неа, не туда воткнул sm.gif В общем сделал как советовали. Теперь код прерывания по RXFLVL выглядит вот так:
Код
static void ISRH_RxFifoNonEmpty(void)
{
    UINT32 status = OTG_FS->GRXSTSP;    /* Get the Status from the top of the FIFO */
    UINT8 ep_num = ((status & OTG_FS_GRXSTSP_EPNUM_MSK) >> OTG_FS_GRXSTSP_EPNUM_POS);
    INT data_len = ((status & OTG_FS_GRXSTSP_BCNT_MSK) >> OTG_FS_GRXSTSP_BCNT_POS);
    g_EP_Desc[0].data_len = data_len;
    UINT8 packet_status = ((status & OTG_FS_GRXSTSP_PKTSTS_MSK) >> OTG_FS_GRXSTSP_PKTSTS_POS);
    
    switch(packet_status)
    {
        case 0x01:    /* Global OUT NAK (triggers an interrupt) */
            break;
                    
        case 0x02:    /* OUT data packet received */
            if(0 == ep_num)
            {
                USBD_CTRL_STATE usbd_state = USBD_DataOut();    /* Process the setup request parse */
                if(USBD_CTRL_STAGE_DATA_IN == usbd_state)    /* DATA_IN stage */
                    OTG_FS->DIEPEMPMSK |= (UINT32)1;    /* Enable TX FIFO empy intr. from EP0 */
            }
            break;
                
        case 0x03:    /*  OUT transfer completed (triggers an interrupt) */
            break;
        
        case 0x04:    /* SETUP transaction completed (triggers an interrupt) */
            if(0 == ep_num)
            {
                OTG_FS->DOEPTSIZ0 =    /* Setup transfer size for ready to receive */
                    OTG_FS_DOEPTSIZ0_XFRSIZ(USBD_CFG_DEVICE_EP0_SIZE * IUSBD_CFG_EP0_DOEPTSIZ_STUPCNT) |
                    OTG_FS_DOEPTSIZ0_PKTCNT |
                    OTG_FS_DOEPTSIZ0_STUPCNT(IUSBD_CFG_EP0_DOEPTSIZ_STUPCNT);
                OTG_FS->DOEPCTL0 |= (OTG_FS_DOEPCTL0_CNAK | OTG_FS_DOEPCTL0_EPENA);
            }
            break;
                
        case 0x06:    /* SETUP data packet received */
            if(0 == ep_num)
            {
                USBD_CTRL_STATE usbd_state = USBD_Setup();    /* Process the setup request parse */
                if(USBD_CTRL_STAGE_DATA_IN == usbd_state)    /* DATA_IN stage */
                    OTG_FS->DIEPEMPMSK |= (UINT32)1;    /* Enable TX FIFO empy intr. from EP0 */
            }
            break;
                
        default:
            break;
    }
}


Из функции IUSBD_EP0_Read код разрешения точки вообще убрал




Цитата(aaarrr @ Nov 8 2015, 02:28) *
Пожалуйста sm.gif Правда, веселый контроллер USB у STM?
Ага веселый, но изучать все равно нужно - тренд.

Мне сейчас интересно посмотреть, какая будет производительность у это OTG_FS ядра. Вижу, что ни о каком двойном буферировании BULK точек в мануале речи не идет - надеюсь оно там есть на уровне ядра? Криво, конечно, что OUT буфер один общий и его нужно обязательно вычитывать сразу, но если прикрутить DMA, то, в принципе, сносно должно получится.


--------------------
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Nov 7 2015, 20:59
Сообщение #59


Гуру
******

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



Цитата(prottoss @ Nov 7 2015, 23:37) *
Мне сейчас интересно посмотреть, какая будет производительность у это OTG_FS ядра. Вижу, что ни о каком двойном буферировании BULK точек в мануале речи не идет - надеюсь оно там есть на уровне ядра?

Уровень буферизации зависит от количества памяти, выделенной в FIFO на прием для точки: если выделить на два пакета максимального размера, то будет как раз двойная.
Go to the top of the page
 
+Quote Post
prottoss
сообщение Nov 7 2015, 21:06
Сообщение #60


Гуру
******

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



Цитата(aaarrr @ Nov 8 2015, 02:59) *
Уровень буферизации зависит от количества памяти, выделенной в FIFO на прием для точки
Это то понятно. Памяти в буфере можно выделить даже на 4 размера конечной точки BULK, при чем в обе стороны.


--------------------
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Nov 7 2015, 21:15
Сообщение #61


Гуру
******

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



Цитата(prottoss @ Nov 7 2015, 23:37) *
...если прикрутить DMA, то, в принципе, сносно должно получится.

Вот не уверен. Вручную запрягать и обслуживать M2M на каждый чих может оказаться накладнее, чем быстренько выгрузить данные программно.
Go to the top of the page
 
+Quote Post
prottoss
сообщение Nov 20 2015, 12:26
Сообщение #62


Гуру
******

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



Поднял на собственном стеке HID с двумя INT точками. Сделал эхо. Все прекрасно работает. Производительность не измерял пока.
Есть непонимание по одному вопросу: Есть регистры, задающие размерность FIFO для IN конечных точек. Это OTG_FS_DIEPTXF0 для контрольной точки и OTG_FS_DIEPTXFx для рабочих точек.
С полем INEPTXFD все понятно. В мануале прямо про них написано:
Цитата
Bits 31:16INEPTXFD:IN endpoint TxFIFO depth
This value is in terms of 32-bit words.
Minimum value is 16
The power-on reset value of this register is specified as the largest IN endpoint FIFO
number depth.

С полем INEPTXSA, у меня, полного понимания нет. Описание в доке:
Цитата
INEPTXSA:IN endpoint FIFOx transmit RAM start address
This field contains the memory start address for IN endpoint transmit FIFOx. The address
must be aligned with a 32-bit memory location.
Т.е. вроде как исчисление в этом поле в байтах, но число должно быть выровнено на 32 бита.
Посмотрел примеры от ST. Там берется, к примеру, размер буфера в 32-бит словах (как и нужно), и это значение используется для вычисления адреса следующего буфера... Т.е. значение не делится на 4 для получения смещения в байтах...
Посмотрел в отладчике состояние этих регистров по умолчанию после инициализации OTG - там, судя по дефолтным значениям полей, происходит то же самое. Правда, для последних регистров, в итоге, занчение адреса вылезает за пределы максимального размера памяти OTG... Хоть в байтах, хоть в 32-бит словах. Опять веселье (С)aaarrr

Извините, может немного сумбурно объяснил вопрос.


--------------------
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Nov 20 2015, 13:09
Сообщение #63


Гуру
******

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



Цитата(prottoss @ Nov 20 2015, 15:26) *
Т.е. вроде как исчисление в этом поле в байтах, но число должно быть выровнено на 32 бита.

Нет, все в словах исчисляется. FIFO у них иной адресации и не имеет.
Go to the top of the page
 
+Quote Post
Tarbal
сообщение Nov 20 2015, 13:28
Сообщение #64


Профессионал
*****

Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439



Цитата(prottoss @ Nov 8 2015, 00:37) *
Мне сейчас интересно посмотреть, какая будет производительность у это OTG_FS ядра. Вижу, что ни о каком двойном буферировании BULK точек в мануале речи не идет - надеюсь оно там есть на уровне ядра? Криво, конечно, что OUT буфер один общий и его нужно обязательно вычитывать сразу, но если прикрутить DMA, то, в принципе, сносно должно получится.


Расскажите дилетанту для чего в USB нужен DMA пожалуйста. Ведь если посылать полные пакеты по 64 байта, то уже вроде как железо заполнит само буфер и вызовет одно прерывание на принятых 64 байта. Или речь идет о коротких пакетах? Вероятно я не вижу подводных камней.
Go to the top of the page
 
+Quote Post
prottoss
сообщение Nov 20 2015, 13:45
Сообщение #65


Гуру
******

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



Цитата(aaarrr @ Nov 20 2015, 19:09) *
Нет, все в словах исчисляется. FIFO у них иной адресации и не имеет.
Зачем тогда написано, что в поле адреса должно быть загружено значение, выровненное на 32 бита? Как можно не выровнять то, что уже выровнено?


Цитата(Tarbal @ Nov 20 2015, 19:28) *
Расскажите дилетанту для чего в USB нужен DMA пожалуйста. Ведь если посылать полные пакеты по 64 байта, то уже вроде как железо заполнит само буфер и вызовет одно прерывание на принятых 64 байта. Или речь идет о коротких пакетах? Вероятно я не вижу подводных камней.
Ну хотя бы для того чтобы переслать данные из памяти USB в порт, минуя копирование данных в память. Вроде как в stm32 otg это можно сделать, хотя, я еще не пробовал. За выходные вечера хочу попробовать. Организация FIFO, на мой взгляд, позволяет это сделать. При запуске трансфера настроить точку и канал, и по прерываниям по приему стартовать канал DMA.


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


Гуру
******

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



Цитата(Tarbal @ Nov 20 2015, 16:28) *
Ведь если посылать полные пакеты по 64 байта, то уже вроде как железо заполнит само буфер и вызовет одно прерывание на принятых 64 байта.

Именно что буфер FIFO заполнит, а не буфер в памяти процессора.

Цитата(prottoss @ Nov 20 2015, 16:37) *
Зачем тогда написано, что в поле адреса должно быть загружено значение, выровненное на 32 бита? Как можно не выровнять то, что уже выровнено?

Загадка-с. Выразились неудачно, CCCV и тому подобное.
Go to the top of the page
 
+Quote Post
prottoss
сообщение Nov 20 2015, 13:47
Сообщение #67


Гуру
******

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



Ну и по передаче так же.

Цитата(aaarrr @ Nov 20 2015, 19:46) *
Загадка-с. Выразились неудачно, CCCV и тому подобное.
Что такое CCCV? sm.gif


--------------------
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Nov 20 2015, 13:48
Сообщение #68


Гуру
******

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



Цитата(prottoss @ Nov 20 2015, 16:45) *
При запуске трансфера настроить точку и канал, и по прерываниям по приему стартовать канал DMA.

64 байта пакета - это всего 16 слов, возможность выигрыша в такой конфигурации представляется сомнительной.
Go to the top of the page
 
+Quote Post
prottoss
сообщение Nov 20 2015, 13:48
Сообщение #69


Гуру
******

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



Цитата(aaarrr @ Nov 20 2015, 19:46) *
Выразились неудачно
Т.е. Вы уверены, что поле адреса - это 32-бит значения?


--------------------
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Nov 20 2015, 13:50
Сообщение #70


Гуру
******

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



Цитата(prottoss @ Nov 20 2015, 16:47) *
Что такое CCCV? sm.gif

Ctrl-C Ctrl-V, copy-paste sm.gif

Цитата(prottoss @ Nov 20 2015, 16:48) *
Т.е. Вы уверены, что поле адреса - это 32-бит значения?

Честно скажу, не проверял. Но логика организации FIFO не позволяет думать иначе.
Go to the top of the page
 
+Quote Post
Tarbal
сообщение Nov 20 2015, 13:51
Сообщение #71


Профессионал
*****

Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439



Цитата(prottoss @ Nov 20 2015, 17:45) *
Ну хотя бы для того чтобы переслать данные из памяти USB в порт, минуя копирование данных в память. Вроде как в stm32 otg это можно сделать, хотя, я еще не пробовал. За выходные вечера хочу попробовать. Организация FIFO, на мой взгляд, позволяет это сделать. При запуске трансфера настроить точку и канал, и по прерываниям по приему стартовать канал DMA.


Спасибо. Значит я все правильно понял.
Go to the top of the page
 
+Quote Post
prottoss
сообщение Nov 20 2015, 13:55
Сообщение #72


Гуру
******

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



Цитата(aaarrr @ Nov 20 2015, 19:48) *
64 байта пакета - это всего 16 слов, возможность выигрыша в такой конфигурации представляется сомнительной.
Согласен. Я не пробовал еще DMA, но, может быть есть возможность быстро его стартануть...


Цитата(aaarrr @ Nov 20 2015, 19:50) *
Честно скажу, не проверял. Но логика организации FIFO не позволяет думать иначе.
Хм. Логика понятна - доступ только 32 бит ИО, по этому размер задается в словах. Но смещение то не обязательно должно задаваться словами...


--------------------
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Nov 20 2015, 13:55
Сообщение #73


Гуру
******

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



Цитата(aaarrr @ Nov 20 2015, 16:50) *
Честно скажу, не проверял. Но логика организации FIFO не позволяет думать иначе.

Поясню: я исходил из адресации в словах, в программе задействован не один буфер, каких-либо проблем и накладок не обнаружено.
Go to the top of the page
 
+Quote Post
prottoss
сообщение Nov 20 2015, 13:57
Сообщение #74


Гуру
******

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



Размер трансфера данных задается все таки в байтах

Цитата(aaarrr @ Nov 20 2015, 19:55) *
Поясню: я исходил из адресации в словах, в программе задействован не один буфер, каких-либо проблем и накладок не обнаружено.
Я тоже, в своей программе задал буфера так, что они в любом случае, не пересекаются. Значит буду пробовать делать крэш.


--------------------
Go to the top of the page
 
+Quote Post
Tarbal
сообщение Nov 20 2015, 15:45
Сообщение #75


Профессионал
*****

Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439



Цитата(aaarrr @ Nov 8 2015, 01:15) *
Вот не уверен. Вручную запрягать и обслуживать M2M на каждый чих может оказаться накладнее, чем быстренько выгрузить данные программно.


Или просто переставить указатель на буфер, а этот буфер в обработку. Хотя M2M надо тоже переставить указатели и стартануть -- не так много действий.
Go to the top of the page
 
+Quote Post
prottoss
сообщение Nov 21 2015, 04:41
Сообщение #76


Гуру
******

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



Вернусь к вопросу использования DMA.
Цитата(aaarrr @ Nov 20 2015, 19:48) *
64 байта пакета - это всего 16 слов, возможность выигрыша в такой конфигурации представляется сомнительной.

Для OUT передач это, возможно, и верно, т.к. для BULK и INT трансферов 64 байта - это максимум. Я проверил на HID и на CDC с штатным Windows драйвером usbser.sys.
Для IN передач все намного радужнее. У IN точек есть персональный хардварный буфер, который может быть по размеру намного больше чем размер точки. Т.е. к примеру, если точка имеет размер 64 байта, я свободного могу сделать буфер размером, к примеру, в 512 байт и загрузить его полностью используя DMA. В данном случае будет явный прирост производительности.

Жаль, конечно, что для OUT точек сделали какой то кастрированный общий буфер...


--------------------
Go to the top of the page
 
+Quote Post
prottoss
сообщение Dec 18 2015, 11:19
Сообщение #77


Гуру
******

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



Продолжаю потихоньку грызть OTG.

Построил USB MSD устройство. Столкнулся с вот такой проблемой:

Рабочая конфигурация FIFO:
1. OUT FIFO - 128 байт. (Возможны и другие варианты).
2. IN FIFO для EP0 - 64 байта.
3. IN FIFO для EP1 (MSD bulk IN) < 512 байт. Любой значение в пределах 64 * (1..7)
так все работает прекрасно.

Если ставлю IN FIFO для EP1 =512 или более - передача в хост затыкается на команде SCSI Read10 чтения 0 сектора. Состояние регистров EP1 IN становится вот такое:
В регистре DIEPCTL1 бит EPENA установлен, что говорит о том, что точка занята (в режиме передачи).
В регистре DIEPSIZ1 поле PKTCNT равно количеству 64 бит пакетов, т.е. 512/64 = 8. Поле XFRSIZ = 0;
В регистре DTXFSTS1 поле INEPTFSAV = 0 - Буфер полный.

Хост, при этом, передачу не видит.

Сделал обманку в обработчике прерываний от Tx FIFO empty - в прерывании гружу не все, что нужно, а только 64/128/192 байт. Все начинает работать как часы.
Если гружу 256 байт или больше опять зависон на передаче 512 байт сектора.

В чем может быть проблема?



--------------------
Go to the top of the page
 
+Quote Post
Шаманъ
сообщение Mar 19 2017, 21:09
Сообщение #78


Знающий
****

Группа: Участник
Сообщений: 758
Регистрация: 27-08-08
Пользователь №: 39 839



Подниму темку в связи со схожим вопросом...
Цитата(prottoss @ Dec 18 2015, 14:19) *
Построил USB MSD устройство. Столкнулся с вот такой проблемой:

Если ставлю IN FIFO для EP1 =512 или более - передача в хост затыкается на команде SCSI Read10 чтения 0 сектора. Состояние регистров EP1 IN становится вот такое:
В регистре DIEPCTL1 бит EPENA установлен, что говорит о том, что точка занята (в режиме передачи).
В регистре DIEPSIZ1 поле PKTCNT равно количеству 64 бит пакетов, т.е. 512/64 = 8. Поле XFRSIZ = 0;
В регистре DTXFSTS1 поле INEPTFSAV = 0 - Буфер полный.

Хост, при этом, передачу не видит.


CDC устройство (свое), данные ходят через BULK EP1. Работает все, кроме передачи данных от девайса к хосту (при этом через EP0 ответы проходят нормально, код пересылки данных на 99% общий). После записи в TX FIFO EP1 остается в таком виде:
DIEPCTL1 = 0x80498040, т.е. EPENA установлен
DIEPSIZ1 = 0x80000, поле PKTCNT=1, поле XFRSIZ = 0 (изначально отправлялся 1 пакет размером 5 байт, соответственно было 0x80005)
DTXFSTS1 = 14, исходный размер был 16 слов, записал 5байт (=2 слова), т.е. все логично.
Если писать данные дальше, то буфер заполняется и все. crying.gif

Ситуация почти 1:1 с Вашей, интересно что это может быть, и чем все закончилось у Вас?
P.S. Да, камень STM32F746

Сообщение отредактировал Шаманъ - Mar 19 2017, 21:11
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Mar 20 2017, 00:43
Сообщение #79


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Я эту ситуацию ловил как результат порчи FIFO из-за взаимного перекрытия областей разных ендпоинтов.
Не совсем как в документации инициализирую GRXFSIZ - если точно по формуле, висим. Попробуйте увеличить, не забывая про размер FIFO (для FS - 1280 байт).
У меня опытным путем получено addplaces = 3
to Шаманъ: а попробовать мой исходник затащить? На каждом углу же предлагаю взять...

CODE
static uint32_t usbd_makefifoparam(uint_fast16_t base, uint_fast16_t size)
{
return ((uint32_t) size << 16) | base;
}

// Преобразование размера в байтах размера данных в требования к fifo
// Расчет аргумента функции HAL_PCDEx_SetRxFiFo, HAL_PCDEx_SetTxFiFo
static uint_fast16_t size2buff4(uint_fast16_t size)
{
const uint_fast16_t size4 = (size + 3) / 4; // размер в 32-бит значениях
return ulmax16(0x10, size4);
}

static void usbd_fifo_initialize(PCD_HandleTypeDef * hpcd, uint_fast16_t fullsize)
{
PCD_TypeDef * const instance = hpcd->Instance;

// DocID028270 Rev 2 (RM0410): 41.11.3 FIFO RAM allocation
// DocID028270 Rev 2 (RM0410): 41.16.6 Device programming model
uint_fast16_t maxoutpacketsize4 = size2buff4(USB_OTG_MAX_EP0_SIZE);
//uint_fast16_t base4;
uint_fast8_t numcontrolendpoints = 1;
uint_fast8_t numoutendpoints = 1;

// при addplaces = 3 появился звук на передаче в трансивер (при 2-х компортах)
// но если CDC и UAC включать поодиночке, обмен не нарушается и при 0.
// todo: найти все-таки документ https://www.synopsys.com/ip_prototyping_kit...tgv2_drd_pc.pdf

uint_fast8_t addplaces = 3;

#if WITHUSBUAC
numoutendpoints += 1;
#if WITHRTS96
enum { nuacinpackets = 1, nuacoutpackets = 1 };
#elif WITHRTS192
enum { nuacinpackets = 1, nuacoutpackets = 1 };
#else /* WITHRTS96 || WITHRTS192 */
enum { nuacinpackets = 2, nuacoutpackets = 2 };
#endif /* WITHRTS96 || WITHRTS192 */
const uint_fast16_t uacinmaxpacket = uasbd_getuacinmaxpacket();
maxoutpacketsize4 = ulmax16(maxoutpacketsize4, nuacoutpackets * size2buff4(VIRTUAL_AUDIO_PORT_DATA_SIZE_OUT));
#endif /* WITHUSBUAC */

#if WITHUSBCDC
numoutendpoints += 2;
#if WITHUSBUAC
#if WITHRTS96 || WITHRTS192
enum { ncdcindatapackets = 3, ncdcoutdatapackets = 4 };
#else /* WITHRTS96 || WITHRTS192 */
enum { ncdcindatapackets = 2, ncdcoutdatapackets = 2 };
#endif /* WITHRTS96 || WITHRTS192 */
#else /* WITHUSBUAC */
enum { ncdcindatapackets = 4, ncdcoutdatapackets = 4 };
#endif /* WITHUSBUAC */

maxoutpacketsize4 = ulmax16(maxoutpacketsize4, ncdcoutdatapackets * size2buff4(VIRTUAL_COM_PORT_DATA_SIZE));
#endif /* WITHUSBCDC */

#if WITHUSBCDCEEM
numoutendpoints += 1;
#if WITHUSBUAC
#if WITHRTS96 || WITHRTS192
enum { ncdceemindatapackets = 3, ncdceemoutdatapackets = 4 };
#else /* WITHRTS96 || WITHRTS192 */
enum { ncdceemindatapackets = 2, ncdceemoutdatapackets = 2 };
#endif /* WITHRTS96 || WITHRTS192 */
#else /* WITHUSBUAC */
enum { ncdceemindatapackets = 4, ncdceemoutdatapackets = 4 };
#endif /* WITHUSBUAC */

maxoutpacketsize4 = ulmax16(maxoutpacketsize4, ncdceemoutdatapackets * size2buff4(USBD_CDCEEM_BUFSIZE));
#endif /* WITHUSBCDCEEM */

uint_fast16_t base4;
uint_fast16_t size4;

{
/* Установить размер RX FIFO */
// (4 * number of control endpoints + 6) +
// ((largest USB packet used / 4) + 1 for status information) +
// (2 * number of OUT endpoints) +
// 1 for Global NAK
size4 =
(4 * numcontrolendpoints + 6) +
(maxoutpacketsize4 + 1) +
(2 * numoutendpoints) +
1 +
addplaces;

instance->GRXFSIZ = size4;
base4 = size4;

/* Установить размер TX FIFO EP0 */
size4 = 2 * (size2buff4(USB_OTG_MAX_EP0_SIZE) + 0);
instance->DIEPTXF0_HNPTXFSIZ = usbd_makefifoparam(base4, size4);
base4 += size4;
}

#if WITHUSBUAC
{
/* endpoint передачи звука в компютер */
const uint_fast8_t pipe = USBD_EP_ISOC_IN & 0x7F;

size4 = nuacinpackets * (size2buff4(uacinmaxpacket) + 0);
instance->DIEPTXF [pipe - 1] = usbd_makefifoparam(base4, size4);
base4 += size4;
}

#endif /* WITHUSBUAC */

#if WITHUSBCDC

{
/* полнофункциональное устройство */
const uint_fast8_t pipe = USBD_EP_CDC_IN & 0x7F;

size4 = ncdcindatapackets * (size2buff4(VIRTUAL_COM_PORT_DATA_SIZE) + 0);
instance->DIEPTXF [pipe - 1] = usbd_makefifoparam(base4, size4);
base4 += size4;
}

/* Эти endpoints не используются для обмена */
size4 = 0x10;
instance->DIEPTXF [(USBD_EP_CDC_INT & 0x7F) - 1] = usbd_makefifoparam(base4, size4);
instance->DIEPTXF [(USBD_EP_CDC_INb & 0x7F) - 1] = usbd_makefifoparam(base4, size4);
instance->DIEPTXF [(USBD_EP_CDC_INTb & 0x7F) - 1] = usbd_makefifoparam(base4, size4);

#endif /* WITHUSBCDC */

#if WITHUSBCDCEEM

{
/* полнофункциональное устройство */
const uint_fast8_t pipe = USBD_EP_CDCEEM_IN & 0x7F;

size4 = ncdceemindatapackets * (size2buff4(USBD_CDCEEM_BUFSIZE) + 0);
instance->DIEPTXF [pipe - 1] = usbd_makefifoparam(base4, size4);
base4 += size4;
}

#endif /* WITHUSBCDCEEM */

USB_FlushRxFifo(instance);
USB_FlushTxFifoAll(instance);

if ((base4 * 4) > fullsize)
{
char b [32];
debug_printf_P(PSTR("usbd_fifo_initialize error: base4=%u, fullsize=%u\n"), (base4 * 4), fullsize);
local_snprintf_P(b, sizeof b / sizeof b [0], PSTR("used=%u"), (base4 * 4));
display_setcolors(COLOR_RED, BGCOLOR);
display_at(0, 0, cool.gif;
for (;;)
;
}
else
{
debug_printf_P(PSTR("usbd_fifo_initialize: base4=%u, fullsize=%u\n"), (base4 * 4), fullsize);
#if 0
// Диагностическая выдача использованного объёма FIFO RAM
char b [32];

local_snprintf_P(b, sizeof b / sizeof b [0], PSTR("used=%u"), (base4 * 4));
display_setcolors(COLOR_GREEN, BGCOLOR);
display_at(0, 0, cool.gif;
local_delay_ms(2000);
#endif
}
}


Сообщение отредактировал Genadi Zawidowski - Mar 20 2017, 00:50
Go to the top of the page
 
+Quote Post
Шаманъ
сообщение Mar 20 2017, 06:05
Сообщение #80


Знающий
****

Группа: Участник
Сообщений: 758
Регистрация: 27-08-08
Пользователь №: 39 839



Цитата(Genadi Zawidowski @ Mar 20 2017, 03:43) *
Я эту ситуацию ловил как результат порчи FIFO из-за взаимного перекрытия областей разных ендпоинтов.

Геннадий приветствую!
Спасибо за ответ. Я вчера обнаружил похожую тему https://community.st.com/thread/15083

Вот оттуда про магическое число 3 sm.gif:
Цитата
I have found this comment in the HAL_PCDEx_SetTxFiFo function code (Cube lib 1.6.0):

"When DMA is used 3n * FIFO locations should be reserved for internal DMA registers"


Но тут речь про TXFIFO и про DMA. У Вас же RXFIFO, а у меня DMA нет...

Цитата
Не совсем как в документации инициализирую GRXFSIZ - если точно по формуле, висим. Попробуйте увеличить, не забывая про размер FIFO (для FS - 1280 байт).
У меня опытным путем получено addplaces = 3

Причем, что интересно EP0 работает нормально, а у нее FIFO как раз за RXFIFO - получается фигня какая-то...

Цитата
to Шаманъ: а попробовать мой исходник затащить? На каждом углу же предлагаю взять...

Заглянул - у меня совсем другая концепция построения модуля (я не пытаюсь сваять еще одного сколь-либо универсального монстра - минимум кода, минимум памяти, максимум быстродействия). Библиотеки от STM я не использую - все свое. Но всеравно спасибо!

Кстати про FIFO и доки. В доках написано несколько туманно, но по факту OTG_DIEPTXF0 и OTG_DIEPTXF1 адресуют один и тот же регистр.

Кстати, а какие размеры fifo и их адреса вызывали проблемы, а какие были рабочими? Может удастся установить связь и найти корень зла sm.gif
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Mar 20 2017, 08:42
Сообщение #81


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Рабочие в проекте. Проблемы если по формуле (там где кодичество IN уendpoints итак далее учитываетмся). GRXFSIZ увеличивайте пока не заработает. DMA я не использовал (хотя и с ним работает).
Или - попробуйте для TX FIFO выделять память от конца - а в GRXFSIZ все что останется...

Или - срисуйте с моего проекта для Вашего конкретного случая распределение памяти FIFO под CDC - и проверьте, работает или нет, что виновато - остальной код или эта часть.
Да хоть пополам разделите 1280.

ps: в аттачменте - тестовый бинарник под плату STM32F746G-DISCO, на FS порту создает два компорта и аудио. Один из компортов - кенвудовский CAT.

Сообщение отредактировал Genadi Zawidowski - Mar 20 2017, 08:52
Прикрепленные файлы
Прикрепленный файл  tc1_stm32f746zg_rom_DISCO.zip ( 161.29 килобайт ) Кол-во скачиваний: 9
Прикрепленный файл  Storch_HF_TRX_CAT.zip ( 1.24 килобайт ) Кол-во скачиваний: 9
Прикрепленный файл  ___________________________.pdf ( 1.45 мегабайт ) Кол-во скачиваний: 10
 
Go to the top of the page
 
+Quote Post
Шаманъ
сообщение Mar 20 2017, 10:03
Сообщение #82


Знающий
****

Группа: Участник
Сообщений: 758
Регистрация: 27-08-08
Пользователь №: 39 839



Цитата(Genadi Zawidowski @ Mar 20 2017, 11:42) *
Проблемы если по формуле (там где кодичество IN уendpoints итак далее учитываетмся). GRXFSIZ увеличивайте пока не заработает.

У меня изначально под RXFIFO выделялось памяти намного больше, чем в формуле. Одну проблему нашел, исправил, проблема была очень глупой (описка).

Получил первый пакет на компе (пока в сниффере). Потом затык с теми же симптомами. Вызывает подозрение этот фрагмент (стрелочками отметил, что это такое непонятно):
Прикрепленное изображение


Цитата
/* Эти endpoints не используются для обмена */
size4 = 0x10;
instance->DIEPTXF [(USBD_EP_CDC_INT & 0x7F) - 1] = usbd_makefifoparam(base4, size4);
instance->DIEPTXF [(USBD_EP_CDC_INb & 0x7F) - 1] = usbd_makefifoparam(base4, size4);
instance->DIEPTXF [(USBD_EP_CDC_INTb & 0x7F) - 1] = usbd_makefifoparam(base4, size4);


И у Вас получается туда что-либо записать? У меня регистры у отключенных эндпоинтов совершенно мертвые (возвращают 0, запись игнорируют).

Цитата(Genadi Zawidowski @ Mar 20 2017, 11:42) *
ps: в аттачменте - тестовый бинарник под плату STM32F746G-DISCO, на FS порту создает два компорта и аудио. Один из компортов - кенвудовский CAT.

Спасибо, но дискавери у меня нет rolleyes.gif
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Mar 20 2017, 12:56
Сообщение #83


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



1) эти неиспользуемые ендпоинты инициализируются обычном способом, просто не выделяется память под буферы (а так как написано).
2) Ты помнишь, что в OTG_FS DMA отсутствует?
3) производительность, простота... Я начал тоже с написания с чистого листа (только заглядывая в кубокод). Это было после того как за месяц аналогичным способом поднял USB DEVICE на Renesas. Уткнувшись в стену через пару недель, решил сперва поднять как работает (и получил железно работающий интерфейс CDC+AUDIO). И за 33 дня (trial period USBLyzer-а) все закончил. Сейчас я пожалуй под структуру от ST склонен перетащить версию под Renesas, чем сильно менять то что работает. Но полигон в любом случае есть.
4) по логу: смотреть кто за кем... без этого могу предположить что в 13 строке инициировано чтение и в 14 удачно завершилось - десяток байт передан. А что в 15 строке не понял... Или не получилось начать передачу. Или это неудачно завершилась ранее инициированная операция. НЕ знаю как с этим логгером работать (варишарк?)


Сообщение отредактировал Genadi Zawidowski - Mar 20 2017, 14:06
Go to the top of the page
 
+Quote Post
controller_m30
сообщение Mar 20 2017, 14:01
Сообщение #84


Местный
***

Группа: Участник
Сообщений: 356
Регистрация: 24-02-09
Пользователь №: 45 309



У меня был похожий случай недавно (на USB CDC), что данные от Хоста к устройству шли нормально, а от устройства к Хосту ни в какую.
Дескрипторы устройства были классические (EP1 IN/OUT - данные BULK, EP2 IN - Interrupt), всё вроде должно работать.

А проблема была в том, что конечную точку EP2 я забыл проинициализировать в контроллере. Я через неё отправлять ничего не собирался и забыл про неё, но Хост, зная из дескрипторов что эта точка есть, периодически (но крайне редко) - делал к ней запрос. Я этот запрос в логах даже найти не мог, т.к. он был 1 раз на 255 кадров SOF.
А поскольку EP2 не была инициализирована в железе, то она никак не отвечала на этот запрос: ни ACK, ни NACK ни как-то ещё. И Хост вообще прекращал делать запросы типа IN не только к EP2 IN но и к EP1 IN. В результате данные от устройства к Хосту не читались. Но передавались от Хоста к устройству исправно.

Когда я вспомнил-таки про EP2 и инициализировал её - данные от EP1 пошли нормально. У меня эта точка ничего не делает, просто отвечает NACK на запрос от Хоста, и всё.
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Mar 20 2017, 14:09
Сообщение #85


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Добавлю - особенно хорошо проявляются такие забытые ендпоинты при работе через хаб. Во всяком случае, у меня было такое как и у Вас - совсем необслуживаемая точка не мешала работать компорту при прямом подключении и прекращала всякой обмен при подключении через хаб.

Сообщение отредактировал Genadi Zawidowski - Mar 20 2017, 14:10
Go to the top of the page
 
+Quote Post
Шаманъ
сообщение Mar 20 2017, 15:03
Сообщение #86


Знающий
****

Группа: Участник
Сообщений: 758
Регистрация: 27-08-08
Пользователь №: 39 839



Цитата(Genadi Zawidowski @ Mar 20 2017, 15:56) *
1) эти неиспользуемые ендпоинты инициализируются обычном способом, просто не выделяется память под буферы (а так как написано).

Что значит обычным способом? Попробуте как-нибудь ради прикола что-то записать регистр конфигурации ФИФО неиспользуемой точки.
Цитата
2) Ты помнишь, что в OTG_FS DMA отсутствует?

Да, мне ДМА не нужен, соответственно не использую.
Цитата
3) производительность, простота... Я начал тоже с написания с чистого листа (только заглядывая в кубокод). Это было после того как за месяц аналогичным способом поднял USB DEVICE на Renesas. Уткнувшись в стену через пару недель, решил сперва поднять как работает (и получил железно работающий интерфейс CDC+AUDIO). И за 33 дня (trial period USBLyzer-а) все закончил.

Ну у меня пока с чистого листа это дело заняло три дня, из которых один потрачен на идиотскую ошибку с распределением ФИФО и эту последнюю нерешенную проблему - врод все не так уж и плохо.
Цитата
по логу: смотреть кто за кем... без этого могу предположить что в 13 строке инициировано чтение и в 14 удачно завершилось - десяток байт передан. А что в 15 строке не понял... Или не получилось начать передачу. Или это неудачно завершилась ранее инициированная операция. НЕ знаю как с этим логгером работать (варишарк?)

Я тоже в этом логгере не силен, есть подозрение, что это вообще глюк логгера. Там вдруг посылается 10 байт через нулевую точку как будто это BULK точка. Перелопатил уже все, что можно, ну не посылаю я ничего такого, и само оно не может уйти - или глюк железки/ее инициализации, или логгер.

Сейчас вообще весело - первый пакет уходит и я его вижу в логгере. Но из очереди (в STMме в смысле) он не убирается и за ним уже ничего в сторону хоста не ходит.

Цитата(controller_m30 @ Mar 20 2017, 17:01) *
А проблема была в том, что конечную точку EP2 я забыл проинициализировать в контроллере. Я через неё отправлять ничего не собирался и забыл про неё, но Хост, зная из дескрипторов что эта точка есть, периодически (но крайне редко) - делал к ней запрос. Я этот запрос в логах даже найти не мог, т.к. он был 1 раз на 255 кадров SOF.

А вот это теплее. Дело в том, что я EP2 не использую, и в дескрипторе она не объявлена у меня. Она ведь исходя из стандарта опциональная, или нет? Наверное от безисходности щас переделаю дескрипторы 1:1 как у STM, и добавлю еще одну точку.

Сообщение отредактировал Шаманъ - Mar 20 2017, 15:06
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Mar 20 2017, 17:38
Сообщение #87


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Дополнил инициализацию отладочной печатью:
Код
v1=00000000
v2=00000000
v3=00000000
v4=0010013D
v5=0010013D
v6=0010013D
usbd_fifo_initialize: base4=1268, fullsize=1280

Код
    /* Эти endpoints не используются для обмена */
    size4 = 0x10;
    debug_printf_P(PSTR("v1=%08lX\n"), instance->DIEPTXF [(USBD_EP_CDC_INT & 0x7F) - 1]);
    debug_printf_P(PSTR("v2=%08lX\n"), instance->DIEPTXF [(USBD_EP_CDC_INb & 0x7F) - 1]);
    debug_printf_P(PSTR("v3=%08lX\n"), instance->DIEPTXF [(USBD_EP_CDC_INTb & 0x7F) - 1]);
    instance->DIEPTXF [(USBD_EP_CDC_INT & 0x7F) - 1] = usbd_makefifoparam(base4, size4);
    instance->DIEPTXF [(USBD_EP_CDC_INb & 0x7F) - 1] = usbd_makefifoparam(base4, size4);
    instance->DIEPTXF [(USBD_EP_CDC_INTb & 0x7F) - 1] = usbd_makefifoparam(base4, size4);
    debug_printf_P(PSTR("v4=%08lX\n"), instance->DIEPTXF [(USBD_EP_CDC_INT & 0x7F) - 1]);
    debug_printf_P(PSTR("v5=%08lX\n"), instance->DIEPTXF [(USBD_EP_CDC_INb & 0x7F) - 1]);
    debug_printf_P(PSTR("v6=%08lX\n"), instance->DIEPTXF [(USBD_EP_CDC_INTb & 0x7F) - 1]);

Они не используются, но вполне себе инициализированные.
Go to the top of the page
 
+Quote Post
Шаманъ
сообщение Mar 20 2017, 19:05
Сообщение #88


Знающий
****

Группа: Участник
Сообщений: 758
Регистрация: 27-08-08
Пользователь №: 39 839



Цитата(Genadi Zawidowski @ Mar 20 2017, 20:38) *
Дополнил инициализацию отладочной печатью:

Забавно, а у меня что-либо поменять получается только в EP0/EP1...Блин это даже не смешно, но в заголовочном файле была ошибка... 1111493779.gif

Переделал на три точки (как у СТМ), поставил USBlyser - правильный инструмент. Теперь вижу откуда были 10байтные передачи данных на control pipe - это драйвер использовал ее вместо дополнительной Interrupt точки. Также вижу где начинаются проблемы, результата правда пока нет...
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Mar 20 2017, 19:06
Сообщение #89


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Цитата
но в заголовочном файле была ошибка

В студию...

зы: с каким кварцем макет? - попробую по приколу тест сделать для твоей платы.

Сообщение отредактировал Genadi Zawidowski - Mar 20 2017, 19:09
Go to the top of the page
 
+Quote Post
Шаманъ
сообщение Mar 20 2017, 19:52
Сообщение #90


Знающий
****

Группа: Участник
Сообщений: 758
Регистрация: 27-08-08
Пользователь №: 39 839



Цитата(Genadi Zawidowski @ Mar 20 2017, 22:06) *
В студию...


У меня он оказался очень древним, все собирался скачать посвежее, но оно ж работает. В структуре забыли __IO в одном месте. Версия файла 0.9.5 (сейчас скачал свежий, он почти в два раза больше по объему и моложе на 1.5года 1111493779.gif и версия значится 1.2.0). Регистры теперь меняются, как надо, но результат +- такой же:
Прикрепленное изображение


Там где зеленым выделено это я отдал хосту 70байт (все прошло нормально). А вот с красного начались проблемы...видать что-то профтыкал я laughing.gif, наверное надо еще раз сделать RTFM по стандарту и скупым докам от STM... Да, терминалом нормально порт открывается и данные от хоста к девайсу ходят.

Цитата
зы: с каким кварцем макет? - попробую по приколу тест сделать для твоей платы.

8MГц это все вокруг платки от WaveShare Core746I построено.
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Mar 20 2017, 20:01
Сообщение #91


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Вот версия с внутренним генератором, теоретически должна поднять USB FS на любой макетке.
Цитата
Там где зеленым выделено это я отдал хосту 70байт (все прошло нормально). А вот с красного начались проблемы...

Нда... ендпоинт ушел в себя... Кстати, для понимания - FIFO у них (STM32F746) не для байтов, а для пакетов. вычитывать только целиком.

Сообщение отредактировал Genadi Zawidowski - Mar 20 2017, 20:09
Прикрепленные файлы
Прикрепленный файл  tc1_stm32f746zg_rom.zip ( 158.67 килобайт ) Кол-во скачиваний: 10
 
Go to the top of the page
 
+Quote Post
Шаманъ
сообщение Mar 20 2017, 20:38
Сообщение #92


Знающий
****

Группа: Участник
Сообщений: 758
Регистрация: 27-08-08
Пользователь №: 39 839



Народ, я тут всех поставил на уши, а потом подключил девайс к машине на которой восьмерка (до этого смотрел на старой машине с ХР), и о чудо он отсылает данные обратно sm.gif Теперь проверить надо туда и назад...

Цитата(Genadi Zawidowski @ Mar 20 2017, 23:01) *
Нда... ендпоинт ушел в себя... Кстати, для понимания - FIFO у них (STM32F746) не для байтов, а для пакетов. вычитывать только целиком.

Да я в курсе, там два пакета было - 64 байта и остаток.
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Mar 20 2017, 20:40
Сообщение #93


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Попробуй мой тест на XP - у меня работало (терминалкой ;;; - в ответ ?;)

Сообщение отредактировал Genadi Zawidowski - Mar 20 2017, 20:40
Go to the top of the page
 
+Quote Post
Шаманъ
сообщение Mar 20 2017, 21:04
Сообщение #94


Знающий
****

Группа: Участник
Сообщений: 758
Регистрация: 27-08-08
Пользователь №: 39 839



Цитата(Genadi Zawidowski @ Mar 20 2017, 23:40) *
Попробуй мой тест на XP - у меня работало (терминалкой ;;; - в ответ ?;)

А что оно еще делает на 400кБ?

Убрал одну EP. Итог - в сторону хоста проходит только первая посылка и все. Ладно буду завтра пилить дальше, есть кое какие мысли почему так...
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Mar 20 2017, 21:16
Сообщение #95


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



На одном из двуз компортов - Kenwood CAT. На объем не обращай внимания, там DSP трансивер внутри... таблицы синусов разные... без выхода наружу. Проверил бы... прошить минутное дело. Хоть сказал бы, опознается или нет.

А что за проблема с interrupt endpoint? на 746 для аудио+компорты впритык хватает. То что XP без interrupt endpoint CDC не работает я где-то писал уже.

Сообщение отредактировал Genadi Zawidowski - Mar 20 2017, 21:09
Go to the top of the page
 
+Quote Post
Alechek
сообщение Mar 21 2017, 03:52
Сообщение #96


Профессионал
*****

Группа: Свой
Сообщений: 1 241
Регистрация: 15-11-05
Из: Челябинск
Пользователь №: 10 882



Цитата(Шаманъ @ Mar 21 2017, 01:38) *
Народ, я тут всех поставил на уши, а потом подключил девайс к машине на которой восьмерка (до этого смотрел на старой машине с ХР), и о чудо он отсылает данные обратно sm.gif Теперь проверить надо туда и назад...

"Cтарая" XP (SP2) и "новая" XP (SP3) - тоже 2 большие разницы. Драйвер CDC в SP3 сильно переработали. Точно что-то поменяли в случае, если размер передачи кратен размеру EP
Go to the top of the page
 
+Quote Post
Шаманъ
сообщение Mar 21 2017, 04:20
Сообщение #97


Знающий
****

Группа: Участник
Сообщений: 758
Регистрация: 27-08-08
Пользователь №: 39 839



Цитата(Genadi Zawidowski @ Mar 21 2017, 00:16) *
Проверил бы... прошить минутное дело. Хоть сказал бы, опознается или нет.

Дело не минутное - надо разобрать девайс, чтобы отключить TFT (поскольку без инициализации LTDC он будет в очень нехорошем состоянии, которое приводит к его медленной деградации). Разбирать довольно долго. Учитывая написанное выше и ниже не уверен, что эта операция что-либо решит.

Цитата
А что за проблема с interrupt endpoint? на 746 для аудио+компорты впритык хватает. То что XP без interrupt endpoint CDC не работает я где-то писал уже.

Мне не хватает - без interrupt EP того, что есть у USB FS хватает впритык (еще бы парочка была кстати, но тут была проблема с распределением других интерфейсов/разводкой платы, в итоге USB HS вытянуть не получилось).

Цитата(Alechek @ Mar 21 2017, 06:52) *
"Cтарая" XP (SP2) и "новая" XP (SP3) - тоже 2 большие разницы. Драйвер CDC в SP3 сильно переработали. Точно что-то поменяли в случае, если размер передачи кратен размеру EP

Спасибо! Теперь припоминаю, что там были проблемы с этим драйвером, из-за чего его особо и не использовал никто. Наверное пора обновиться sm.gif.
Go to the top of the page
 
+Quote Post
Шаманъ
сообщение Mar 21 2017, 05:28
Сообщение #98


Знающий
****

Группа: Участник
Сообщений: 758
Регистрация: 27-08-08
Пользователь №: 39 839



XP таки была "новая" в смысле XP SP3
Go to the top of the page
 
+Quote Post
Шаманъ
сообщение Mar 21 2017, 14:32
Сообщение #99


Знающий
****

Группа: Участник
Сообщений: 758
Регистрация: 27-08-08
Пользователь №: 39 839



Цитата(Genadi Zawidowski @ Mar 21 2017, 00:16) *
Проверил бы... прошить минутное дело. Хоть сказал бы, опознается или нет.

Отчитываюсь, разобрал девайс, отлючил ТФТ, залил - работает. Я тут у себя еще нарыл проблем, коротче буду искать. За файл спасибо - теперь понятно, что работать должно...
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Mar 21 2017, 14:45
Сообщение #100


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Спасибо. На какой операционной системе проверялось? На XP SP3 мой файл проверял?
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 24th July 2025 - 11:15
Рейтинг@Mail.ru


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