Короче, всем спасибо, проблему решил. Оказывается этой микруху нужно было правильно проинитить. Последовательно описана в knowlagebase производителя в разделе про SPI_InitDevice. Эта функция просто экспортируется в библиотеке под винду, а у меня линух и пришлось вручную делать. Главное у этих (м-м-м я воздержусь от эпитетов) нигде это не написанно у меня даже в мыслях не было что это может такой эффект вызвать.
Кому интересно прилагаю код инициализации после которого у меня все запахало. Код юзает ихние линуховые дрова но в принципе любой компилятор знающий С++ может его подцепить.
ftStatus = FT_OpenEx((void *)"Dual RS232 A",FT_OPEN_BY_DESCRIPTION,&ftHandle);
if (ftStatus != FT_OK) { cout<<"Device open fail "<<ftStatus<<endl; return EXIT_SUCCESS;};
cout<<"Device open success"<<endl;
ftStatus = FT_ResetDevice(ftHandle);
if (ftStatus != FT_OK) { cout<<"Device reset fail "<<ftStatus<<endl; return EXIT_SUCCESS;};
cout<<"Device reset success"<<endl;
ftStatus = FT_Purge(ftHandle,FT_PURGE_RX|FT_PURGE_TX);
if (ftStatus != FT_OK) { cout<<"Device purge fail "<<ftStatus<<endl; return EXIT_SUCCESS;};
cout<<"Device purge success"<<endl;
ftStatus = FT_SetChars(ftHandle,0,0,0,0);
if (ftStatus != FT_OK) { cout<<"Device set chars fail "<<ftStatus<<endl; return EXIT_SUCCESS;};
cout<<"Device set chars success"<<endl;
ftStatus = FT_SetTimeouts(ftHandle,-1,5000);
if (ftStatus != FT_OK) { cout<<"Device SetTimeouts fail "<<ftStatus<<endl; return EXIT_SUCCESS;};
cout<<"Device SetTimeouts success"<<endl;
ftStatus = FT_SetLatencyTimer(ftHandle, 16);
if (ftStatus != FT_OK) { cout<<"Device SetLatencyTimer fail "<<ftStatus<<endl; return EXIT_SUCCESS;};
cout<<"Device SetLatencyTimer success"<<endl;
ftStatus = FT_SetBitMode(ftHandle,0x00,0x00);
if (ftStatus != FT_OK) { cout<<"Device Reset MPSSE fail "<<ftStatus<<endl; return EXIT_SUCCESS;};
cout<<"Device Reset MPSSE success"<<endl;
ftStatus = FT_SetBitMode(ftHandle,0x00,0x02);
if (ftStatus != FT_OK) { cout<<"Device SetBitMode fail "<<ftStatus<<endl; return EXIT_SUCCESS;};
cout<<"Device SetBitMode success"<<endl;
DWORD FT_Q_Bytes;
ftStatus = FT_GetQueueStatus(ftHandle,&FT_Q_Bytes);
if (ftStatus != FT_OK) { cout<<"Device GetQueueStatus fail "<<ftStatus<<endl; return EXIT_SUCCESS;};
cout<<"Device GetQueueStatus success "<<FT_Q_Bytes<<endl;
if(FT_Q_Bytes>0){
ftStatus = FT_Read(ftHandle,out_buffer,FT_Q_Bytes,&written);
if (ftStatus != FT_OK) { cout<<"Device Read fail "<<ftStatus<<endl; return EXIT_SUCCESS;};
cout<<"Device Read success "<<written<<endl;
};
do{
out_buffer[0]=0xAA;
ftStatus = FT_Write(ftHandle,out_buffer,1,&written);
if (ftStatus != FT_OK) { cout<<"Device Write fail "<<ftStatus<<endl; return EXIT_SUCCESS;};
usleep(15000);
ftStatus = FT_GetQueueStatus(ftHandle,&FT_Q_Bytes);
if (ftStatus != FT_OK) { cout<<"Device GetQueueStatus fail "<<ftStatus<<endl; return EXIT_SUCCESS;};
cout<<"Device GetQueueStatus success "<<FT_Q_Bytes<<endl;
}while((FT_Q_Bytes==0));
ftStatus = FT_Read(ftHandle,out_buffer,FT_Q_Bytes,&written);
if (ftStatus != FT_OK) { cout<<"Device Read fail "<<ftStatus<<endl; return EXIT_SUCCESS;};
cout<<"Device Read success "<<written<<endl;
print_hex(out_buffer,written);
cout<<endl;
bool synk_success = false;
for(int t=0;t<written;++t){
if((unsigned char)out_buffer[t]==0xFA){
cout<<"0xFA found"<<endl;
if(t<written-1){
if((unsigned char)out_buffer[t+1]==0xAA){synk_success=true;break;};
};
};
};
if(!synk_success){cout<<"Device synk to MPSSE fail "<<endl; return EXIT_SUCCESS;};
cout<<"Device synk to MPSSE success "<<endl;
do{
out_buffer[0]=0xAB;
ftStatus = FT_Write(ftHandle,out_buffer,1,&written);
if (ftStatus != FT_OK) { cout<<"Device Write fail "<<ftStatus<<endl; return EXIT_SUCCESS;};
ftStatus = FT_GetQueueStatus(ftHandle,&FT_Q_Bytes);
usleep(15000);
if (ftStatus != FT_OK) { cout<<"Device GetQueueStatus fail "<<ftStatus<<endl; return EXIT_SUCCESS;};
cout<<"Device GetQueueStatus success "<<FT_Q_Bytes<<endl;
}while((FT_Q_Bytes==0));
ftStatus = FT_Read(ftHandle,out_buffer,FT_Q_Bytes,&written);
if (ftStatus != FT_OK) { cout<<"Device Read fail "<<ftStatus<<endl; return EXIT_SUCCESS;};
cout<<"Device Read success "<<written<<endl;
print_hex(out_buffer,written);
cout<<endl;
synk_success = false;
for(int t=0;t<written;++t){
if((unsigned char)out_buffer[t]==0xFA){
if(t<written-1){
if((unsigned char)out_buffer[t+1]==0xAB){synk_success=true;break;};
};
};
};
if(!synk_success){cout<<"Device synk to MPSSE fail "<<endl; return EXIT_SUCCESS;};
cout<<"Device synk to MPSSE success"<<written<<endl;
out_buffer[0]=0x80; //set all to 1
out_buffer[1]=0xFF;
out_buffer[2]=0xFF;
ftStatus = FT_Write(ftHandle,out_buffer,3,&written);
if (ftStatus != FT_OK) { cout<<"all pins to 1 fail "<<ftStatus<<endl; return EXIT_SUCCESS;};
cout<<"all pins to 1 success"<<written<<endl;
out_buffer[0]=0x86; //тут надо править под свой baudrate у меня 20 KHz
out_buffer[1]=0x57;
out_buffer[2]=0x02;
ftStatus = FT_Write(ftHandle,out_buffer,3,&written);
if (ftStatus != FT_OK) { cout<<"Setting baudrate fail "<<ftStatus<<endl; return EXIT_SUCCESS;};
cout<<"Setting baudrate success. Written "<<written<<" bytes"<<endl;
out_buffer[0]=0x85;
ftStatus = FT_Write(ftHandle,out_buffer,1,&written);
if (ftStatus != FT_OK) { cout<<"Loopback off fail "<<ftStatus<<endl; return EXIT_SUCCESS;};
cout<<"Loopback off success. Written "<<written<<" bytes"<<endl;
out_buffer[0]=0x80; //set all to 1
out_buffer[1]=0x08;
out_buffer[2]=0x0B;
ftStatus = FT_Write(ftHandle,out_buffer,3,&written);
if (ftStatus != FT_OK) { cout<<"all pins to 1 fail "<<ftStatus<<endl; return EXIT_SUCCESS;};
cout<<"all pins to 1 success"<<written<<endl;