Телесистемы
 Разработка, производство и продажа радиоэлектронной аппаратуры
На главную   | Карта сайта | Пишите нам | В избранное
Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс.
e-mail:jobsmp@pochta.ru

Телесистемы | Электроника | Конференция «Микроконтроллеры и их применение»

Помогите понять прерывания USB в AT90USB1287...

Отправлено Dikoy 17 января 2008 г. 13:10


Сорри за простыню, но короче не получилось... :(

Был прибор узкого назначения, работал через UART. Потребовалось сделать десяточек на USB. Для экономии времени тупо купили 10 USBKey-ев, на нём и клепаю.
Так вот. В старом приборе были UARTовские функции putchar(); & getchar();, а так же два прерывания - на приход и передачу данных:

#define UART_RXC_vect (0x64)
#define UART_UDRE_vect (0x68)

#pragma vector=UART_RXC_vect
__interrupt void UART_RXC_ISR(void);
#pragma vector=UART_UDRE_vect
__interrupt void UART_UDRE_ISR(void);

В этих прерываниях щёл расгрёб того, что прилетело в UART.

Я скачал с атмела их апноту с виртуальным ком-портом (AVR272: USB CDC Demonstration UART to USB Bridge) и исходник к ней. Там всё предельно понятно - из прерываний активировано только SOFI, далее програмка в цикле проверяет биты, говорящие что что-то пришло или готово к отправке и принимает/отправляет (в демо варианте). Для приёма/отправки заботливые атмеловцы написали аналогичные UART-у функции uart_usb_putchar(); и uart_usb_getchar(); которые и работают с PIPE и ENDPOINT, и позволяют, в т.ч., принимать и передавать по одному байту (то что мне надо чтобы сильно не курочить старую прошивку).

Вот. Но у меня таки есть два прерывания в старой прошивке и сейчас, с USB, мне тоже они нужны, только уже от USB. То есть прога должна заходить в прерывание1, если принят хотя бы один байт, и прерывание2, если передача байта (слив ендпойнта в случае USB) завершена.

Стал рыть. Атмеловская uart_usb_getchar(); проверяет перед приёмом бит: (UEINTX&(1<<RXOUTI)). По ходу, это аналог UARTовского RXC.
Кстати, UEINTX это передефайненый атмелом EPINTx.
Бит RXOUTI умеет вызывать прерывание Received OUT data(EPINTx, RXOUTI=1). тут всё хорошо.

А вот с приёмом непонятки... По даташите мне нужно прерывание Ready to accept IN data(EPINTx, TXINI=1). Насколько я понял даташит...
Но атмеловцы почему-то проверяют (прежде чем скопировать очередной байт в ендпойнт, ибо отправка вызывается либо принудительно флажком (UEINTX &= ~(1<<FIFOCON)), либо по переполнению ендпойнта этим же флажком) бит (UEINTX&(1<<RWAL))... Бит этот проверяет, пуст ли выбраный ендпойнт. Если он == 0 банк пуст (стр. 275 ДШ).
Но, насколько я понял, он не умеет вызывать прерывание...
Помогите подобрать битик, который вызывает прерывание по окончании передачи данных (очистке ендпойнта), а то я уже в конец запутался...
:(


Составить ответ | Вернуться на конференцию

Ответы


Отправка ответа
Имя*: 
Пароль: 
E-mail: 
Тема*:

Сообщение:

Ссылка на URL: 
URL изображения: 

если вы незарегистрированный на форуме пользователь, то
для успешного добавления сообщения заполните поле, как указано ниже:
введите число 69:

Перейти к списку ответов | Конференция | Раздел "Электроника" | Главная страница | Карта сайта

Rambler's Top100 Рейтинг@Mail.ru
 
Web telesys.ru