CH341A Eeprom Programmer
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.
Auf der Platine sind die Positionen der wichtigen Signale gekennzeichnet.
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
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:
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):
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
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.
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:
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.
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):
Die zusätzlichen Jumper sitzen auf einer kleinen Platine.
Eine kleine Unsauberkeit bleibt noch offen, der Pegel an Pin [9], V3.
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
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 :
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.)
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.