¿Cuál es una buena manera para que la mcu determine en qué versión de hardware se está ejecutando?

Estoy trabajando en el diseño de un nuevo producto y probablemente habrá cambios/arreglos de hardware pequeños o grandes durante la vida útil del producto. Para futuras actualizaciones de firmware en el campo, necesito una forma de determinar la revisión del hardware. ¿Qué es una buena estrategia?

Actualmente estoy subiendo/bajando dos pines de repuesto con resistencias externas y comprobando el patrón. Esto solo permite 4 revisiones de hardware, pero eso podría ser suficiente para fines prácticos. Podría convertirse en un problema si necesito uno o ambos pines en una futura revisión de hardware.

Supongo que una forma más económica podría ser tener un divisor de resistencia conectado a un pin ADC. Cada revisión de hardware podría tener resistencias de diferentes valores. Desafortunadamente, no tengo ADC de repuesto en mi diseño actual.

Supongo que otra forma podría ser codificar el número de versión del hardware en una EEPROM o en el flash mcu durante la producción. (No tenemos esa instalación en este momento).

Supongo que estoy buscando sugerencias para un método flexible y robusto.

[EDITAR]

Re. sugerencia de @ trav1s: no tengo un bus de direcciones en sí, pero tengo una EEPROM 24LCxx en el bus I2C. Los 3 bits inferiores de la dirección esclava están cableados. Supongo que podría cambiar los bits de dirección y buscar la EEPROM durante el inicio.

Respuestas (4)

Esto es algo con lo que trato de forma continua. Tenemos hardware muy complejo que ha estado en el campo durante casi 10 años, con diferentes versiones de varios subsistemas. Algunos de los subsistemas tienen un código de 2 bits, pero como mencionaste, eso no siempre es suficiente.

La sugerencia de EEPROM es buena, pero requiere programar la EEPROM y llenar la placa con la versión correcta.

Lo que sugeriría es un registro de desplazamiento de salida en serie paralelo de 8 bits como un 74HC166. El número de versión se puede configurar en la entrada mediante la propia placa de PC vinculando las entradas ALTO o BAJO y luego solo necesita 3 pines para cargar y leer el registro de desplazamiento de una MCU.

Me gusta que la versión hw esté cableada en la placa, de esa manera solo necesito una versión de firmware y no necesito manejar EEPROM preprogramadas. Parece que se puede encontrar un registro de desplazamiento por alrededor de USD 0.1 y eso está bien.
En esa misma línea, también podría usar un expansor de puerto I2C colgando de su bus I2C. Aunque puede ser un poco más caro.

No usaría un número de versión programado en el microcontrolador. A menos que el software sea diferente para las diferentes versiones de la placa, pero entonces la versión de la placa me parece superflua. Tenga la menor cantidad posible de versiones del software del microcontrolador, idealmente solo una. Cada versión diferente puede causar problemas logísticos.

El código EEPROM es una buena idea, porque permite muchos códigos de placa diferentes, pero sáquelo del microcontrolador, en un dispositivo separado. Las EEPROM son caras para grandes capacidades (mucho más caras por bit que Flash), pero por unos pocos bytes las puedes encontrar baratas. Este cuesta solo 16 centavos en 100 y solo necesita 1 línea de E/S.

Una forma de disminuir la posibilidad de errores es tener un paquete diferente para cada versión de placa. Entonces, programe un lote de EEPROM con una versión número 1 en SOT-23, la siguiente versión 2 en MSOP, etc. Entonces no puede tener una EEPROM de versión 1 en una placa de versión 2.

Gracias. Esta puede ser una pregunta estúpida, pero ¿cómo programo un lote de EEPROM antes de colocarlas en la placa? No tengo la facilidad para sacar las EEPROM de la cinta, programarlas, volver a colocarlas en la cinta y enviar la cinta al ensamblador de PCB.
@morten: su proveedor puede hacerlo por usted. Les envías tu archivo (ese byte :-)) y obtienes las partes programadas, marcadas con una marca de tu elección. El costo dependerá del tamaño del lote; tendrás un costo fijo + un costo por pieza. Una vez calculamos si no sería más barato hacer la programación nosotros mismos, pero en cualquier caso por miles no valía la pena.

Una opción que usará solo dos pines digitales es algo como esto:

Diagrama de circuito

Al cambiar los valores de R1 y C1, puede tener diferentes tiempos de carga para el capacitor que puede medir para determinar la versión del hardware.

Ajá, una solución bastante inteligente :-)

Si hay algún espacio sin usar en el bus de direcciones, puede colocar un registro de ROM en el bus que puede leer la MCU. El registro contendría el número de versión del hardware. Cuando la MCU lee desde esa dirección, el registro escribiría su valor en el bus de datos. El registro podría estar cableado en el tablero o si desea poder cambiar el número de versión con sus propias manos, podría hacer pines que se puedan atar hacia arriba o hacia abajo como lo está haciendo ahora.

Tal vez podría usar la dirección de la EEPROM en sí ... vea la edición de la pregunta.
ESTÁ BIEN. No sabía que había un bus I2C. Tal vez podría hacer un pequeño esclavo I2C que lea el número de versión cuando la MCU lo lea.