Jak spínat výstupy v bit-bang režimu?

Používám obvod FT2232H jako převodník na I2C sběrnici. Sběrnice je připojena na první port a na druhém bych si chtěl udělat nějaké dig. vstupy a výstupy. Ale narazil jsem na problém a po několika dnech laborování, už nevím co s tím. Jde o spínání výstupů v bit-bang režimu. Program tvořím v Delphi a pro spínání používám příkaz FT_Write (ftHandle, parametr A, parametr B, parametr C). Když dám příklad: chci sepnout druhý bit portu. Potom hodnota parametru A by měla být 00000010, hodnota parametru B je 1 (odesílám jeden byte). Jde o to, že mě to takhle nefunguje. Ať je za A dosazeno cokoliv, nic se neděje, výstupy se spínají podle hodnoty parametru B, což mi přijde nesmyslné, navíc hodnoty, při kterých výstupy spínají, také nedávají smysl. Co dělám špatně? Nebo se příkaz FT_Write ke spínání výstupů v bit-bang režimu nepoužívá?

:arrow_right: administrator: přesunuto z "Ostatní"

V knihe USB prakticky s FTDI, ak som to správne pochopil, tvrdia, že by si mal do parametra A vkladať adresu a nie hodnotu.

Takto je to tam uvedené:
FT_STATUS FT_Write(FTJHANDLE ftHandle, LPVOID IpBuffer, DWORD dwBytesToWrite, LPDWORD IpdwBytesWritten);
Parametry:
■ ftHandle - handle zařízení, na které se má zapisovat,
■ IpBuffer - adresa bufferu zapisovaných dat,
■ dwBytesToWrite - počet bajtů, které chceme zapsat,
■ IpdwBytesWritten - adresa proměnné typu DWORD pro příjem skutečného počtu
zapsaných bajtů.

Príklad:
ftStatus=FT_Write(ftHandle, &data, 1, &pocet);
if(ftStatus!=FT_OK) { //chyba }

Skús tak, možno pomôže, ak nie, trochu viac sa rozpíš…

Přesně takhle jsem to pochopil i já z manuálu ke knihovně D2XX. Mám nastavené první a poslední dva piny portu B jako vstupy, zbytek výstupy. Dejme tomu, že chci sepnout třetí pin (počítáno od pinu s nejnižší platností). Tady je přepis části zdrojáku, jak by to mělo být a jak jsem to zkoušel:

dataout := 4; //v bin soustavě 00000100
bytesTotransfer := 1;
ftStatus := FT_Write (ftHandleB, @dataout, bytesTotransfer, @bytesTotransfered);
if ftStatus <> 0
then MessageDlg(‘Chyba komunikace’, mtError, [mbOk], 0);

Ale takhle mi to právě nefunguje. Ať mám v proměnné dataout cokoliv, tak se mi nesepne nic. Naopak, když měním hodnotu v proměnné bytesTotransfer, tak se výstupy spínají ať je hodnota v proměnné dataout jakákoliv. Pro tenhle případ se mi výstup sepne, když jsou hodnoty následující:

dataout := 0;
bytesTotransfer := 14;
ftStatus := FT_Write (ftHandleB, @dataout, bytesTotransfer, @bytesTotransfered);
if ftStatus <> 0
then MessageDlg(‘Chyba komunikace’, mtError, [mbOk], 0);

Nevím, jak si to vysvětlit. Něco dělám špatně, ale netuším co.

Mám tu jeden dobrý článok z KE1/2009, skús pozrieť ešte tam, inak ti bohužiaľ neviem poradiť.
KE1_2009.zip (3.02 MB)

Mám dojem, že jsem měl ten samý problém.
FTDI obvod mi nechtěl zaboha spínat k VCC, ale k nule to šlo.
Vyřešil jsem to externím pullup odpůrkem.
Není to sice košér, ale fungovalo to.

Tak už je vím, kde byl problém.
Pro nastavení big-bang režimu jsem používal funkci Set_USB_Device_BitMode z D2XX unity pro Delphi, ale příkaz FT_Write jsem implementoval do programu přímo z DLL knihovny. Nevím, jaký to má vliv, když se to takhle zkombinuje (do programování zase tolik nevidím), ale když jsem v programu použil přímo příkaz FT_SetBitMode, tak pak všechno běželo jak má. Jiné změny jsem v programu nedělal, tak to muselo být ono.

Díky moc za pomoc, napadlo mi to, když jsem se koukal na ten výpis zdrojáku v článku z KTE :wink:

Nie je za čo, som rád že ti to pomohlo…