Регистрация | Последние сообщения | Персональный список | Поиск | Настройка конференции | Личные данные | Правила конференции | Список участников | Top 64 | Статистика раздела | faq | Что нового v.2.3 | Чат
Skunk Forum - Техника, Наука, Общество » Форум разработчиков РЭА »
Элементарные вопросы по ISP1581

Версия для печати (настроить)

Новая тема | Написать ответ

Подписаться

Автор Тема:   Элементарные вопросы по ISP1581
Silentor
Junior Member

Сообщений: 1
Регистрация: Апрель 2007

написано 05 Апреля 2007 22:02ИнфоПравкаОтветитьIP

Здравствуйте
Намучился с ISP1581, в инете инфы мало, а здесь есть люди, работавшие с ним. Имеющиеся темы прочел, но не помогло)
Вопрос 1: непонятка с многобайтовыми регистрами. Взять тот же регистр INT_ENABLE. Читаем дейташит, смотрим Филипсовские примеры. Выходит, что он расположен от мл. байта к старшему по возрастанию адресов (использую 8мибитовую split-bus). Т.е.:
Адрес 0x14 - IEBRST, IESUSP, IERESM и т.д.
Адрес 0x15 - IEP0SETUP и т.д.
Адрес 0x16, 0x17 - эндпоинты.
Пробую писать в него, потом читать - смотрю результат: байты по адресам 0x16, 0x17 - все нули. Ладно, обойдемся двумя младшими. Хочу разрешить IEBRST, IESUSP, IERESM. Пишу:
по адресу 0x14 - 0x19
по адресу 0x15 - 0x00
Глухо, при подсоединении-отсоединении прерываний нет. Меняю местами:
по адресу 0x14 - 0x00
по адресу 0x15 - 0x19
начинают проскакивать прерывания. Пишу так:
по адресу 0x14 - 0x19
по адресу 0x15 - 0x19
прерываний нет. Странно. Пишу
по адресу 0x14 - 0x02
по адресу 0x15 - 0x19
ловлю Bus Reset и SOF после подключения шины. Такое ощущение, что разрешение SOF находится по адресу 0x14, а SUSP и RESUME - по 0x15.

Еще похоже, что в регистре источника прерывания INTERRUPT (адрес 0x18) в самом старшем байте (адрес 0x1B) торчит единичка в мл. бите. Её невозможно снять и она не вызывает прерывания, просто торчит).

ЗЫ. Работа по опросу регистра прерывания не помогает. Инициализирую как обычно:
TEST = 0x10
MODE = 0x89
INT_CONFIG = 0x54 (низким уровнем)
INT_ENABLE = в процессе экспериментов)
DMA_ENDPOINT = 0x0F (в неиспользуемый эндпоинт)
ADDRESS = 0x80
По бас-резету повторяю, по SUSPEND/RESUME реагирую, как у Филипса (1->0 соотв. ножкой).

Однобайтовые регистры, похоже, нормально работают. Что я не так делаю с регистром INTERRUPT_ENABLE?

Silentor
Junior Member

Сообщений: 2
Регистрация: Апрель 2007

написано 06 Апреля 2007 21:43ИнфоПравкаОтветитьIP

Пришлите плиз кусок кода с инициализацией и приёмом SETUP пакета. Желательно для AT89 проца. А то моск уже сломан На silentor at rambler.ru

nagserg
Junior Member

Сообщений: 22
Регистрация: Декабрь 2005

написано 09 Апреля 2007 09:32ИнфоПравкаОтветитьIP

У меня вот так сделано:
код:

void Init_ISP1581 (void)
{
//D14_Cntrl_Reg->D14_TEST_MODE.BITS.FORCEFS = 1;// включает только full-speed

//Подключаем pull-up резистор, разрешаем глобально прерывания,
//Enable Clock Always On, enable wakeup on chip select

D14_Cntrl_Reg->D14_MODE.VALUE |= 0x8C; //Mode,GLINTENA+CLKAON+WKUPCS

//bit7,bit6=01; (Ctrl EP) Interrupt on ACK, NYET
//bit5,bit4=11; (In EP) Interrupt on ACK, NYET, and first NAK.
//bit3,bit2=11; (out EP) Interrupt on ACK, NYET, and first NAK.
//Выбираем режим для INTR - Low Push Pull, bit1=0,level mode, bit0=0,active low.
D14_Cntrl_Reg->D14_INT_CONFIG.VALUE = 0x54; // 01010100


D14_Cntrl_Reg->D14_INT_ENABLE.VALUE = 0xFD39;
//bit4, enable the interrupt upon detection of a 'resume' state.
//bit3, enable the interrupt upon detection of a 'suspend' state.
//bit0, enable the interrupt upon detection of a bus reset.
//enable the interrupt for the Setup and in/out on endpoint 0
//enable the interrupt for in/out on endpoint 1
}


Потом инициализирую конечные точки
Далее
код:
D14_Cntrl_Reg->D14_MODE.BITS.SOFTCT = 1;  //Подключаем 1,5 кОм к D+

[Это сообщение изменил skunk (изменение 17 Апреля 2007 20:01).]

Silentor
Junior Member

Сообщений: 3
Регистрация: Апрель 2007

написано 10 Апреля 2007 20:12ИнфоПравкаОтветитьIP

Спасибо, но есть вопрос:
D14_Cntrl_Reg->D14_INT_ENABLE.VALUE = 0xFD39;
В каком порядке вы записываете байты регистра? По идее (дейташиту), первый байт - это IEDMA, IEHS_STA, IERESM, IESUSP, IEPSOF, IESOF, IEBRST, второй - эндпойнт 0, 1 и 2. Тогда получается, что вы пишете единичку в зарезервированный бит и разрешаете IEPSOF. Если байты расположены наоборот, то выходит, что вы разрешаете прерывания на эндпойнте 2 (0xFD). Хочется точно разобраться с порядком записи многобайтовых регистров.
И еще, сброс адреса устройства (Address := 0x80) до включение SoftConnectа или после?
А вот еще вопрос, как вы отлаживаете приход событий шины, типа EP0SETUP и т.д.?
У меня создаётся такое впечатление по поводу прерываний:
По включению приходит BRESET, по подсоединению шины 2 BRESET сразу, потом с некоторым интервалом еще 2 BRESET и все, потом по отрыву шины еще один BRESET. Больше никакие источники не появляются. Отлаживаю так: по появлению прерывания (нижний уровень на ножке INT1) записываю в массив мл. 2 байта регистра INTERRUPT, после 6 записей выталкиваю записанное на ножки и смотрю цифровым осциллографом.

[Это сообщение изменил Silentor (изменение 10 Апреля 2007 21:37).]

nagserg
Junior Member

Сообщений: 23
Регистрация: Декабрь 2005

написано 11 Апреля 2007 09:55ИнфоПравкаОтветитьIP

В каком порядке вы записываете байты регистра?

Работаю в CodeVisionAVR, там получается передается младший байт первый, т.е.: 1-й байт 0x39, 2-й 0xFD, 3-й 0x00, 4-й 0x00.

Если байты расположены наоборот, то выходит, что вы разрешаете прерывания на эндпойнте 2 (0xFD)

Да, я разрешаю прерывания IEP2TX IEP2RX IEP1TX IEP1RX IEP0TX IEP0RX IEP0SETUP

И еще, сброс адреса устройства (Address := 0x80) до включение SoftConnectа или после?

У меня до включения SoftConnect-а, сразу после инициализации конечных точек.

А вот еще вопрос, как вы отлаживаете приход событий шины, типа EP0SETUP и т.д.?

С помощью COM порта выводил на экран компьютера содержимое регистров.

Silentor
Junior Member

Сообщений: 4
Регистрация: Апрель 2007

написано 11 Апреля 2007 20:50ИнфоПравкаОтветитьIP

Т.е., для регистра INT_ENABLE вы пишете
по адресу 0x14 - 0x39,
по адресу 0x15 - 0xFD,
0x16 - 0x00,
0x17 - 0x00?
Посмотрите, пожалуйста, на откомпиленный код, как там происходит запись многобайтового регистра, бо я с ними намучился Однобайтовые работают ожидаемо, а INT_ENABLE и INTERRUPT - чёрти как.
И вы таки не используете прерывание, а просто регулярно опрашиваете INTERRUPT?

nagserg
Junior Member

Сообщений: 24
Регистрация: Декабрь 2005

написано 12 Апреля 2007 12:26ИнфоПравкаОтветитьIP

по адресу 0x14 - 0x39,
по адресу 0x15 - 0xFD,
0x16 - 0x00,
0x17 - 0x00?

Да, правильно, это зависит от компилятора, в CodeVision так, а вот в Keil-е вроде как наоборот, я сам на этом в свое время застрял:

в Кейл-е:
D14_Cntrl_Reg.D14_INT_ENABLE.VALUE = 0x39fd0000;

Посмотри здесь проект на Кеил на китайском ссылка , я по нему разбирался, вроде все понятно.

И вы таки не используете прерывание, а просто регулярно опрашиваете INTERRUPT?
У меня при срабатывании прерывания в обработчике прерывания сохраняется установленный флаг, потом по опросу обрабатываю его.

Silentor
Junior Member

Сообщений: 5
Регистрация: Апрель 2007

написано 12 Апреля 2007 21:18ИнфоПравкаОтветитьIP

меня при срабатывании прерывания в обработчике прерывания сохраняется установленный флаг, потом по опросу обрабатываю его.
Я потому спрашиваю, что когда вы с quarter обсуждали на этом форуме ISP1581, он написал:
НО!!! По прерываниям эта тварь работает очень и очень некоРРектно! Поэтому советую работать по-опросу.
А хочется, чтобы работало корректно Я хочу прояснить, вы реагируете на прерывание, запоминаете в обработчике источник, потом в основном потоке обрабатываете, или регулярно опрашиваете регистр INTERRUPT в основном же потоке, не обращая внимание на прерывание?

nagserg
Junior Member

Сообщений: 25
Регистрация: Декабрь 2005

написано 13 Апреля 2007 11:22ИнфоПравкаОтветитьIP

Я хочу прояснить, вы реагируете на прерывание, запоминаете в обработчике источник, потом в основном потоке обрабатываете, или регулярно опрашиваете регистр INTERRUPT в основном же потоке, не обращая внимание на прерывание?
Реагирую на прерывание, запоминаю в обработчике источник, потом в основном цикле обрабатываю:
код:

interrupt [EXT_INT2] void usb_isr(void)
{
USB_Int_Flag.VALUE |= D14_Cntrl_Reg->D14_INT.VALUE; // читаем регистр прерываний и запоминаем
//printf("EXT_%x",D14_Cntrl_Reg->D14_INT.VALUE);
D14_Cntrl_Reg->D14_INT.VALUE = USB_Int_Flag.VALUE; // сбрасываем флаг источника прерывания в регистре прерывания

...

...

}


Silentor
Junior Member

Сообщений: 6
Регистрация: Апрель 2007

написано 14 Апреля 2007 17:41ИнфоПравкаОтветитьIP

Спасибо, я аналогично обрабатываю.
А вот еще непонятка с софт=коннектом. Выяснил я, что без софт-коннекта шина вообще не работает, так что я его включаю и больше не трогаю. По дейташиту по бас-резету он не сбрасывается. Но к своему удивлению, я обнаружил, что он сбрасывается по SUSPEND, когда я делаю:
isp1581Regs.MODE.bits.GOSUSP = 1;
isp1581Regs.MODE.bits.GOSUSP = 0;
Так что я решил пока вообще не обрабатывать SUSPEND.
У вас был такой нюанс?

2)Есть определённый прогресс и новые вопросы
Принял Get Device Descriptor с длиной 64, Set Address (адрес корректный), Get Device Descriptor с длиной 18, Get Config Descriptor (только конфиг и большой). В USB View появилось моё у-во с моим Device Descriptor. Заметил интересную особенность:
Если отвечать Device Descriptorом так:

код:

прописать его в DATA_PORT_LSB
валидировать Control_In


то хост не поймет его и не запросит Конфиг дескриптор. А если так
код:

выставить BUFFER_LENGTH
прописать его в DATA_PORT_LSB


то все нормально. Для Config Descriptorа вроде проходят оба варианта. Не объясните, почему?

[Это сообщение изменил Silentor (изменение 14 Апреля 2007 22:44).]

nagserg
Junior Member

Сообщений: 26
Регистрация: Декабрь 2005

написано 16 Апреля 2007 10:19ИнфоПравкаОтветитьIP

1.Без софт=коннекта шина и не будет работать. USB хост видит что появилось устройство на шине когда подключен резистор 1,5 кОм между линией D+ и 3.3 вольта, за что и отвечает бит софт=коннект.
Насчет SUSPEND не могу сказать

2.Я делаю так:

код:
		
//задаем размер
D14_Cntrl_Reg->D14_BUFFER_LENGTH_LSB = 0x12;
D14_Cntrl_Reg->D14_BUFFER_LENGTH_MSB = 0;

//пишем в DATA_PORT_LSB



Silentor
Junior Member

Сообщений: 7
Регистрация: Апрель 2007

написано 18 Апреля 2007 22:57ИнфоПравкаОтветитьIP

Здравствуйте, еще чуток продвинулся)
Энумерацию почти прошел, в USBView уже отображаются мои девайс, конфиг, интерфейс и эндоинт дескрипторы, хотя значок все еще (!).
Сделал inf под драйвер, libUSB win32, зарегистрировал, все красиво. Но все таки энумерация до конца не получилась. Такое ощущение, что после запроса какого-то строкового дескриптора ничего не приходит от хоста. Адрес вычитываю и устанавливаю правильно. Но никаких других (не Get Descriptor или Set Address) реквестов не наблюдаю.

Silentor
Junior Member

Сообщений: 8
Регистрация: Апрель 2007

написано 19 Апреля 2007 22:18ИнфоПравкаОтветитьIP

Помучил еще, сделал примитивное логирование запросов. Отключил пока строковые дескрипторы.
В целом похоже на обычную схему, но...
Ситуация такая:
Суспенды, резеты
...
Set Address
Get Device Descriptor
Get Config Descr (размер 9)
Get Config Descr (размер 0xFF)
Get Config Descr (размер 32) //Как раз размер моих дескрипторов
а потом тишина... Перевтыкаем шину.
Как то его не устраивает мой ответ. Вроде все честно. В чем разница между отправкой пакета размером 0xFF и 32? Читал руководство по ЮСБ, не совсем понял, чем отличается ситуация, когда нужно отдать меньше байт, чем запросил хост. Китайский камрад вроде никак не различает эту ситуацию.

Silentor
Junior Member

Сообщений: 9
Регистрация: Апрель 2007

написано 21 Апреля 2007 19:53ИнфоПравкаОтветитьIP

Так и не удаётся дождаться Set Configuration, после Get Descriptor (Configuration). Может руками его посылать надо? Или хост обязан им завершать энумерацию?

nagserg
Junior Member

Сообщений: 27
Регистрация: Декабрь 2005

написано 23 Апреля 2007 11:25ИнфоПравкаОтветитьIP

Хост посылает Set Configuration после установки драйвера.

Silentor
Junior Member

Сообщений: 10
Регистрация: Апрель 2007

написано 26 Апреля 2007 23:12ИнфоПравкаОтветитьIP

Чуток продвинулся, прошел энумерацию. Да, Set Configuration посылает драйвер. Я исользую LibUSB, там это нужно делать руками)
Борюсь с bulk-эндпоинтами. Посылаю данные (1 байт), возникает прерывание EP1RX. По аналогии с Control transfer, обнуляю флажок, вычитываю из EP1_OUT девайс-реквест. Это должен быть token packet. Там смотрю поле wLength, а оно равно 0, странно, там должна быть единица по идее. Мне не понятно, как вычитавать данные, т.е. дожидаться еще одного флага прерывания EP1RX, когда придёт Data packet? Или он уже должен лежать в буфере вместе с token packet? Или вообще не надо вычитывать token packet?

nagserg
Junior Member

Сообщений: 28
Регистрация: Декабрь 2005

написано 27 Апреля 2007 11:45ИнфоПравкаОтветитьIP

У меня:
Пришло прерывание, обнуляю флаг, далее выбираю номер точки
код:
D14_Cntrl_Reg->D14_ENDPT_INDEX = 2

, читаю сколько байт пришло:
код:

ByteCount=D14_Cntrl_Reg->D14_BUFFER_LENGTH_MSB;
ByteCount<<= 8;
ByteCount|=D14_Cntrl_Reg->D14_BUFFER_LENGTH_LSB;


далее читаю что пришло
код:

for(i=0; i<ByteCount; i++)
{
RX_buf[i]= D14_Cntrl_Reg->D14_DATA_PORT_LSB;
//printf("i=%d-%x ",i,RX_buf[i]);
}

Silentor
Junior Member

Сообщений: 11
Регистрация: Апрель 2007

написано 27 Апреля 2007 21:39ИнфоПравкаОтветитьIP

А ACK на EP1_IN потом надо делать?
На отправке ACKа он вешается. Наверное, не надо.

Делаю по вашему образу, прерывание приходит, обнуляю, выбираю ЕП, читаю BUFFER_LENGTH_LSB, там 0 (хотя шлю данные). При повторных посылках прерывание не возникает вообще. Может, эндпойнты неправильно проинициализировались? Хотя делал по образцу... Продолжаю борьбу)

[Это сообщение изменил Silentor (изменение 27 Апреля 2007 22:36).]

Silentor
Junior Member

Сообщений: 12
Регистрация: Апрель 2007

написано 03 Мая 2007 21:09ИнфоПравкаОтветитьIP

Выходит такая картина: выбираю EP1 OUT, вычитываю BUFFER_LENGTH оба байта, а там ноль... потом вычитываю байтик из DATA_PORT_LSB, и там мои данные! Т.е., данные приходят, но BUFFER_LENGTH врёт, нулевой он...
Теперь буду бороть DMA режим передачи данных

nagserg
Junior Member

Сообщений: 29
Регистрация: Декабрь 2005

написано 04 Мая 2007 09:45ИнфоПравкаОтветитьIP

Странно, у меня все правильно приходит. А с DMA это интересно, я до этого так и не дошел.

Silentor
Junior Member

Сообщений: 13
Регистрация: Апрель 2007

написано 04 Мая 2007 22:12ИнфоПравкаОтветитьIP

DMA тоже не сдается, пока вернусь к ручной работе с bulk enpointом. Может я неправильно инициализировал эндпоинт, и он косо работает...

Ваш ответ:

Коды форума
Смайлики


Ник:    Пароль       
Отключить смайлики

Все время MSK

Склеить | Разбить | Закрыть | Переместить | Удалить

Новая тема | Написать ответ
Последние сообщения         
Перейти к:

Свяжитесь с нами | skunksworks.net

Copyright © skunksworks.net, 2000-2018

Разработка и техническая поддержка: skunksworks.net


Рейтинг@Mail.ru Яндекс.Метрика