Цитата(Atlantis- @ Nov 21 2015, 02:20)

После сброса, включения питания, USB-МК настроен как передатчик (в смысле, находящийся на его стороне ресивер настроен как передатчик), второй МК настроен как приемник, ждет команд.
USB-МК отправляет команду (или серию команд), направление передачи пока не переключаем, поскольку ответа не будет.
Когда все во втором МК настроено, USB-МК посылает первый запрос данных, в прерывании по окончанию передачи - переключается на прием.
Соответственно, второй МК после принятия такого запроса сразу же переключается на передачу, запускает таймер, который отсчитав 1 мс переключает МК на прием. Соответственно, время 1 мс выбрано потому что запросы данных будут приходить от USB-МК именно с такой частотой.
Потенциальна проблема заключена в переходном периоде, когда один узел переключается с приема на передачу, а другой - с передачи на прием. С одной стороны, нельзя чтобы оба передатчика оказались включены одновременно, это криминал. С другой стороны, промежуток времени, когда оба передатчика выключены, должен быть коротким. А насколько коротким? Что произойдет за время, пока оба передатчика выключены?
1. Если помех мало, то ничего не произойдет. Резисторы подтяжки удерживают линию связи в пассивном состоянии, если нет помех, то вообще никто ничего не заметит. Если же помехи есть, то вероятность появления ложного сигнала пропорциональна "плотности" помех, а также пропорциональна длительности "опасного" интервала.
2. Если длительность "опасного" интервала очень мала, то приемник может "ничего не заметить" даже если помеха навелась прямо на этот интервал. Это зависит от того, как устроен приемник UART-а. Приемники "для оффисных применений" детектируют старт-бит по фронту, а сэмплируют принимаемые биты один раз ровно в середине бит-интервала. Совсем хреновые воплощения могут запустить прием по короткому фронту (помехового)сигнала, после чего даже не проверять уровень старт-бита в середине стартового бит-интервала. Приемники для индустриальных применений трижды сэмплируют данные в середине каждого бит-интервала, включая старт-бит. Можно надеяться, что и фронт сигнала они определяют по трем выборкам, хотя в даташитах подробности реализации как правило не раскрываются.
При бодовой скорости 1 Mbps длительность помехи, которая может быть отсеяна "хорошей" реализацией UART-а, составляет малую долю микросекунды. Имеет ли смысл закладываться на этот механизм? Можно ли программно обеспечить "опасное" время, когда оба передатчика выключены, порядка 0.2-0.3 мкс? Нет, конечно.
3. Если длительность "опасного" интервала больше, чем в п.2, то в момент переключения коварная помеха может создать как минимум ложный старт-бит. Конечно, чем длиннее интервал переключения, тем больше вероятность, что это произойдет. Тем не менее, ложный старт-бит может появится, а значит, UART может принять ложный байт. Что с ним делать? Протоколы типа Modbus RTU устроены так, что ложно принятый в это время байт будет гарантированно отброшен. Самопальные протоколы такого как правило не умеют, они надеются на резисторы подтяжки, плюс, иногда (как в вашем случае) надеются на то, что вероятность этого события мала, поскольку длительность "опасного" интервала мала.
Однако это паллиатив, т.е. всего лишь припарка, не более того. Правильное решение - когда ложный сигнал будет принят, но он будет отброшен. После этого совершенно не играет роли, насколько долог или короток был "опасный" интервал.