Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: SPI на 12 МГц через длинные провода
Форум разработчиков электроники ELECTRONIX.ru > Аналоговая и цифровая техника, прикладная электроника > Цифровые схемы, высокоскоростные ЦС
Страницы: 1, 2
Kitsok
Добрый день!

Любительским образом разрабатываю устройство ввода-вывода для строительства "картонных кабин" для авиасимуляторщиков.

Непосредственно устройства ввода (кнопки, тумблеры, энкодеры) и вывода (светодиоды, 7-сегментные индикаторы) подключаются к сдвиговым регистрам ('165 и '595), регистры каскадированы и подключены к контроллеру, к SPI-порту через преобразователь уровней 3.3<->5 ADG3304 и инвертор '04 (нужен для инвертирования CS для '165.
Частота SPI выбрана равной 12 МГц из соображений производительности контроллера, периода опроса энкодеров и т.д.

Имеется разведенная плата, на ней - ветка из 8 '165 и 8 '595. Дальше шина оканчивается разъемом RJ-45, где имеется 4 сигнала и 4 "земли". Предполагается подключать дальше цепочкой следующие платы с регистрами(модули), делая таким образом длинную цепочку из сдвиговых регистров.
Последовательных резисторов на сигнальных линиях , впрочем как и подтяжек не стоит.... При подключении оконечных устройств непосредственно к плате никаких проблем нет, все работает как и задумано.

Опыты показали, что если подключить к этому RJ-45 произвольной длины (от 5 сантиметоров до 2 метров) кабель, то вся работа шины останавливается. Осцилографом еще не смотрел, но предполагаю завалы фронтов и, возможно, звон. Я так предполагаю, что если уж кабель вызывает отказ работы шины, то никакими ухищирениями со стороны модуля ситуацию исправить не получится, и нужно переделывать схему и переразводить плату.

Как решение предполагаю установку подтягивающих к +5 резисторов, буфера типа '125 и проходных резисторов 20-50 ом. Аналогичную схему планирую также ставить на всех последующих модулях. Соединяться все это хозяйство будет неэкранированной витой парой CAT5, земля и сигналы будут перевиты.

Поскольку ни образования, ни опыта в высокочастотной электронике у меня нету, прощу помощь уважаемых знатоков - поможет ли затея с буфером и резисторами?

Заранее спасибо!
rezident
Может стоит для такого случая LVDS-драйверы/приемники применить? По крайней мере сигналы, подаваемые на разъем, пробуферировать нужно в любом случае.
bms
Достаточно сделать две вещи:
1. Клок от "мастера" размножить на буфере и завести на каждую плату СВОЙ.
2. В цепях данных и клока поставить полследовательные резисторы номиналом 82 Ом (для согласования с CAT5). Резисторы ставить строго на передающей стороне.

Да, еще. Желательно, в случае если провода от платы до платы будут длинными - выровнять по длине линии данных и клока.

Это конечно потребует несколько переделать то, что у Вас уже есть, но это единственное дешёвое и надёжное решение.
alexander55
Рекомендую посмотреть
http://www.gaw.ru/html.cgi/txt/interface/lvds/lvds.htm
Kitsok
rezident,alexander55

По LVDS почитаю, но с одной стороны - 12 МГц, не перебор-ли, а с другой - насколько это удорожит систему и как передать общую землю через 4-парник? Ведь как я понял, используются дифф. пары, а у меня 4 сигнала. Хотя, два из них инвертированны.... В общем, буду думать.



bms
Поскольку данные у меня как бы от крайнего регистра, то его надо змейкой пустить? И CS, наверное, тоже стоит так-же?

Про резисторы понял. Подтяг не нужно?

А вот про размножение клока - это сложно.... 4-парный кабель - это максимум 4 платы, т.е. на плате (при ограничении в 2048 регистров - это по 512 регистров на плату.... Либо делать плату размножителя клоков отдельную... В общем, буду думать, с точки зрения разъемов не очень понятно, как это сделать. Платы-то последовательно соединяются..


Спасибо большое за ответы!!!
bms
Цитата(Kitsok @ Nov 21 2007, 10:50) *
bms
Поскольку данные у меня как бы от крайнего регистра, то его надо змейкой пустить? И CS, наверное, тоже стоит так-же?

Про резисторы понял. Подтяг не нужно?

А вот про размножение клока - это сложно.... 4-парный кабель - это максимум 4 платы, т.е. на плате (при ограничении в 2048 регистров - это по 512 регистров на плату.... Либо делать плату размножителя клоков отдельную... В общем, буду думать, с точки зрения разъемов не очень понятно, как это сделать. Платы-то последовательно соединяются..
Спасибо большое за ответы!!!


Размножать клок можно непосредственно на плате. Схематично вариант такого размножения показан на рисунке. Ставите на входе каждой платы буфер-повторитель, через него заводите на регистры данные и размножаете клоки. Один из клоков и данные с последнего регистра выводите во внешний мир через резисторы согласования. Таким образом можно соединить сколько угодно плат.

Резисторы подтяжки не нужны.
Выравнивание клока и данных в этом случае получится автоматически - т.к. всё это будет передаваться через один 4-х парный кабель.
Важно данные и клок протаскивать через один и тот же корпус буфера, т.е. берёте например счетверённый буфер, как на рисунке. Нельзя использовать разные корпуса (например не счетверённый корпус, а четыре отдельных корпуса), поскольку в этом случае разные корпуса будут иметь разные задержки и при большом числе плат данные и клок могут сильно "разъехаться" во времени. А в пределах одного (счетверённого например) корпуса задержки по всем буферам будут одинаковые.
gte
Цитата(bms @ Nov 21 2007, 23:47) *
времени. А в пределах одного (счетверённого например) корпуса задержки по всем буферам будут одинаковые.


А данные, прошедшие через SPI устройство, пройдут с нулевой задержкой?
zltigo
Цитата(gte @ Nov 22 2007, 09:24) *
А данные, прошедшие через SPI устройство, пройдут с нулевой задержкой?

Добавлю еще, что даже при задержках "скомпенсированных" на многочисленных буферах СLK и MOSI проблема разбега CLK и MISO стоит в полный рост, ибо составляет суммарную задержку передачи CLK туда и MISO обратно.
alexander55
Цитата(zltigo @ Nov 22 2007, 11:47) *
Добавлю еще, что даже при задержках "скомпенсированных" на многочисленных буферах СLK и MOSI проблема разбега CLK и MISO стоит в полный рост, ибо составляет суммарную задержку передачи CLK туда и MISO обратно.

Да, конечно.
Вот простой расчетик.
При длине кабеля 2 м, сигнал проходит растояние 4 м.
Если сигнал распространяется со скоростью света 300 т.км/с, задержка составит 13,3 нс.
Если учесть индуктивность кабеля и задержки чиповые (3-10 нс), то это значение может удвоиться-утроиться.
Прикиньте, какой это фазовый сдвиг на 12 МГц. Более четверти до половины периода.
Уже есть над чем задуматься. smile.gif
Kitsok
Цитата(alexander55 @ Nov 22 2007, 13:56) *
Да, конечно.
Вот простой расчетик.
При длине кабеля 2 м, сигнал проходит растояние 4 м.
Если сигнал распространяется со скоростью света 300 т.км/с, задержка составит 13,3 нс.
Если учесть индуктивность кабеля и задержки чиповые (3-10 нс), то это значение может удвоиться-утроиться.
Прикиньте, какой это фазовый сдвиг на 12 МГц. Более четверти до половины периода.
Уже есть над чем задуматься. smile.gif


Прошу прощения за нескромный вопрос, но может быть существуют какие-то устоявшиеся решения проблемы с разбегом? Или SPI совсем не предназначен для таких дел?
Сергей Борщ
Цитата(Kitsok @ Nov 22 2007, 13:37) *
Прошу прощения за нескромный вопрос, но может быть существуют какие-то устоявшиеся решения проблемы с разбегом? Или SPI совсем не предназначен для таких дел?
Приходит в голову использование для приема второго SPI в режиме slave, на который подается CLK с того же регистра, с которого и снимается MOSI. Остается вопрос - где взять еще одну пару в кабеле. А еще могу порекомендовать книжку "Синхронизация в телекоммуникационных системах" - там много интересных решений описано.
zltigo
Цитата(Kitsok @ Nov 22 2007, 13:37) *
Или SPI совсем не предназначен для таких дел?

Не предназначен.
Цитата
Прошу прощения за нескромный вопрос, но может быть существуют какие-то устоявшиеся решения проблемы с разбегом?

Устоявшиеся smile.gif. Для случаев, когда нужно пропускать/буферизировать десяткомегагерцовые SPI использую, например, 9bit посылки при этом лишний бит и лишний такт используется для компенсации задержки.
Kitsok
Цитата(zltigo @ Nov 22 2007, 14:53) *
Не предназначен.

Устоявшиеся smile.gif. Для случаев, когда нужно пропускать/буферизировать десяткомегагерцовые SPI использую, например, 9bit посылки при этом лишний бит и лишний такт используется для компенсации задержки.


Интересный ход. А как при этом определить, в каком бите у нас что пришло?
alexander55
Цитата(Kitsok @ Nov 22 2007, 14:37) *
Прошу прощения за нескромный вопрос, но может быть существуют какие-то устоявшиеся решения проблемы с разбегом? Или SPI совсем не предназначен для таких дел?

Устоявшегося (или устоявшевося) решения нет (готового). SPI - это синхронный интерфейс для SWAP. Его преимущество проявляется при близком расположении SPI-устройств (на одной плате или набираемом блоке).
PS. При больших длинах посмотрите в сторону снижения CLK.
Или изменения алгоритма функционирования (например, аппаратного SPI с учетом задержек от каждого SPI)
или вариант Сергея.

Цитата(Kitsok @ Nov 22 2007, 15:07) *
Интересный ход. А как при этом определить, в каком бите у нас что пришло?

Да, Вам zltigo предложил классный вариант (можно сказать, гениальный).
Используйте тестовую посылку для выявления где мухи, где котлеты.
zltigo
Цитата(Kitsok @ Nov 22 2007, 14:07) *
Интересный ход. А как при этом определить, в каком бите у нас что пришло?

На "трансляторе" производится стробирование принимаемых данных входной тактовой и таким образом вносится гарантированный сдвиг ровно на один бит. Передавать будете в первых восьми битах а принимать в последних восьми.


P.S.
А вообще так SPI c TTL уровнями использовать это махровое радиолюбительство sad.gif.
Kitsok
Цитата(zltigo @ Nov 22 2007, 15:25) *
На "трансляторе" производится стробирование принимаемых данных входной тактовой и таким образом вносится гарантированный сдвиг ровно на один бит. Передавать будете в первых восьми битах а принимать в последних восьми.
P.S.
А вообще так SPI c TTL уровнями использовать это махровое радиолюбительство sad.gif.


"Транслятор" - это как я понимаю, просто "И"? И ставить его надо в той точке, где сдвиг составляет аккурат пол-фазы? Поправьте плиз, если не так, я что-то механику процесса не понимаю.

P.S. дык на профессионализм и не претендую ни разу.
alexander55
Цитата(Kitsok @ Nov 22 2007, 16:56) *
"Транслятор" - это как я понимаю, просто "И"? И ставить его надо в той точке, где сдвиг составляет аккурат пол-фазы? Поправьте плиз, если не так, я что-то механику процесса не понимаю.

Не правильно, попробую перевести слова нашего уважаемого гуру на простой язык.

/*На "трансляторе" производится стробирование принимаемых данных входной тактовой и таким образом вносится гарантированный сдвиг ровно на один бит. */

Транслятор - это регистр сдвига, но с дополнительным битом.
Можно посмотреть на примере LPC2xxx.
Это значит. Выставлен формат не 8 бит, а 9 бит или даже более.

/*Передавать будете в первых восьми битах а принимать в последних восьми.*/
Это значит, что мастер полезную информацию передает без смещения, а принятую информацию рассматривает как сдвинутую на 1 бит, т.к. самый первый принятый бит пройдет со смещением на такт из-за задержек. Т.е. формально принятый первый бит для мастера - это еще не информация.

Цитата(Kitsok @ Nov 22 2007, 16:56) *
P.S. дык на профессионализм и не претендую ни разу.

Не обижайтесь.

PS. Надеюсь, не запутал Вас окончательно.
Kitsok
Цитата(alexander55 @ Nov 22 2007, 17:36) *
Не правильно, попробую перевести слова нашего уважаемого гуру на простой язык.

/*На "трансляторе" производится стробирование принимаемых данных входной тактовой и таким образом вносится гарантированный сдвиг ровно на один бит. */

Транслятор - это регистр сдвига, но с дополнительным битом.
Можно посмотреть на примере LPC2xxx.
Это значит. Выставлен формат не 8 бит, а 9 бит или даже более.

/*Передавать будете в первых восьми битах а принимать в последних восьми.*/
Это значит, что мастер полезную информацию передает без смещения, а принятую информацию рассматривает как сдвинутую на 1 бит, т.к. самый первый принятый бит пройдет со смещением на такт из-за задержек. Т.е. формально принятый первый бит для мастера - это еще не информация.
Не обижайтесь.

PS. Надеюсь, не запутал Вас окончательно.


Запутал окончательно wink.gif Да и день тяжелый был, поэтому попробую еще проще, поправьте плиз.

Есть длинная цепочка сдвиговых регистров, работающих, допустим на ввод, т.е. от ближайшего к контроллеру регистра идет MISO. Регистры все 8-битрые, параллельный ввод - последовательный вывод. Допустим, регистр выдает данные данные по фронту CLK, мастер забирает их по спаду.

Вдоль цепочки растет сдвиг по фазе
Проблема: если цепочка достаточно длинная, да еще и буферы на CLK стоят, то пока фронт "доедет" до последнего регистра, и тот выдаст данные на свой серийный выход, мастер уже давно опустил CLK и ожидает на входе получить бит.
По мере удаления от мастера разбег увеличивается, и получается так, что очередной регистр пропускает бит от соседа. Пока правильно?

Как решение - поставить посредине 9-битный регистр? Вот тут я уже нахожусь в клинах....

Если на мастере выставить 9 бит, то по вводу вроде особых проблем нет, а вот по выводу? Этот 9-й бит вылезет на первом-же регистре....

Ткните, пожалуйста, носом в ссылку, где эта проблема разбирается, если такие ссылке в природе есть...

P.S. Я и не обижаюсь. Хоть и МИФИ заканчивал, занимаюсь ну совсем не электроникой. Ну то есть, даже рядом не валялось wink.gif Да и в МИФИ два семестра всего электроники-то было....
zltigo
Цитата(Kitsok @ Nov 22 2007, 15:56) *
"Транслятор" - это как я понимаю, просто "И"?

Транслятор это Ваше некое устройство при прохождении сигналов через которое неизбежно образуется задержка. "Ставить" его не надо оно у Вас неизбежно существует.



Цитата(Kitsok @ Nov 22 2007, 17:56) *
Как решение - поставить посредине 9-битный регистр?

Разумеется нет.
Цитата
Если на мастере выставить 9 бит, то по вводу вроде особых проблем нет, а вот по выводу? Этот 9-й бит вылезет на первом-же регистре....

Так рассчитывайте на то, что вылезет.
Цитата
Ткните, пожалуйста, носом в ссылку, где эта проблема разбирается, если такие ссылке в природе есть...

Сссылок нет. Придумано и реализовано было для пропуска 30MHz SPI через коммутатор на FPGA.
Идея простая, вроде описал достаточно.
Kitsok
Цитата(zltigo @ Nov 22 2007, 19:18) *
Так рассчитывайте на то, что вылезет.


Я, кажется, понял.
Но для реализации идеи нужна "обратная связь", т.е. контроллер должен прочитать назад то, что послал. Это не мой случай, у меня ветки передачи и приема не связаны....
Можно, конечно, эмпирическим путем найти регистр, на котором этот 9-й бит на самом деле станет 8-м, но такая куча битовой арифметики, да на 2 килобайтах посылки...
zltigo
Цитата(Kitsok @ Nov 22 2007, 22:49) *
Но для реализации идеи нужна "обратная связь", т.е. контроллер должен прочитать назад то, что послал.

Нееет!
Цитата
Можно, конечно, эмпирическим путем ...

Какая 'эмпирика'? Все абсолютно предопределено при тактировании MISO
следующим (противоположным) фронтом CLK. Сдвиг будет на один бит на каждом из "трансляторов" (если угодно - "регенераторов" ) включеных в цепочку.
alexander55
Цитата(Kitsok @ Nov 22 2007, 18:56) *
Запутал окончательно wink.gif

Да уж.
Попробую еще раз и еще проще и от печки. smile.gif
SPI - синхронный интерфейс, т.е. синхронизация ведется по CLK мастера.
Мастер и слэйв обмениваются информацией фиксированной длины.
Для слэйва задержки неактуальны, т.к. входные данные (от мастера) и тактовая частота CLK (от мастера) имеют одинаковые задержки.
Для мастера задержка актуальна, т.к. входные данные (от слэйва) и тактовая частота (мастера) имеют значительную задержку.
Т.к. передающий механизм (и принимающий) регистры сдвига, то для мастера новая информация появится позже на 1 такт CLK (точнее раньше, но будет стоять). Т.е. мастер принимает информацию со сдвигом на 1 такт CLK.
А решение этой проблемы приведено выше.
PS. Проще уже никак.
rezident
В синхронных системах приема-передачи кроме выравнивания длин проводов и согласования волновых сопротивлений делается еще финт с возвратным сигналом синхронизации. Т.е. приемники на том и этом конце провода тактируются каждый своим CLK, который имеет такую же задержку как и данные.
Приемник на удаленном ведомом (slave) устройстве тактируется сигналом CLK и принимает данные от MOSI, а приемник на ведущем (master) принимает от MISO, но тактируется сигналом CLK_RET, который является тем же самым CLK, который генерирует сам ведущий, но прошедшим двойной путь "туда" (до slave) и "обратно" (до master).
Графически можно изобразить так
Код
SPI master --- SPI slave
-----------------------
CLK ----------> CLK
                |
CLK_RET <-------|
MOSI --------> MOSI
MISO <-------- MISO
CS(OUT) -----> CS(IN)

В микроконтроллерах со встроенным контроллером SPI такая реализация чаще всего невозможна. На ПЛИС же - как два байта переслать.
Kitsok
Чувствую себя тупым хвойным деревом "Дуб".
Простите меня, пожалуйста, что я так трудно дохожу.
Беру таймаут на подумать и порисовать.

На всякий случай, предпосылки такие:
1. Заранее не известна длина кабелей между модулями.
2. Заранее не известно количество каскадированных регистров. Есть максимальное количество, которое обусловлено размерами буферов в приложении в контроллере.

Похоже, самым простым способом понять будет попробовать 9-битную посылку.
Kitsok
Цитата(alexander55 @ Nov 23 2007, 09:21) *
Для мастера задержка актуальна, т.к. входные данные (от слэйва) и тактовая частота (мастера) имеют значительную задержку.
Т.к. передающий механизм (и принимающий) регистры сдвига, то для мастера новая информация появится позже на 1 такт CLK (точнее раньше, но будет стоять). Т.е. мастер принимает информацию со сдвигом на 1 такт CLK.
А решение этой проблемы приведено выше.
PS. Проще уже никак.


Смотрите, у меня сейчас стоит цепочка из 8 регистров ('165) - слейвов. CLK инвертирован относительно того, который идет на '595, все работает, т.е. мастер получает ожидаемую информацию в ожидаемое время (не помню уже точно, по-моему, спада CLK).

Проблема возникнет когда цепочка будет настолько длинная, что задержка распространения CLK до регистра + время на переключение регистра превысит пол-периода CLK. Вот в этом случае - да, бит потеряется. Правильно я понимаю?
alexander55
Цитата(Kitsok @ Nov 28 2007, 16:56) *
Смотрите, у меня сейчас стоит цепочка из 8 регистров ('165) - слейвов. CLK инвертирован относительно того, который идет на '595, все работает, т.е. мастер получает ожидаемую информацию в ожидаемое время (не помню уже точно, по-моему, спада CLK).

Т.е. у Вас есть запас пол периода. Слэйв сдвинется раньше, чем требуется мастеру.

Цитата(Kitsok @ Nov 28 2007, 16:56) *
Проблема возникнет когда цепочка будет настолько длинная, что задержка распространения CLK до регистра + время на переключение регистра превысит пол-периода CLK. Вот в этом случае - да, бит потеряется. Правильно я понимаю?

Почти.
Проблема возникнет когда цепочка будет настолько длинная, что задержка распространения CLK до регистра + время на переключение регистра + время распространения данных от слэйва до мастера превысит Ваш запас. Вот в этом случае - да, бит потеряется.
Kitsok
Цитата(alexander55 @ Nov 28 2007, 17:14) *
Проблема возникнет когда цепочка будет настолько длинная, что задержка распространения CLK до регистра + время на переключение регистра + время распространения данных от слэйва до мастера превысит Ваш запас. Вот в этом случае - да, бит потеряется.


Ну вот это я понимаю вроде wink.gif

Так вот вопрос - а как поможет 9-битная посылка? Да, будет запас у нас в период, и бит не потеряется, а "сдвинется". Но без обратной связи ведь не определить, на каком именно регистре произошла потеря?
alexander55
Цитата(Kitsok @ Nov 29 2007, 11:14) *
Ну вот это я понимаю вроде wink.gif

Замечательно.
Лед тронулся, господа ...(И. и П.)

Цитата(Kitsok @ Nov 29 2007, 11:14) *
Так вот вопрос - а как поможет 9-битная посылка? Да, будет запас у нас в период, и бит не потеряется, а "сдвинется".

Это значит, что это надо учесть.

Цитата(Kitsok @ Nov 29 2007, 11:14) *
Но без обратной связи ведь не определить, на каком именно регистре произошла потеря?

Если Вы хотите анализировать (кто виноват и что делать (Чернышевский)), то посылайте заранее известную выдачу от слэйва.
Kitsok
Цитата(alexander55 @ Nov 29 2007, 11:40) *
Это значит, что это надо учесть.

Для того, чтобы это учесть, нужно знать какой бит в каком 9-битном слове является не номером N, а номером N+1, а этого без обратной связи, не узнать.
Цитата
Если Вы хотите анализировать (кто виноват и что делать (Чернышевский)), то посылайте заранее известную выдачу от слэйва.


Слейв - это просто регистры, к которым подключены кнопки, тумблеры и энкодеры. MOSI, исходящее от мастера, никогда не попадает никаким образом на MISO smile.gif

Цепочки регистров на ввод и на вывод не связаны никак. Вот поэтому я и не могу понять, как поможет 9-битная посылка.
alexander55
Да уж...
Цитата(Kitsok @ Nov 29 2007, 12:20) *
Для того, чтобы это учесть, нужно знать какой бит в каком 9-битном слове является не номером N, а номером N+1, а этого без обратной связи, не узнать.

Биты или сдвинуты все или не сдвинуты не один. Это фиксированная величина для конкретного слейва.
Что за обратная связь я не понимаю.

Цитата(Kitsok @ Nov 29 2007, 12:20) *
Слейв - это просто регистры, к которым подключены кнопки, тумблеры и энкодеры.

Понял Вас. Слейву информация от мастера не нужна.

Цитата(Kitsok @ Nov 29 2007, 12:20) *
MOSI, исходящее от мастера, никогда не попадает никаким образом на MISO smile.gif

А кто Вам такое мог сказать ?

Цитата(Kitsok @ Nov 29 2007, 12:20) *
Цепочки регистров на ввод и на вывод не связаны никак. Вот поэтому я и не могу понять, как поможет 9-битная посылка.


Объясняю, на Вашем примере.
1. По сигналу выбора слейв устройства, Вы пишете состояние кнопкок, тумблеров и энкодеров в регистр сдвига слейва (я так думаю). smile.gif
2. По сигналу CLK передаваемая от мастера информация игнорируется слейвом. Это мы выяснили.
3. По сигналу CLK информация в регистре сдвига сдвигается, и поступает в мастер.
4. По своему же CLK мастер сдвигает принятую информацию.

А теперь контрольные вопросы Вам, чтобы понять, где мы находимся.
А. Что будет:
- если информация от слейва на момент сдвига мастером еще не дошла
- а если уже дошла.
Б. Меняется ли задержка прихода информации для конкретного слейв устройства.
Сергей Борщ
Цитата(Kitsok @ Nov 29 2007, 11:20) *
Слейв - это просто регистры, к которым подключены кнопки, тумблеры и энкодеры. MOSI, исходящее от мастера, никогда не попадает никаким образом на MISO smile.gif
Привесьте в хвост цепочки еще один регистр, на входе которого выставьте заранее известное значение (0xA5). В принимаемом сигнале ищите эту комбинацию как маркер конца. Можно взять не A5 а какую-либо из последовательностей Баркера или Уилларда(?). Или еще лучше - формировать биты такой последовательности с прямого и инвесного выходов делителя на 2 сигнала загрузки входов регистра. Тогда на каждом цикле считывания будете иметь инвертированный маркер, существенно ниже вероятность спутать его с такой же комбинацией входных сигналов.
Kitsok
Цитата(alexander55 @ Nov 29 2007, 13:31) *
Биты или сдвинуты все или не сдвинуты не один. Это фиксированная величина для конкретного слейва.
Что за обратная связь я не понимаю.

wink.gif Вот тут я не понимаю. Получается, что если у меня сейчас работает с восемью 74HC165, то будет работать и с 8000? Сомневаюсь.

Цитата
Понял Вас. Слейву информация от мастера не нужна.
А кто Вам такое мог сказать ?

Это медицинский факт wink.gif
Цитата
Объясняю, на Вашем примере.
1. По сигналу выбора слейв устройства, Вы пишете состояние кнопкок, тумблеров и энкодеров в регистр сдвига слейва (я так думаю). smile.gif
2. По сигналу CLK передаваемая от мастера информация игнорируется слейвом. Это мы выяснили.

Совершенно верны оба два утверждения

Цитата
3. По сигналу CLK информация в регистре сдвига сдвигается, и поступает в мастер.
4. По своему же CLK мастер сдвигает принятую информацию.

По тому-же CLK, только инвертированному. Или задержку при прохождении через инвертор тоже имеет смысл здесь учесть?

Цитата
А теперь контрольные вопросы Вам, чтобы понять, где мы находимся.
А. Что будет:
- если информация от слейва на момент сдвига мастером еще не дошла

Бит потеряется где-то между двух регистров(n и n+1) посредине цепочки. В том месте, где на n задержка прохождения CLK еще меньше полупериода, а на n+1 - уже больше. Ключевой момент. Если Вам удастся мне объяснить, прав я или нет, то буду признателен чрезвычайно wink.gif

Цитата
- а если уже дошла.

То не потеряется wink.gif
Цитата
Б. Меняется ли задержка прихода информации для конкретного слейв устройства.


Я этот вопрос не понимаю, у меня одно слейв устройство, состоящее из длинного каскада сдвиговых регистров. Мне так кажется, что в цепочки из N-регистров по 8 бит каждый, и если считать бит номер 0 "ближайшим" к мастеру, то время прихода k-того бита зависит от длины проводов и от N.


Цитата(Сергей Борщ @ Nov 29 2007, 14:25) *
Привесьте в хвост цепочки еще один регистр, на входе которого выставьте заранее известное значение (0xA5). В принимаемом сигнале ищите эту комбинацию как маркер конца. Можно взять не A5 а какую-либо из последовательностей Баркера или Уилларда(?). Или еще лучше - формировать биты такой последовательности с прямого и инвесного выходов делителя на 2 сигнала загрузки входов регистра. Тогда на каждом цикле считывания будете иметь инвертированный маркер, существенно ниже вероятность спутать его с такой же комбинацией входных сигналов.


А не поможет. Конец я найду, т.е. узнаю количество подключенных регистров. Но мне нужно выцепить конкретный теряющийся бит, поэтому нужно загнать в крайний регистр тестовую последовательность двойной максимально возможной длины и анализировать ее.
Сергей Борщ
Цитата(Kitsok @ Nov 29 2007, 13:54) *
Но мне нужно выцепить конкретный теряющийся бит
Куда ему теряться? Проблема в том, что в зависимости от длины вашей цепочки вы можете получить на вход последовательность, задержанную на n бит, где n прямо пропорционально длине цепочки и может принимать значения от 0 до забора. Вам просто нужно принимать на байт больше и по положению маркера вычислять сдвиг принятых данных. Если я правильно понял.
alexander55
Цитата(Kitsok @ Nov 29 2007, 14:54) *
Бит потеряется где-то между двух регистров(n и n+1) посредине цепочки. В том месте, где на n задержка прохождения CLK еще меньше полупериода, а на n+1 - уже больше. Ключевой момент. Если Вам удастся мне объяснить, прав я или нет, то буду признателен чрезвычайно wink.gif

Т.е. Вы хотите сказать, что у Вас SPI не 8 битный, а 8*n битный.
Ответьте на этот вопрос.
Kitsok
Цитата(alexander55 @ Nov 29 2007, 15:20) *
Т.е. Вы хотите сказать, что у Вас SPI не 8 битный, а 8*n битный.
Ответьте на этот вопрос.

Эээхм... Да.
Объяснюсь.
CS поднимается один раз перед передачей 4 кб (и, соответственно, приема 1 кб). На протяжении всех этих 4 кб мастер генерит CLK без сдвигов и задержек.

Цитата(Сергей Борщ @ Nov 29 2007, 15:14) *
Куда ему теряться? Проблема в том, что в зависимости от длины вашей цепочки вы можете получить на вход последовательность, задержанную на n бит, где n прямо пропорционально длине цепочки и может принимать значения от 0 до забора. Вам просто нужно принимать на байт больше и по положению маркера вычислять сдвиг принятых данных. Если я правильно понял.


Вот и я не знаю. Здравый смысл подсказывает, что при небесконечной скорости света и наличии задержек при переключениях в микросхемах, цепочка не может работать при бесконечной длине. Но логика не подсказывает, где именно и какой произойдет сбой.

Образно я вижу так - фронт сигнала (по которому должен происходить сдвиг в регистре) доезжает до некого k-того регистра с задержкой (относительно мастера) в полпериода. Т.е. когда тот k-тый регистр только выдвинул бит, мастер уже ожидает... стоп. Мастер далеко. Дыра что-ли получается в битовой последовательности? Ну не получается представить... ;(
alexander55
Цитата(alexander55 @ Nov 29 2007, 15:20) *
Т.е. Вы хотите сказать, что у Вас SPI не 8 битный, а 8*n битный.
Ответьте на этот вопрос.

Кажется я понял, с чем Вы мучаетесь.
Если у Вас 8*n битный SPI.
Решение такое.
От мастера CLK должен подходить сначала к самому дальнему слейву (самый дальний дает перенос тому, который поближе), затем ближе ... и наконец к самому ближнему, с которого данные и идут в мастер.
Произвольное подключение CLK приведет к анархии.
Волна данных по переносам должна идти вместе CLK ( иначе будет полный бардак).

Цитата(Kitsok @ Nov 29 2007, 16:15) *

Я догадался правильно. biggrin.gif
PS. Замечу только, что такая распределенная организация сдвигового регистра не особо надежна в плане передачи данных (хотя может все получится).
Kitsok
Цитата(alexander55 @ Nov 29 2007, 16:21) *
Волна данных по переносам должна идти вместе CLK ( иначе будет полный бардак).
Я догадался правильно. biggrin.gif


И ведь была у меня эта мысль после той картинки с кольцеванием CLK, да постеснялся высказать wink.gif
Спасибо за наводку, буду попробовать.

Цитата
PS. Замечу только, что такая распределенная организация сдвигового регистра не особо надежна в плане передачи данных (хотя может все получится).


А альтернатива? Хотя это, видимо, не для этой ветки.
alexander55
Цитата(Kitsok @ Nov 29 2007, 16:52) *
И ведь была у меня эта мысль после той картинки с кольцеванием CLK, да постеснялся высказать wink.gif
Спасибо за наводку, буду попробовать.

Хочется услышать результат (не зажимайте информацию).
Вы меня заинтриговали. smile.gif

Цитата(Kitsok @ Nov 29 2007, 16:52) *
А альтернатива? Хотя это, видимо, не для этой ветки.

Параллелить со своими CS.
rezident
Цитата(Kitsok @ Nov 29 2007, 18:15) *
Т.е. когда тот k-тый регистр только выдвинул бит, мастер уже ожидает... стоп. Мастер далеко. Дыра что-ли получается в битовой последовательности? Ну не получается представить... ;(

Я вам еще в посте #22 объяснил как решается эта проблема. Каждый приемник (и мастера и слейва) тактируется своим собственным CLK. CLK приемника мастера этот тот же CLK, сгенерированный его собственным передатчиком, но прошедший путь до конца цепочки (с которого берется MISO) и обратно - CLK_RET. Такой способ используется во всех скоростных эмуляторах , которые работают с JTAG на десятках-сотнях МГц.
Kitsok
Цитата(rezident @ Nov 29 2007, 17:55) *
Я вам еще в посте #22 объяснил как решается эта проблема. Каждый приемник (и мастера и слейва) тактируется своим собственным CLK. CLK приемника мастера этот тот же CLK, сгенерированный его собственным передатчиком, но прошедший путь до конца цепочки (с которого берется MISO) и обратно - CLK_RET. Такой способ используется во всех скоростных эмуляторах , которые работают с JTAG на десятках-сотнях МГц.


Мне бы хотелось для начала осознать в деталях проблему wink.gif
О Вашем решении я помню. Только не очень представляю, как это реализовать с тем контроллером, который есть у меня (AT91SAM7S256). Программный SPI делать? Ну вот на это я точно не готов...

Цитата(alexander55 @ Nov 29 2007, 17:18) *
Хочется услышать результат (не зажимайте информацию).
Вы меня заинтриговали. smile.gif

Всепренепременнейше wink.gif
Цитата
Параллелить со своими CS.


Т.е. грубо хотя бы 1000 регистров - 1000 CS? smile.gif
rezident
Цитата(Kitsok @ Nov 29 2007, 20:31) *
О Вашем решении я помню. Только не очень представляю, как это реализовать с тем контроллером, который есть у меня (AT91SAM7S256). Программный SPI делать? Ну вот на это я точно не готов...

Например, для передачи используйте SPI, а для приема другой модуль синхронного приемопередатчика. Он вроде SSC у Atmel называется?
alexander55
Цитата(Kitsok @ Nov 29 2007, 18:31) *
Т.е. грубо хотя бы 1000 регистров - 1000 CS? smile.gif

Можно не 1000, а 1000/2=500 smile.gif
Можно делать с использованием ПЛИС, тогда количество CS будет таким каким Вы пожелаете. biggrin.gif
Плюсы такого подхода:
- с гонками фронтов нет проблем
- локальные задачи решаются здесь же и их не надо передавать в uC
- возможно сжатие информации перед передачей мастеру
- многобитный SPI.
Минус один:
- длины проводов от опрашиваемых девайсов возрастают.
Вариантов море, но что Вам требуется знаете только Вы.
Kitsok
Цитата(rezident @ Nov 29 2007, 18:42) *
Например, для передачи используйте SPI, а для приема другой модуль синхронного приемопередатчика. Он вроде SSC у Atmel называется?


Это мысль, попробую.
Теперь чуть-чуть теоретических расчетов.

Частота 12МГц, полпериода - 41.5 нс.
Скорость света в проводе примерно 0.7C, 4.7 нс на метр. Делим одно на другое (и учитывая что мы можем позволить себе, скажем, 90% от половины периода), получаем чуть меньше 8 метров допустимой длины кабеля.
Так?
alexander55
Цитата(Kitsok @ Nov 30 2007, 14:45) *
Это мысль, попробую.
Теперь чуть-чуть теоретических расчетов.

Частота 12МГц, полпериода - 41.5 нс.
Скорость света в проводе примерно 0.7C, 4.7 нс на метр. Делим одно на другое (и учитывая что мы можем позволить себе, скажем, 90% от половины периода), получаем чуть меньше 8 метров допустимой длины кабеля.
Так?

Так. Если у Вас безиндуктивные цепи и логика переключается мгновенно. biggrin.gif
И длину кабеля поделите пополам. Сигнал уходит и приходит.
Kitsok
Цитата(alexander55 @ Nov 30 2007, 15:16) *
Так. Если у Вас безиндуктивные цепи и логика переключается мгновенно. biggrin.gif
И длину кабеля поделите пополам. Сигнал уходит и приходит.


Вот я не могу понять, почему сигнал приходит и уходит? Когда до n-го бита доходит переключение CLK, он вдвигается в соседний триггер, а не в Master. А Master тактируется локально, а не отраженным от конца линии (????? а если там терминатор?) сигналом.
alexander55
Цитата(Kitsok @ Nov 30 2007, 15:26) *
Вот я не могу понять, почему сигнал приходит и уходит? Когда до n-го бита доходит переключение CLK, он вдвигается в соседний триггер, а не в Master. А Master тактируется локально, а не отраженным от конца линии (????? а если там терминатор?) сигналом.

Для простоты считайте CLK входом черного ящика, а MISO выходом. И все станет на свои места.
Kitsok
Цитата(alexander55 @ Nov 30 2007, 15:45) *
Для простоты считайте CLK входом черного ящика, а MISO выходом. И все станет на свои места.


Не встает smile.gif
Потому что даже если это - черный ящик, то всегда есть ближайший к контроллеру регистр, который будет выдавать на MISO данные через незначительное (в буквальном смысле) время после фронта CLK.

Еще раз повторюсь, что моя схема представляет из себя условно говоря сдвиговый регистр длиною в 1024 (2048, 4096,...) байт, непосредственно подключенный к контроллеру. Внутри - да, там есть ощутимые задержки, но вот ближайший к контроллеру регистр работает практически синхронно с мастером.
rezident
Господа, вы уже начинаете поражать отсутствием воображения biggrin.gif
Код
SPI-master........Slave1..............Slave2...............Slave3...................
......SlaveN

CLK----->delay1---->|------>delay2------>|------>delay3------>|------->.......---->delayN----|
                                                                                             |
CLK_RET<-delay1<-----------delay2<---------------delay3<---------------........<-------------|
MOSI---->delay1->|prop|--->delay2---->|prop|---->delay3---->|prop|--->.......-->delayN->|prop|-|
                                                                                               |
MISO<----delay1<-----------delay2<--------------delay3<---------------........<-delayN<--------|

Пояснения.
SPI-master это SPI-мастер smile.gif
Slave1, Slave2, Slave3, SlaveN это сдвиговый регистр подключенный к SPI. Пускай для определенности это будет 74HC595. 74HC595 включены в цепочку MOSI последовательно, т.е. MOSI поступает на вход SER, а выходным сигналом является Q'h, который идет на вход SER следующего регистра.
CLK это выходной тактовый сигнал передатчика SPI-master
CLK_RET это входной тактовый сигнал приемника SPI-master
delay1, delay2, delay3, delayN это задержка распространения сигнала в линии
prop - это задержка выдачи выходного сигнала Slave относительно фронта тактового сигнала CLK. Для 74HC595 эта задержка не превышает 30нс.
Если слейвы находятся на одинаковом расстоянии друго от друга, а сигнал CLK проходит последовательно через них, то значение delay будет одинаковым. Причем одинаковым как для CLK, так и для MOSI. Для каждого последующего Slave входной сигнал данных будет отставать от CLK всего лишь на величину prop. Задержка же CLK накапливаться не будет!
Соответственно входной сигнал SPI-master CLK_RET будет иметь задержку относительно LCK на 2*N*delay. Но входной сигнал MISO будет иметь эту же самую задержку относительно CLK и задержку равную prop относительно CLK_RET.
В такой схеме максимальная тактовая частота ограничивается только максимальным временем задержки самого медленного из слейвов, но никак не длиной цепочки. Конечно же тактовая частота не может превышать максимальной тактовой частоты слейвов. В случае цепочки из нескольких 74HC595 ее можно тактировать частотой 30МГц (гарантированное значение по даташиту).
Естественно линия должны быть рассчитана и согласована на такую частоту.
Сергей Борщ
Цитата(Kitsok @ Nov 30 2007, 16:01) *
всегда есть ближайший к контроллеру регистр, который будет выдавать на MISO данные через незначительное (в буквальном смысле) время после фронта CLK.
Эти данные уже стоят на выходе регистра. А после заднего фронта (среза?) CLK, когда они меняются, есть время до следующего фронта, когда контроллер их будет забирать. А сдвиг во всех регистрах происходит одновременно, ибо они синхронные.
alexander55
Цитата(Kitsok @ Nov 30 2007, 17:01) *
Не встает smile.gif
Потому что даже если это - черный ящик, то всегда есть ближайший к контроллеру регистр, который будет выдавать на MISO данные через незначительное (в буквальном смысле) время после фронта CLK.

Еще раз повторюсь, что моя схема представляет из себя условно говоря сдвиговый регистр длиною в 1024 (2048, 4096,...) байт, непосредственно подключенный к контроллеру. Внутри - да, там есть ощутимые задержки, но вот ближайший к контроллеру регистр работает практически синхронно с мастером.

Еще раз скажу.
Чтобы сдвиг последующего регистра сдвига не происходил раньше предыдущего
выполняйте правила заведения CLK.
Я как мог объяснил. Неужели Вы в первый раз встречаете гонки фронтов ?
Иначе получите бред.
rezident тоже привел диаграммы.
Не спешите. Вот еще аналогия.
Труба с кранами, открывающимися на короткое время. М.б. не очень удачная аналогия, но как-то ...
Если Вы откроете вначале выходной вентиль, то между последним и предпоследним куском появится воздушная пробка. biggrin.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.