|
ISP1583 - Двойная буферизация |
|
|
|
Feb 26 2009, 09:03
|
Участник

Группа: Участник
Сообщений: 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. Может алгоритм обработки прерывания должен быть другой. Или конечная точка не так настроена.
|
|
|
|
|
Feb 26 2009, 10:24
|

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

|
Цитата(ArkZel @ Feb 26 2009, 12:03)  Если не забирать 512 байт данных из FIFO, то следующего прерывания я не дожидаюсь. Подобная ситуация и при передаче к хосту. Когдато работал с isp1181a и там при двойной буфферизации кажется комманда очистки буффера переключала буффер. После любого чтения буффера ЕР попробуйте подавать комманду очистки буффера этой ЕР. При передаче в хост данных комманда подтверждения данных тоже должна переключать буффера. А сколько sram отведено под буффера ЕР? В isp1181a на всё было 2К. Может вы превысили лимит и суммарный размер всех ЕР с учётом их двойной буфферизации превысил размер sram под ЕР?
|
|
|
|
|
Feb 26 2009, 11:13
|
Участник

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

|
Размер FIFO ISP1583 составляет 8к, даже при двойной буферизации места должно хватать. А насчет очистки буфера после чтения сейчас проверю! Очистка буфера после чтения данных ни к чему не привела. Результат абсолютно идентичный  Очистка буфера после чтения не дала результата.
|
|
|
|
|
Feb 26 2009, 13:20
|
Участник

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

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

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

|
Сам когдато около месяца пытался заставить работать usb-контроллер  И заставил - так что и у вас получится  Настройку конечных точек проводил только по запросу Код 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. Если в одном из них были данные то считывал их и очищал буффер конечной точки. Если были прерывания но буффера был пустые то просто подавал команду очистки. При передаче данных записывал в буффер данные и подтверждал их. После этого проводил опрос статуса конечной точки. Если обнаруживал что буффера пусты то передача завершена. Если это был последний пакет размера=размеру конечной точки то подавал пакет нулевой длины. В таком исполнении мне удалось наладить передачу данных. В вашем случае все эти действия можно выполнять не опросом а по прерываниям. Вообще если вы говорите что при одинарной буферизации всё работает а при двойной нет то нужно смотреть в сторону настроек конечной точки  Или тщательней проводить анализ буфферов  Цитата(ArkZel @ Feb 26 2009, 17:20)  После того как я принимаю прерывание от контроллера что приняты новые данные. Данные не забираю, но флаг прерывания сбрасываю. После этого хост ничего мне не передает (т.к. нового прерывания по этой конечной точке мне не приходит). Пробовал выставлять ACK после приема первого прерывания результат тот же. А двойную буферизацию я включаю еше до того как устанавливаю бит ENABLE = 1 в регистре Endpoint Type). Так что судя по всему хост следующие 512 байт мне не передает, до тех пор пока я не заберу предыдущие данные. А если я их забираю то новые данные поступают мне опять в BUF0, а не в BUF1 как бы этого не хотелось. По симптомам похоже что у вас нет двойной буферизации. А хост не может послать в заполненый буффе данные (иначе он слал-бы их во второй буффер) У вас чото с настройками ЕР не то
|
|
|
|
|
Feb 26 2009, 13:41
|
Участник

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

|
Цитата(mempfis_ @ Feb 26 2009, 19:30)  Сам когдато около месяца пытался заставить работать usb-контроллер  И заставил - так что и у вас получится  Настройку конечных точек проводил только по запросу Код 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. Если в одном из них были данные то считывал их и очищал буффер конечной точки. Если были прерывания но буффера был пустые то просто подавал команду очистки. При передаче данных записывал в буффер данные и подтверждал их. После этого проводил опрос статуса конечной точки. Если обнаруживал что буффера пусты то передача завершена. Если это был последний пакет размера=размеру конечной точки то подавал пакет нулевой длины. В таком исполнении мне удалось наладить передачу данных. В вашем случае все эти действия можно выполнять не опросом а по прерываниям. Вообще если вы говорите что при одинарной буферизации всё работает а при двойной нет то нужно смотреть в сторону настроек конечной точки  Или тщательней проводить анализ буфферов  По симптомам похоже что у вас нет двойной буферизации. А хост не может послать в заполненый буффе данные (иначе он слал-бы их во второй буффер) У вас чото с настройками ЕР не то  Может быть и на самом деле проблема связана с тем что я не делаю отключения всех не задействованных ендпоинтов. Надо будет их попробовать их отключить. Хотя в филипсовских исходниках они этого не делают. А бит двойной буферизации (DBLBUF) нужно устанавливать до или после включения ендпоинта? Я устанавливаю в самом начале инициализации конечной точки (в то время как хост мне выставляет конфигурацию).
|
|
|
|
|
Feb 26 2009, 13:49
|
Знающий
   
Группа: Свой
Сообщений: 841
Регистрация: 10-05-07
Из: Чебоксары (Россия)
Пользователь №: 27 640

|
Цитата(mempfis_ @ Feb 26 2009, 16:30)  По симптомам похоже что у вас нет двойной буферизации. А хост не может послать в заполненый буффе данные (иначе он слал-бы их во второй буффер) У вас чото с настройками ЕР не то  +1 Я когда спрашивал "ArkZel" передаёт-ли хост, имел ввиду что снуппер показывает то? А не то, что прерывания и т.п. возникают или нет.
|
|
|
|
|
Feb 26 2009, 13:52
|

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

|
У меня делается так: Код #define EP1_config 0b11100011 #define EP2_config 0b10100011
void Endpoints_ini(void) { //;бит7 - 1-Разрешение, 0-Запрешщение выделение памяти под конечную точку //;бит6 - 0-OUT, 1-IN OR 0-DMA READ, 1-DMA WRITE //;бит5 - 1-двойная буферизация данных //;бит4 - 1-изохронная КТ, 0-bulk, interrupt //;3..0 - размер КТ 0000-8байт 0001-16 байт 0010-32 байта 0011-64 байта
//;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; //конфигурируем конечную точку ControlOUT //;выделение памяти разрешено=1 тип in=1 без двойной буфферизации=0 interrupt=0 размер 64 байтa=0011 SetEPConfig(ControlOUT,ControlOUT_config); //;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; //;конфигурируем конечную точку ControlIN //;выделение памяти разрешено=1 тип in=1 без двойной буфферизации=0 interrupt=0 размер 64 байтa=0011 SetEPConfig(ControlIN,ControlIN_config);
//;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; //;конфигурируем конечную точку 1 //;выделение памяти разрешено=1 тип in=1 без двойной буфферизации=0 interrupt=0 размер 64 байтa=0011 SetEPConfig(1,EP1_config);
//;конфигурируем конечную точку 2 //;выделение памяти разрешено=1 тип out=0 без двойной буфферизации=0 interrupt=0 размер 64 байтa=0011 SetEPConfig(2,EP2_config); static char i; for(i=3;i<=14;i++) { SetEPConfig(i,0x00); }; delay_ms(2); //UnStallEP(1); } т.е. при инициализации ер включается и настраиваются её параметры
|
|
|
|
|
Feb 26 2009, 14:15
|
Участник

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

|
УРА!!! Народ спасибо у меня все заработало! Нужно было сначала включить конечную точку затем ее конфигурять! Вы очень помогли А что касается ISP - контроллеров то общее впечатление ничего. Только документации маловато. Хотя я первый раз с USB столкнулся. Впрочем это вполне проходимо.
|
|
|
|
|
Feb 26 2009, 14:21
|

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

|
Код Я тоже подумываю об использовании ISP1181. Мне нравятся его 16 EP с буферами по 64 байта и двойной буферизацией. Но не нравится его тормозной параллельный интерфейс. Или я напрасно переживаю? Какое у вас сложилось мнение о нём? Что посоветуете? Прошу прощения за оффтоп. Это микросхема чистый usb1.1-контроллер. Т.е. все проблемы с её конфигурированием, формированием дескрипторов, обработкой setup-запросов будут лежать на вас. Но зато вы сможете сделать своё устройство с необходимым вам набором конечных точек (композитные usb-устройства). Её плюсы - вы можете создавать свои конечные точки (разного типа и размера), простота доступа к буфферам конечных точек, управление по прерываниям (есть отдельный вывод - индикатор прерываний тип которого можно настраивать (импульсы, уровень)), есть возможность работать без прерываний проводя опрос регистров прерываний. (больше пока не помню - если что напишу) Минусы - usb1.1 - т.е. больше мегабайта скорости не получите, требуется много ног управления (у меня было задействовано 2 полных порта atmeg-и - один данные, один управление), не получилось настроить вывод прерываний (хотя это было когда я ещё толком не представлял что такое микроконтроллер - возможно просто не смог настроить int1 в МК), необходимо наличие толкового системного программиста способного написать драйвер для вашего usb-устройства (из-за этого пришлось использовать hid-драйвер со скоростью ~64КБ/с) Из-за двух последних минусов перевожу проект на FTDI (в управлении попроще и есть готовый драйвер) Я бы советовал смотреть в сторону usb2.0 контроллеров причём не внешних а интегрированных в МК Это позволит сэкономить кучу ног управления и в идеале упростит управлнение usb-модулем  Цитата(ArkZel @ Feb 26 2009, 18:15)  УРА!!! Народ спасибо у меня все заработало! Нужно было сначала включить конечную точку затем ее конфигурять! Вы очень помогли А что касается ISP - контроллеров то общее впечатление ничего. Только документации маловато. Хотя я первый раз с USB столкнулся. Впрочем это вполне проходимо. Поздравляю с успехом
|
|
|
|
|
Feb 26 2009, 14:58
|
Знающий
   
Группа: Свой
Сообщений: 841
Регистрация: 10-05-07
Из: Чебоксары (Россия)
Пользователь №: 27 640

|
Цитата(mempfis_ @ Feb 26 2009, 17:21)  Это микросхема чистый usb1.1-контроллер. Т.е. все проблемы с её конфигурированием, формированием дескрипторов, обработкой setup-запросов будут лежать на вас. Но зато вы сможете сделать своё устройство с необходимым вам набором конечных точек (композитные usb-устройства). ... 1. Это всё понятно, именно такие девайсы (составные HID+MassStorage) я и делаю. Более мегабайта мне не нужно. Подумываю о составном устойстве из 12 HID-ов т.к. хорошо ложится на один из проектов. Скорость передачи при этом тоже на 12 помножается. Но тут дело не в скорости, (т.к. мой самодельный Full speed MassStorage строго мегабайт выдает т.е. без NAK-ов работает), а в удобстве. 2. А вот на FTDI переходить не рекомендую категорически. Как раз из-за драйвера (см. соседнюю ветку), и из-за того, что вы ничего у неё внутри изменить не сможете. Если уж вам так хочется - сделайте наоборот. Т.е. девайс под имеющийся драйвер. 3. Встроенные контроллеры конечно лучше, когда можно я их использую, но с 12-тью EP я ни одного такого не знаю.
|
|
|
|
|
Feb 26 2009, 15:51
|

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

|
Цитата 1. Это всё понятно, именно такие девайсы (составные HID+MassStorage) я и делаю. Более мегабайта мне не нужно. Подумываю о составном устойстве из 12 HID-ов т.к. хорошо ложится на один из проектов. Скорость передачи при этом тоже на 12 помножается. Но тут дело не в скорости, (т.к. мой самодельный Full speed MassStorage строго мегабайт выдает т.е. без NAK-ов работает), а в удобстве. 2. А вот на FTDI переходить не рекомендую категорически. Как раз из-за драйвера (см. соседнюю ветку), и из-за того, что вы ничего у неё внутри изменить не сможете. Если уж вам так хочется - сделайте наоборот. Т.е. девайс под имеющийся драйвер. 3. Встроенные контроллеры конечно лучше, когда можно я их использую, но с 12-тью EP я ни одного такого не знаю. По кол-ву конечных точек я тоже не встречал равного isp1181a. Если под удобством вы подразумеваете удобство управления то микросхема довольно легко управляется. Достаточно написать и отладить 3 процедуры: запись байта кода, запись байта данных и чтения байта данных и всё. Остальные процедуры управления (запись/чтение регистров управления, запись/чтение конечных точек) будут строится на основе этих трёх. Единственное что смущало поначалу это то что в документации нет примеров. Но я нашёл несколько дополнительных документов которые значительно упростили написание программной части. Как найду постараюсь выложить их в этой ветке. По поводу ftdi - мне от usb-контроллера нужна простота управления и скорость передачи. Человека способного написать драйвер для дря работы с isp1181a не нашлось поэтому пришлось довольствоваться hid-драйвером. Ради экономия времени решили перейти на ftdi - всётаки скорость ~600кБ лучше чем 64кБ. А с глюками будем разбираться позже
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|