Jump to content

    
Sign in to follow this  
Kitsok

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

Recommended Posts

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

Share this post


Link to post
Share on other sites
Биты или сдвинуты все или не сдвинуты не один. Это фиксированная величина для конкретного слейва.

Что за обратная связь я не понимаю.

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

 

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

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

Это медицинский факт ;)

Объясняю, на Вашем примере.

1. По сигналу выбора слейв устройства, Вы пишете состояние кнопкок, тумблеров и энкодеров в регистр сдвига слейва (я так думаю). :)

2. По сигналу CLK передаваемая от мастера информация игнорируется слейвом. Это мы выяснили.

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

 

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

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

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

 

А теперь контрольные вопросы Вам, чтобы понять, где мы находимся.

А. Что будет:

- если информация от слейва на момент сдвига мастером еще не дошла

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

 

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

То не потеряется ;)

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

 

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

 

 

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

 

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

Share this post


Link to post
Share on other sites
Но мне нужно выцепить конкретный теряющийся бит
Куда ему теряться? Проблема в том, что в зависимости от длины вашей цепочки вы можете получить на вход последовательность, задержанную на n бит, где n прямо пропорционально длине цепочки и может принимать значения от 0 до забора. Вам просто нужно принимать на байт больше и по положению маркера вычислять сдвиг принятых данных. Если я правильно понял.

Share this post


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

Т.е. Вы хотите сказать, что у Вас SPI не 8 битный, а 8*n битный.

Ответьте на этот вопрос.

Share this post


Link to post
Share on other sites
Т.е. Вы хотите сказать, что у Вас SPI не 8 битный, а 8*n битный.

Ответьте на этот вопрос.

Эээхм... Да.

Объяснюсь.

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

 

Куда ему теряться? Проблема в том, что в зависимости от длины вашей цепочки вы можете получить на вход последовательность, задержанную на n бит, где n прямо пропорционально длине цепочки и может принимать значения от 0 до забора. Вам просто нужно принимать на байт больше и по положению маркера вычислять сдвиг принятых данных. Если я правильно понял.

 

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

 

Образно я вижу так - фронт сигнала (по которому должен происходить сдвиг в регистре) доезжает до некого k-того регистра с задержкой (относительно мастера) в полпериода. Т.е. когда тот k-тый регистр только выдвинул бит, мастер уже ожидает... стоп. Мастер далеко. Дыра что-ли получается в битовой последовательности? Ну не получается представить... ;(

Share this post


Link to post
Share on other sites
Т.е. Вы хотите сказать, что у Вас SPI не 8 битный, а 8*n битный.

Ответьте на этот вопрос.

Кажется я понял, с чем Вы мучаетесь.

Если у Вас 8*n битный SPI.

Решение такое.

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

Произвольное подключение CLK приведет к анархии.

Волна данных по переносам должна идти вместе CLK ( иначе будет полный бардак).

 

Я догадался правильно. :biggrin:

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

Share this post


Link to post
Share on other sites
Волна данных по переносам должна идти вместе CLK ( иначе будет полный бардак).

Я догадался правильно. :biggrin:

 

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

Спасибо за наводку, буду попробовать.

 

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

 

А альтернатива? Хотя это, видимо, не для этой ветки.

Share this post


Link to post
Share on other sites
И ведь была у меня эта мысль после той картинки с кольцеванием CLK, да постеснялся высказать ;)

Спасибо за наводку, буду попробовать.

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

Вы меня заинтриговали. :)

 

А альтернатива? Хотя это, видимо, не для этой ветки.

Параллелить со своими CS.

Share this post


Link to post
Share on other sites
Т.е. когда тот k-тый регистр только выдвинул бит, мастер уже ожидает... стоп. Мастер далеко. Дыра что-ли получается в битовой последовательности? Ну не получается представить... ;(

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

Share this post


Link to post
Share on other sites
Я вам еще в посте #22 объяснил как решается эта проблема. Каждый приемник (и мастера и слейва) тактируется своим собственным CLK. CLK приемника мастера этот тот же CLK, сгенерированный его собственным передатчиком, но прошедший путь до конца цепочки (с которого берется MISO) и обратно - CLK_RET. Такой способ используется во всех скоростных эмуляторах , которые работают с JTAG на десятках-сотнях МГц.

 

Мне бы хотелось для начала осознать в деталях проблему ;)

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

 

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

Вы меня заинтриговали. :)

Всепренепременнейше ;)

Параллелить со своими CS.

 

Т.е. грубо хотя бы 1000 регистров - 1000 CS? :)

Share this post


Link to post
Share on other sites
О Вашем решении я помню. Только не очень представляю, как это реализовать с тем контроллером, который есть у меня (AT91SAM7S256). Программный SPI делать? Ну вот на это я точно не готов...

Например, для передачи используйте SPI, а для приема другой модуль синхронного приемопередатчика. Он вроде SSC у Atmel называется?

Share this post


Link to post
Share on other sites
Т.е. грубо хотя бы 1000 регистров - 1000 CS? :)

Можно не 1000, а 1000/2=500 :)

Можно делать с использованием ПЛИС, тогда количество CS будет таким каким Вы пожелаете. :biggrin:

Плюсы такого подхода:

- с гонками фронтов нет проблем

- локальные задачи решаются здесь же и их не надо передавать в uC

- возможно сжатие информации перед передачей мастеру

- многобитный SPI.

Минус один:

- длины проводов от опрашиваемых девайсов возрастают.

Вариантов море, но что Вам требуется знаете только Вы.

Share this post


Link to post
Share on other sites
Например, для передачи используйте SPI, а для приема другой модуль синхронного приемопередатчика. Он вроде SSC у Atmel называется?

 

Это мысль, попробую.

Теперь чуть-чуть теоретических расчетов.

 

Частота 12МГц, полпериода - 41.5 нс.

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

Так?

Share this post


Link to post
Share on other sites
Это мысль, попробую.

Теперь чуть-чуть теоретических расчетов.

 

Частота 12МГц, полпериода - 41.5 нс.

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

Так?

Так. Если у Вас безиндуктивные цепи и логика переключается мгновенно. :biggrin:

И длину кабеля поделите пополам. Сигнал уходит и приходит.

Share this post


Link to post
Share on other sites
Так. Если у Вас безиндуктивные цепи и логика переключается мгновенно. :biggrin:

И длину кабеля поделите пополам. Сигнал уходит и приходит.

 

Вот я не могу понять, почему сигнал приходит и уходит? Когда до n-го бита доходит переключение CLK, он вдвигается в соседний триггер, а не в Master. А Master тактируется локально, а не отраженным от конца линии (????? а если там терминатор?) сигналом.

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