Перейти к содержанию
    

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Биты или сдвинуты все или не сдвинуты не один. Это фиксированная величина для конкретного слейва.

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

;) Вот тут я не понимаю. Получается, что если у меня сейчас работает с восемью 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 сигнала загрузки входов регистра. Тогда на каждом цикле считывания будете иметь инвертированный маркер, существенно ниже вероятность спутать его с такой же комбинацией входных сигналов.

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Эээхм... Да.

Объяснюсь.

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

 

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

 

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

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

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

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

 

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

 

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

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

 

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

 

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

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

 

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

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

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

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

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

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

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

Минус один:

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

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

 

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

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

Так?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

 

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

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

Так?

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

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

×
×
  • Создать...