Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: USB на SAM7 зацикливается в прерывнаии при получении пакета
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
InsolentS
Здравствуйте! С USB устройствами я знаком не очень глубоко, а тут задача встала сделать простенькое, в режиме Bulk. Bulk стек выдрал из кеиловского MSD примера, получилось примерно так:
Код
void USB_EndPoint4 (DWORD event) {
  BYTE buff[64];
  USB_ReadEP(USB_ENDPOINT_OUT(4), buff);    
}

void USB_EndPoint5 (DWORD event) {
  BYTE buff[64]={'H','e','l','l','o',' ','W','o','r','l','d','!',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
,0,0,0,0,0,0,0,0,0};
  USB_WriteEP(USB_ENDPOINT_IN(5), buff, 64);
}

Но: прерывание по 5ому ендпоинту вообще никогда не вызывается, а по 4му:
когда шлю от компа первый пакет данных - он принимается на "ура", всё ок.
Когда шлю второй пакет - устройство зацикливается в прерывании от ендпоинта, причём в buff приходит всякая чушь.
Родной кеиловский MSD работает отлично. Подскажите пожалуйста, где я ступил, такое чувство, что лишнее отрезал, как будто флаг прерывания не сбрасываю, что ли..
InsolentS
Всё, разобрался.
Причина оказалась в том, что кеиловский стек юзает константу
Код
const BYTE  DualBankEP = 0x06;

т.е. считает что только 1ый и 2ой ендпоинты Dual-Banked.
На самом же деле 4ый и 5ый тоже такими являются. Из-за этого весь сыр-бор и происходил.
Если у кого-то будет похожая проблема, нужно в файле usbcfg.h заменить
Код
const BYTE  DualBankEP = 0x06;
на
const BYTE  DualBankEP = 0x36;
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.