fk0, легенда (25.06.2019 12:33, просмотров: 144) ответил AVF на Посоветуйте внутриприборную шину. Максимальная длина - 2м, скорость - 0.2-0.5Мбит. Кол-во узлов до 8, конфигурация модулей может меняться. i2c не хочется, так как i2c почти у всех кривой. 485 вроде как избыточен, ставить на каждую плату драйвер
Главный вопрос, шина это именно шина, или может быть кольцом. Второй главный вопрос, единственный арбитр (мастер), нет арбитра, или мульти-мастер. Судя по "конфигурация может быть разной", кольцо организовать становится сложным (но не невозможным -- нужно как-то обеспечить пропуск сообщений на следующий модуль при отсутствии данного).
Преимущество кольца в отсутствии коллизий. В варианте именно шины коллизии неизбежны во всех случаях, кроме варианта с единственным арбитром. Последний вариант не очень хорош тем, что все модули будут опрашиваться в каком-то порядке, ключевое слово "опрашиваться", т.е. от запроса до ответа неизбежна значительная задержка вызванная временем отклика ПО, что вызывает существенное снижение пропускной способности шины (и к тому же практически не зависит от скорости передачи, а зависит от скорости реакции ПО). Либо нужно как-то синхронизировать время на всех модулях и реализовывать передачу с разделением во времени, каждый модуль в своём тайм-слоте.
Кроме того, ещё важный вопрос -- отсутствие кварцевого резонатора. Все варианты асинхронной передачи требуют его наличия. Автоподстройка возможна, но скорей упирается опять же в ПО -- только для относительно простых модулей, способных выделить на автоподстройку значительный ресурс процессорного времени, только в условиях отсутствия искажений в канале связи, к тому же.
Тут пишут про низкие скорости в бодах. Они вызваны искажением сигнала в канале передачи для интерфейса RS-232, где волновое сопротивление передатчика и приёмника не согласовано с кабелем. При скоростях порядка 9600 бит/сек эффекты вроде отражений сигнала, межсимвольной интерференции и т.п. при любых разумных расстояниях становятся не существенными, впрочем как и ёмкость кабеля уже не влияет. Для "токовой петли" или согласованного трансмиттера (RS-485, RS-422, RS-423) это уже не существенно. Но пока не доходит до шины. Если шина именно шина, т.е. проводник с двумя выраженными концами на которые можно установить терминаторы, то всё ок. Но обычно оканчивается звездой, где лучи имеют неравные длины (да и ещё некоторые модули могут отсутствовать по условию задачи), то в таком варианте с согласованием всё плохо. Спасают только маленькие расстояния.
Ещё вопрос контроля скорости потока. Передающая сторона может передать данных больше, чем принимающая успевает обрабатывать. Варианты: аппаратное квитирование, протокол наподобии HDLC, передача строго по запросу (отсутствие потоковых данных, что иногда неудобно). В случае кольца проблема усугубляется тем, что каждый модуль обязан передавать данные всех других модулей и их просто может быть много (модуль не будет успевать копировать данные в другой UART, хотя здесь может помочь просто ограничение скорости передачи на более низком уровне).
Оптическая развязка в ситуации, когда все модули находятся внутри одного прибора и питаются от общего источника питания не нужна. Её любят вспоминать люди которые не решили и не поняли своих проблем и занимаются решением задачи путём чистого шаманства.
Про RS-485 тут уже много раз написали, добавить нечего.
MBedder любит поминать то ли RS-422 (симплекс, дифф. приёмник, передача лог. уровнем), то ли RS-423 (симплекс, дифф. приёмник и передатчик). На них шину как есть не построить (верней, получится RS-485 с сопутствующими ей сложностями). Но на базе RS-422 (423 по-моему избыточен, 422 позволяет сэкономить на передатчике) можно построить кольцо. В кольце каждый модуль транслирует всё принятое со входа на выход (другой UART) попутно добавляя свои сообщения. Таким образом нет проблемы коллизий и сообщения передаются с минимальными задержками (нет ожидания, впрочем есть задержка на копировании данных из одного UART в другой -- оценочно на несколько десятков байт на модуль, и разумеется она увеличивается в случае вставки модулями своих сообщений). Для регулирования вставки сообщений (хотя скорей будет более удобен вариант, когда модуль вставляет сколько хочет, с разумными лимитами) возможен вариант наподобии применённого в Token Ring -- маркерный доступ. Это когда арбитр периодически запускает в кольцо сообщение говорящее о том, что после него возможна вставка сообщения от такого-то модуля.
Но нужно как-то решать проблему обеспечения работы в отсутствии модуля. В принципе модуль мог бы выдавать, когда подключен, сигнал, отключающий мультиплексор, соединяющий RX и TX модуля (для сквозной передачи в его отсутствии). Мультиплексор должен размещаться где-то на материнской плате, условно говоря.
Недостатком кольца является полная неисправность при отказе любого одного модуля, низкая надёжность (ввиду зависимости от всех разъёмных соединений в совокупности). В частности прошивка через кольцо если и возможна, то "вслепую" (нет ответов от очередного прошиваемого модуля) и строго по порядку их включения. В случае разнородных модулей это может быть неудобно.
Преимуществом -- низкая задержка сообщений, дуплекс, асинхронные приём и передача (без подтверждений), высокая помехозащищённость (дифф. приёмник может быть полноценно согласован с волновым сопротивлением шины).
Разумеется в кольце нужен пакетный режим передачи, чтоб каждый модуль понимал границы сообщений (пакетов) посланных другими модулями при осуществлении вставки. Равно как и чтоб было возможно восстановление на границе пакета в случае нарушения целостности данных. Кроме того, пакет должен иметь как минимум адрес назначения и контрольную сумму., На мой взгляд для работы в таком режиме подходит хорошо HDLC-подобный протокол, к сожалению отличающийся высокой сложностью. В качестве простой альтернативы можно передавать текстовые строчки, содержащие в начале адрес модуля и контрольную сумму в конце, с условно-произвольным содержанием. Если при этом каждый модуль не будет вырезать свои сообщения и передавать их дальше по кольцу, то на входе RX арбитра будут собраны сообщения от всех модулей и арбитра в том числе, что удобно для анализа и наблюдения за работой.
[ZX]