В свое время я разрабатывал бесплатный для повторения
проект по управлению компьютером с ПДУ на AT90USB162.
Смысл проекта был в том, что бы поднять CDC и через него обработанные передавать данные на компьютер.
но так как код проекта был очень большой, то пришлось писать его на ассемблере (вариант брать процессор
с большим ОЗУ я тогда не рассматривал).
Данных было мало, все бегало шустро (для ИК больше и не надо).
Единственный найденный тогда глюк заключался в том, что выяснилось -
получившийся исходник не работает на прием в потоковом режиме.
Передача шла нормально пакетами, но прием работал только в байтовом режиме.
К тому же оказалось что большинство программ для Windows (включая ГиперТерминал)
передают данные в RS232 побайтово (и глюк практически не проявлялся).
Сейчас пользователи попросили приделать к существующему приемнику мигалку, аналог Эмбилайт'а.
Мигалку я приделал, и возникла необходимость в потоковой загрузке данных в процессор...
стандартная функция чтения буфера выглядит так
Код
char uart_usb_getchar(void)
{
register Uchar data_rx;
Usb_select_endpoint(RX_EP);
if (!rx_counter) while (!uart_usb_test_hit());
data_rx=Usb_read_byte();
rx_counter--;
if (!rx_counter) Usb_ack_receive_out();
return data_rx;
}
глюк заключается в том что функция data_rx=Usb_read_byte();
(на асме - lds R20_Arg1, UEDATX)
по непонятным мне причинам постоянно читает только первый байт буфера и не инкрементируется.
пример
;0x20,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09 отправляю
;0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20 приходит
Ну и собственно вопрос -
Не подскажет ли доброуважаемый АЛЛ куда копать?Долго копался сам, единственное что нашел:
в более свежих версиях исходника в эту функцию добавили еще одну строку
причем Usb_reset_endpoint_fifo_access вызывается везде перед чтением или записью...
но свежий исходник намного более сложен и я в нем к сожалению заблудился...
и не понятно нужна ли она для 162...
Код
char uart_usb_getchar(void)
{
register char data_rx;
if (!rx_counter) {
while (!uart_usb_test_hit());
[color="#FF0000"]Usb_reset_endpoint_fifo_access(RX_EP);[/color]
}
data_rx=Usb_read_endpoint_data(RX_EP, 8);
rx_counter--;
if (!rx_counter) Usb_ack_out_received_free(RX_EP);
return data_rx;
}
Сообщение отредактировал QuickWitted - Mar 1 2012, 06:52