FTDI – FT232RL

In diesem Artikel beschäftigen wir uns mit einem Chip von FTDI der durch das aussterben der alten seriellen Schnittstelle immer mehr an Präsenz gewinnt. Mit dem FT232 RL  Chip von FTDI kann man ganz einfach mit einem Mikrocontroller eine Verbindung zu einem USB-Host, zum Beispiel einem PC herstellen. Und das beste daran ist, dass man sich nicht mit der USB-Spezifikation auseinandersetzten muss.

Der FT232 RL  übernimmt sämtliche Aufgaben der USB-Schnittstelle und bietet für euch nach außen hin eine virtuelle serielle Schnittstelle an. Das bedeutet, dass Ihr über das ganz einfache UART Modul eures Controllers mit dem PC Kontakt aufnehmen könnt, wie man es von früher gewohnt ist. Nur, dass dies nun über USB, statt über den seriellen Port geschieht – klasse!

Was wir alles brauchen

Zunächst einmal benötigt ihr natürlich den FT232 RL  selber. Am besten ladet Ihr euch auch gleich das Datenblatt  des Chips herunter. Und hier kommt dann auch der größte und zugleich einzige Haken an der Sache. Es gibt das IC leider nur in SMD Bauform.

ftdi

Wer sich absolut nicht zutraut diese Bauform zu löten, der kann jedoch auf sog. Breakout-Boards ausweichen. Einfach mal auf eBay nach “FT232RL” suchen. Hier gibt es Unmengen an günstigen Angeboten. Das nachfolgende Foto zeigt ein solches Breakout-Board (auch bei eBay erstanden).

DSC04155

In diesem Artikel behandele ich die serielle Ansprache des Chips unter Windows. Dafür benötigt ihr die Treiber für den PC. Diese findet ihr auf der Webseite von FTDI . Am anderen Ende sollte sich dann euer Mikrocontroller befinden.

Hardwareaufbau/Schaltplan

Wenn Ihr euch für ein Breakout Board entschieden habt, dann könnt Ihr dieses Kapitel auch einfach überspringen. Für alle anderen: Wir schauen uns nun an, wie das IC, also der FT232 RL  zu beschalten ist. Erstmal vorweg, hier gibt es das Datenblatt zum Chip. In diesem steht im Grunde genommen alles was man wissen muss. Ich beschreibe an dieser Stelle mal den USB Powered Mode. Dieser wird verwendet, wenn euer Board über den USB-Bus mit Strom versorgt wird. Ihr findet das entsprechende Schaltbild auf Seite 23 im Datenblatt.

usb_powered

Hier gleich ein wichtiger Hinweis: Wenn Ihr euch Gedanken über den Anschluss des USB-Schirms macht, also die Abschirmung um das Kabel (und Gehäuse der Buchsen), dann schaut euch bitte dieses Dokument an. Zusammengefasst: Den Schirm des USB-Kabels sollte man nicht direkt mit der Masse der Platine verbinden. Auch wenn das bei manch einem oft gut gegangen ist. Der Schirm des Kabels ist eine hervorragende Antenne und könnte das Potential eurer Masse anheben. Entweder lasst ihr den Schirm auf eurer Seite offen oder koppelt ihn über einen Widerstand mit 1\,\text{M}\Omega , parallel zu einem Kondensator mit ca 4\text{,}7\,\text{nF}  an eure Masse.

Als Ferritperle, siehe Schaltplan, kann zur Entstörung einer der folgenden von Reichelt verwendet werden. Jedoch berichtet die große Mehrheit der Anwender, dass die Spule nicht zwingend notwendig ist. Im Zweifel aber lieber einplanen.

ft232rl_led_con

Am Mikrocontroller schließt ihr TxD vom FTDI an RxD vom PIC und RxD vom FTDI an TxD vom PIC. Und nicht anders 🙂 Wenn ihr möchtet könnt ihr eine oder zwei LEDs für die Anzeige von RxD und/oder TxD zusammen verwenden. So könnt ihr eine aktive Kommunikation “sichtbar” machen. Ich verwende die im Bild rechts dargestellte Version mit einer LED zur Anzeige.  Die gewählte Version wird dann über ein kleines Tool ( Download  – User Guide ) vom PC aus, eingestellt. Die entsprechende(n) LED(s), samt dem/den Widerstand/ Widerständen sind von euch am Chip anzubringen.

Signalpegel

Der FT232 RL  wird über den USB-Anschluss mit 5V vom Host, also dem PC, Rasberry Pi, o.ä. versorgt. Insofern liefert der Chip auch 5V-Pegel zu eurem Mikrocontroller. Wenn ihr euren Mikrocontroller ohnehin mit 5V betreiben wollt/wolltet ist das natürlich ideal. Wenn ihr jedoch eure restliche Schaltung auf z.B. 3,3V ausgelegt habt, weil vielleicht andere Peripherie nur mit 3,3V betrieben werden kann (nicht unüblich bei vielen Displays …), dann sind die 5V die vom FT232 RL  kommen würden natürlich zu viel. Der FT232 RL  kann jedoch auch auf 3,3V-Pegel eingestellt werden. Hierfür müsst ihr lediglich Pin #3 ‘VCCIO’ mit dem Pin #17 ‘3V3 OUT’ verbinden und schon liefert der FT232 RL  3,3V-Pegel. Der 100\,\text{nF} Kondensator von Pin #17 ‘3V3 OUT’ gegen GND muss weiter beschaltet werden.

Schritt für Schritt

Software/Programme

Folgende Software wird auf dem PC benötigt:

  • Die Treiber für den FT232RL
  • FT-Prog zur Konfiguration des FT232RL
  • Eine Benutzeranwendung, z.B. TeraTerm

Also die Treiber (Virtual COM Port Drivers – VCP) für den FT232RL findet Ihr je nach Betriebssystem auf der Webseite  von FTDI. Hier gibt es ebenso das Programm FT-Prog zum Download  , mit dem sich der Chip bei Bedarf konfigurieren lässt.

Es würde natürlich Sinn machen, wenn ihr euch eine eigenes Programm samt grafischer Benutzeroberfläche programmiert, mit der ihr die Kommunikation/Steuerung verwalten könnt. Für den ersten Test kann man jedoch auch einfach ein Terminal starten und die eingehenden Daten ansehen oder durch Tastatureingabe Daten senden. Hierfür bietet sich zum Beispiel das Terminal Tera Term (v4.87)  an. Hier wählt ihr einfach den gewünschten COM-Port, die Baudrate, … aus und schon empfängt/sendet das Terminal.

Schauen wir uns unsere Checkliste an:

  1. Hardware ist vorhanden (PIC inkl. FTDI) 
  2. Treiber (VCP) sind installiert
  3. Das Tool FT-Prog ist installiert 
  4. Terminal auf dem PC installiert 

Gut, wenn diese drei Schritte soweit erledigt sind, kann es mit dem Erstellen der Firmware für den Mikrocontroller weiter gehen.

Firmware (Mikrocontroller)

Wir programmieren jetzt die Gegenstelle, die die gesendeten Daten in Empfang nimmt und auch seinerseits Daten verschickt. Dies ist üblicherweise ein Mikrocontroller, der zum Beispiel Temperaturdaten erfasst und sie an eine Kontrolleinheit (vielleicht ein Raspberry Pi) schickt, das wiederum mit den gesammelten Daten eine Hausautomation realisiert (nur ein Beispiel).

An dieser Stelle werde ich Schritt für Schritt beschreiben, wie ein Mikrocontroller programmiert werden muss, damit eine Verbindung zwischen PC und Mikrocontroller hergestellt werden kann. Ich verwende hierzu Beispielhaft einen PIC18F45K22. Ich möchte zunächst demonstrieren wie Daten vom PC an den PIC gesendet werden können.

Damit geprüft werden kann ob eine erfolgreiche Kommunikation zustande gekommen ist, müssen die übertragenen Daten natürlich in irgendeiner Art und Weise geprüft bzw. verifiziert werden. Hier gibt es verschiedene Herangehensweisen. Ich werde die empfangenen Daten auf einem LC-Display zur Anzeige bringen. Denkbar wäre auch das einfach überprüfen von Registerinhalten mit einem Debugger.

Zusätzlich werde ich die Datenleitungen mit einem Logicanalyzer überwachen. Auf diese Weise würde man Übertragungsfehler sofort finden und könnte entsprechend reagieren. An der Stelle möchte ich gerne auf meinen  Artikel zu den Logic-Analyzern der Firma Saleae  verweisen, die ich sehr empfehlen kann.

Initialisierung des USART-Moduls

Wenn euer Mikrocontroller über eine USART Einheit verfügt, steht der Kommunikation nichts mehr im Weg. Im Datenblatt des PIC findet ihr mit den Begriffen RXD und TXD die Pins des Controllers heraus, die für das Empfangen und Aussenden von Daten vorgesehen sind. Beim hier als Beispiel verwendeten PIC18F45K22 sind dies z.B. RC6 und RC7.

Der nachfolgende Programmcode initialisiert das USART-Modul am PIC18F45K22, sollte sich jedoch bei anderen PIC nicht großartig unterscheiden und ist daher gut übertragbar. Das Modul wurde im Beispiel auf 8 Bit, 9600 bit/s und 1 Stoppbit konfiguriert.


void initEUSART(void)
{
   TXSTA = 0b00100000;
   RCSTA1 = 0b10010000;
   BAUDCON1bits.BRG16 = 0;
   SPBRG1 = 12;
   IPR1bits.RC1IP = 1;
   PIE1bits.RC1IE = 1;
}

Für genaue Einstellungen des Moduls bitte einen Blick in das Datenblatt eures verwendeten Controllers werfen und nach EUSART suchen. Mit dieser Funktion kann ein Zeichen über die serielle Schnittstelle, über den FTDI via USB an die Gegenstelle gesendet werden.


void transmitEUSART(char value)
{
   /*are you ready to send out new data?*/
   if(PIR1bits.TX1IF)
   {
      /*load the byte into the buffer*/
      TXREG1 = value;
   }
}

In dem oben gezeigten Beispiel wurde die Priorität des EUSART-Interrupts auf High eingestellt. Aufgrund dessen muss der Interrupt auch in der entsprechenden ISR empfangen/erwartet werden, siehe:


char eusartInput;

// ...

void interrupt highPrio(void)
{
   /*is there an unreaded byte in the buffer?*/
   if(PIR1bits.RC1IF == 1)
   {
      /*clear int-flag by readout the buffer*/
      eusartInput = RCREG1;
   }
}

Leave a Reply

Your email address will not be published. Required fields are marked *