Christians Webseite        << zurueck        vor >>

CH341A Eeprom Programmer

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

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

Ein Blick auf den Schaltplan zeigt dass die Schaltung auf das absolut notwendige Minimum reduziert ist. Das ist bei diesen Low-Cost Gimmicks übliche Praxis und natürlich keine Überraschung. Als Folge gibt es aber ein kleines Durcheinander bei den verwendeten Spannungen. Man sollte deshalb genau hinschauen ob das zu programmierende Bauteil mit den zusammengewürfelten Spannungspegeln zurecht kommt. Der CH341A und seine Signal-Ports laufen mit 5V, das Eeprom im Sockel wird mit 3.3V versorgt. Eine recht merkwürdige Auslegung die vermutlich nur dank der toleranten Auslegung der Eeproms meistens funktioniert.

Link: https://www.onetransistor.eu/2017/08/ch341a-mini-programmer-schematic.html
ch341a

Ich würde NICHT empfehlen den Programmer direkt out-of-the-box einzusetzen. Vorab sollte man zumindest anhand des Datenblatts abklären ob der Speicherbaustein 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 (und ihre Geschwister mit ähnlicher Speichergrösse) 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

Bei der Betrachtung der Signalbelegung des Programmer-Sockels und des Zubehöres erkennt man schnell dass es keine Übereinstimmung der Pin-Belegungen gibt. Eine Adaptierung ist daher notwendig. Mit ein wenig Geschick und Fädeldraht kann man einen der mitgelieferten Adapter umbauen. (Bilder jeweils Top-View):
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
Es hängt allerdings stark von der internen Schaltung des Steuergeräts ab ob ein Zugriff im Betrieb überhaupt funktioniert. Der CH341A hängt parallel zum existierenden Bus und muss dessen Pegel übersteuern. Was dabei in der unbekannten Schaltung passiert ist kaum vorhersagbar und undefiniert. Es würde mich auch nicht wundern wenn es dabei zu Schäden kommt..

Das Eeprom ist ausgebaut und nicht mit der Ziel-Elektronik verbunden
Diese sichere Methode würde ich empfehlen wenn man keine Erfahrung mit der Zielelektronik hat. Das Auslöten eines modernen SMD-Speicherbausteins ist allerdings ebenfalls ein riskantes Handwerk.
  • 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

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 Eeproms.

Der CH341A wird direkt vom USB mit 5V versorgt, die Pegel seiner Ausgangssignale sind daran gekoppelt. Das zu programmierende Eeprom wird über Vcc aber nur mit 3V versorgt. Seine üblichen internen Schutzbeschaltungen an den Signaleingängen (Dioden nach Vcc) führen dann zu einer indirekten Speisung des gesamten ICs über diese 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 sehr 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.
ch341a

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 kleinen Modifikationen im Bereich der Stromversorgung vorgenommen. Die Änderungen sind in rot unterlegt:

ch341a

Die 5V vom USB gehen nun nur noch direkt zum Spannungsregler. Dort kann ausgewählt werden (Jumper A) ob die ganze Schaltung mit 3V oder mit 5V versorgt werden soll. Die Vcc-Pins im Sockel und den Steckkontakten sind jetzt alle miteinander verbunden und auf gleichem Potential. So kann man nicht mehr (versehentlich) mixen. Alternativ kann man die Eeprom-Versorgung unterbrechen (Jumper B) und von der Ziel-HW versorgen lassen.

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

Bei dieser Gelegenheit habe ich direkt auch den im Datenblatt empfohlenen Kondensator zwischen Pin 2 (RSTi) und Vcc eingefügt (steht hochkant auf dem Pin, schwer zu erkennen):
ch341a

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

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

Laut Datenblatt soll dieser Pin unterschiedlich beschaltet werden, in Abhängigkeit von der Betriebsspannung Vcc :

  • 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 und der Pin deshalb in diesem Fall direkt mit Vcc verbunden. 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 den Pin [9] dauerhaft mit dem 3V-Regler zu verbinden?

In meinem Exemplar habe ich alles gelassen wie es ist. Die Schaltung funktioniert offensichtlich einwandfrei und ich möchte nichts verschlimmbessern.

Software

Die "originale" Software unterstützt nur die 24er und 25er Eeprom-Serien. Für meine Anwendung leider nicht brauchbar :
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

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.