|
|
  |
SPI на 12 МГц через длинные провода |
|
|
|
Nov 29 2007, 11:25
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(Kitsok @ Nov 29 2007, 11:20)  Слейв - это просто регистры, к которым подключены кнопки, тумблеры и энкодеры. MOSI, исходящее от мастера, никогда не попадает никаким образом на MISO  Привесьте в хвост цепочки еще один регистр, на входе которого выставьте заранее известное значение (0xA5). В принимаемом сигнале ищите эту комбинацию как маркер конца. Можно взять не A5 а какую-либо из последовательностей Баркера или Уилларда(?). Или еще лучше - формировать биты такой последовательности с прямого и инвесного выходов делителя на 2 сигнала загрузки входов регистра. Тогда на каждом цикле считывания будете иметь инвертированный маркер, существенно ниже вероятность спутать его с такой же комбинацией входных сигналов.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Nov 29 2007, 11:54
|
Местный
  
Группа: Свой
Сообщений: 211
Регистрация: 9-11-06
Пользователь №: 22 136

|
Цитата(alexander55 @ Nov 29 2007, 13:31)  Биты или сдвинуты все или не сдвинуты не один. Это фиксированная величина для конкретного слейва. Что за обратная связь я не понимаю.  Вот тут я не понимаю. Получается, что если у меня сейчас работает с восемью 74HC165, то будет работать и с 8000? Сомневаюсь. Цитата Понял Вас. Слейву информация от мастера не нужна. А кто Вам такое мог сказать ? Это медицинский факт Цитата Объясняю, на Вашем примере. 1. По сигналу выбора слейв устройства, Вы пишете состояние кнопкок, тумблеров и энкодеров в регистр сдвига слейва (я так думаю). 2. По сигналу CLK передаваемая от мастера информация игнорируется слейвом. Это мы выяснили. Совершенно верны оба два утверждения Цитата 3. По сигналу CLK информация в регистре сдвига сдвигается, и поступает в мастер. 4. По своему же CLK мастер сдвигает принятую информацию. По тому-же CLK, только инвертированному. Или задержку при прохождении через инвертор тоже имеет смысл здесь учесть? Цитата А теперь контрольные вопросы Вам, чтобы понять, где мы находимся. А. Что будет: - если информация от слейва на момент сдвига мастером еще не дошла Бит потеряется где-то между двух регистров(n и n+1) посредине цепочки. В том месте, где на n задержка прохождения CLK еще меньше полупериода, а на n+1 - уже больше. Ключевой момент. Если Вам удастся мне объяснить, прав я или нет, то буду признателен чрезвычайно Цитата - а если уже дошла. То не потеряется Цитата Б. Меняется ли задержка прихода информации для конкретного слейв устройства. Я этот вопрос не понимаю, у меня одно слейв устройство, состоящее из длинного каскада сдвиговых регистров. Мне так кажется, что в цепочки из N-регистров по 8 бит каждый, и если считать бит номер 0 "ближайшим" к мастеру, то время прихода k-того бита зависит от длины проводов и от N. Цитата(Сергей Борщ @ Nov 29 2007, 14:25)  Привесьте в хвост цепочки еще один регистр, на входе которого выставьте заранее известное значение (0xA5). В принимаемом сигнале ищите эту комбинацию как маркер конца. Можно взять не A5 а какую-либо из последовательностей Баркера или Уилларда(?). Или еще лучше - формировать биты такой последовательности с прямого и инвесного выходов делителя на 2 сигнала загрузки входов регистра. Тогда на каждом цикле считывания будете иметь инвертированный маркер, существенно ниже вероятность спутать его с такой же комбинацией входных сигналов. А не поможет. Конец я найду, т.е. узнаю количество подключенных регистров. Но мне нужно выцепить конкретный теряющийся бит, поэтому нужно загнать в крайний регистр тестовую последовательность двойной максимально возможной длины и анализировать ее.
|
|
|
|
|
Nov 29 2007, 13:15
|
Местный
  
Группа: Свой
Сообщений: 211
Регистрация: 9-11-06
Пользователь №: 22 136

|
Цитата(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-тый регистр только выдвинул бит, мастер уже ожидает... стоп. Мастер далеко. Дыра что-ли получается в битовой последовательности? Ну не получается представить... ;(
|
|
|
|
|
Nov 29 2007, 13:21
|
Бывалый
    
Группа: Свой
Сообщений: 1 584
Регистрация: 7-08-07
Пользователь №: 29 615

|
Цитата(alexander55 @ Nov 29 2007, 15:20)  Т.е. Вы хотите сказать, что у Вас SPI не 8 битный, а 8*n битный. Ответьте на этот вопрос. Кажется я понял, с чем Вы мучаетесь. Если у Вас 8*n битный SPI. Решение такое. От мастера CLK должен подходить сначала к самому дальнему слейву (самый дальний дает перенос тому, который поближе), затем ближе ... и наконец к самому ближнему, с которого данные и идут в мастер. Произвольное подключение CLK приведет к анархии. Волна данных по переносам должна идти вместе CLK ( иначе будет полный бардак). Цитата(Kitsok @ Nov 29 2007, 16:15)  Я догадался правильно.  PS. Замечу только, что такая распределенная организация сдвигового регистра не особо надежна в плане передачи данных (хотя может все получится).
|
|
|
|
|
Nov 29 2007, 13:52
|
Местный
  
Группа: Свой
Сообщений: 211
Регистрация: 9-11-06
Пользователь №: 22 136

|
Цитата(alexander55 @ Nov 29 2007, 16:21)  Волна данных по переносам должна идти вместе CLK ( иначе будет полный бардак). Я догадался правильно.  И ведь была у меня эта мысль после той картинки с кольцеванием CLK, да постеснялся высказать Спасибо за наводку, буду попробовать. Цитата PS. Замечу только, что такая распределенная организация сдвигового регистра не особо надежна в плане передачи данных (хотя может все получится). А альтернатива? Хотя это, видимо, не для этой ветки.
|
|
|
|
|
Nov 29 2007, 14:18
|
Бывалый
    
Группа: Свой
Сообщений: 1 584
Регистрация: 7-08-07
Пользователь №: 29 615

|
Цитата(Kitsok @ Nov 29 2007, 16:52)  И ведь была у меня эта мысль после той картинки с кольцеванием CLK, да постеснялся высказать Спасибо за наводку, буду попробовать. Хочется услышать результат (не зажимайте информацию). Вы меня заинтриговали. Цитата(Kitsok @ Nov 29 2007, 16:52)  А альтернатива? Хотя это, видимо, не для этой ветки. Параллелить со своими CS.
|
|
|
|
|
Nov 29 2007, 15:31
|
Местный
  
Группа: Свой
Сообщений: 211
Регистрация: 9-11-06
Пользователь №: 22 136

|
Цитата(rezident @ Nov 29 2007, 17:55)  Я вам еще в посте #22 объяснил как решается эта проблема. Каждый приемник (и мастера и слейва) тактируется своим собственным CLK. CLK приемника мастера этот тот же CLK, сгенерированный его собственным передатчиком, но прошедший путь до конца цепочки (с которого берется MISO) и обратно - CLK_RET. Такой способ используется во всех скоростных эмуляторах , которые работают с JTAG на десятках-сотнях МГц. Мне бы хотелось для начала осознать в деталях проблему О Вашем решении я помню. Только не очень представляю, как это реализовать с тем контроллером, который есть у меня (AT91SAM7S256). Программный SPI делать? Ну вот на это я точно не готов... Цитата(alexander55 @ Nov 29 2007, 17:18)  Хочется услышать результат (не зажимайте информацию). Вы меня заинтриговали.  Всепренепременнейше Цитата Параллелить со своими CS. Т.е. грубо хотя бы 1000 регистров - 1000 CS?
|
|
|
|
|
Nov 30 2007, 05:52
|
Бывалый
    
Группа: Свой
Сообщений: 1 584
Регистрация: 7-08-07
Пользователь №: 29 615

|
Цитата(Kitsok @ Nov 29 2007, 18:31)  Т.е. грубо хотя бы 1000 регистров - 1000 CS?  Можно не 1000, а 1000/2=500 Можно делать с использованием ПЛИС, тогда количество CS будет таким каким Вы пожелаете. Плюсы такого подхода: - с гонками фронтов нет проблем - локальные задачи решаются здесь же и их не надо передавать в uC - возможно сжатие информации перед передачей мастеру - многобитный SPI. Минус один: - длины проводов от опрашиваемых девайсов возрастают. Вариантов море, но что Вам требуется знаете только Вы.
|
|
|
|
|
Nov 30 2007, 11:45
|
Местный
  
Группа: Свой
Сообщений: 211
Регистрация: 9-11-06
Пользователь №: 22 136

|
Цитата(rezident @ Nov 29 2007, 18:42)  Например, для передачи используйте SPI, а для приема другой модуль синхронного приемопередатчика. Он вроде SSC у Atmel называется? Это мысль, попробую. Теперь чуть-чуть теоретических расчетов. Частота 12МГц, полпериода - 41.5 нс. Скорость света в проводе примерно 0.7C, 4.7 нс на метр. Делим одно на другое (и учитывая что мы можем позволить себе, скажем, 90% от половины периода), получаем чуть меньше 8 метров допустимой длины кабеля. Так?
|
|
|
|
|
Nov 30 2007, 12:26
|
Местный
  
Группа: Свой
Сообщений: 211
Регистрация: 9-11-06
Пользователь №: 22 136

|
Цитата(alexander55 @ Nov 30 2007, 15:16)  Так. Если у Вас безиндуктивные цепи и логика переключается мгновенно.  И длину кабеля поделите пополам. Сигнал уходит и приходит. Вот я не могу понять, почему сигнал приходит и уходит? Когда до n-го бита доходит переключение CLK, он вдвигается в соседний триггер, а не в Master. А Master тактируется локально, а не отраженным от конца линии (????? а если там терминатор?) сигналом.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|