Jump to content

    
Sign in to follow this  
Kitsok

SPI на 12 МГц через длинные провода

Recommended Posts

Добрый день!

 

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

 

Непосредственно устройства ввода (кнопки, тумблеры, энкодеры) и вывода (светодиоды, 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, земля и сигналы будут перевиты.

 

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

 

Заранее спасибо!

Share this post


Link to post
Share on other sites

Может стоит для такого случая LVDS-драйверы/приемники применить? По крайней мере сигналы, подаваемые на разъем, пробуферировать нужно в любом случае.

Share this post


Link to post
Share on other sites

Достаточно сделать две вещи:

1. Клок от "мастера" размножить на буфере и завести на каждую плату СВОЙ.

2. В цепях данных и клока поставить полследовательные резисторы номиналом 82 Ом (для согласования с CAT5). Резисторы ставить строго на передающей стороне.

 

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

 

Это конечно потребует несколько переделать то, что у Вас уже есть, но это единственное дешёвое и надёжное решение.

Share this post


Link to post
Share on other sites

rezident,alexander55

 

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

 

 

 

bms

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

 

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

 

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

 

 

Спасибо большое за ответы!!!

Share this post


Link to post
Share on other sites
bms

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

 

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

 

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

Спасибо большое за ответы!!!

 

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

 

Резисторы подтяжки не нужны.

Выравнивание клока и данных в этом случае получится автоматически - т.к. всё это будет передаваться через один 4-х парный кабель.

Важно данные и клок протаскивать через один и тот же корпус буфера, т.е. берёте например счетверённый буфер, как на рисунке. Нельзя использовать разные корпуса (например не счетверённый корпус, а четыре отдельных корпуса), поскольку в этом случае разные корпуса будут иметь разные задержки и при большом числе плат данные и клок могут сильно "разъехаться" во времени. А в пределах одного (счетверённого например) корпуса задержки по всем буферам будут одинаковые.

post-7545-1195678011_thumb.jpg

Share this post


Link to post
Share on other sites
времени. А в пределах одного (счетверённого например) корпуса задержки по всем буферам будут одинаковые.

 

А данные, прошедшие через SPI устройство, пройдут с нулевой задержкой?

Share this post


Link to post
Share on other sites
А данные, прошедшие через SPI устройство, пройдут с нулевой задержкой?

Добавлю еще, что даже при задержках "скомпенсированных" на многочисленных буферах СLK и MOSI проблема разбега CLK и MISO стоит в полный рост, ибо составляет суммарную задержку передачи CLK туда и MISO обратно.

Share this post


Link to post
Share on other sites
Добавлю еще, что даже при задержках "скомпенсированных" на многочисленных буферах СLK и MOSI проблема разбега CLK и MISO стоит в полный рост, ибо составляет суммарную задержку передачи CLK туда и MISO обратно.

Да, конечно.

Вот простой расчетик.

При длине кабеля 2 м, сигнал проходит растояние 4 м.

Если сигнал распространяется со скоростью света 300 т.км/с, задержка составит 13,3 нс.

Если учесть индуктивность кабеля и задержки чиповые (3-10 нс), то это значение может удвоиться-утроиться.

Прикиньте, какой это фазовый сдвиг на 12 МГц. Более четверти до половины периода.

Уже есть над чем задуматься. :)

Share this post


Link to post
Share on other sites
Да, конечно.

Вот простой расчетик.

При длине кабеля 2 м, сигнал проходит растояние 4 м.

Если сигнал распространяется со скоростью света 300 т.км/с, задержка составит 13,3 нс.

Если учесть индуктивность кабеля и задержки чиповые (3-10 нс), то это значение может удвоиться-утроиться.

Прикиньте, какой это фазовый сдвиг на 12 МГц. Более четверти до половины периода.

Уже есть над чем задуматься. :)

 

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

Share this post


Link to post
Share on other sites
Прошу прощения за нескромный вопрос, но может быть существуют какие-то устоявшиеся решения проблемы с разбегом? Или SPI совсем не предназначен для таких дел?
Приходит в голову использование для приема второго SPI в режиме slave, на который подается CLK с того же регистра, с которого и снимается MOSI. Остается вопрос - где взять еще одну пару в кабеле. А еще могу порекомендовать книжку "Синхронизация в телекоммуникационных системах" - там много интересных решений описано.

Share this post


Link to post
Share on other sites
Или SPI совсем не предназначен для таких дел?

Не предназначен.

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

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

Share this post


Link to post
Share on other sites
Не предназначен.

 

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

 

Интересный ход. А как при этом определить, в каком бите у нас что пришло?

Share this post


Link to post
Share on other sites
Прошу прощения за нескромный вопрос, но может быть существуют какие-то устоявшиеся решения проблемы с разбегом? Или SPI совсем не предназначен для таких дел?

Устоявшегося (или устоявшевося) решения нет (готового). SPI - это синхронный интерфейс для SWAP. Его преимущество проявляется при близком расположении SPI-устройств (на одной плате или набираемом блоке).

PS. При больших длинах посмотрите в сторону снижения CLK.

Или изменения алгоритма функционирования (например, аппаратного SPI с учетом задержек от каждого SPI)

или вариант Сергея.

 

Интересный ход. А как при этом определить, в каком бите у нас что пришло?

Да, Вам zltigo предложил классный вариант (можно сказать, гениальный).

Используйте тестовую посылку для выявления где мухи, где котлеты.

Share this post


Link to post
Share on other sites
Интересный ход. А как при этом определить, в каком бите у нас что пришло?

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

 

 

P.S.

А вообще так SPI c TTL уровнями использовать это махровое радиолюбительство :(.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this