Was ist ein guter Weg für die MCU, um festzustellen, auf welcher Hardwareversion sie läuft?

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.

Antworten (4)

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.

Mir gefällt, dass die HW-Version fest auf dem Board verdrahtet ist, so brauche ich nur eine Firmware-Version und muss nicht mit vorprogrammierten EEPROMs hantieren. Sieht so aus, als ob ein Schieberegister für etwa 0,1 USD zu finden ist, und das ist in Ordnung.
In diesem Sinne könnten Sie auch einen I2C-Port-Expander verwenden, der an Ihrem I2C-Bus hängt. Es darf aber etwas teurer sein.

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.

Vielen Dank. Dies mag eine dumme Frage sein, aber wie bekomme ich eine Reihe von EEPROMs programmiert, bevor ich sie auf die Platine lege? Ich habe nicht die Möglichkeit, die EEPROMS vom Band zu nehmen, sie zu programmieren, sie wieder auf Band zu bringen und das Band an den Leiterplattenbestücker zu senden.
@morten - Ihr Lieferant kann das für Sie erledigen. Sie schicken ihnen Ihre Datei (dieses eine Byte :-)) und Sie bekommen die Teile programmiert zurück, markiert mit einer Markierung Ihrer Wahl. Die Kosten hängen von der Chargengröße ab; Sie haben feste Kosten + Kosten pro Teil. Wir haben mal ausgerechnet, ob es nicht billiger wäre, selbst zu programmieren, aber für Tausende hat es sich auf jeden Fall nicht gelohnt.

Eine Option, die nur zwei digitale Pins verwendet, sieht etwa so aus:

Schaltplan

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.

Aha, ziemlich schlaue Lösung :-)

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.

Vielleicht könnte ich die Adresse des EEPROM selbst verwenden ... siehe Bearbeiten zur Frage.
OK. Wusste nicht, dass es einen I2C-Bus gibt. Vielleicht könnten Sie einfach einen winzigen I2C-Slave machen, der die Versionsnummer zurückliest, wenn die MCU daraus liest.