Ich arbeite an einem neuen Produktdesign und es wird während der Lebensdauer des Produkts wahrscheinlich kleine oder große Hardwareänderungen/Korrekturen geben. Für zukünftige Firmware-Updates im Feld benötige ich eine Möglichkeit, die Hardware-Revision zu ermitteln. Was ist eine gute Strategie?
Ich ziehe derzeit zwei Ersatzstifte mit externen Widerständen nach oben / unten und überprüfe das Muster. Dies erlaubt nur 4 Hardware-Revisionen, aber das könnte für praktische Zwecke ausreichen. Es könnte ein Problem werden, wenn ich einen oder beide dieser Pins in einer zukünftigen Hardware-Revision benötige.
Ich denke, ein wirtschaftlicherer Weg könnte darin bestehen, einen Widerstandsteiler an einen ADC-Pin anzuschließen. Jede Hardware-Revision könnte Widerstände mit unterschiedlichen Werten haben. Leider habe ich keine Ersatz-ADCs in meinem aktuellen Design.
Ich denke, eine andere Möglichkeit könnte darin bestehen, die Hardware-Versionsnummer während der Produktion in einem EEPROM oder dem MCU-Flash zu codieren? (Im Moment haben wir diese Möglichkeit nicht.)
Ich denke, ich suche nach Vorschlägen für eine flexible und robuste Methode.
[BEARBEITEN]
Betreff. Vorschlag von @trav1s: Ich habe per se keinen Adressbus, aber ich habe ein 24LCxx-EEPROM auf dem I2C-Bus. Die niedrigen 3 Bits der Slave-Adresse sind fest verdrahtet. Ich denke, ich könnte die Adressbits ändern und während des Starts nach dem EEPROM suchen.
Damit beschäftige ich mich laufend. Wir haben sehr komplexe Hardware, die seit fast 10 Jahren im Einsatz ist, mit verschiedenen Versionen verschiedener Subsysteme. Einige der Subsysteme haben einen 2-Bit-Code, aber wie Sie bereits erwähnt haben, reicht das nicht immer aus.
Der EEPROM-Vorschlag ist gut, erfordert jedoch die Programmierung des EEPROM und die Bestückung der Platine mit der richtigen Version.
Was ich vorschlagen würde, ist ein 8-Bit-Parallel-In-Serial-Out-Schieberegister wie ein 74HC166. Die Versionsnummer kann am Eingang von der PC-Platine selbst eingestellt werden, indem die Eingänge HIGH oder LOW verbunden werden, und dann benötigen Sie nur 3 Pins, um das Schieberegister von einer MCU zu laden und zu lesen.
Ich würde keine in den Mikrocontroller einprogrammierte Versionsnummer verwenden. Es sei denn, die Software ist für verschiedene Boardversionen unterschiedlich, aber dann erscheint mir die Boardversion überflüssig. Haben Sie so wenige Versionen der Software des Mikrocontrollers wie möglich, idealerweise nur eine. Jede andere Version kann logistische Probleme verursachen.
Der EEPROM-Code ist eine gute Idee, da er viele verschiedene Platinencodes zulässt , aber ihn in einem separaten Gerät aus dem Mikrocontroller herausnimmt. EEPROM ist teuer für große Kapazitäten (viel teurer pro Bit als Flash), aber für ein paar Bytes sind sie billig zu finden. Dieser kostet nur 16 Cent in 100 und benötigt nur 1 E / A-Leitung.
Eine Möglichkeit, die Wahrscheinlichkeit von Fehlern zu verringern, besteht darin, für jede Board-Version ein anderes Paket zu haben. Lassen Sie also eine Reihe von EEPROMs mit einer Versionsnummer 1 in SOT-23, der nächsten Version 2 in MSOP usw. programmieren. Dann können Sie kein EEPROM der Version 1 auf einer Platine der Version 2 haben.
Eine Option, die nur zwei digitale Pins verwendet, sieht etwa so aus:
Durch Ändern der R1- und C1-Werte können Sie unterschiedliche Ladezeiten für den Kondensator haben, die Sie messen können, um die Hardwareversion zu bestimmen.
Wenn im Adressbus ungenutzter Speicherplatz vorhanden ist, können Sie ein ROM-Register auf dem Bus platzieren, das von der MCU gelesen werden kann. Das Register würde die Versionsnummer der Hardware enthalten. Wenn die MCU von dieser Adresse liest, würde das Register seinen Wert auf den Datenbus schreiben. Das Register könnte auf der Platine fest verdrahtet sein, oder wenn Sie die Versionsnummer mit bloßen Händen ändern möchten, könnten Sie Stifte herstellen, die wie jetzt oben/unten gebunden werden können.
Morten
alex.forencich