Was ist ein guter Weg für die mcu, um festzustellen, auf welcher Hardware-Version es läuft?

13

Ich arbeite an einem neuen Produktdesign und es wird wahrscheinlich kleine oder große Hardware-Änderungen / Korrekturen während der gesamten Lebensdauer des Produkts 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 gerade zwei Ersatzstifte mit externen Widerständen nach oben / unten und überprüfe das Muster. Dies ermöglicht nur 4 Hardware-Revisionen, aber dies könnte für praktische Zwecke ausreichen. Es könnte zu einem Problem werden, wenn ich in einer zukünftigen Hardwarerevision einen oder beide dieser Pins benötige.

Ich denke, ein wirtschaftlicherer Weg könnte sein, einen Widerstandsteiler an einen ADC-Pin anzuschließen. Jede Hardwarerevision kann unterschiedliche Wertwiderstände haben. Leider habe ich in meinem aktuellen Design keine Ersatz-ADCs.

Ich vermute, eine andere Möglichkeit könnte sein, die Hardware-Versionsnummer in einem EEPROM oder dem mcu-Flash während der Produktion zu verschlüsseln? (Wir haben diese Einrichtung im Moment nicht.)

Ich schätze, ich suche nach Vorschlägen für eine flexible und robuste Methode.

[BEARBEITEN]

Re. Vorschlag von @ trav1s: Ich habe keinen Adressbus an sich, aber ich habe ein 24LCxx-EEPROM auf dem I2C-Bus. Die unteren 3 Bits der Slave-Adresse sind fest verdrahtet. Ich denke, ich könnte die Adressbits ändern und während des Startvorgangs nach dem EEPROM suchen.

morten
quelle

Antworten:

7

Damit beschäftige ich mich ständig. Wir haben sehr komplexe Hardware, die seit fast 10 Jahren auf dem Markt 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 das Bestücken der Karte 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 Leiterplatte selbst festgelegt werden, indem die Eingänge HIGH oder LOW belegt werden. Dann werden nur noch 3 Pins benötigt, um das Schieberegister von einer MCU zu laden und zu lesen.

Lyndon
quelle
Mir gefällt, dass die Hardware-Version auf dem Board fest verdrahtet ist, so dass ich nur eine Firmware-Version benötige und keine vorprogrammierten EEPROMs verwenden muss. Es sieht so aus, als ob ein Schieberegister für etwa 0,1 USD gefunden werden kann, und das ist in Ordnung.
Morten
2
In diesem Sinne können Sie auch einen I2C-Port-Expander verwenden, der an Ihrem I2C-Bus hängt. Es kann jedoch etwas teurer sein.
alex.forencich
8

Ich würde keine im Mikrocontroller programmierte Versionsnummer verwenden. Es sei denn, die Software ist für verschiedene Boardversionen unterschiedlich, aber dann erscheint mir die Boardversion überflüssig. Verwenden Sie so wenige Versionen der Mikrocontroller-Software wie möglich, idealerweise nur eine. Jede andere Version kann zu logistischen Problemen führen.

Der EEPROM-Code ist eine gute Idee, da er viele verschiedene Kartencodes zulässt , diese jedoch in einem separaten Gerät aus dem Mikrocontroller entfernt. EEPROM ist teuer für große Kapazitäten (viel teurer pro Bit als Flash), aber für ein paar Bytes kann man sie billig finden. Dieser ist nur 16 Cent in 100s und benötigt nur 1 I / O-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 der Versionsnummer 1 in SOT-23, der nächsten Version 2 in MSOP usw. programmieren. Dann können Sie auf einer Karte der Version 2 kein EEPROM der Version 1 haben.

stevenvh
quelle
Danke. Dies mag eine blöde Frage sein, aber wie kann ich eine Reihe von EEPROMs programmieren, bevor ich sie auf die Platine stelle? Ich habe nicht die Möglichkeit, die EEPROMs vom Band zu nehmen, zu programmieren, wieder auf Band zu bringen und das Band an den Leiterplattenbestücker zu senden.
Morten
@morten - Ihr Lieferant kann das für Sie tun. Du schickst ihnen deine Datei (das eine Byte :-)) und du bekommst die Teile zurück programmiert, markiert mit einer Markierung deiner Wahl. Die Kosten hängen von der Losgröße ab. Sie haben feste Kosten + Kosten pro Teil. Wir haben einmal berechnet, ob es nicht billiger wäre, selbst zu programmieren, aber für Tausende hat es sich auf keinen Fall gelohnt.
stevenvh
4

Eine Option, die nur zwei digitale Stifte verwendet, sieht folgendermaßen aus:

Schaltplan

Durch Ändern der R1- und C1-Werte können Sie unterschiedliche Ladezeiten für den Kondensator festlegen, die Sie messen können, um die Hardwareversion zu bestimmen.

Bruno Ferreira
quelle
Aha, ziemlich clevere Lösung :-)
Morten
2

Wenn im Adressbus nicht genutzter 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 hoch- und runtergebunden werden können.

Travisbartley
quelle
Vielleicht könnte ich die Adresse des EEPROM selbst verwenden ... siehe edit zu hinterfragen.
Morten
IN ORDNUNG. Ich wusste nicht, dass es einen I2C-Bus gibt. Vielleicht könntest du einfach einen winzigen I2C-Slave machen, der die Versionsnummer zurückliest, wenn die MCU davon liest.
Travisbartley