«Иногда самые важные вещи в даташите пишутся мелким шрифтом» или очередная история о дебаге.
Мы разрабатывали устройство, в котором был Ethernet и микропроцессор с Линуксом внутри. Часть железа была давно отлажена, а вот с софтом вечно что-то не клеилось. Ethernet подняли за счет каких-то костылей и запускался он очень нестабильно. Но если всё-таки запускался, то работал нормально.
И вот программисты работали-работали, заказчик ждал-ждал, сроки затянули-затянули и за пару дней до обещанного релиза программисты наконец-то фиксят тот самый костыль. Ethernet работает намного лучше, но всё-таки иногда не включается.
Проблемы программистов электронщиков беспокоят мало, но ровно до тех пор пока к ним не приходят со словами: «А вот на одной плате он во всех 100% случаях запускается, а на двух других с той же самой прошивкой – как попало🤷♂️».
И вот тут уже не отвертеться…
Итак, что мы вообще имеем?
1. Микропроцессор начинает работать не сразу, а через какое-то время после подачи питания. Ему требуется время чтоб выполнить загрузку Линукса.
.
2. Клоки для работы Ethernet-микросхемы предоставляет также процессор после завершения загрузки.
.
3. Ethernet начинает работать после того, как процессор и ETH трансивер смогли подружиться.
.
4. В 20% - 30% случаев после включения, Ethernet не начинал работать, иными словами, не запускался.
.
5. При этом на одной единственной плате, с точно таким же железом и точно таким же софтом, всё работало в 100% случаев.
Дело пахнет какой-то плавающей фигнёй…
Очень неприятный вид проблем, который трудно отследить, структурировать, систематизировать и пофиксить.
Первым делом я полез смотреть есть ли вообще клоки и как они себя ведут. Спустя некоторое время я заметил, что если включать плату, постоянно держа щуп осциллографа на пине с клоками, то всё начинает работать в 100%. Я начал проводить всякие эксперименты, чтоб сымитировать влияние щупа: ставил разного номинала резисторы, конденсаторы поверх, но моё время сэкономил коллега, задавший вполне резонный вопрос «а ты пробовал сделать резет трансивера?».
Резет трансивера сделать не так-то уж просто, но пока разбирались нашли в даташите замечательную осциллограмму и сноску: «Clock shall be available at power ramp. If Clock is provided after power ramp, external Reset of PHY is needed once clock is available». По-русски говоря, если сразу после подачи питания клоков нет, то после их появления нужно сделать резет.
Программисты запросили электрическую схему только через месяц работы над проектом, поэтому ожидать что они читали даташит, особенно, сноски, написанные мелким шрифтом, было наивно.
Видимо, внутри самой микросхемы трансивера на аппаратном уровне есть некоторая нестабильность, которая внесла такую смуту между разными платами.
В итоге, резет после запуска Линкуса действительно помог, Ethrenet стал запускаться во всех случаях, а я выучил для себя новое правило: «В непонятной ситуации сначала попробуй сделать резет».
Post #211
228
- 👍 4
- 😁 4
- ☃ 1
- 🍌 1