Какой хороший способ для mcu определить, на какой версии аппаратного обеспечения он работает?

13

Я работаю над новым дизайном продукта, и, вероятно, будут небольшие или большие аппаратные изменения / исправления в течение срока службы продукта. Для будущих обновлений прошивки в полевых условиях мне нужен способ определения версии оборудования. Что такое хорошая стратегия?

В настоящее время я вытягиваю два запасных контакта вверх / вниз с помощью внешних резисторов и проверяю схему. Это позволяет использовать только 4 версии оборудования, но этого может быть достаточно для практических целей. Это может стать проблемой, если мне понадобится один или оба этих контакта в будущей версии оборудования.

Я предполагаю, что более экономичным способом может быть подключение резисторного делителя к выводу АЦП. Каждая ревизия оборудования может иметь разные значения резисторов. К сожалению, в моем текущем дизайне нет запасных АЦП.

Я предполагаю, что другим способом может быть кодирование номера версии аппаратного обеспечения в EEPROM или флэш-памяти mcu во время производства? (У нас нет такой возможности в данный момент.)

Я думаю, я ищу предложения для гибкого и надежного метода.

[РЕДАКТИРОВАТЬ]

Число рейнольдса предложение от @ trav1s: у меня нет адресной шины как таковой, но у меня есть 24LCxx EEPROM на шине I2C. 3 младших бита адреса ведомого устройства являются аппаратными. Я думаю, я мог бы изменить биты адреса и искать EEPROM во время запуска.

Morten
источник

Ответы:

7

Это то, с чем я имею дело на постоянной основе. У нас очень сложное аппаратное обеспечение, которое используется уже почти 10 лет, с различными версиями различных подсистем. Некоторые подсистемы имеют 2-битный код, но, как вы упомянули, этого не всегда достаточно.

Предложение EEPROM является хорошим, но оно требует программирования EEPROM и заполнения платы правильной версией.

Я хотел бы предложить 8-битный параллельный последовательный сдвиговый регистр типа 74HC166. Номер версии может быть установлен на входе самой платой ПК, связывая входы ВЫСОКИЙ или НИЗКИЙ, и тогда вам нужно только 3 контакта для загрузки и считывания регистра сдвига из MCU.

Линдон
источник
Мне нравится, что версия hw встроена в плату, поэтому мне нужна только одна версия прошивки, и мне не нужно обрабатывать предварительно запрограммированные EEPROM. Похоже, что сдвиговый регистр можно найти примерно за 0,1 доллара США, и это нормально.
умереть
2
В том же духе вы также можете использовать расширитель портов I2C, висящий на вашей шине I2C. Это может быть немного дороже, хотя.
alex.forencich
8

Я бы не использовал номер версии, запрограммированный в микроконтроллере. Если программное обеспечение не отличается для разных версий плат, но тогда версия платы мне кажется излишней. Иметь как можно меньше версий программного обеспечения микроконтроллера, в идеале только одну. Каждая отдельная версия может вызвать проблемы с логистикой.

Код EEPROM является хорошей идеей, поскольку он допускает множество различных кодов плат, но вынимает его из микроконтроллера в отдельном устройстве. EEPROM дорог для больших емкостей (намного дороже, чем Flash), но за несколько байтов вы можете найти их дешевыми. Это только 16 центов в сотнях и требует только 1 линию ввода / вывода.

Чтобы уменьшить вероятность ошибок, используйте разные пакеты для каждой версии платы. Поэтому запрограммируйте партию EEPROM с номером версии 1 в SOT-23, следующей версией 2 в MSOP и т. Д. Тогда у вас не будет EEPROM версии 1 на плате версии 2.

stevenvh
источник
Спасибо. Это может быть глупым вопросом, но как мне запрограммировать партию EEPROM до того, как поместить их на плату? У меня нет возможности снять ЭСППЗУ с ленты, запрограммировать их, положить обратно на ленту и отправить ленту сборщику печатных плат.
умереть
@morten - Ваш поставщик может сделать это для вас. Вы отправляете им свой файл (этот один байт :-)) и получаете запрограммированные детали, помеченные выбранной вами маркировкой. Стоимость будет зависеть от размера партии; Вы будете иметь фиксированную стоимость + стоимость за часть. Однажды мы рассчитали, не будет ли дешевле заниматься программированием самостоятельно, но в любом случае для тысяч это не стоило того.
Стивенв
4

Один вариант, который будет использовать только два цифровых вывода, выглядит примерно так:

Принципиальная электрическая схема

Изменяя значения R1 и C1, вы можете установить разное время зарядки конденсатора, которое можно измерить для определения версии аппаратного обеспечения.

Бруно Феррейра
источник
Ага, довольно умное решение :-)
morten
2

Если в адресной шине есть неиспользуемое пространство, вы можете поместить на нее регистр ПЗУ, который может быть прочитан MCU. Регистр будет содержать номер версии аппаратного обеспечения. Когда MCU читает с этого адреса, регистр записывает свое значение в шину данных. Регистр может быть встроен в плату или, если вы хотите иметь возможность менять номер версии своими руками, вы можете сделать выводы, которые можно привязать вверх / вниз, как вы делаете сейчас.

travisbartley
источник
Может быть, я мог бы использовать адрес самой EEPROM ... см. Редактирование на вопрос.
умереть
OK. Не знал, что там был автобус I2C. Может быть, вы могли бы просто сделать крошечное ведомое устройство I2C, которое считывает номер версии, когда MCU читает с него.
Трэвисбартли