Тэкс, прерывания не спасли

Возможно дело в программе на компутере... Попытаюсь описать проблему:
С камеры идут следущие сигналы:
- кадровые импульсы на вход INT0, прерывание срабатывает по фронту
- данные 8 разрядов идут на FIFO (PORTB, восьмиразрядный режым)
- на вход IFCLK идет тактовый сигнал с камеры (передним фронтом тактирует данные)
- на вход SLWR подаются строчные (ну почти, там еще гасящие учтены) импульсы, т.е. во время строки (640 байт) разрешается запись в ФИФО. Всего между кадровыми 480 строчных импульсов. Между задним фронтом кадрового импульса и первой строкой примерно 6500 тактов.
- еще адрес точки задается равным 10 на выводах FIFOADR0,1
Инициализация в сапрасовском МК следующая:
Код
void TD_Init(void) {
PORTACFG = 1; //PA0 будет входом прерывания от кадров
PORTCCFG = 0; //этот порт в принципе не используется
OEC = 0x0b; //так только чтобы флаги выводить на светодиоды
IOC = 0x0e;
SYNCDELAY;
CPUCS = 0x10;
SYNCDELAY;
IFCONFIG = 0xcb; //при включении ФИФО внутреннее
//тактирование, чтобы хрень не принимать
SYNCDELAY;
REVCTL = 0x03; // must set REVCTL.0 and REVCTL.1 to 1
SYNCDELAY;
SYNCDELAY;
EP1OUTCFG = 0x00; //нас будет интересовать только точка 6 в режыме IN
EP1INCFG = 0xb0;
SYNCDELAY;
EP2CFG = 0xA0;
SYNCDELAY;
EP4CFG = 0x00;
SYNCDELAY;
EP6CFG = 0xE0;
SYNCDELAY;
EP8CFG = 0x00;
SYNCDELAY;
FIFOPINPOLAR = 0x04; //для записи - активный высокий, т.к. такие уж строчные
SYNCDELAY;
for (i = 0; i < 4; i++) { //хм... хватилобы и один разок
FIFORESET = 0x80;
SYNCDELAY;
FIFORESET = 0x02;
SYNCDELAY;
FIFORESET = 0x04;
SYNCDELAY;
FIFORESET = 0x06;
SYNCDELAY;
FIFORESET = 0x08;
SYNCDELAY;
FIFORESET = 0x00;
SYNCDELAY;
}
EP2FIFOCFG = 0x0; //эти точки нафиг пока не нужны
SYNCDELAY;
EP4FIFOCFG = 0x0;
SYNCDELAY;
EP8FIFOCFG = 0x0;
SYNCDELAY;
EP6FIFOCFG = 0x04; //8 разрядов, пока не автаин, чтоб не леза дрянь
SYNCDELAY;
EP6AUTOINLENH = 0x02; //пакеты по 512
SYNCDELAY;
EP6AUTOINLENL = 0x00;
SYNCDELAY;
OED = 0xff;
IOD = 0xff;
Rwuen = TRUE; // Enable remote-wakeup
}
Т.е. при включении хоть с камеры уже и идут данные, но мы их не принимаем, отключив внешние такты на ФИФО и точку сделав ручной.
По прерываниям от кадрового импульса:
Код
void INT0_isr(void) interrupt INT0_VECT
{
PC0 = PC0 ^ 1; //это я так сморю нет ли пропусков кадровых импульсов (нету...)
if (nachalo == 1) { //флаг nachalo выставляется при нажатии кнопки, а сбрасывается при
//приходе следующего кадрового импульса
SYNCDELAY;
FIFORESET = 0x80; //очистить ФИФО
SYNCDELAY;
FIFORESET = 0x06;
SYNCDELAY;
FIFORESET = 0x00;
SYNCDELAY;
IFCONFIG = 0x03; //вот тут делаем внешние такты (от камеры) и синхронный режим
SYNCDELAY;
EP6FIFOCFG = 0x0c; //вот теперь точка стала автаин... пошел прием даных
SYNCDELAY;
EP6AUTOINLENH = 0x02;
SYNCDELAY;
EP6AUTOINLENL = 0x00;
SYNCDELAY;
nachalo = 0;
} else { //в следующем же кадре хватит принимать
//чтобы у нас только один кадр был
IFCONFIG = 0xcb; //нафиг внешние такты
SYNCDELAY;
EP6FIFOCFG = 0x04; //на всякий случай точку в ручной режим
SYNCDELAY;
EP6AUTOINLENH = 0x02;
SYNCDELAY;
EP6AUTOINLENL = 0x00;
SYNCDELAY;
SYNCDELAY;
FIFORESET = 0x80;
SYNCDELAY;
FIFORESET = 0x06;
SYNCDELAY;
FIFORESET = 0x00;
SYNCDELAY;
}
}
Вот, т.е. нажали кнопку установив при этом флаг nachalo, и при приходе кадрового импульса разрешаем передачу данных в течении одного кадра. это 640*480 байт или 600 пакетов по 512 байт.
Значицца, как же это принимаю на компе? А вот так (делаю не я, а програмист на компе, лучшеб конечно он объяснил ну да лана):
Код
dlg->CtrlEndPt->TimeOut = 1500;
dlg->InEndPt->TimeOut = 1500;
dlg->InEndPt->XferData(buffers[0], len); //вот собственно :)
Делали и очередь по приему, как это написано в примере "Стриммер". Вывод на экран правильный, пробовал заменять принятый буфер buffers[0] на чото свое - все норм.
И проблема осталась прежней

- картинка разбита на куски. Нет синхронизации ни строчной походу ни кадровой (т.к. разбивается и по вертикали и по горизонтали).
Нажимаем кнопку "прием" и сразу же на плате кнопку, которая ставит флаг nachalo... и - пакет принимается не полностью, вроде не сначала. причом что интересно в разбиении картинки имеется повторяемость - примерно каждые 100 пикселей по вертикали разбиватет. Т.е. картинка состоит из 4,8 полосок по вертикали и по горизонтали похоже на то же самое.
Что тут может быть не так? Прога для компа или для МК, как отличить???