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

 
 
> ISP1583 - Двойная буферизация
ArkZel
сообщение Feb 26 2009, 09:03
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 29
Регистрация: 15-12-08
Из: Томск
Пользователь №: 42 479



Добрый день!

При работе с ISP1583 возникла необходимость использования двойной буферизации конечных точек.

Я использую две конечные точки - Bulc (IN1, OUT1 , MaxPackSize = 512).
Работаю по прерываниям - EP1TX, EP1RX.

При инициализации конечных точек выставляю бит DBLBUF в регистре Endpoint Type,
Два раза очищаю буфер (CLBUF = 1 в регистре Control Function). Отключаю конечную точку (ENABLE = 0 в регистре Endpoint Type) Устанавливаю MaxPackSize = 512. Выставляю тип конечной точки Bulc, включаю ее и еще раз делаю двойную очистку буфера.

Ловлю прерывание допустим - EP1RX. Проверяю регистр статуса буфера - Buffer Status. Выставляется бит BUF0. Считываю 512 байт данных из FIFO контроллера. Сбрасываю флаг EP1RX и выхожу из прерывания.
Ловлю следующее прерывание - EP1RX. При проверке регистра статуса буфера опять выставляется бит BUF0, а не BUF1.
Данные при этом передаются корректно.

Если не забирать 512 байт данных из FIFO, то следующего прерывания я не дожидаюсь.


Подобная ситуация и при передаче к хосту.


Подскажите кто знает. Почему не выставляется бит BUF1. Может алгоритм обработки прерывания должен быть другой. Или конечная точка не так настроена.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
ArkZel
сообщение Feb 26 2009, 11:13
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 29
Регистрация: 15-12-08
Из: Томск
Пользователь №: 42 479



Размер FIFO ISP1583 составляет 8к, даже при двойной буферизации места должно хватать.

А насчет очистки буфера после чтения сейчас проверю!

Очистка буфера после чтения данных ни к чему не привела. Результат абсолютно идентичный crying.gif

Очистка буфера после чтения не дала результата.
Go to the top of the page
 
+Quote Post
mempfis_
сообщение Feb 26 2009, 13:30
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409



Сам когдато около месяца пытался заставить работать usb-контроллер smile.gif
И заставил - так что и у вас получится smile.gif

Настройку конечных точек проводил только по запросу
Код
case  SET_CONFIGURATION:
       {
            switch (wValue)
            { case unconfigure_device: Configuration_flag=0;
                           OFF_all_endpoints();
                           ZeroLenthPacket(ControlIN);
                           break;
               case  configure_device:   Configuration_flag=1;
                           Endpoints_ini();
                           ZeroLenthPacket(ControlIN);
                           break;
             };


В Endpoints_ini() настраиваю все используемые конечные точки в порядке их нумерации (control out, control in, ep1, ep2 и т.д.), и выключаю все неиспользуемые (в isp1181a их всего 16)!!!
Когдато читал что после этого микросхема распределит память и конечные точки будут доступны.

При приёме данных читал регистр прерываний, определял источник (ер2), проверял на заполненость буффера ер2. Если в одном из них были данные то считывал их и очищал буффер конечной точки. Если были прерывания но буффера был пустые то просто подавал команду очистки.

При передаче данных записывал в буффер данные и подтверждал их. После этого проводил опрос статуса конечной точки. Если обнаруживал что буффера пусты то передача завершена. Если это был последний пакет размера=размеру конечной точки то подавал пакет нулевой длины.
В таком исполнении мне удалось наладить передачу данных.

В вашем случае все эти действия можно выполнять не опросом а по прерываниям.
Вообще если вы говорите что при одинарной буферизации всё работает а при двойной нет то нужно смотреть в сторону настроек конечной точки smile.gif
Или тщательней проводить анализ буфферов smile.gif



Цитата(ArkZel @ Feb 26 2009, 17:20) *
После того как я принимаю прерывание от контроллера что приняты новые данные. Данные не забираю, но флаг прерывания сбрасываю. После этого хост ничего мне не передает (т.к. нового прерывания по этой конечной точке мне не приходит). Пробовал выставлять ACK после приема первого прерывания результат тот же. А двойную буферизацию я включаю еше до того как устанавливаю бит ENABLE = 1 в регистре Endpoint Type). Так что судя по всему хост следующие 512 байт мне не передает, до тех пор пока я не заберу предыдущие данные. А если я их забираю то новые данные поступают мне опять в BUF0, а не в BUF1 как бы этого не хотелось.


По симптомам похоже что у вас нет двойной буферизации.
А хост не может послать в заполненый буффе данные (иначе он слал-бы их во второй буффер)
У вас чото с настройками ЕР не то smile.gif
Go to the top of the page
 
+Quote Post
ArkZel
сообщение Feb 26 2009, 13:41
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 29
Регистрация: 15-12-08
Из: Томск
Пользователь №: 42 479



Цитата(mempfis_ @ Feb 26 2009, 19:30) *
Сам когдато около месяца пытался заставить работать usb-контроллер smile.gif
И заставил - так что и у вас получится smile.gif

Настройку конечных точек проводил только по запросу
Код
case  SET_CONFIGURATION:
       {
            switch (wValue)
            { case unconfigure_device: Configuration_flag=0;
                           OFF_all_endpoints();
                           ZeroLenthPacket(ControlIN);
                           break;
               case  configure_device:   Configuration_flag=1;
                           Endpoints_ini();
                           ZeroLenthPacket(ControlIN);
                           break;
             };


В Endpoints_ini() настраиваю все используемые конечные точки в порядке их нумерации (control out, control in, ep1, ep2 и т.д.), и выключаю все неиспользуемые (в isp1181a их всего 16)!!!
Когдато читал что после этого микросхема распределит память и конечные точки будут доступны.

При приёме данных читал регистр прерываний, определял источник (ер2), проверял на заполненость буффера ер2. Если в одном из них были данные то считывал их и очищал буффер конечной точки. Если были прерывания но буффера был пустые то просто подавал команду очистки.

При передаче данных записывал в буффер данные и подтверждал их. После этого проводил опрос статуса конечной точки. Если обнаруживал что буффера пусты то передача завершена. Если это был последний пакет размера=размеру конечной точки то подавал пакет нулевой длины.
В таком исполнении мне удалось наладить передачу данных.

В вашем случае все эти действия можно выполнять не опросом а по прерываниям.
Вообще если вы говорите что при одинарной буферизации всё работает а при двойной нет то нужно смотреть в сторону настроек конечной точки smile.gif
Или тщательней проводить анализ буфферов smile.gif





По симптомам похоже что у вас нет двойной буферизации.
А хост не может послать в заполненый буффе данные (иначе он слал-бы их во второй буффер)
У вас чото с настройками ЕР не то smile.gif



Может быть и на самом деле проблема связана с тем что я не делаю отключения всех не задействованных ендпоинтов. Надо будет их попробовать их отключить. Хотя в филипсовских исходниках они этого не делают.
А бит двойной буферизации (DBLBUF) нужно устанавливать до или после включения ендпоинта? Я устанавливаю в самом начале инициализации конечной точки (в то время как хост мне выставляет конфигурацию).
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- ArkZel   ISP1583 - Двойная буферизация   Feb 26 2009, 09:03
- - mempfis_   Цитата(ArkZel @ Feb 26 2009, 12:03) Если ...   Feb 26 2009, 10:24
||- - mempfis_   У меня делается так: Код#define EP1_config 0b1...   Feb 26 2009, 13:52
|- - galjoen   Цитата(mempfis_ @ Feb 26 2009, 16:30) По ...   Feb 26 2009, 13:49
|- - galjoen   Цитата(mempfis_ @ Feb 26 2009, 16:30) Сам...   Feb 26 2009, 13:59
|- - mempfis_   КодЯ тоже подумываю об использовании ISP1181. Мне ...   Feb 26 2009, 14:21
|- - galjoen   Цитата(mempfis_ @ Feb 26 2009, 17:21) Это...   Feb 26 2009, 14:58
|- - mempfis_   Цитата1. Это всё понятно, именно такие девайсы (со...   Feb 26 2009, 15:51
|- - galjoen   Цитата(mempfis_ @ Feb 26 2009, 18:51) По ...   Feb 26 2009, 16:16
|- - mempfis_   ЦитатаА разбираться позже будет поздно. Ничего уже...   Feb 26 2009, 17:46
- - galjoen   Цитата(ArkZel @ Feb 26 2009, 12:03) Если ...   Feb 26 2009, 12:47
- - ArkZel   После того как я принимаю прерывание от контроллер...   Feb 26 2009, 13:20
- - ArkZel   УРА!!! Народ спасибо у меня все зарабо...   Feb 26 2009, 14:15


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

 


RSS Текстовая версия Сейчас: 2nd August 2025 - 15:14
Рейтинг@Mail.ru


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