Перейти к содержанию
    

Крайне интересно! Скоро самому придется заниматься этой темой.

 

Спрашивай, все что знаю расскажу. :-)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Крайне интересно! Скоро самому придется заниматься этой темой.

 

Спрашивай, все что знаю расскажу. :-)

Спасибо!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Немного не по теме :bb-offtopic:

Иногда, когда дивайс не определяется, возможны и такие варианты. ;)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Немного не по теме :bb-offtopic:

Иногда, когда дивайс не определяется, возможны и такие варианты. ;)

 

О как!!!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Друзья, уже с неделю мучаюсь с usbn9604, подружить его пытаюсь с at89s8253 (знаю, что ядро не avr, но здесь меня больше вопрос интерфейса волнует).

использовал примеры UsbMasters...

Проблема в следующем - насколько я понимаю, в процессе инициализации в регистр адреса FAR не встает бит AD_EN (0x80), как следствие, устройство не отвечает хосту и на компе вылезает надпись, подключено новое устройство, устройство работает не правильно (не опознано).

на моей плате есть рабочий ЖК - туда вывожу состояния регистров (они читаются - т.е. функции USB_WR и USB_RD работают).

когда вставляю кабель в комп у устройства начинают срабатывать прерывания по алтернативному регистру, но суть события заключается либо в окончании пакета (EOP - 0x08 в регистре ALTEV) либо вообще непонятно что (0x00 в регистре ALTEV). Точнее так - сначала где-то с пару секунд висит EOP (т.е. постоянно срабатывает), а через пару секунд на компе вылезает надпись, что не опознано устройство и в ALTEV приходит только 0x00.

 

Если я все правильно понимаю - проблема в инициализации где-то, т.к. регистр FAR из состояния 0x00 не выходит в принципе (даже когда на всякий случай добавил USB_WR(FAR,0x80) в конце инициализации - в FAR остался 0x00)...

 

Нифига понять не могу что делать :) или куда посмотреть еще... прям ступор какой-то...

 

привожу из кода функцию инициализации и на всякий функции USB_WR и USB_RD:

void Init_USBN9604(void)
 {

  unsigned char c[8];
  unsigned char Event;

         usb_cfg = 0;                 
  address = 0;

  USB_WR(MCNTRL,SRST);       //Инициируем програмный сброс USBN9604 
     while(USB_RD(MCNTRL)&SRST);  // ожидаем окончания сброса
  USB_WR(MCNTRL,VGE+INT_L_P);//Выбираем режим для INTR - Low Push Pull, включаем 3.3B Voltage Regulator
     NOP(0x4000);  // функция задержки - название из асма позаимствовано :)

  if((USB_RD(RID)&0x0f)!=0x02) LCDPuts(0,4,"RID");  // чтение идентификатора устройства - если там не все в порядке - на экран сообщение
     USB_WR(FAR,AD_EN+0x00);       //Устанавливаем у функции Default address  ВОТ ЗДЕСЬ НАЧИНАЮТСЯ ПРОБЛЕМЫ
     USB_WR(EPC0, 0x00);        //Endpoint 0 Normal operation

     USB_WR(NAKMSK,NAK_O0+NAK_I3);    //Разрешаем прерывания по NAK событиям
     USB_WR(RXMSK,RXFIFO0+RXFIFO3);   //Разрешаем прерывания по RX событиям
     USB_WR(TXMSK,TXFIFO0+TXFIFO3);   //Разрешаем прерывания по TX событиям


     USB_WR(ALTMSK,SD3+SD5+RESET_A);      //Разрешаем прерывания по ALT событиям - таймауты и перезапуск от хоста
     USB_WR(MAMSK,(INTR_E+RX_EV+NAK+TX_EV+ALT)); //Разрешаем прерывания глобально


     FLUSHTX0();                      //Очищаем TXFIFO0 и запрещаем выдачу из него данных
     USB_WR(RXC0,RX_EN);              //Разрешаем прием данных в Endpoint0    

     USB_WR(NFSR,OPR_ST);             //Переходим в Operational State
     USB_WR(MCNTRL,VGE+INT_L_P+NAT);  //Устанавливаем напряжение, уровень прерывания и запускаемся :)

  USB_RD(ALTEV);  //очищаем буфер альтернативных событий

         Event=USB_RD(FAR);  // проверяем адресный регистр и всегда обнаруживаем там 0x00 ((((((((((
 	  sprintf(c,"F%d ",(int)Event);
 	  LCDPuts(0,1,c);


 }

 

Функции общения с чипом:

void USB_WR(char U_ADDR,char U_DATA)
{
SETBIT(P3,ALE); /*Устанавливаем ALE в 1  */ 
CLRBIT(P3,CS);  /*Устанавливаем CS в 0  Выбираем USBN9604*/
NOP(10);
P1=U_ADDR;      /*Выдаем адрес регистра*/
NOP(50);
CLRBIT(P3,ALE); /*Сбрасываем ALE в '0', защелкивая адрес*/
CLRBIT(P3,WR);  /*Сбрасываем WR в '0', инициируя запись*/
NOP(10);
P1=U_DATA;      /*Выставляем на шину данные*/      
NOP(50);
SETBIT(P3,WR);  /* Защелкиваем данные '1' на WR*/
SETBIT(P3,CS);  /* Устанавливаем CS в '1' - отключаем микросхему*/
}  


unsigned char USB_RD(char U_ADDR)
{
char U_DATA;      
CLRBIT(P3,CS);  /*Устанавливаем CS в 0  Выбираем USBN9604*/
SETBIT(P3,ALE); /*Устанавливаем A0 в 1  */ 
CLRBIT(P3,WR);  /*Сбрасываем WR в '0', инициируя запись*/
NOP(50);
P1=U_ADDR;      /*Выдаем адрес регистра*/
SETBIT(P3,WR);  /* Защелкиваем адрес '1' на WR*/
CLRBIT(P3,ALE); /*Устанавливаем A0 в 0  */ 
CLRBIT(P3,RD);  /*Сбрасываем RD в '0', инициируя чтение*/
NOP(50);
U_DATA=P1;       /*Считываем данные с шины*/      
SETBIT(P3,RD);  /* Защелкиваем данные '1' на RD*/
SETBIT(P3,CS);  /* Устанавливаем CS в '1' - отключаем микросхему*/
return(U_DATA);
}      

 

 

Пожалуйста помогите - хоть скажите куда смотреть... весь инет уже облазил (((

обещаю отдельной темой в 8051 выложить проект :)

 

я тут еще один вещь заметил:

написал в тексте для проверки

USB_WR(NAKMSK,0x55);

(когда прочитал и на дисплей вывел - пришло только 0x05)

а после этого написал

USB_WR(NAKMSK,0xaa);

(когда прочитал и на дисплей вывел - пришло только 0x0a)

 

получается у меня со старшими разрядами что-то...

может с генератором что... у меня стоит резонатор на 24 МГц и конденсаторы по 18пФ (про мегаомный резистор в параллель - не забыл).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В данный момент близок к реализации Mass Storage Device, если кому-то будет полезно могу поделиться информацией и наблюдениями.

Давным-давно реализовал составное устройство HID+MassStorage на связке USBN9604+AT45DB642D+ATmega/AT90CAN. Думал это уже никому не интересно. Думал, что и USBN9604 то уже с производства снимают, поэтому подзатарился для возможного спроса/ремонта. А где вы эти USBN9604 покупаете? И сколько они стоят? Я через друга, который живёт в США, купил. Около 70 руб. штука обошлись.

Мне USBN9604, несмотря на тормозную шину (на 16 мГц даже с максимальной задержкой не все работают) и кое-какие глюки (если интересно опишу), очень понравились. У современных, встроенных в микроконтроллеры, систем таких возможностей нет. М.б. я рано USBN9604 в утиль списал?

 

По теме:

1. Могу рекомендовать использовать 2 незадействованные EP для того, чтобы у EP0 было FIFO 64 байта. USBN9604, в отличие от других, позволяет адрес EP устанавливать, в т.ч. и одинаковые адреса у разным EP. Да и работать удобнее когда для данных туда, данных сюда и SETUP-а разные буфера. Хотя с энумерацией повозится придётся, но там полюбому нужно возится чтобы при включении компа, со вставленным в него USB девайсом, он нормально загружался (любой комп).

2. В MassStorage можно данные из AT45DB642D в USBN9604 минуя процессор отправлять если их на одну шину посадить. Получается даже лучше, чем ПДП, потому, что процессор вообще свободен, только таймерами сигналы формирует. И скорость чтения MassStorage (если CRC не считать и HIDа ,с зарезервированной под него пропускной способностью шины USB, нет) получается строго 1 мБайт в секунду. Т.е. теоретический предел пропускной способности full speed USB.

 

public32,

не понял, а где у вас передача дескрипторов хосту? О какой установке адреса (и где у вас обрабатывается получение SETUP пакета SET_ADDRESS?) вы говорите до того, как отправили хосту дескриптор DEVICE? Этот дескриптор (и какой он у вас?) хосту нормально отправляется? ACK от хоста на него вы получаете?

NAK-и на первое время можете вообще не обрабатывать. Запретите прерывания по ним и всё. А вот когда ваш девайс определятся начнёт, тогда это может понадобится.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

покупал в чипе-дипе

http://www.chipdip.ru/product0/959352017.aspx

 

а кусочка кода с инициализацией устройства не осталось? мне бы инициализацию пройти... с endpointами разберемся :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

покупал в чипе-дипе

http://www.chipdip.ru/product0/959352017.aspx

 

а кусочка кода с инициализацией устройства не осталось? мне бы инициализацию пройти... с endpointами разберемся :)

Да, цены однако...

 

Я всё на асме написал, вам не подойдёт, но инициализация в виде таблицы регист-значение имеется. Некоторые из регистров/битов в родном описании не описаны, я их сам описал. Не помню присутствуют ли они в инициализации, но если что по названию разберётесь. AdXX это мои адреса EP, но это вроде и так понятно.

Ti9604:; таблица начальной инициализации 9604 (без присоединения)
.db MCNTRL, VGE; токо +3.3V (отаттачено и без прер-ний)
;.db MCNTRL, 0; нет +3.3V, отаттачено и без прер-ний
.db NEPC0, 0; снимем STALL и DEF у EP0
.db CCONF, 0x0B; частота 4 Мгц
.db NEPC1, 0; временно запретим EP1
.db NEPC2, 0; временно запретим EP2
.db NEPC3, 0; запретим EP3
.db NEPC4, 0; запретим EP4
.db NEPC5, 0; запретим EP5
.db NEPC6, 0; запретим EP6
.db WKUP, ENUC|ENUSB; + чистим PNDUC и PNDUSB
.db MAMSK, INTR_E|RX_EV|NAK|TX_EV|ALT|WARN; разр. прер.
.db RXMSK, RXFIFO1|RXFIFO0; прер. токо от EP0 (EP1 - она-же)
;.db ALTMSK, RESET_A|SD3; прер. по сбросу и suspend3ms
.db ALTMSK, RESET_A; прер. токо по сбросу без suspend3ms
.db TXMSK, TXFIFO1|TXFIFO0; прер. токо от EP0 (EP1 - она-же)
;.db NAKMSK, 0x77; NAK для EP0, EP1,3 (TX), EP2,4 (RX)
.db NTXC1, FLUSH; чистим FIFO передачи EP1
.db NTXC2, TFWL4|FLUSH|TX_TOGL; чистим FIFO пер-чи EP3 (и DATA0)
.db NRXC1, FLUSH|IGN_SETUP; FIFO приёма EP2 + запр. SETUP
.db NRXC2, FLUSH|IGN_SETUP; FIFO приёма EP4 + запр. SETUP
.db NTXC0, FLUSH|IGN_IN; FIFO передачи EP0 + запр. IN
.db NRXC0, FLUSH|IGN_OUT; приема 0 + запр. OUT (SETUP разр.)
.db FAR, AD_EN; адрес по умолчанию (0x00)
.db NEPC1, EP_EN; чтоб на IN отвечали NAK-ом
.db NEPC2, EP_EN; чтоб на OUT отвечали NAK-ом
.db NEPC3, EP_EN|AdBI; чтоб на Bulk-IN отвечали NAK-ом
.db NEPC4, EP_EN|AdBO; чтоб на Bulk-OUT отвечали NAK-ом
.db NEPC5, EP_EN|AdII; чтоб на Interrupt-IN отвечали NAK-ом
.db DMCNTRL, DMEP3; запрещённый DMA к передающей EP3
;.db NFSR, OPR_ST; режим работа
.db 0xFF, 0xFF; признак конца таблицы

Можете раскоментировать

.db NFSR, OPR_ST ; режим работа

тогда подключится, но обработчики прерываний у вас д.б.

 

Только сейчас дошло, что тема в 2005 году начата :D

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

спасибо большое! да, все более-менее понятно... язык он и в Африке язык :)

 

У меня такое ощущение, что я не ту емкость взял на кристалл... было при 22 пФ и при 18 пФ - сейчас купил 15 (как в даташите) и 39 (встречал в инете на схемах)... может пойдет...

 

блин действительно :) 2005 :) уже отчаяние бьет потихоньку... медленно склоняюсь к покупке ftdi... ((

пытался частоту посмотреть на осциллографе, но из-за его входного импеданса в 50 Ом :) ... частота получилась порядка 200 Гц... долго не мог поверить глазам, пока про 50Ом не вспомнил :)

Изменено пользователем public32

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...