drka 0 25 ноября, 2005 Опубликовано 25 ноября, 2005 · Жалоба Крайне интересно! Скоро самому придется заниматься этой темой. Спрашивай, все что знаю расскажу. :-) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Igor26 0 25 ноября, 2005 Опубликовано 25 ноября, 2005 · Жалоба Крайне интересно! Скоро самому придется заниматься этой темой. Спрашивай, все что знаю расскажу. :-) Спасибо! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
IgorKossak 0 25 ноября, 2005 Опубликовано 25 ноября, 2005 · Жалоба Немного не по теме :bb-offtopic: Иногда, когда дивайс не определяется, возможны и такие варианты. ;) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Igor26 0 25 ноября, 2005 Опубликовано 25 ноября, 2005 · Жалоба Немного не по теме :bb-offtopic: Иногда, когда дивайс не определяется, возможны и такие варианты. ;) О как!!! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
public32 0 7 января, 2010 Опубликовано 7 января, 2010 · Жалоба Друзья, уже с неделю мучаюсь с 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пФ (про мегаомный резистор в параллель - не забыл). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
galjoen 0 7 января, 2010 Опубликовано 7 января, 2010 · Жалоба В данный момент близок к реализации 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-и на первое время можете вообще не обрабатывать. Запретите прерывания по ним и всё. А вот когда ваш девайс определятся начнёт, тогда это может понадобится. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
public32 0 7 января, 2010 Опубликовано 7 января, 2010 · Жалоба покупал в чипе-дипе http://www.chipdip.ru/product0/959352017.aspx а кусочка кода с инициализацией устройства не осталось? мне бы инициализацию пройти... с endpointами разберемся :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
galjoen 0 7 января, 2010 Опубликовано 7 января, 2010 · Жалоба покупал в чипе-дипе 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
public32 0 8 января, 2010 Опубликовано 8 января, 2010 (изменено) · Жалоба спасибо большое! да, все более-менее понятно... язык он и в Африке язык :) У меня такое ощущение, что я не ту емкость взял на кристалл... было при 22 пФ и при 18 пФ - сейчас купил 15 (как в даташите) и 39 (встречал в инете на схемах)... может пойдет... блин действительно :) 2005 :) уже отчаяние бьет потихоньку... медленно склоняюсь к покупке ftdi... (( пытался частоту посмотреть на осциллографе, но из-за его входного импеданса в 50 Ом :) ... частота получилась порядка 200 Гц... долго не мог поверить глазам, пока про 50Ом не вспомнил :) Изменено 8 января, 2010 пользователем public32 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться