Управление W5100 и AT25160A по одной шине SPI. Непредвиденные грабли.

Всем привет.
Продолжаю ковырять потихоньку свой проект основанный на STM32F103 и W5100, и понадобилось мне прикрутить к нему последовательную EEPROMку чтоб настройки хранить.
Самые ходовые варианты — это серия AT24 и AT25.
Так как AT24 — серия основанная на I2C, мне она не особо катит, потому как выискивать и мультиплексировать ноги под интерфейс не лучшее решение. Другое дело серия AT25. Работает по SPI, который у меня уже используется, то есть делов-то вроде — еще одну ногу CS выделить, и будет счастье. Но не тут-то было…

Выделил ногу, написал быстренько процедурки для общения с микросхемой, тут никаких проблем. Полез подключать в макетку. У меня присутствует на макетке панелька DIP8, разведенная под эту память. Соединил нужные ноги, воткнул из старого загашника AT25256 и начал мучить.
На SPI в параллели сидит W5100.

Очень упрощенно схема выглядит так:

Запускаю в отладчике — результат чтения регистра статуса 0xFF. Значит что микра не поняла команду. Снизил скорость на интерфейсе, подключил лог. анализатор, все равно без толку. Нет ответа с микросхемы. При этом W5100 прекрасно работает. Перепробовал весь загашник, нет ответа.

Ладно, думаю, у меня скорее всего старая 5ти-вольтовая серия, а напряжение питания идет 3.3 вольта. Завтра зайду в магазин и куплю микру с нужными параметрами по питанию. Подумал так и лег спать.

На следующий день купил новую память AT25160, вставил в панельку, приготовился радоваться — да не тут-то было. Опять получаю ответ 0xFF. Перепробовал все что можно, нет ответа.
Полез ковырять схему еще раз, уже осцилографом. Осцил у меня старенький, особой четкости сигналов на нем уже нет. Перед этим смотрел бегло и не замечал ничего особенного, а тут настроил его получше и увидел следующую картинку:



Это выход SO на микросхеме. Он просаживается примерно на 1 вольт вместо положенных 3х.
На логическом анализаторе это выглядело так:


Видно, что логический 0 просто не детектируется.
Видимо выходит конфликт с W5100.
Для проверки этой догадки выдергиваю SO из W5100 и картинка сразу меняется:


На логическом анализаторе сразу изменилась картинка:


Значит W5100 не отпускает свой выход в Z-состояние по снятию сигнала CS и надо оба выхода развязать.
Изобретать велосипед не хотелось, потому вспомнил, что в загашнике у меня есть 74HC125, которая представляет собой 4-х канальный буфер с Z-состоянием и раздельным управлением каждым каналом.
То есть схему надо было преобразовать упрощенно к следующему виду:


Весь интерфейс развязывать не надо, только подать сигналы SO с памяти и W5100 на входы буфера, завести на входы управления каналами сигнал CS и забрать сигнал с выходов буфера на вход МК (и не забыть этот сигнал подтянуть к питанию, чтоб мусор не ловить).

Быстренько нарисовал и вытравил платку, запаял в нее буфер, подключил и вуаля:


Кадр работы W5100 и AT25160A на одной шине. Верхний сигнал ENABLE это CS памяти, а нижний сигнал ENABLE1 — это CS W5100. Видно, что все прекрасно работает.

UPD:

Благодаря заданному вопросу порылся еще в даташитах и нашел схему, которую предлагает в данном случае производитель:


Я ее видел, но не связал это именно с работой 2х устройств на шине.
То есть, согласно этой схемы надо параллельно со входом CS инвертировать состояние входа SPI_EN:
Когда CS=0 SPI_EN=1, когда CS=1 SPI_EN=0.
Инвертер делается с помощью транзистора в режиме ключа, так что вариант более экономичный и не требует дополнительного корпуса. Разве что я его не опробовал пока на практике.

UPD: UPD:
Да уж позор на мою седую голову… Даташиты надо иногда не только смотреть но и читать. Вот цитата из Аппнота по SPI:

Multiple SPI Slave Usage
Basically, multiple SPI slave usage is the same as single SPI slave usage. One difference between
other SPI slave devices compared to the W5100 is that the MISO output is continuously driven in the
W5100 whether the /SCS is asserted as high or as low. As well, when the 5100 /SCS is asserted as
high when using multiple slaves, other SPI devices cannot be read or written by the SPI master on
the SPI BUS simultaneously. These problems will continue unless the recommendations listed below
are followed.
Recommendations:
— When accessing another device on the SPI BUS rather than the W5100, assert the SEN pin in
the W5100 as low first, then access the other devices.
— When accessing the W5100, the SEN pin should be high.
Figure 3 is a reference schematic for multiple SPI slave devices. The W5100‟s SEN signal is input
from the /SCS through the inverter. If you don‟t want to use the inverter, you can control each
signal through the I/O port of the MCU.


Тоесть все понятным буржуйским языком и написано…
Читайте внимательно документацию и не будете, как я, терять время в пустую!!!
  • +3
  • 01 февраля 2012, 00:03
  • Ultrin

Комментарии (23)

RSS свернуть / развернуть
… и не забыть этот сигнал подтянуть к питанию, чтоб мусор не ловить).
Здесь не совсем понятно, о чем речь?
0
  • avatar
  • Aneg
  • 01 февраля 2012, 02:16
Это дополнительная мера, чтобы убрать мусор со входа контроллера при переводе выходов буфера в Z-состояние. Хотя бы для того чтоб во время анализа работы интерфейса этот мусор не мешал.
0
Прошу прощения за глупый вопрос, а собственно почему W5100 не переводит вывод в Z-состояние? Быть может необходимо микру специально попросить об этом?
А в даташите есть явное упоминание о состоянии выводов в момент, когда ENABLE=1?
0
Никаких настроек или команд связанных с состоянием выхода в W5100 нет. Явного упоминания в даташите тоже не видел, за исключением того, что где-то мне попадалась фраза о том, что в случае отсутствия ответа от микры приходит 0xFF. Во временных диаграммах нарисовано типа-как-Z, но надписями это не обозначено, потому не факт.
Вообще я исходил из того, что раз SPI позволяет вешать на шину несколько устройств, то нога выхода должна представлять собой выход типа «Открытый коллектор».

Спасибо за вопрос, кстати. Сейчас нашел еще один вариант, который указан в апноте по SPI w5100. Добавил в статью.
0
Вообще я исходил из того, что раз SPI позволяет вешать на шину несколько устройств, то нога выхода должна представлять собой выход типа «Открытый коллектор».
С чего бы? В шинах с чип-селектом выходы tri-state. В рабочем состоянии — тянут в обе стороны, в нерабочем — просто отключаются (Hi-Z). На подтяжках работают шины вроде I2C или 1-Wire, где отдельного выбора устройства нет.

Еще повезло кстати что выходы друг друга не выжгли, когда один тянул вверх, а другой — вниз.

Из решений мне кстати больше всего вариант с одноканальным буфером ниже в комментах нравится. Решение не дороже, чем с инвертором.
0
Ну вход-то все равно организовать лучше с подтяжкой. Вреда от нее быть не должно и нога в воздухе не болтается.
На счет буфера — мне тоже данный вариант нравится. Надо бы пробить их на доступность. Инверторы на ебее вроде по баксу за пучек идут, а буфера не смотрел…
0
Ну а если на шине два-три десятка устройств и у всех подтяжка? Тем более SO — исключительно выход. Тут единственный баг — что по снятию CS W5100 не отключается от шины, а продолжает ее тянуть.
Доступность у них я думаю сравнимая. Мне 74LVC серия нравится. Там изрядно одиночных буферов и ЛЭ в пятиногом корпусе, многие с двойным питанием — для согласования уровней. Во многих программаторах/отладчиках выходные каскады сделаны именно на этой серии.
0
только что взял на ебее буфера (как ниже в комментах) и инверторы. Стоит за 10 штук 3.99 бакса и те и другие. За серию тоже спасибо, присмотрюсь к ней.
0
Я в Чип-НН брал по 4р/штука. В отдельности конечно достака ужрет, но не обязательно же только буффера брать :)
0
с ебея примерно так и выходит по 4 р. штука. Доставка бесплатная, что сильно радует :) Там тоже есть скидки по количеству. Например STM32f103c8t6 по одному идут в среднем по 5 баксов, а если брать 10, то можно уже по 3.5 найти. У одного продавца нашел 10 штук по 2.9 бакса, тока зарплату еще не получил :(
0
Чего-то я не того насчитал с просонья… 12 рублей за корпус выходит. Дороговато по сравнению с магазином, но в магазине их ща в наличии просто нет… а с инет-магазинов добавлять минимум 300 р за доставку…
0
Как-то работал с WIZ811MJ (на основе W5100), там в описании на модуль выбор слейва осуществляется сигналом /SCS, и этот же сигнал через инвертор подается на SPI_EN. Инвертор 74AHC1G04, очень удобный, в корпусе типа SOT-23 только с пятью ногами. Еще насколько я помню можно SPI_EN просто к питанию подтянуть.
Кстати, пятивольтовые сигналы W5100 переваривает отлично, 5V I/O signal tolerance действительно есть)
0
у меня модуль WIZ810MJ. В нем такого нет. SPI_EN идет с ноги на пин напрямую. А за инвертер спасибо, буду иметь в виду, потому как транзистор с обвязом тоже место занимает.
Толерантность к 5 вольтам дело хорошее, но в данном случае лишнее. Если все работает от 3.3 V зачем еще и 5 вводить…
0
у меня мега32 была в том устройстве
0
Имхо в данном конкретном случае нужно было i2c память. И ни каких дополнительных инверторов не надо :)
0
Схема всего устройства в данной статье не приводится, чтоб не захламлять. Ноги контроллера заняты под завязку и запихавать i2c неудобно.
0
Дело хозяйское.
а корпус побольше или аппнойт про использование флеша в качестве еепром не рассматривали?
0
корпус побольше пока не рассматриваю по причине его физического его отсутствия. Апнот пока не смотрел, может так и сделаю в итоге.
0
Вижу, вы уже обнаружили в техпаспорте этот довольно известный косяк W5100. Мораль такова, что следует при разработке всё-таки изучать существующие проекты по теме; например, этот же чип используется в Ethernet shield для дуины, там везде инвертер ставят (и не обязательно целую микросхему, полевика хватит). forum.easyelectronics.ru/viewtopic.php?p=121129#p121129 например или www.practicalarduino.com/freetronics/EthernetShield-Worksheet.pdf)
+1
  • avatar
  • Dzhus
  • 01 февраля 2012, 10:36
У модуля MRF24J40MA есть даже специальный однопиновый буффер (реально маленькая пятиножка), поскольку в чипе бага
The SDO signal is tri-state buffered by IC2 to solve a silicon errata where the SDO signal does not release to a high-impedance state after the CS pin returns to its inactive state.
0
Расскажите подробнее о протоколе обмена с AT25160A по SPI. Чтобы осуществить запись или чтение, какие команды нужно отправить?
0
  • avatar
  • Aneg
  • 01 февраля 2012, 17:11
Для чтения все просто. Селект чипа, команда на чтение, 2 байта адреса (для 160ки), далее командой чтения можно читать до конца страницы (32 байта на 160ке). Потом селект чипа отпустить.
Для зписи обязательно после Селекта чипа подать команду на разрешение записи, проверять регистр статуса до исчезновения сигнала Buzy, команду на запись, 2 байта адреса, данные. По отпусканию чип-селекта читать регистр статуса до исчезновения Buzy и тогда можно приступать к следующей операции. Можно писать сразу страницу — по аналогии с чтением. Но пока я страничную запись не реализовал, занят был… А на память не помню, посылаются просто данные или надо перед каждым байтом команду записи слать… Как сделаю, проверю — напишу.
0
Когда писал ответ торопился и чутка ошибся при описании записи:
команда Write Enable идет отдельно, тоесть надо прижать Чип-селект, дать команду write enable, отпустить чип-селект, потом снова прижать чип-селект, дать команду записи, 2 байта адреса, потом данные сплошным потоком до конца страницы, отпустить чип-селект, читать регистр статуса до исчезновения сигнала Busy, далее писать следующую страницу или дать команду завершения режима записи.
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.