Forum: Mikrocontroller und Digitale Elektronik FT232H: TxD, RTS, DTR im Bit Bang Mode als Inputs möglich?


von Michael960 (Gast)


Lesenswert?

Hallo zusammen,

nachdem ich unter 
http://hackaday.com/2009/09/22/introduction-to-ftdi-bitbang-mode/ vom 
Bit Bang Mode des FT4232H gelesen habe, war ich neugierig und habe mir 
mit Lazarus (Delphi-Clone) ein kleines Programm geschrieben, das 
(getriggert von einem Windows-Timer) im asynchronen Bit Bang Mode jede 
Millisekunde den Status aller Datenleitungen anzeigt. Mein 
"Versuchsaufbau" ist ein DIGITUS DA-70159 USB-auf-4x-RS232-Adapter von 
Reichelt zusammen mit zwei RS232-auf-Bananenstecker-Adapter, die ich 
beliebig zusammen stecken kann.

Grundsätzlich funktioniert mein Programm. Nur gelingt es mir nicht, die 
Pins TxD, RTS und DTR (die im RS232-Modus eigentlich Ausgangs-Pins sind) 
als Eingänge zu nutzen, obwohl dies nach meinem Verständnis des 
Datenblattes 
http://www.ftdichip.com/Support/Documents/DataSheets/ICs/DS_FT4232H.pdf 
Abs. 3.4.2 möglich sein müsste. Oder habe ich etwa das Datenblatt falsch 
verstanden bzw. etwas übersehen und das geht wirklich nicht?

Hier die relevanten Ausschnitte meines Programms:

1
procedure TMainForm.btnRunClick(Sender: TObject);
2
begin
3
  Open_USB_Device_By_Device_Description( cmbDevice1.Text );
4
  Set_USB_Device_BitMode( $00, $01 );
5
  FT_Current_Baud := StrToInt( cmbBaudRate.Text );
6
  Set_USB_Device_BaudRate;
7
8
  Timer.Enabled := True;
9
10
  btnRun.Enabled := False;
11
  btnStop.Enabled := True;
12
end;      
13
14
procedure TMainForm.btnStopClick(Sender: TObject);
15
begin
16
  Timer.Enabled := False;
17
18
  Close_USB_Device;
19
20
  btnStop.Enabled := False;
21
  btnRun.Enabled := True;
22
end;     
23
24
procedure TMainForm.TimerTimer(Sender: TObject);
25
  var
26
    LastByte: Byte;
27
    BytesRead: Integer;
28
begin
29
  Get_USB_Device_QueueStatus;
30
31
  if FT_Q_Bytes > 0 then begin;
32
    BytesRead := Read_USB_Device_Buffer( FT_Q_Bytes );
33
    LastByte := FT_In_Buffer[BytesRead - 1];
34
35
    if ( LastByte and %00000001 ) > 0 then begin
36
      shpDevice1Bit0.Brush.Color := clGreen;
37
    end else begin
38
      shpDevice1Bit0.Brush.Color := clRed;
39
    end;
40
41
    // [...]
42
43
    if ( LastByte and %10000000 ) > 0 then begin
44
      shpDevice1Bit7.Brush.Color := clGreen;
45
    end else begin
46
      shpDevice1Bit7.Brush.Color := clRed;
47
    end;
48
49
  end;
50
end;

Schon mal vielen Dank für Eure Antworten!

Viele Grüße
Michael

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Deinem Code entnehme ich nicht, daß Du hier irgendwo einen Bitbang-Modus 
konfiguriert hast.

Hast Du Dir im Datenblatt auch den Abschnitt 4.5 und das dort erwähnte 
Dokument AN2232-02, “Bit Mode Functions for the FT2232” angesehen?

von Michael960 (Gast)


Lesenswert?

Hallo Rufus,

vielen Dank für Deine schnelle Antwort!

Abschnitt 4.5 und AN2232-02 hatte ich gelesen und war der meinung, in 
der dritten Zeile von oben würde ich in den Bit Bang Modus wechseln:
1
Set_USB_Device_BitMode( $00, $01 );

Der erste Parameter ($00) definiert alle Leitungen als Inputs und der 
zweite Parameter ($01) schaltet in den asynchronen Bit Bang Modus - so 
zumindest mein Verständnis der genannten Dokumente.

Aber auch wenn ich den ersten Parameter auf $FF setze (was nach meinem 
Verständnis der Dokumente alle Leitungen als Outputs definiert), kann 
ich die RS2332-Inputs weiterhin als Inputs verwenden. Der einzige 
Unterschied ist, dass dann von den RS232-Outputs dauerhaft 0 zurückgeben 
statt dauerhaft 1 (jeweils unabhängig von der von außen angelegten 
Spannung).

Die Funktion Set_USB_Device_BitMode() ist in der von FTDI 
herunterladbaren Delphi-Unit D2XXUnit.pas definiert und ruft die im 
AN2232-02 genannte Funktion FT_SetBitMode() auf:
1
Function Set_USB_Device_BitMode(Mask,Enable:Byte) : FT_Result ;
2
Begin
3
  Result := FT_SetBitMode(FT_Handle,Mask,Enable);
4
  If Result <> FT_OK then FT_Error_Report('FT_SetBitMode ',Result);
5
End;

Viele Grüße
Michael

von Michael960 (Gast)


Lesenswert?

Hallo zusammen,

ich weiß jetzt, warum die RS232-Outputs sich auch im Bit Bang Modus 
nicht als Inputs nutzen lassen: in dem DIGITUS-Adapter sitzt hinter dem 
FT4232H noch ein Pegelwandler EXAR SIPEX SP213ECA und dieser ist nicht 
bidirektional. Hätte ich mir den Hardware-Teil des FT4232H-Datenblattes 
mal gründlich durchgelesen, wäre ich da früher drauf gekommen dass er 
ohne Pegelwandler gar keine RS232-Pegel ausgeben kann ... statt dessen 
habe ich den Adapter aufgeschraubt :o)

Viele Grüße
Michael

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.