Суть проблемы: Имеем CY7C68013A в режиме SLAVEFIFO, EP2 - 2x, AUTOOUT, EP4 - 2x AUTOIN, EP6 - 4x AUTOIN. Indexed mode. Шина 16 бит. Синхронный режим. Это все привязано к FPGA с управляющим процем и памятью. Проц через FPGA управляет потоками данных между CY и FPGA. Итак через EP2 устройство принимает небольшие пакеты данных, через EP4 отправляет пакеты, все пакеты защищены контрольными суммами. Через EP6 устройство отправляет на комп данные, размер несколько мегабайт. Драйвер CyUSB.sys, использую функции IOCTL.
Ситуция такая: 1. передаем малые пакеты по EP2 и EP4 - передаем поочередно туда-сюда, долго, "часами" - все работает. 2. Теперь начинаем передавть мегабайты по EP6. Если передаем разом 32 мегабайта, они проходят в норме, без единой ошибки. Но вот после этой успешной передачи у меня проходит в направлении к девайсу через EP2 пакет, девайс отвечает пакетом через EP4. И вот этот пакет EP4 уже НЕ ПРОХОДИТ. После этого не проходит уже совсем ничего ни по одной EP! Девайс можно отключить от компа (питание у него свое), подключить снова, как устройство он будет видется, но уже ни одна EP2,4,6 не работает! Все EP висят намертво!. 3. Та же ситуация, но дробим пакет 32 мегабайта на 2 по 16 МБ и добавляем к каждому по 2 байта, чтоб проходил PKTEND. Шлем пакеты по всем EP ПООЧЕРЕДНО (то есть дожидаемся, пока прошли все данные по одной EP, потом переключаемся на другую). Все работает ОК, очень долго тестировал непрерывно, без сбоев. 4. Все вроде бы ОК в пункте 3, но хотелось бы, пока идут пакеты через EP6 общаться еще и по Ep2+EP4. Делаю так - в моменты, когда EP6 ставит флаг FULL, переключаюсь на другие EP, и считываю и отправляю пакетик данных, потом снова переключаюсь на Ep6. Это работает некоторое время, но рано или поздно все EP на CY виснут, причет точно также, как описано в п. 2. Причем иногда достаточно сократить размер пакета, передаваемого через EP6 на 1 килобайт, как вроде все начинает работать до некоторого момента, потом все снова виснет.
Уже голову сломал. Сделал задержки по нескольку тактов между сигналами WR (RD) и преключениями адреса EP - как мертвому припарки. Уже так сделал - сигнал WR (RD) становится неактивным, ждем 8 тактов IFCLK, переключаем адрес, ждем 8 тактов, производим операции с выбранной EP - все равно виснет. А вот если дождаться окончания передачи всех данных по текущей EP, тогда все работает.
Сообщение отредактировал alevnew - Mar 17 2009, 04:51
|