Друзья, уже с неделю мучаюсь с 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пФ (про мегаомный резистор в параллель - не забыл).