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

 
 
> Помогите с at90usb162.
arbuz
сообщение Aug 1 2013, 06:22
Сообщение #1





Группа: Участник
Сообщений: 12
Регистрация: 9-04-11
Пользователь №: 64 241



День добрый. Обращаюсь за помощью-подсказкой. Начал изучение интерфейса USB, для этого приобрёл контроллер at90usb162. Решил познать всё с нуля. Проштудировав datasheet, и прочую литературу занялся написание прошивки на языке С в AVR Studio 4. Написав пару программа моргания диодом и ответом на нажатие кнопочки, решил приступить к написанию программы для USB. Сейчас затык на этапе получения пакета SETUP от хоста т.е. ПК. Подскажите, пожалуйста, где ошибка. Код прошивки прилагается.
CODE
#include <avr/io.h>
#include <avr/wdt.h>
#include <avr/power.h>


#define F_CPU 16000000UL


#include <util/delay.h>



int main()
{
DDRC |= 1 << DDC6; // Порт С - как выход

MCUSR &= ~(1 << WDRF);
wdt_disable();

clock_prescale_set(clock_div_1);

//CLKPR = 0x80; // Бит разрешение изменения делителя
//CLKPR = 0x00; // Установка делителя на 1 F = 16 MHz

PORTC |= (1 << PC6); // РС6 - зажечь диод

//REGCR = (1 << REGDIS);

UDIEN = 0x00; //
UDINT = 0x00; //

USBCON |= (1 << USBE);

USBCON &= ~(1 << FRZCLK);

PLLCSR |= (1 << PLLP0); // Установить делитель PLL
if ((PLLCSR & 0x1C) == 0x04)
PORTC = 0x00; // Потушить диод
PLLCSR |= (1 << PLLE); // Enable PLL
while((PLLCSR & 0x01) != 0x01) // Захват в петле PLL
PORTC = 0x00; // Потушить диод
PORTC |= (1<<PC6); // РС6 - зажечь диод

/*------Начало настройки нулевой КТ------*/
UENUM = 0x00; // Нулевая конечая точка
//UECONX |= 0x29; // Бит разрешения работы КТ + бит сброса переключения данных
UECONX |= (1 << STALLRQ);
UECONX |= (1 << EPEN); // Бит разрешения работы КТ + бит сброса переключения данных
//UECFG0X = 0x81; // Bulk, in
//UECFG0X = 0x00; // Control, out
//UECFG0X = 0x01; // Control, in
//UECFG1X = 0x36; // 64 байта, 2-ой банк, выделение буфера
UECFG1X = 0x32; // 64 байта, 1 банк, выделение буфера
//UECFG1X = 0x10; // 16 байт, 1 банк, очистка буфера
while ((UESTA0X & 0x80) != 0x80) // Проверка корректности настройки КТ
PORTC = 0x00; // Потушить диод, диод горит - КТ сформировалась корректно*/
/*------Конец настройки КТ------*/
PORTC |= (1<<PC6); // РС6 - зажечь диод
//UERST |= 0x01; // Сброс нулевой конечной точки
//UERST = 0x00; // Очистка, для завершения броса и начала использования FIFO.
UENUM = 0x00; // Выбор нулевой КТ

UDCON &= ~(1 << DETACH);

while((UDINT & 0x04) != 0x04)
PORTC = 0x00; // Потушить диод, ожидание флага Start of Frame
PORTC |= (1<<PC6); // РС6 - зажечь диод
UDINT &= ~(1 << SOFI);
while((UEINTX & 0x08) != 0x08)
PORTC = 0x00; // Потушить диод, ожидание пакета SETUP, бит RXSTPI
PORTC |= (1<<PC6); // РС6 - зажечь диод

while(1);
return 0;
}


Сообщение отредактировал IgorKossak - Aug 1 2013, 06:31
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
arbuz
сообщение Aug 15 2013, 07:05
Сообщение #2





Группа: Участник
Сообщений: 12
Регистрация: 9-04-11
Пользователь №: 64 241



Спасибо всем за подсказки, результат - положительный, пакет SETUP приходит и об этом свидельствует установка бита RXSTPI. Далее действия:
Код
#define Usb_read_byte() (UEDATX)

  while((UEINTX & 0x08) != 0x08)
    PORTC = 0x00;  // Потушить диод, ожидание пакета SETUP, бит RXSTPI
  UEINTX &= ~(1 << RXSTPI); // Очистка RXSTPI, для подтверждения пакета setup
  PORTC |= (1<<PC6);  // РС6 - зажечь диод

  UEINTX &= ~(1 << RXOUTI); // Очистка бита RXOUTI

  bmRequestType = Usb_read_byte();  // тип запроса; bmRequestType - переменная типа unsigned char
  bmRequest      = Usb_read_byte();  // код запроса; bmRequest - переменная типа unsigned char

  if (bmRequestType == 0x80)
    PORTC |= (1<<PC6);  // РС6 - зажечь диод
  else PORTC = 0x00;     // Потушить диод

  if (bmRequest == 0x06)
    PORTC |= (1<<PC6);  // РС6 - зажечь диод
  else PORTC = 0x00;  // Потушить диод

Результат оказывается следующим, переменные bmRequestType и bmRequest содержат одно и тоже число 0х80. Вопрос, как необходимо считывать данные из UEDATX? ACK отправляется самостоятельно контроллером или необходимо это сделать программно? И правильный ли вобщем алгоритм действий?

Сообщение отредактировал arbuz - Aug 15 2013, 07:10
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- arbuz   Помогите с at90usb162.   Aug 1 2013, 06:22
- - kovigor   Цитата(arbuz @ Aug 1 2013, 09:22) решил п...   Aug 1 2013, 08:27
- - arbuz   Спасибо за совет. Читал и Гука, и Агурова, и перев...   Aug 1 2013, 08:50
|- - kovigor   Цитата(arbuz @ Aug 1 2013, 11:50) Спасибо...   Aug 1 2013, 08:59
|- - Rimsky   Цитата(arbuz @ Aug 1 2013, 17:50) Спасибо...   Aug 13 2013, 11:12
- - arbuz   Остаётся вопрос, почему после того как ловится бит...   Aug 1 2013, 11:15
|- - fractcon   Цитата(arbuz @ Aug 1 2013, 15:15) Остаётс...   Aug 1 2013, 11:40
|- - arbuz   Цитата(fractcon @ Aug 1 2013, 15:40) Вот ...   Aug 8 2013, 19:15
- - vgo1   Цитата(arbuz @ Aug 1 2013, 10:22) День до...   Aug 11 2013, 12:31
- - Alex11   Я тут давным-давно выкладывал проект под 162 мегу:...   Aug 11 2013, 22:16
- - controller_m30   Моё предложение такое, что надо сначала проверить ...   Aug 13 2013, 17:15
- - vgo1   После того как поймали RXSTPI. сделайте 8 последов...   Aug 15 2013, 10:21
|- - arbuz   Цитата(vgo1 @ Aug 15 2013, 14:21) После т...   Aug 16 2013, 12:18
- - arbuz   Процесс пошёл, пришёл пакет SETUP, флаг RXSTPI уст...   Sep 2 2013, 06:43
- - arbuz   Хост присылает запрос GET_DESCRIPTOR, ответом высы...   Nov 25 2013, 11:21


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

 


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


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