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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> Код получения прерывания от RXSETUP на SAM7S
Shaienn
сообщение Nov 30 2009, 12:10
Сообщение #16


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

Группа: Участник
Сообщений: 103
Регистрация: 21-06-09
Пользователь №: 50 494



Вот функция конфигурирования конечной точки. Для нулевой точки пишу size = 8.

CODE
//------------------------------------------------------------------------------
/// Конфигурирование конечной точки
//------------------------------------------------------------------------------
static void ConfigureEndpoint(const int EndpointNum)
{
unsigned char Type;
unsigned char EndpointDir;
if (EndpointNum == 0)
{
Endpoint[EndpointNum].size=8;
Type= 0;
EndpointDir = 0;
}
else
{
//Other Endpoints
}

//Настройка регистра UDP_ CSRx [x = EndpointNumber]
SET_CSR(EndpointNum, (unsigned int)AT91C_UDP_EPEDS | (Type << 8) | (EndpointDir << 10));
Endpoint[EndpointNum].state = UDP_ENDPOINT_IDLE;
if (Type == 0) //Если точка контрольная, то разрешить прерывание EPxINT [x = EndpointNumber]
{
AT91C_BASE_UDP->UDP_IER = (1 << EndpointNum);
}
}


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

А это:
Код
if (count!=0){return;}        
                        count++;


Для того, чтобы прошел только один RXSETUP... smile.gif
Причина редактирования: Уменьшение видимого размера цитаты исходника.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Nov 30 2009, 12:37
Сообщение #17


Гуру
******

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



Цитата(Shaienn @ Nov 30 2009, 15:10) *
Для того, чтобы прошел только один RXSETUP... smile.gif

Уберите, зачем самоломающийся код нужен?
Go to the top of the page
 
+Quote Post
Shaienn
сообщение Dec 1 2009, 12:37
Сообщение #18


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

Группа: Участник
Сообщений: 103
Регистрация: 21-06-09
Пользователь №: 50 494



Уважаемый aaarrr, изучил тему с Вашим участием. Посмотрел пример Protossa. Сравнил со своим. Ну все так же. Но так и не отправляет последние два байта дескриптора, хотя почему-то происходит запрос SET_ADDRESS.

Не могли бы Вы заглянуть в мой проект, может и я банально затупил где-нибудь. Знаю, что тратите свое время. Буду очень благодарен.

Прикрепленный файл  ARM_USB.rar ( 335.65 килобайт ) Кол-во скачиваний: 106
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Dec 1 2009, 12:48
Сообщение #19


Гуру
******

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



Цитата(Shaienn @ Dec 1 2009, 15:37) *
Но так и не отправляет последние два байта дескриптора, хотя почему-то происходит запрос SET_ADDRESS.

Да не нужны хосту ваши последние два байта (точнее, ему вообще нужны только первые 8) - он адрес установить хочет поскорее! Полностью дескриптор будет запрошен после.
Так что добавьте обработку запроса SET_ADDRESS, и все будет в порядке.
Go to the top of the page
 
+Quote Post
Shaienn
сообщение Dec 1 2009, 14:14
Сообщение #20


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

Группа: Участник
Сообщений: 103
Регистрация: 21-06-09
Пользователь №: 50 494



Ага спасибо. Процесс дошел до получения дескриптора конфигурации. В нем есть поле wTotalLength - общий объем данных (в байтах) возвращаемый для данной конфигурации.

Это поле равно:
Код
sizeof(USBConfigurationDescriptor)+sizeof(USBInterfaceDescriptor)


Или нет?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Dec 1 2009, 14:21
Сообщение #21


Гуру
******

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



Цитата(Shaienn @ Dec 1 2009, 17:14) *
Или нет?

Нет, еще как минимум сумма длин дескрипторов endpoint'ов.
Go to the top of the page
 
+Quote Post
Shaienn
сообщение Dec 2 2009, 15:11
Сообщение #22


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

Группа: Участник
Сообщений: 103
Регистрация: 21-06-09
Пользователь №: 50 494



2aaarrr
Ок. Устройство распознается windows как неизвестное.

Немного не понимаю процесс конфигурирования. После запроса GET_CONFIGURATION отправляется дескриптор конфигурации в котором есть общая длина данных для передачи, включая, как Вы и сказали, длину дескриптора конфигурации, дескриптора интерфейса и двух точек. Также а дескрипторе конфигурации говорится, что данная конфигурация имеет один интерфейс. После отправки дескриптора конфигурации мне нужно ждать GET_INTERFACE_DESCRIPTOR? Или уже начинается работа драйвера для моего устройства? И в какой момент времени должен отправляться дескриптор первой точки, а когда второй.

smile.gif Спасибо за Вашу помощь.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Dec 2 2009, 15:46
Сообщение #23


Гуру
******

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



На запрос конфигурации Вы должны отправить все сразу - дескриптор конфигурации, дескрипторы интерфейсов и конечных точек. После этого получите SET_CONFIGURATION, и начиная с этого момента сможете работать с устройством через свой драйвер.
Go to the top of the page
 
+Quote Post
Shaienn
сообщение Dec 4 2009, 12:05
Сообщение #24


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

Группа: Участник
Сообщений: 103
Регистрация: 21-06-09
Пользователь №: 50 494



А SET_CONFIGURATION приходит после того, как я установил драйвер в windows или вне зависимости от него?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Dec 4 2009, 12:37
Сообщение #25


Гуру
******

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



После.
Go to the top of the page
 
+Quote Post
Shaienn
сообщение Dec 9 2009, 15:59
Сообщение #26


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

Группа: Участник
Сообщений: 103
Регистрация: 21-06-09
Пользователь №: 50 494



Добрый день.
Продолжаю свою эпопею.

Собрал в DriverStudio драйвер под свой девайс. Драйвер ставится, но выдает код 10 (невозможно запустить устройство). В микроконтроллере приходит SET_CONFIGURATION с номером конфигурации 0.
Видимо дело в драйвере.

У отсылаю такой общий дескриптор:
CODE

const DriverConfigurationDescriptors driverConfigurationDescriptor =
{
{
sizeof(USBConfigurationDescriptor),
USBGenericDescriptor_CONFIGURATION,
sizeof(DriverConfigurationDescriptors),
0, // No interface in this configuration
1, // This is configuration #1
0, // No string descriptor for this configuration
0,
USBConfigurationDescriptor_POWER(100)
},
{
sizeof(USBInterfaceDescriptor),
USBGenericDescriptor_INTERFACE,
0, // This is interface #0
0, // This is setting #0 for interface
2, // Interface has 2 endpoint
0, // No interface class code
0, // No interface subclass code
0, // No interface protocol code
0, // No string descriptor
},
{
sizeof(USBEndpointDescriptor),
USBGenericDescriptor_ENDPOINT,
(((0 & 0x01) << 7) | (1 & 0xF)),
2,
0x01,
0x00 // Does not apply to Bulk endpoints
},
// Bulk-IN endpoint descriptor
{
sizeof(USBEndpointDescriptor),
USBGenericDescriptor_ENDPOINT,
(((1 & 0x01) << 7) | (2 & 0xF)),
2,
0x01,
0x00 // Does not apply to Bulk endpoints
}

} ;


То есть хочу две точки, на вход и на выход.

Точки настроил так:
CODE

//------------------------------------------------------------------------------
/// Конфигурирование конечной точки
//------------------------------------------------------------------------------
static void ConfigureEndpoint0(void)
{
const int EndpointNum = 0;
AT91C_BASE_UDP->UDP_RSTEP = AT91C_UDP_EP0;
AT91C_BASE_UDP->UDP_RSTEP = 0;
Endpoint[EndpointNum].size=8;
SET_CSR(0,(unsigned int)AT91C_UDP_EPEDS | (0 << 8) | (0 << 7));
AT91C_BASE_UDP->UDP_FADDR = AT91C_UDP_FEN;
AT91C_BASE_UDP->UDP_IER = (1 << EndpointNum);
}

//------------------------------------------------------------------------------
/// Конфигурирование конечной точки
//------------------------------------------------------------------------------
static void ConfigureEndpoint1(void)
{
const int EndpointNum = 1;
AT91C_BASE_UDP->UDP_RSTEP = AT91C_UDP_EP1;
AT91C_BASE_UDP->UDP_RSTEP = 0;
Endpoint[EndpointNum].size=64;
SET_CSR(1,(unsigned int)AT91C_UDP_EPEDS | AT91C_UDP_EPTYPE_BULK_OUT | (1<<7));
AT91C_BASE_UDP->UDP_FADDR = AT91C_UDP_FEN;
}

//------------------------------------------------------------------------------
/// Конфигурирование конечной точки
//------------------------------------------------------------------------------
static void ConfigureEndpoint2(void)
{
const int EndpointNum = 2;
AT91C_BASE_UDP->UDP_RSTEP = AT91C_UDP_EP2;
AT91C_BASE_UDP->UDP_RSTEP = 0;
Endpoint[EndpointNum].size=64;
SET_CSR(1,(unsigned int)AT91C_UDP_EPEDS | AT91C_UDP_EPTYPE_BULK_IN | (0<<7));
AT91C_BASE_UDP->UDP_FADDR = AT91C_UDP_FEN;
}


Из за чего вообще такое может происходить? Укажите направление раскопок smile.gif



PS Раскопал. В конфигурационном дескрипторе сказал, что для данной конфигурации нет интерфейса.... smile.gif

Сообщение отредактировал Shaienn - Dec 9 2009, 16:02
Go to the top of the page
 
+Quote Post
Shaienn
сообщение Jan 9 2010, 15:37
Сообщение #27


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

Группа: Участник
Сообщений: 103
Регистрация: 21-06-09
Пользователь №: 50 494



Добрый день. После небольшой паузы возвращаюсь к этой задаче.
Используя WinDriver собрал драйвер для устройства и сейчас пытаюсь отправить что-то с микроконтроллера в windows.

написал следующую функцию:
Код
unsigned char Send64BytePacket(unsigned char EndpointNum, const void *pData)
{
unsigned int Length;
//Подготовка данных
if((AT91C_BASE_UDP->UDP_CSR[EndpointNum] & AT91C_UDP_TXPKTRDY)==0)
{
Length = sizeof(pData);
if (Length%Endpoint[EndpointNum].size == 0)
            {
            Endpoint[EndpointNum].options = SEND_ZERO_LENGTH_PKT;
            }
Endpoint[EndpointNum].remaining = Length;
Endpoint[EndpointNum].pData = (void *)pData;
//Процесс передачи
while(Endpoint[EndpointNum].remaining!=0)
{
unsigned int status = AT91C_BASE_UDP->UDP_CSR[EndpointNum];    

        if ((status & AT91C_UDP_TXPKTRDY) == 0)
        {
                            if (Endpoint[EndpointNum].remaining != 0) //Не все данные переданы
                                {
                                USB_WriteFIFO(EndpointNum);
                                CLEAR_CSR(EndpointNum,AT91C_UDP_TXCOMP);
                                }
                            else
                                {
                                if (Endpoint[EndpointNum].options == SEND_ZERO_LENGTH_PKT)
                                                    {
                                                    LED_Toggle(0);
                                                    USB_PrepareTransfer(EndpointNum,0,0);
                                                    Endpoint[EndpointNum].options =0;
                                                    }
                                CLEAR_CSR(EndpointNum,AT91C_UDP_TXCOMP);
                                }
        }

}
}
return 1;
}



В сниффере WinDriver`a ничего не вижу, в связи с этим пара вопросов:

а) В результате начальных действий устройство стоит в сконфигурированном состоянии.
Чтобы мне начать пересылку, мне нужно записать данные в FIFO и выставить флаг TXPKTRDY? Т.е. микроконтроллер начинает пересылку с момента появление флага TXPKTRDY в соответствующем UDP_CSR?

б) Посмотрите пожалуйста на дескриптор конечной точки на передачу к хосту:
Код
                      {
        sizeof(USBEndpointDescriptor),
        USBGenericDescriptor_ENDPOINT,
        (((0 & 0x01) << 7) | (2 & 0xF)),
        2,
        0x40,
        0x00                               // Does not apply to Bulk endpoints
                       }


и на инициализацию этой конечной точки:
Код
static void ConfigureEndpoint1(void)
{
const int EndpointNum = 1;
AT91C_BASE_UDP->UDP_RSTEP = AT91C_UDP_EP1;
AT91C_BASE_UDP->UDP_RSTEP = 0;
Endpoint[EndpointNum].size=64;
SET_CSR(1,(unsigned int)AT91C_UDP_EPEDS | AT91C_UDP_EPTYPE_BULK_OUT);
AT91C_BASE_UDP->UDP_FADDR = AT91C_UDP_FEN;
}


Не напортачил ли я где?

Заранее спасибо smile.gif
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jan 9 2010, 15:54
Сообщение #28


Гуру
******

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



Цитата(Shaienn @ Jan 9 2010, 18:37) *
а) В результате начальных действий устройство стоит в сконфигурированном состоянии.
Чтобы мне начать пересылку, мне нужно записать данные в FIFO и выставить флаг TXPKTRDY? Т.е. микроконтроллер начинает пересылку с момента появление флага TXPKTRDY в соответствующем UDP_CSR?

Да.

Цитата(Shaienn @ Jan 9 2010, 18:37) *
б) Посмотрите пожалуйста на дескриптор конечной точки на передачу к хосту:

Это дескриптор OUT-точки, т.е. от хоста к устройству.

Цитата(Shaienn @ Jan 9 2010, 18:37) *
и на инициализацию этой конечной точки:

Здесь та же ошибка, кроме того как-то странно записывать в этой процедуре UDP_FADDR.

Цитата(Shaienn @ Jan 9 2010, 18:37) *
Не напортачил ли я где?

Вот, например:
Код
Length = sizeof(pData);

Length будет всегда равна 4-м.
Go to the top of the page
 
+Quote Post
Shaienn
сообщение Jan 11 2010, 04:23
Сообщение #29


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

Группа: Участник
Сообщений: 103
Регистрация: 21-06-09
Пользователь №: 50 494



Добрый день.

Написал такой тестовый код:
Код
unsigned char Send64BytePacket(unsigned char EndpointNum, const void *pData)
{
char code,*data;
signed int d;
signed int size;
d = 0x1f044a;
size = sizeof(d);
data = (void *)&d;
while(AT91C_BASE_UDP->UDP_CSR[EndpointNum]&AT91C_UDP_TXPKTRDY);
while (size--)
{
AT91C_BASE_UDP->UDP_FDR[EndpointNum] = *data;
data++;    
}
SET_CSR(EndpointNum,AT91C_UDP_TXPKTRDY);

return 1;


Почему я передаю 0x001f044a, а принимаю зеркальное 0x4a041f00? Это особенность USB или мой косяк?

Спасибо.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jan 11 2010, 11:22
Сообщение #30


Гуру
******

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



Цитата(Shaienn @ Jan 11 2010, 07:23) *
Почему я передаю 0x001f044a, а принимаю зеркальное 0x4a041f00? Это особенность USB или мой косяк?

Потому что SAM7 работает в режиме Little Endian. USB тут ни при чем никаким боком.
Go to the top of the page
 
+Quote Post

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

 


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


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