Это все - полудуплексная передача... А я встречал примеры полнодуплексной Суть - примерно как и в телефонных аппаратах, в подавлении в приемном тракте передаваемого сигнала.
В линию подается сигнал через усилитель с неким Ку и выходным сопротивлением R= Rлинии, с линии через делитель с коэф. 1/Ку сигнал идет на неинвертирующий вход ОУ, а н инвертирующий - заводится входной сигнал.
Итого: имеем на входе ОУ для исходящего сигнала - синфазное напряжение (в итоге напряжение на выходе =0), для входящего - соответственно только на неинвертирующем входе; которое и усиливается ОУ.
О модуляции цифрового сигнала и т.д. - отдельный разговор, цифру в линию гнать некошерно.
Тут немного н адосуге подумал над протоколом... наверное надо будет упрощать.
1. Ведущий детектирует линию на работоспособность, подав
напряжение на линию сначала одной, потом другой полярности
через резистор 100к, и смотря напряжение на нём. Таким
током диод оптопары не зажжется, но если будет обрыв,
то плюём на эту затею и визжим диким голосом, что линия оборвана.
2. Если линия цела, запоминаем полярность, в которой включен диод.
От этого будем и плясать. Собственно, с таким протоколом
будет пофигу, как соединять провода, скрутил от руки и готово...
3. Ведущий поджигает диод на длительное время (пусть 500мс).
Ведомый видит это, готовится принять информацию после сброса
линии. Если ведущий ничего не передаёт в течении определённого
таймаута - ведомый возвращается в исходное (ждущее) состояние.
4. Ведущий передаёт на минимальной скорости служебную информацию.
Там указывается, что мы собственно от него хотим. Чтобы ведомый
передал нам данные, или принял от нас, на какой скорости,
или сделать тест скорости, ну и т.д. В конце контрольная сумма.
5. Ведущий после передачи переключается на приём, и ждёт.
Если после первого сеанса ведомый неправильно принял, он молчит.
Попытка повторяется несколько раз сначала, если нет - визжим.
6. Если всё ОК ведомый передаёт назад контрольную сумму послания,
ведущий её сверяет. Если на этом этапе ошибка - ждём и сначала.
7. Если и тут всё ОК, то оба переключаются на нужную скорость,
и начинают обмен в зависимости от того, что требуется.
Смысл такой - передающий передаёт пакет (N байт), сзади
контрольная сумма. Принимающий отсылает контрольную сумму назад,
того, что принял. Если там ошибка, это увидят оба и повторят
сессию.
-----
может быть 2 варианта повреждения пакета: 1. Повреждено тело пакета. Контрольная сумма на принимающей стороне не сошлась. Приёмник считает контрольную сумму повреждённого пакета, плюс самой контрольной суммы, т.е. от всего, что получил, и отсылает назад - передатчик видит, что надо повторить. 2. Повреждена контрольная сумма, пакет цел. Опять же их общая контрольная сумма не сойдется, передача повторится. -----
8. Во время передачи подсчитывается количество ошибок.
Если оно превышает какую-то критическую норму, тут два варианта возможны:
а) Визжим, прекращаем обмен.
б) Переходим на более низкую скорость.
Реализацию вторго варианта во время передачи надо обдумать..
9. После передачи, если ведущему больше ничего не надо,
он сигнализирует об этом как нибудь ведомого, и тот
переходит в режим ожидания, а ведущий отцепляется от линии.
----------
Чую, реализация на ассемблере заставит попыхтеть мозжечок...
----------
Верно! Конечно хочется своё... Но, по сути, всё уже придумано. Я почитал на счет 1-wire. Но суть в чём - если б мне нужна была совместимость - я б не задумывался. А так есть полёт фантазии! Вообще все протоколы делятся на два вида: с потярями и без потерь. Самые простые примеры - TCP и UDP. Так же и тут. Мне надо без потерь (соответственно в ущерб скорости).
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения