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

 
 
> Код получения прерывания от RXSETUP на SAM7S
Shaienn
сообщение Nov 20 2009, 08:02
Сообщение #1


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

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



Добрый день. Посмотрите пожалуйста код. Ожидается, что при получении Control пакета возникнет бит RXSETUP и будет вызвано прерывание isrUDP, но в прерывание не заходит.

CODE
#include <AT91SAM7S256.H> /* AT91SAMT7S64 definitions */
#include <lib_AT91SAM7S256.h>
/*
* Main Program
*/
int i;
__irq void isrUDP(void)
{
unsigned int status = AT91C_BASE_UDP->UDP_ISR;
AT91PS_UDP pUDP = AT91C_BASE_UDP;
AT91_REG isr = pUDP->UDP_ISR;
AT91_REG csr = pUDP->UDP_CSR[0]; //rejestr csr endpointu 0
if (isr&AT91C_UDP_EPINT0)
{
if (i)
{
AT91C_BASE_PIOA->PIO_SODR = 1;
i = 0;
}
else
{
AT91C_BASE_PIOA->PIO_CODR = 1;
i = 1;
}
}
AT91C_BASE_UDP->UDP_CSR[0] = (0<<AT91C_UDP_RXSETUP);
AT91C_BASE_AIC->AIC_EOICR = status;
}

int main (void) {
AT91C_BASE_PIOA->PIO_PER = (1 << AT91C_PIO_PA0);
AT91C_BASE_PIOA->PIO_OER = 0x00000001;
AT91C_BASE_PMC->PMC_PCER = (1UL << AT91C_ID_PIOA);

// Set the PLL USB Divider
AT91C_BASE_CKGR->CKGR_PLLR |= AT91C_CKGR_USBDIV_1;
AT91C_BASE_PMC->PMC_SCER = AT91C_PMC_UDP; //Разрешили частоту на UDP
AT91C_BASE_PMC->PMC_PCER = (1 << AT91C_ID_UDP);

AT91C_BASE_UDP->UDP_RSTEP = (1 << 0);
AT91C_BASE_UDP->UDP_RSTEP = 0;
AT91C_BASE_UDP->UDP_CSR[0] = AT91C_UDP_EPTYPE_CTRL;
AT91C_BASE_UDP->UDP_CSR[0] = AT91C_UDP_EPEDS;

// Enable UDP PullUp (USB_DP_PUP) : enable & Clear of the corresponding PIO
// Set in PIO mode and Configure in Output
AT91F_PIO_CfgOutput(AT91C_BASE_PIOA,AT91C_PIO_PA16);
// Clear for set the Pul up resistor
AT91F_PIO_ClearOutput(AT91C_BASE_PIOA,AT91C_PIO_PA16);

AT91C_BASE_UDP->UDP_IMR = AT91C_UDP_ENDBUSRES|AT91C_UDP_EPINT0;
AT91C_BASE_AIC->AIC_SVR[AT91C_ID_UDP] = (unsigned int)isrUDP;
AT91C_BASE_AIC->AIC_SMR[AT91C_ID_UDP] = 6;
AT91C_BASE_AIC->AIC_IECR = (1UL << AT91C_ID_UDP);

// Loop forever
for (;;)
{
}
}


При чтении состояния регистра UDP_ISR в главном цикле без прерывания при данных настройках возвращает 0x00000100 (хотя должен 0x00000001). смотрю через дебаггер ulink. При замене AT91C_UDP_EPINT0 на AT91C_UDP_EPINT2 все равно не работает.

Вроде бы все указал... Затык.


Спасибо.
Причина редактирования: Уменьшение видимого объема цитаты исходника.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Shaienn
сообщение Jan 9 2010, 15:37
Сообщение #2


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

Группа: Участник
Сообщений: 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

Сообщений в этой теме
- Shaienn   Код получения прерывания от RXSETUP на SAM7S   Nov 20 2009, 08:02
- - vmp   Почему бы не взять за основу какой-нибудь атмеловс...   Nov 20 2009, 08:46
- - sergeeff   Глобальная переменная i первоначально не инициализ...   Nov 20 2009, 10:50
- - Shaienn   ЦитатаПочему бы не взять за основу какой-нибудь ат...   Nov 20 2009, 11:00
|- - vmp   Цитата(Shaienn @ Nov 20 2009, 14:00) Я бы...   Nov 20 2009, 11:04
- - aaarrr   Цитата(Shaienn @ Nov 20 2009, 11:02) Ожид...   Nov 23 2009, 07:04
- - Shaienn   2vmp Спасибо за ссылку. Куча откровений Цитата(a...   Nov 25 2009, 04:16
|- - aaarrr   Цитата(Shaienn @ Nov 25 2009, 07:16) 1) Я...   Nov 25 2009, 10:40
|- - Shaienn   Цитата(aaarrr @ Nov 25 2009, 14:40) Регис...   Nov 25 2009, 12:33
|- - aaarrr   Цитата(Shaienn @ Nov 25 2009, 15:33) Може...   Nov 25 2009, 14:12
|- - Shaienn   Цитата(aaarrr @ Nov 25 2009, 18:12) В AIC...   Nov 25 2009, 14:18
- - Shaienn   Здравствуйте. Поправьте меня в процессе отправки ...   Nov 29 2009, 15:51
|- - aaarrr   Цитата(Shaienn @ Nov 29 2009, 18:51) Поче...   Nov 29 2009, 17:51
- - Shaienn   RE: Код получения прерывания от RXSETUP на SAM7S   Nov 30 2009, 11:12
- - aaarrr   Код, я бы сказал, малость раздутый. Поле size дейс...   Nov 30 2009, 11:56
- - Shaienn   Вот функция конфигурирования конечной точки. Для н...   Nov 30 2009, 12:10
|- - aaarrr   Цитата(Shaienn @ Nov 30 2009, 15:10) Для ...   Nov 30 2009, 12:37
- - Shaienn   Уважаемый aaarrr, изучил тему с Вашим участием. По...   Dec 1 2009, 12:37
|- - aaarrr   Цитата(Shaienn @ Dec 1 2009, 15:37) Но та...   Dec 1 2009, 12:48
- - Shaienn   Ага спасибо. Процесс дошел до получения дескриптор...   Dec 1 2009, 14:14
|- - aaarrr   Цитата(Shaienn @ Dec 1 2009, 17:14) Или н...   Dec 1 2009, 14:21
- - Shaienn   2aaarrr Ок. Устройство распознается windows как не...   Dec 2 2009, 15:11
- - aaarrr   На запрос конфигурации Вы должны отправить все сра...   Dec 2 2009, 15:46
- - Shaienn   А SET_CONFIGURATION приходит после того, как я уст...   Dec 4 2009, 12:05
- - aaarrr   После.   Dec 4 2009, 12:37
- - Shaienn   Добрый день. Продолжаю свою эпопею. Собрал в Driv...   Dec 9 2009, 15:59
|- - aaarrr   Цитата(Shaienn @ Jan 9 2010, 18:37) а) В ...   Jan 9 2010, 15:54
- - Shaienn   Добрый день. Написал такой тестовый код: Кодunsig...   Jan 11 2010, 04:23
- - aaarrr   Цитата(Shaienn @ Jan 11 2010, 07:23) Поче...   Jan 11 2010, 11:22


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

 


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


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