Полная версия этой страницы:
Реализация SPI в AVR
vladimir_orl
Sep 25 2013, 13:13
Здравствуйте. Имеется SPI-slave устройство, которое я пытаюсь сэмулировать с помощью mega128. Единственное отличие между оригиналом и клоном, подключенными к SPI-мастеру - разница в уровнях на линии miso в паузах между посылками. В оригинале в паузах miso всегда выставляется в "1". А в AVR-овском SPI уровень MISO в паузе зависит от последнего бита. Отключать линию - тоже не вариант, т.к. надо быть постоянно "начеку". Т. к. мы не знаем когда начнётся следующая посылка. Режим передачи данных - третий. Кто-нибудь сталкивался с подобными вещами? Тема озвучена в ветке "AVR" а не в ветке "протоколы", т.к. насколько я понимаю это именно такая реализация в данном семействе МК.
Tarbal
Sep 25 2013, 14:45
Цитата(vladimir_orl @ Sep 25 2013, 17:13)

Здравствуйте. Имеется SPI-slave устройство, которое я пытаюсь сэмулировать с помощью mega128. Единственное отличие между оригиналом и клоном, подключенными к SPI-мастеру - разница в уровнях на линии miso в паузах между посылками. В оригинале в паузах miso всегда выставляется в "1". А в AVR-овском SPI уровень MISO в паузе зависит от последнего бита. Отключать линию - тоже не вариант, т.к. надо быть постоянно "начеку". Т. к. мы не знаем когда начнётся следующая посылка. Режим передачи данных - третий. Кто-нибудь сталкивался с подобными вещами? Тема озвучена в ветке "AVR" а не в ветке "протоколы", т.к. насколько я понимаю это именно такая реализация в данном семействе МК.
Классическая ошибка при имплементации I2C.
Проблема в том, что вы неправильно передаете высокий логический уровень. Его надо передавать не записывая единицу в соответствующий бит, а настраивая этот бит на вход. Тогда он станет высокоимпедансным и будет притянут резистором вверх. В вашем случае выход вашего слейва дает единицу, а мастера ноль и идет огромный ток. Это довольно опасная ситуация, хотя я не помню чтобы что-нибудь сгорело
aaarrr
Sep 25 2013, 14:57
Цитата(Tarbal @ Sep 25 2013, 18:45)

Классическая ошибка при имплементации I2C.
Вообще-то в исходном сообщении три раза написано "SPI"
Цитата(vladimir_orl @ Sep 25 2013, 20:13)

Здравствуйте. Имеется SPI-slave устройство, которое я пытаюсь сэмулировать с помощью mega128. Единственное отличие между оригиналом и клоном, подключенными к SPI-мастеру - разница в уровнях на линии miso в паузах между посылками. В оригинале в паузах miso всегда выставляется в "1". А в AVR-овском SPI уровень MISO в паузе зависит от последнего бита. Отключать линию - тоже не вариант, т.к. надо быть постоянно "начеку". Т. к. мы не знаем когда начнётся следующая посылка. Режим передачи данных - третий. Кто-нибудь сталкивался с подобными вещами? Тема озвучена в ветке "AVR" а не в ветке "протоколы", т.к. насколько я понимаю это именно такая реализация в данном семействе МК.
chipselect если отпустить, то avr тогда и mosi должен отпустить болтаться (автоматически будет переключаться на вход), ну и чтобы в "1" был - подтянуть к питанию.
в единицу переключать mosi после последнего клока и с активным чипселектом никто не обязан.
Цитата
19.3 SS Pin Functionality
19.3.1 Slave Mode
When the SPI is configured as a Slave, the Slave Select (SS) pin is always input. When SS is held low, the SPI is
activated, and MISO becomes an output if configured so by the user. All other pins are inputs. When SS is driven
high, all pins are inputs, and the SPI is passive, which means that it will not receive incoming data. Note that the
SPI logic will be reset once the SS pin is driven high.
Tarbal
Sep 25 2013, 15:35
Цитата(aaarrr @ Sep 25 2013, 18:57)

Вообще-то в исходном сообщении три раза написано "SPI"

Простите мне мою невнимательность. Однако повышеный уровень нуля после последней единицы (или пониженный уровень единицы после последнего нуля) в посылке. все равно указывает на конфликт двух выходов. Полагаю, что чип селект может как-то влиять на состояние выхода MISO. Поищите в настройках.
ZASADA
Sep 25 2013, 18:23
если эта тема является продолжением предыдущих про нестандартный протокол по SPI, то там у мастера не было выхода чипселекта.
Tarbal
Sep 25 2013, 21:17
Цитата(ZASADA @ Sep 25 2013, 22:23)

если эта тема является продолжением предыдущих про нестандартный протокол по SPI, то там у мастера не было выхода чипселекта.
Чип селект (слейв селект) сигнал обязателен в SPI
vladimir_orl
Sep 26 2013, 04:21
Да, действительно. На шине master-slave всего три линии: miso, mosi, clk. На slave чипселект после каждого байта включается-выключается самим slave-ом. Честно говоря, сам удивляюсь, почему всё работает без внешнего чипселекта. И биты на сбиваются.
Наверное надо действительно надо делать SPI переключением выводов на вход или выход (то есть изменением их сопротивления). У меня сейчас внешняя подтяжка 1k резисторами к +5В. Тока действительно много потребляется. Надо будет транзисторы на вход поставить.
С "прижиманием" линии clk тоже разобрался. Его действительно осуществляет slave для подтверждения того что всё хорошо. Без этого связка не работает.
Цитата(vladimir_orl @ Sep 26 2013, 14:21)

На slave чипселект после каждого байта включается-выключается самим slave-ом.
Этого не может быть. Или Вы реализуете совсем не SPI. Обмен данными всегда инициирует мастер, он же должен дергать и сигнал SS (входной сигнал для слейва).
vladimir_orl
Sep 26 2013, 05:12
Цитата
На slave чипселект после каждого байта включается-выключается самим slave-ом.
Это я так сделал. Потому как не мог ничего лучше придумать. И линии SS нет.
Это вы неправильно сделали. Линия SS, если это SPI-интерфейс, обязана быть. Просто в AVR в режиме master вы обязаны ее дергать вручную и настроить как выход. В режиме Slave интерфейс узнает, что к нему обращаются, как раз при наличии сигнала SS, он должен быть настроен как вход.
При реализации slave-SPI на сдвиговом регистре (простейшая аппаратная реализация) сигнал SS, как правило, разрешает сдвиг.
ZASADA
Sep 26 2013, 08:15
прочитайте предыдущие темы топикстартера.
это не совсем SPI-интерфейс, точнее совсем не SPI-интерфейс. Это нестандартный трехпроводный интерфейс. Отличий от SPI куча:
отсутствует чипселект
выход CLK у мастера после передачи пакета становится входом и мастер ждет по нему подтверждение от слейва
вход CLK у слейва после приема пакета становится выходом и слейв дергает им, подтверждая правильность приема пакета
выход MISO у слейва после приема ставится в 1 (возможно Z-состояние, надо проверять )
vladimir_orl
Sep 26 2013, 10:59
Да. Это нестандартный SPI. Но в том-то и дело что его надо на AVR mega сделать.
Вот сейчас натолкнулся в даташите на SAM4S (раздел про SPI):
Нажмите для просмотра прикрепленного файлаНаверное и в мегах то же. Буду дальше думать...
- MISO - * Not defined, but normally MSB of previous character received.
Tarbal
Sep 26 2013, 13:02
"Осетрина бывает только первой свежести", а SPI только стандартным

Нестандартный SPI называется как-то иначе, но не SPI.
Я бы почитал документацию и поискал где сигнал SS. Дело в том, что по завершению этого сигнала интерфейс SPI совершает действия и не быть его не может. Если например вы в ЕЕПРОМ с SPI интерфейсом не будете опускать и поднимать SS (допустим разрешите навсегда), то вы ничего не запишете в мамять.
__Alexander
Sep 30 2013, 14:54
а почему это слэйв самостоятельно выставляет на линию miso лог "1" ? такого быть не может. это обычный сдвиговый регистр. если он работает на прием, то это прием.
CS на SPI не обязателен, точнее его можно жестко притянуть к земле, но если вылезет ошибка, то тогда да, не перезапустишь )
Tarbal
Sep 30 2013, 18:43
Цитата(__Alexander @ Sep 30 2013, 18:54)

а почему это слэйв самостоятельно выставляет на линию miso лог "1" ? такого быть не может. это обычный сдвиговый регистр. если он работает на прием, то это прием.
CS на SPI не обязателен, точнее его можно жестко притянуть к земле, но если вылезет ошибка, то тогда да, не перезапустишь )
MISO -> M(aster)I(n)S(lave)O(ut)
MISO is out for slave
__Alexander
Oct 1 2013, 06:37
да. не внимательно прочел. сорри.
уж слишком много отличий от стандартного spi в avr. если скорости не большие, то легче сделать программно. clk повесить на прерывание и сдвигать на выход байт как захочется.
Цитата(Tarbal @ Sep 26 2013, 01:17)

Чип селект (слейв селект) сигнал обязателен в SPI
Цитата(ILYAUL @ Oct 1 2013, 13:08)

А своими словами слабо?
Цитата(Tarbal @ Oct 1 2013, 20:27)

А своими словами слабо?
В большинстве случаев его просто сажают на землю
Цитата(ILYAUL @ Oct 1 2013, 23:15)

В большинстве случаев его просто сажают на землю
Обычно с этого начинают писать драйвер SPI EEPROM. Потом, наевшись проблем, понимают наконец роль сингнала SS и начинают им управлять.
Я же поднесу вам суть проблемы на блюдечке. Вот выдержка из описания микросхемы памяти AT25010A:
A Write instruction requires the following sequence. After the CS line is pulled low to
select the device, the WRITE op-code (including A8) is transmitted via the SI line fol-
lowed by the byte address (A7 A0) and the data (D7 D0) to be programmed.
Programming will start after the CS pin is brought high. The low-to-high transition of the
CS pin must occur during the SCK low time immediately after clocking in the D0 (LSB)
data bit.
Если SS посадить на землю, то ничего не запишется.
http://www.atmel.ca/Images/doc3348.pdf
Ваш случай по-видимому относится к меньшинству , где-то у меня такая валялась . Проверю
это не чей то случай, это часть спецификации интерфейса. то что можно использовать только часть спецификации для передачи данных не означает что это правильно. в случае соединения точка точка можно редуцировать SS линию в ряде случаев, а в случае связи 3-х устройств ?
вы просто произвели для себя подмену понятий SPI = "SPI так как им пользуюсь я", но других то убеждать в этом не обязательно.
Цитата(Duhas @ Oct 2 2013, 20:15)

а в случае связи 3-х устройств ?
Протокол SPI допускает не использовать SS . Для Ваших трех - решений предостаточно , от рассыпухи до использования портов контролера ( не лучший вариант) Что будите делать если у Вас их , SPI устройст 22 шт. , все однотипные и обратная связь с MCU не нужна. Тоже дешифраторы нагородите/
Кстати даю сразу правильный ответ , чтоб закрыть тему ибо мне не интересна, что для 3 что для 22 устройств SS может сидеть на земле и при этом путаницы в обращении к устройствам не будет. А вот почему и как - решаете Вы
считаю что красивым решением для 22 устройств будет повесить на ту же SPI сдвиговый регистр + дешифраторы и адресовать до 255 устройств записью однобайтного адреса устройства на шине. Но представить 10+ периферийных устройств на шине SPI я не могу, т.к. либо это очень много однотипных устройств, что может говорить либо о неверном подборе компонентов, либо о суровой специализации устройства, где могут быть не критичны как трата пинов МК, так и установка доп. микросхем. в случае когда устройств много и требуется скорость - это уже несколько SPI..
если же городить пакетную передачу с адресацией для SPI - то это уже , имхо, извращение, т.к. для этого есть I2C и прочее...
Я посмотрел этот проект, чтобы себе напомнить как было решена сия задача. Единственное в чём погорячился , что SS был использован но не только как выбор всех чипов (PIC 22шт.) сразу , но и как сигнал окончания передачи. По сути SPI и сдвиговый регистр братья близнецы. И как любой сдвиговый регистр его можно наращивать . Поэтому в буфер мастера загоняются данные для всех 22 устройств . Первыми выходят данные для последнего устройства в цепочке. И кстати первыми приходят , если они Вам нужны. За 176 импульсов CLK все устройства получат свои данные и отдадут что накопили. Сигнал SS снимается , сообщая все устройствам сразу , что они получили свои данные.
Цитата(ILYAUL @ Oct 2 2013, 21:57)

Протокол SPI допускает не использовать SS .
И аргументировать сможете? Приведете документ, в котором об этом сказано?
Я полагаю, что это ваше личное умозаключение, но вы можете переубедить меня, приведя ссылку на документ.
Цитата(ILYAUL @ Oct 3 2013, 11:42)

Я посмотрел этот проект, чтобы себе напомнить как было решена сия задача. Единственное в чём погорячился , что SS был использован но не только как выбор всех чипов (PIC 22шт.) сразу , но и как сигнал окончания передачи. По сути SPI и сдвиговый регистр братья близнецы. И как любой сдвиговый регистр его можно наращивать . Поэтому в буфер мастера загоняются данные для всех 22 устройств . Первыми выходят данные для последнего устройства в цепочке. И кстати первыми приходят , если они Вам нужны. За 176 импульсов CLK все устройства получат свои данные и отдадут что накопили. Сигнал SS снимается , сообщая все устройствам сразу , что они получили свои данные.
Вопрос стоит не как ухитриться сделать нестандартно, а следует ли вообще применять нестандартные решения.
Цитата(Tarbal @ Oct 3 2013, 20:08)

И аргументировать сможете? Приведете документ, в котором об этом сказано?
Я полагаю, что это ваше личное умозаключение, но вы можете переубедить меня, приведя ссылку на документ.
Поищу
Цитата(Tarbal @ Oct 3 2013, 20:08)

Вопрос стоит не как ухитриться сделать нестандартно, а следует ли вообще применять нестандартные решения.
Что же здесь не стандартного , даже любимый Вами SS использован
Цитата(ILYAUL @ Oct 3 2013, 20:14)

Что же здесь не стандартного , даже любимый Вами SS использован
Тады Ой!
Однако не мой любимый

, его стандарт любит.
deleted duplicated message
ILYAUL, есть устройства, позволяющие вешать их паровозом на одну шину SPI, а есть не позволяющие...
Цитата(ZASADA @ Oct 3 2013, 23:08)

ILYAUL, есть устройства, позволяющие вешать их паровозом на одну шину SPI, а есть не позволяющие...
Это те, у которых есть чип-селект, и те, у которых его нету.
Цитата(Xenia @ Oct 3 2013, 22:20)

Это те, у которых есть чип-селект, и те, у которых его нету.

чипселект тут не причем =). как правило они все с чипселектом, просто в описании присутствует фраза типа daisy chain capable SPI
А еще у SPI есть одна логическая проблема. Причинно-следственная связь иногда нарушается. Посылает мастер запрос, а одновременно с посланным байтом приниматся входящий. Возникают непонятки
Цитата(ZASADA @ Oct 4 2013, 05:32)

просто в описании присутствует фраза типа daisy chain capable SPI
Если я правильно помню - Daisy Chain - это когда вы от МК MOSI заводите в MOSI 1 слэйва, его MISO заводите в MOSI 2 второго соэйва ... MOSI слэйва n заводите в MISO МК...
Цитата(ZASADA @ Oct 3 2013, 23:08)

ILYAUL, есть устройства, позволяющие вешать их паровозом на одну шину SPI, а есть не позволяющие...
Какой нить примерчик
Цитата
Если я правильно помню - Daisy Chain - это когда вы от МК MOSI заводите в MOSI .....
Да
Много раз говорили о том, что если чипселект не ограничивает кадр, то с ростом числа бит помехоустойчивость такого канала падает и смысла отменять /SS в связи с этим нет
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.