Christians Webseite        << zurück        vor >>

CH341A Eeprom Programmer

ch341a ch341a ch341a ch341a

Dieser low-cost Programmer ist für viele der gängigen seriellen 8-Pin Eeproms geeignet. Er ist recht verbreitet in der Computer-Szene um z.B. BIOS-Eeproms zu beschreiben. Nebenbei ist er auch als ISP-Programmer oder als USB-UART Umsetzer einsetzbar.

Das Design basiert auf dem CH341A Chip der Firma Nanjing Qinheng Microelectronics. Dies ist ein USB Interface Baustein der alle möglichen Schnittstellenprotokolle anbietet (UART, parallel Port, I2C, SPI). Sein kleiner, abgespeckter Bruder, der CH340, ist sehr verbreitet als USB-UART Umsetzer.

Ich möchte diesen Programmer benutzen um 9346 und 9356 Eeproms zu programmieren.
Bisher habe ich dafür PonyProg mit seinem super simplen RS232-Interface benutzt. Serielle PC-Schnittstelle sind aber mittlerweile kaum noch vorhanden und eine modernere USB-Lösung musste her.

Im Lieferumfang waren noch ein paar Adapter und ein Test-Clip. Der Clip ist leider vom billigsten und kaum brauchbar.
ch341a ch341a

Auf der Platine sind die Positionen der wichtigen Signale gekennzeichnet.
ch341a ch341a
ch341a ch341a

Ein Blick auf den Schaltplan zeigt dass die Schaltung auf das absolut notwendige Minimum reduziert ist, wie üblich bei diesen Low-Cost Gimmicks. Besonders wenn man exotischere Bauteile programmieren möchte sollte man daher vorher überprüfen ob sie mit den Spannungspegeln zurecht kommen. Der CH341A läuft mit 5V, das Eeprom im Sockel wird mit 3.3V versorgt. Eine recht merkwürdige Auslegung die aber wohl dank der toleranten Auslegung der Eeproms meistens funktioniert.

Ich würde NICHT empfehlen den Programmer direkt out-of-the-box einzusetzen. Vorab sollte man zumindest anhand des Datenblatts des Eeproms abklären ob es für 5V geeignet ist.

93xx Eeproms

Der Programmer ist ursprünglich für die 24er Two-Wire und 25er SPI Eeprom Serien ausgelegt, ebenso die mitgelieferten Adapter. Mit der passenden Software kann er aber auch andere Protokolle bedienen.

Die sog. 93er Three-Wire Eeproms werden (wurden?) häufig in Tachos und Steuergeräten in Motorrädern und Autos eingesetzt. Ein typisches Exemplar ist das M93C46 von "STMicroelectronics" mit der folgenden Pin-Belegung:
ch341a ch341a

Bei der Betrachtung der Belegung des Programmer-Sockels und des Zubehöres erkennt man ziemlich schnell dass es keine direkte Übereinstimmung der Pin-Belegungen gibt. Eine Adaptierung ist also notwendig.
ch341a ch341a ch341a ch341a

Die Belegung der restlichen Pins hängt vom Einsatzfall ab:

Das Eeprom bleibt im (Steuer-)Gerät, wird von dort mit Spannung versorgt und über den Clip kontaktiert

  • alles gut, keine weiteren Signale notwendig
  • Bootloader ins Target laden mit AVRdude
  • Firmware kodieren und übertragen
Es hängt allerdings auch von der internen Schaltung des Steuergeräts ab ein Zugriff im Betrieb überhaupt funktioniert.

Das Eeprom ist ausgebaut und nicht mit der Ziel-Elektronik verbunden
  • Vcc muss zusätzlich angelegt werden, der Wert steht im Datenblatt. Die meisten Varianten tolerieren 3.3V
  • ORG auf Masse (8-Bit, Byte) oder Vcc (16-Bit, Word) legen, wie in der Ziel-Elektronik
  • DU (Don't Use) bleibt unbelegt

Mit ein wenig Geschick und Fädeldraht kann man einen der mitgelieferten Adapter umbauen.

Three-Wire/SPI/Microwire?

Three-Wire ist der Oberbegriff für SPI Schnittstellen. Einige Hersteller haben die SPI Anforderungen strikter formuliert und dem ganzen einen neuen Namen gegeben (z.B. National Semiconductor -> Microwire). Ebenso kann es feine Unterschiede in den Protokollschichten geben. Obwohl alles sehr ähnlich ist wird deshalb weiterhin der jeweilige Begriff verwendet.

Programmer modifizieren

Wie bereits erwähnt ist die Beschaltung des CH341A alles andere als optimal. In den Foren gibt es sogar vereinzelt Berichte über zerstörte Eeproms. Der Grund liegt in der Stromversorgung.

Der CH341A wird direkt vom USB mit 5V versorgt. Die Pegel seiner Ausgangssignale sind daran gekoppelt. Das zu programmierende Eeprom wird aber nur mit 3V versorgt. Die üblichen internen Schutzbeschaltungen an den Signaleingängen (Diode nach Vcc) führen dann zu einer indirekten Speisung des gesamten ICs über die Schutzdioden. Auf dem Papier ist das total unsauber, in der Praxis funktioniert es aber meistens. Viele Eeproms sind tolerant für einen VCC-Bereich von 3..5V ausgelegt. Bei 1.8V Typen wäre ich aber vorsichtig.

Wenn man das Eeprom direkt in der Zielschaltung programmieren möchte wird es noch undefinierter. Die umgebende Beschaltung ist unbekannt und der vorliegende Logikpegel muss beachtet werden (1.8, 3.3 oder 5V?).

Diese Problematik und eine Lösung wurden z.B. im EEVblog-Forum ausführlich diskutiert. Dort findet sich auch ein Link zu GitHub unter dem ein Forumsmitglied dankenswerterweise seine Analyseergebnisse der Platine und einen Schaltplan abgelegt hat.

Wie häufig bei solchen Clones sind sie nicht alle genau identisch. Das Layout von meinem Exemplar zeigt einige kleinere Abweichungen. Aber der Schaltplan ist identisch. Darauf basierend habe ich die folgenden Modifikationen vorgenommen:

ch341a ch341a

Der CH341A kann wahlweise (per Jumper) mit 3V oder mit 5V versorgt werden. Die Vcc-Pins im Sockel und den Steckkontakten erhalten die gleiche Spannung. Sie sind jetzt auch alle miteinander verbunden, so das man nicht mehr (versehentlich) mixen kann. Alternativ kann man die Eeprom-Versorgung unterbrechen und von der Ziel-HW versorgen lassen.

Auf der Patine habe ich einige Leiterbahnen unterbrochen und ein paar Fadeldrähte gezogen.
ch341a ch341a ch341a ch341a
ch341a ch341a

Bei dieser Gelegenheit habe ich direkt auch den empfohlenen Kondensator zwischen Pin 2 (RSTi) und Vcc eingefügt:
ch341a ch341a

Die zusätzlichen Jumper sitzen auf einer kleinen Platine.
ch341a ch341a ch341a ch341a

Eine kleine Unsauberkeit bleibt noch offen, der Pegel an Pin [9], V3.
ch341a ch341a

Laut Datenblatt soll dieser Pin abhängig von der Betriebsspannung Vcc unterschiedlich beschaltet werden:

  • 5V: ein Kondensator nach Masse (wie auf der Originalplatine)
  • 3V: verbinden mit Vcc
Vermutlich sitzt hier eine ~3V Referenzspannungsquelle die mit dem Kondensator "beruhigt" wird, das Datenblatt liefert dazu leider keine weiteren Infos. Die Referenz wird bei 3V Vcc nicht mehr richtig funktionieren, deshalb wird direkt Vcc verwendet. Beim Umschalten auf 5V würde sie dann aber beschädigt. Mit einen zusätzlichen Jumper könnte man das Problem lösen. Aber nach Murphy wird man irgendwann das gemeinsame Umstecken vergessen..

Möglicherweise wäre es eine Lösung Pin [9] dauerhaft mit dem 3V-Regler zu verbinden.

Software

Die "originale" Software unterstützt nur die 24er und 25er Eeprom-Serien. Für meine Anwendung leider nicht brauchbar :
ch341a ch341a

Glücklicherweise hat ein findiger Programmierer eine alternative Software erstellt die zusätzlich auch die 93er Microwire Eeproms unterstützt. Das Programm hat den Namen UsbAsp-flash, bzw AsProgrammer.
(Es hat aber nichts zu tun mit dem legendären und namensgleichen USBasp Atmel-Programmer von Thomas Fischl.)
ch341a ch341a

Das Programm ist in Pascal/Delphi erstellt. Mit ein wenig Anlauf konnte ich das Projekt in FreePascal/Lazarus zum laufen bringen. Eine hervorragende Basis wenn man eigene Erweiterungen einbauen möchte. Ein paar Hinweise für Spezies die das gerne selbst nachvollziehen möchten:

  • Das "RichMemo" Package im Lazarus über die Online-Package-Verwaltung hinzufügen
  • Das für Lazarus angepasste "MpHexEditor"-Package aus dem GitHub herunterladen und manuell installieren

Natürlich kann man auch direkt die fertig kompilierte Windows-Version verwenden.

Sehr angenehm bei diesem Programm ist die erweiterbare Eeprom-Liste und die Möglichkeit eigene Sprachen/Übersetzungen hinzuzufügen zu können.

Die Schnittstelle zum CH341A läuft über eine DLL die offensichtlich vom Hersteller erstellt wurde und keine Sourcen hat. Die Schnittstellen sind aber beschrieben und man kann sie daher in beliebige andere Umgebungen einbinden.

Links und Hinweise

Ein guter Einstieg ist GitHub:
CH341-Store präsentiert eine sehr umfassende Übersicht.
PonyProg scheint mittlerweile auch den CH341A zu unterstützen.

Bei OneTransistor finden sich diverse Blog-Einträge:
CH341A Mini Programmer Schematic and Drivers
CH341A SPI Programming (Windows API)
Use CH341A with AsProgrammer on Windows

Im EEVblog-Forum findet sich eine Umbauanleitung für 5V-Eeproms:
CH341A Serial Memory Programmer Power Supply Fix
Dort wird u.a. diskutiert was man für eine saubere 5V/3.3V Umschaltung machen muss. Ausserdem findet sich dort ein Link zu GitHub mit Infos zur Platine und einem KiCad Projekt.

Ein YouTube Video zur Adaption von 93xx Eeproms:
Modify the CH341A EEPROM Programmer (Black Edition) for 5V 93XXX + 95XXX Automotive Use

Der AsProgrammer ist die passende PC-Software um auch die 93er Serien zu unterstützen.
UsbAsp-flash

Alle notwendigen (Windows-)Treiber befinden sich in der Datei CH341PAR.ZIP (siehe CH341-Store GitHub).
Alternativ kann man das Board auch als USB-UART-Bridge verwenden. Dann werden die Treiber aus CH341SER.ZIP benötigt.