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

 
 
> Не получается поймать глюк в CDC на AT90USB162, (не инкрементируется указатель)
QuickWitted
сообщение Mar 1 2012, 06:42
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 322
Регистрация: 21-06-07
Из: СНГ
Пользователь №: 28 596



В свое время я разрабатывал бесплатный для повторения проект по управлению компьютером с ПДУ на 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


--------------------
Сайт с разработками http://www.mindrunway.ru/
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 20:15
Рейтинг@Mail.ru


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