Возможно ли использовать 74HC165 по SPI совместно с другими устройствами?
- Войдите на сайт для отправки комментариев
Как-то начитавшись http://robocraft.ru/blog/arduino/518.html , где утверждается, что по SPI можно использовать несколько устройств, переключаясь между ними с помощью линии "выбор ведомого" - по одной на каждой устройство, а также ее продолжения http://robocraft.ru/blog/arduino/520.html , где в качестве примера ввода используется именно 74HC165, а также дэйташита на 74HC165, где указан пин CE (активный низкий), который я и посчитал пином "выбор ведомого", собрал схемку.
Точнее, сначала проверил все по отдельности - все работало. А вот когда кобрал все вместе - тут и полезли косяки. В общем, подключение 74HC165 блокирует работу других устройств.
Почитал внимательнее деэйташит на 74HC165, оказалось, CE - не переводит выходы в высокоимпедансное состояние, как это должно быть при работе по SPI, а лишь блокирует входные тактовые импульсы.
Отсюда вопрос: как заставить работать 74HC165 вместе с другими SPI устройствами?
Лично я пока предполагаю 3 варианта:
1. Я чего-то недоглядел или недопонял и проблемы не существует.
2. Перенести 74HC165 на отдельную софтверную SPI.
3. Подключить выход Q7 74HC165 к общему MISO через резистор. (я бы выбрал 1 кОм)
А какие пины Вы использовали в качестве SS для разных устройств и не забыли ли Вы их настроить на OUTPUT - все? Особенно 10-ый, потому что, если он окажется в INPUT и на нём вдруг окажется LOW, SPI тут же сломается - в Slave режим перейдёт.
Как пишут в интернетах, можно использоваь пункт 3:
If the 74HC165 chain must be used with other SPI devices with tristate output together,
then put a resistor (2k) in series to the 74HC165 output.
If no other SPI slave was selected, then the 74HC165 was read over this resistor.
If another SPI slave was selected, then it override the 74HC165 output.
А какие пины Вы использовали в качестве SS для разных устройств и не забыли ли Вы их настроить на OUTPUT - все? Особенно 10-ый, потому что, если он окажется в INPUT и на нём вдруг окажется LOW, SPI тут же сломается - в Slave режим перейдёт.
Если мне не изменяет память, на 2560 не 10, а 53. Он тоже зерезервирован под SPI, но пока устройство к нему не подключено, и сам он на выход не сконфигурирован. Надо будет переключить.
Как пишут в интернетах, можно использоваь пункт 3:
...then put a resistor (2k) in series to the 74HC165 output.
Собственно, я Тырнетов не читал, но сделал именно по пункту 3. С 1 кОмом работает на 4 МГц и, вроде, довольно устойчиво. Причем, можно с разными устройствами работать на разных частотах.
Вопрос в принципе интересный, скорей можна.
//Почитал внимательнее деэйташит на 74HC165, оказалось, CE - не переводит выходы в высокоимпедансное состояние, как это должно быть при работе по SPI, а лишь блокирует входные тактовые импульсы.
На сколько понимаю это не должно влиять...хмм
А как Вы собственно подключали устройства.?
Схему в студию.
Вопрос в принципе интересный, скорей можна.
//Почитал внимательнее деэйташит на 74HC165, оказалось, CE - не переводит выходы в высокоимпедансное состояние, как это должно быть при работе по SPI, а лишь блокирует входные тактовые импульсы.
На сколько понимаю это не должно влиять...хмм
А как Вы собственно подключали устройства.?
Схему в студию.
То есть как это "не должно влиять"?
Если к шине подключены два устройства, выходы которых оба находятся в активном состоянии, мне кажется очевидным, что они должны друг другу мешать передавать данные. А Вам нет?
Схему рисовать лень (пока. Позже, когда буду размещать материалы в разделе "Проекты", возможно, нарисую). ПОдключение такое, которое я считаю стандартным, т.е. мсе MOSI соединены вместе, все MISO - тоже вместе, CLK - аналогично, а "выбор устройства" у каждого свой. Собственно, это исходный вариант, который не работал.
В настоящее время между общей для всех устройств точкой MISO и выходом регистра Q7 последовательно включен резистор 1к0.
А кто запрещает самому организовать Z-состояние? У меня сейчас уже 2 года 165, 595, и Ethernet модуль (W5100 и SD-карта) работают на одной шине.
Схему рисовать лень
Зачем самому рисоват, уже все нарисовано до нас. Вы наверног хотите так
А можна ведь и так
И наверно можна комбинировать эти 2 схемы весьма причудливыми образами.
ТС интересовался возможностью одновременной работы 165 регистра с другими устройствами. Т.к. Z-состояния нет, то какое бы подключение Вы не выбрали - будет глючить (по шине MISO). Поэтому необходимо самостоятельно его реализовать. А приводимые схемы, хотя и верные, к вопросу никак не относятся.
А кто запрещает самому организовать Z-состояние? У меня сейчас уже 2 года 165, 595, и Ethernet модуль (W5100 и SD-карта) работают на одной шине.
Из Вашего ответа я, честно говоря, не понял, как именно Вы предлагаете это сделать.
Схему рисовать лень
Зачем самому рисоват, уже все нарисовано до нас. Вы наверног хотите так
А можна ведь и так
И наверно можна комбинировать эти 2 схемы весьма причудливыми образами.
Разные устройства у меня подключены, естественно, по верхней схеме, а каскад сдвиговых регистров, которые я рассматриваю как одно устройство, - по нижней (Почти. Каскадируются MISO, а MOSI вообще отсутствуют).
Так что по Вашей терминологии выходиит "причудливая комбинация".
А кто запрещает самому организовать Z-состояние? У меня сейчас уже 2 года 165, 595, и Ethernet модуль (W5100 и SD-карта) работают на одной шине.
Из Вашего ответа я, честно говоря, не понял, как именно Вы предлагаете это сделать.
Вот кусок схемы реально работающего устройства (более двух лет - управляет светом в моей квартире). За кадром еще Ethernet-шилд с SD-карточкой.
Для получения Z-состояния использовался буфер 74hc125. Резистор в 10k нужен для того чтобы, не было глюков, когда все устройства в Z.
Разные устройства у меня подключены, естественно, по верхней схеме, а каскад сдвиговых регистров, которые я рассматриваю как одно устройство, - по нижней (Почти. Каскадируются MISO, а MOSI вообще отсутствуют).
Так что по Вашей терминологии выходиит "причудливая комбинация".
Для случая с 74HC165 без Z-состояния наверно так. Берем за основу верхную схему, но MOSI к примеру устройства1 разрезаем. В разрыв включаем 74HC165 соеденив ее SS с аналогичным устройства1, выход МК на DS а выход D7 на вход MOSI устройства1, т.е. по нижней схеме. Несколько усложнится обмен конечно, но электрическая проблема решается. И надо бы убедится что устройство1 такой фокус поддержит, а если нет - берем устройство2 ;)
Вот кусок схемы реально работающего устройства (более двух лет - управляет светом в моей квартире). За кадром еще Ethernet-шилд с SD-карточкой.
Для получения Z-состояния использовался буфер 74hc125. Резистор в 10k нужен для того чтобы, не было глюков, когда все устройства в Z.
Спасибо.
Схему, правда, не разглядел, - видать, глазки уже не те. Но для понимания было достаточно "74hc125".
Возможно, если бы речь шла о нескольких устройсвтвах, да еще и с частотой обмена в десятки мегагерц, это было бы единственно возможным решением, но я предпочел обойтись единственным резистором. До 4 МГц это работает.
Для случая с 74HC165 без Z-состояния наверно так. Берем за основу верхную схему, но MOSI к примеру устройства1 разрезаем. В разрыв включаем 74HC165 соеденив ее SS с аналогичным устройства1, выход МК на DS а выход D7 на вход MOSI устройства1, т.е. по нижней схеме. Несколько усложнится обмен конечно, но электрическая проблема решается. И надо бы убедится что устройство1 такой фокус поддержит, а если нет - берем устройство2 ;)
Вообще-то с MOSI у меня проблем нет. Один выход (контроллера) без проблем подключается к нескольким входам (ведомых устройств). Проблема в том, что у 74HC165 MISO (т.е. D7) не переходит в z-состояние, а потому он мешает читать данные с других устройств.
Вероятно, Вы перепутали MOSI и MISO. В таком случае действительно заметно усложняется обмен, т.к. возникает дилемма:
- либо пожертвовать производительностью, гоняя почем зря байты через сдвиговый регистр,
- либо пожертвовать инкапсуляцией и разрабатывать протокол обмена не для каждого устройства отдельно, а одновременно для всех устройств, т.к. придется передвать управляющее слово одному устройству (скажем АЦП MC3008) одновременно с приемом данных от другого (например того же 74HC165).
Оба варианта я рассматриваю как неприемлемые.
Спасибо.
Схему, правда, не разглядел, - видать, глазки уже не те. Но для понимания было достаточно "74hc125".
На самом деле возможны еще проблемы. Если используете 595 регистр. В приведенной выше схеме у меня проблем не возникло, но в другой - да. Суть такая: когда я через 595 подключил LCD1602, и параллельно 595 подключил AT25160B, то на экране начали появлятся "левые" символы. Решил блокировкой тактирования 74HC595 через 74HC08, управляемой CS.
Для случая с 74HC165 без Z-состояния наверно так. Берем за основу верхную схему, но MOSI к примеру устройства1 разрезаем. В разрыв включаем 74HC165 соеденив ее SS с аналогичным устройства1, выход МК на DS а выход D7 на вход MOSI устройства1, т.е. по нижней схеме. Несколько усложнится обмен конечно, но электрическая проблема решается. И надо бы убедится что устройство1 такой фокус поддержит, а если нет - берем устройство2 ;)
Вообще-то с MOSI у меня проблем нет. Один выход (контроллера) без проблем подключается к нескольким входам (ведомых устройств). Проблема в том, что у 74HC165 MISO (т.е. D7) не переходит в z-состояние, а потому он мешает читать данные с других устройств.
Чтоб выбрать что из двух лучше, надо знать Вашу задачу. Я бы возможно выбрал и третье - забил на инкапсуляцию.
ПС. Участвовал в разработке больших, даже очень-очень больших, проектов, группами програмеров. Знаю абсолютного добра не существует, инкапсуляция не исключение, молится на неё как на священную корову нет смысла. Тем более в домашнем самописном проекте. Ну что стоит Вам в своем коде поменять private на public? Ничего не стоит. Захотите поменяете, и доберетесь до самой запрятаной и инкапсулированой сущности. Что стоит Вам не лезть к переменным к которым не следует лезть - аналогично, все в руках разраба. Если у него с головой плохо (без обид, это не к Вам) - инкапсуляция не поможет, если хорошо - ничего не даст. Конечно с ней лучше чем без ней (идентификаторы короче, меньше букфф))) , но если она становится целью - это не верно.
когда я через 595 подключил LCD1602, и параллельно 595 подключил AT25160B, то на экране начали появлятся "левые" символы.
Есть такое, 595 ловит помеху. И защелкивает в регистре. И держит пока следкющие данные не прийдут. А прога получается и не в курсе что на выходе 595 лажа. Я на 595 светодиоды подсветки повесил, с ШИМ-ом, так весь процесс наглядно наблюдал, когда в 3 часа ночи подсветка включается по полной на десятки мс ))) И так несколько раз за ночь, когда спиш - не реагируеш, а если засыпаеш - аж подпрыгиваеш. Лечится стандартно - резисторы, конденсаторы и понижение скорости из за подросшей паузы между установкой данных и стробом. К счастью пауза не существенно растет, с одного такта до нескольких.
не видно к чему резистор подключен к земле или +5?
не видно к чему резистор подключен к земле или +5?
Вы опоздали всего на два года.(((
Столкнулся с данной проблемой неожиданно. Была старая партия 74HC165 и они работали !!! корректно (2 шт + другие устройства SPI ).
С новой партией микросхем все встало колом. Посмотрел осцилографом , со старыми уровень 1 около 3,3V , с новыми меньше 2,2 V.
Решение с резисторами 1-2К не очень удачное, все равно не активные микросхемы просаждают сигнал сильно, есть сбои
Нашел лучшее решение. Каждый выход 74HC165 (9 нога) подключаю на шину SPI (MISO) через сигнальный диод , a ножку процессора MISO притягиваю к земле через 10К. Все начинает работать как надо.
Конечно лучше поставить буфер с 3м состоянием , но места на плате нет