Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: FT2232D, нет сигнала на TDI/DO в режиме MPSSE
Форум разработчиков электроники ELECTRONIX.ru > Интерфейсы > Форумы по интерфейсам > RS232/LPT/USB/PCMCIA/FireWire
MiSSioN
Развел печатную плату как описанно в мунуале.
Спаял, цепляю на USB, отлично определяется, как устройство видится.
Решил проверить как работает. Написал простеньку программку
#include <iostream>
#include <cstdlib>
#include <stdio.h>
#include <sys/types.h>
#include <ftd2xx.h>
#include <string.h>

int main(int argc, char *argv[])
{
FT_STATUS ftStatus;
FT_DEVICE_LIST_INFO_NODE *devInfo;
FT_HANDLE ftHandle;
char out_buffer[256];
DWORD written;
unsigned int counter=0;

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_SetBitMode(ftHandle,0x00,0x02);
if (ftStatus != FT_OK) { cout<<"Setting bit mode fail "<<ftStatus<<endl; return EXIT_SUCCESS;};
cout<<"Setting bit mode success"<<endl;

out_buffer[0]=0x86; //setting baudrate
out_buffer[1]=0x57; // set 20 KHz
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;

while(1){
out_buffer[0]=0x80;//set all to 0
out_buffer[1]=0x00;
out_buffer[2]=0x0B;//CS=out DI=input DO=out CLK=out
ftStatus = FT_Write(ftHandle,out_buffer,3,&written);
if (ftStatus != FT_OK) { cout<<"all pins to 0 fail "<<ftStatus<<endl; return EXIT_SUCCESS;};
usleep(10000);

out_buffer[0]=0x10;//write only ve+
out_buffer[1]=0x07;//write 8 bytes lval
out_buffer[2]=0x00;//hval
sprintf(&out_buffer[3],"TEST%04u",counter);
out_buffer[11]=0x87;//flush buffers
ftStatus = FT_Write(ftHandle,out_buffer,12,&written);
if (ftStatus != FT_OK) { cout<<"Data write fail "<<ftStatus<<endl; return EXIT_SUCCESS;};

out_buffer[0]=0x80; //set pin
out_buffer[1]=0x0A; //CS=1 DI=0 DO=1 CLK=0
out_buffer[2]=0x0B; //CS=out DI=input DO=out CLK=out
ftStatus = FT_Write(ftHandle,out_buffer,3,&written);
if (ftStatus != FT_OK) { cout<<"fail "<<ftStatus<<endl; return EXIT_SUCCESS;};
usleep(1000000);
};

ftStatus = FT_Close(ftHandle);
if(ftStatus != FT_OK){cout<<"Device close fail "<<ftStatus<<endl;return EXIT_SUCCESS;};
cout<<"Device close success"<<endl;
return EXIT_SUCCESS;
};

запускаю, целевой мк читает нули, 8 байт нулей.
Подключаю осцилограф к ногам 24 и 23 FT2232D, наблюдаю следуюющую картину:

красный - CLK
черный - DO
сначала у меня возникла мысль что я перепутал и подключился к CS вместо DO, но нет я провожу измерение напряжения на 23ей ноге а не на 21ой.
Может кто-нибудь подскажет где я ошибся, кроме ДНК, конечно?
ReAl
Цитата(MiSSioN @ Jun 16 2009, 12:42) *
Код
  while(1){
    out_buffer[0]=0x80;//set all to 0
    out_buffer[1]=0x00;
    out_buffer[2]=0x0B;//CS=out DI=input DO=out CLK=out
    ftStatus = FT_Write(ftHandle,out_buffer,3,&written);
    if (ftStatus != FT_OK) { cout<<"all pins to 0 fail "<<ftStatus<<endl; return EXIT_SUCCESS;};
    usleep(10000);

    out_buffer[0]=0x10;//write only ve+
    out_buffer[1]=0x07;//write 8 bytes lval
    out_buffer[2]=0x00;//hval
    sprintf(&out_buffer[3],"TEST%04u",counter);
    out_buffer[11]=0x87;//flush buffers
    ftStatus = FT_Write(ftHandle,out_buffer,12,&written);
    if (ftStatus != FT_OK) { cout<<"Data write fail "<<ftStatus<<endl; return EXIT_SUCCESS;};
Да вроде бы на первый взгляд всё правильно.
AndreyS
Цитата(MiSSioN @ Jun 16 2009, 13:42) *
сначала у меня возникла мысль что я перепутал и подключился к CS вместо DO, но нет я провожу измерение напряжения на 23ей ноге а не на 21ой.
Может кто-нибудь подскажет где я ошибся, кроме ДНК, конечно?


День добрый.

Может быть банально КЗ по 21 и 23 лапе (вместе с 22)??

Вообще просмотрите качество пайки. И прозвоните соседние ноги. Ну на всякий случай.
MiSSioN
Цитата(AndreyS @ Jun 16 2009, 15:16) *
День добрый.

Может быть банально КЗ по 21 и 23 лапе (вместе с 22)??

Вообще просмотрите качество пайки. И прозвоните соседние ноги. Ну на всякий случай.


нет, потыкал омметром, нет КЗ, да и под микроскопом "соплей" не видно.
P.S. Попробовал сделать эмуляцию SPI в "софтовом" режиме,
т.е. на команде 0x80
for(int t = 0;t<8;++t){
int_buffer[0]=0x80;
int_buffer[1]=(byte&0x80)?(0x03):(0x01);
int_buffer[2]=0x0B;
ftStatus = FT_Write(ftHandle,int_buffer,3,&written);
if (ftStatus != FT_OK) { cout<<"pin write fail "<<ftStatus<<endl;};
usleep(50);
int_buffer[0]=0x80;
int_buffer[1]=(byte&0x80)?(0x02):(0x00);
int_buffer[2]=0x0B;
ftStatus = FT_Write(ftHandle,int_buffer,3,&written);
if (ftStatus != FT_OK) { cout<<"pin write fail "<<ftStatus<<endl;};
byte<<=1;
usleep(50);
};
оно. конечно, работает, но криво же, тайминги не выдерживаются и вообще.
MiSSioN
Короче, всем спасибо, проблему решил. Оказывается этой микруху нужно было правильно проинитить. Последовательно описана в 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;

Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.