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

 
 
> Помогите с 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
сообщение Sep 2 2013, 06:43
Сообщение #2





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



Процесс пошёл, пришёл пакет SETUP, флаг RXSTPI установился, далее считываю данные из UEDATX, и далее флаг RXSTPI сбрасываю.
Код
  while((UEINTX & 0x08) != 0x08)
    PORTC = 0x00;  // Потушить диод, ожидание пакета SETUP, бит RXSTPI
  PORTC |= (1<<PC6);  // РС6 - зажечь диод

  bmRequestType = Usb_read_byte();  // тип запроса
  bmRequest     = Usb_read_byte();    // код запроса

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

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


  UEINTX &= ~(1 << RXSTPI); // Очистка RXSTPI, для отправки ACK


Далее, должен прийти пакет IN, в ответ на который контроллер обязан выслать 8 байт дескриптора, и получить от хоста ACK.
CODE

#define Usb_write_byte(byte) (UEDATX = (unsigned char)byte)

while((UEINTX & 0x01) != 0x01) //(ВЕРНО?)
PORTC = 0x00; // Потушить диод, ожидание пакета IN, бит TXINI
PORTC |= (1<<PC6); // РС6 - зажечь диод
Usb_write_byte(0x12);
Usb_write_byte(0x01);
Usb_write_byte(0x00);
Usb_write_byte(0x02);
Usb_write_byte(0x00);
Usb_write_byte(0x00);
Usb_write_byte(0x00);
Usb_write_byte(0x08); // Запись данных в UEDATX

UEINTX &= ~(1 << TXINI); // Сброс TXINI для отправки данных хосту



Вопрос: правильно ли, то что установка бита TXINI считается приходом пакета IN? Каким образом узнать что хост прислал ACK?

Далее, хост присылает пакет OUT нулевой длинны, задача контроллера отправить пакет ACK.
Код
  while((UEINTX & 0x04) != 0x04)
    PORTC = 0x00;  // Потушить диод, ожидание пакета OUT, бит RXOUTI
  PORTC |= (1<<PC6);  // РС6 - зажечь диод
  
  UEINTX = 0x00; // Сброс регистра, для отправки ACK


Вопрос: для отправки ACK на пакет OUT достаточно очистки бита RXOUTI?

Сообщение отредактировал IgorKossak - Sep 23 2013, 11:27
Причина редактирования: Поднятие темы запрещено правилами форума!!!
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
- - arbuz   Спасибо всем за подсказки, результат - положительн...   Aug 15 2013, 07:05
- - vgo1   После того как поймали RXSTPI. сделайте 8 последов...   Aug 15 2013, 10:21
|- - arbuz   Цитата(vgo1 @ Aug 15 2013, 14:21) После т...   Aug 16 2013, 12:18
- - arbuz   Хост присылает запрос GET_DESCRIPTOR, ответом высы...   Nov 25 2013, 11:21


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

 


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


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