Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Согласование уровней 3.3V -> 5V при работе с SPI
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
kernel
Доброго времени суток, уважаемые!

Уже вторую неделю борюсь с проблемой соединения 3.3Vop и 5Vop девайсов по SPI.
Есть ATMEGA16, которая работает на частоте 16 MHz и питается 5В. К ней я пытаюсь по SPI законнектить SD флэшку, которая работает на 3.3В, и сетевой контроллер (ENC28J60), который питается от 3.3В, но на выходе DATAoutput (SO) дает 2.6В (что является недостаточным для восприятия Мегой). Для согласования уровней использую 74HCT08N "Quad 2-input AND gate". Вроде бы все просто - нужно лишь заставить съесть 74HCT08N на двух входах элемента "И" логическую единицу (>2В должно хватать) и выплюнуть на выходе 5V уровень. Первое, что я сделал, это прицепил на входы одного из элементов 74HCT08N (A&B) выход SO сетевого контроллера, а выход элемента 74HCT08N (Y) вместе с DATAout SD флэшки - к MISO ATMEGA16:
Нажмите для просмотра прикрепленного файла
Но вот беда - не работает зараза sad.gif Первое, что приходит в голову - 5В с выхода 74HCT08N не нравятся пину DATAout флэшки SD (хотя, полагаю, внутри SD на DATAout должен быть диодик). Далее делаю по другому: на входы двух разных элементов 74HCT08N цепляю выходы SD и сетевого контроллера, а выходы элементов 74HCT08N соединяю вместе и веду к MISO Меги:
Нажмите для просмотра прикрепленного файла
Опять не работает.
Что я делаю не так?

Проблем с софтом нет, в местах, где нужно преобразовывать 5В->3.3В стоят делители - с этим тоже нет проблем. Вместо 74HCT08N пробовал напрямую цеплять SD & ENC к ATMEGA - работает, но сеть не стабильно (видно, все же маловато 2.6В). В разводке платы проблем вроде тоже не должно быть - частоты не высокие, петель дорожек нет, острых углов на поворотах дорожек нет, вокруг в пустых местах везде земля. Флэшка с делителями находятся на отдельной плате и соединены с родительской платой шлейфом ~10 см, на питании всех девайсов стоят C=0.1uF, около флэшки еще 47uF (хотя этот конденсатор поставлен не для флэшки, но на питание последней тоже попадает), на общем питании 5В 10uF + 0.1uF (временно, вместо 10uF на конечной плате планируется 100uF lowESR), на 3.3В пока только 0.1uF.

Заранее благодарю всех за помощь.
aaarrr
Цитата(kernel @ Feb 14 2010, 21:55) *
Что я делаю не так?

Соединяете выходы вместе. Естественно, что так ничего работать не будет.
rezident
Поставьте от выходов 5В-ой меги логику из серии 74LVC, запитав ее от 3,3В или тем же напряжением, что питается ваша SD card. Например, широко распространенные 74LVC125. У этой серии входы толерантны к входным 5В-ым сигналам.
А для управления входами 5В-ой меги поставьте что-то из серии 74HCT или 74AHCT, запитав ее как и положено от 5В.
Если как-то "жмут" размеры корпусов, то используйте одногейтовую логику. Типа 74LVC1G125 и 74HCT1G08.
sensor_ua
То, что выходы HCT08 так собирать нельзя, уже сказали. Можно пробовать подать на разные входы "И" подать сигналы от разных девайсов.
Ещё стОит обратить внимание на подтяжку входов HCT08 (или что другое будет), потому как обычно SO имеют 3-е состояние пока нет CS.
_3m
Цитата(kernel @ Feb 14 2010, 21:55) *
Уже вторую неделю борюсь с проблемой соединения 3.3Vop и 5Vop девайсов по SPI.
...
Но вот беда - не работает зараза sad.gif
...
Что я делаю не так?

Вы ВСЕ делаете не так.
У 74XXX08 выходы не имеют Z состояния а вы подключаете параллельно этому выходу что-то еще. Если хотите соединять выходы - используйте HCT125 и подключайте входы enabe на cs ваших чипов.
Или пустите SO ENC28J60 на вход 1A HCT08 а выход SO SD карты - на вход 1B. Выход HCT08 пускаете на вход MISO атмеги, больше к этой цепи ничего не подключать!
Входы 1A и 1B HCT08 в такой схеме нужно подтянуть к +3,3V.

вариант с HCT125 предпочтительнее, так как возможно у вас с SD карты снимается питание и без питания на карте линия MISO занулится.
serge71
А что мешает использовать резисторный делитель?
_3m
Цитата(serge71 @ Feb 15 2010, 10:37) *
А что мешает использовать резисторный делитель?

у афтора проблемы с передачей сигнала "вверх" - SO с уровнем "1" 2,6V ему надо подключить ко входу MISO 5-вольтовой атмеги.
kernel
ОГРОМНОЕ всем спасибо за помощь!

Теперь просьба пояснить, почему сработал этот вариант с HCT08:
Цитата(_3m @ Feb 15 2010, 14:28) *
Вы ВСЕ делаете не так.
У 74XXX08 выходы не имеют Z состояния а вы подключаете параллельно этому выходу что-то еще. Если хотите соединять выходы - используйте HCT125 и подключайте входы enabe на cs ваших чипов.
Или пустите SO ENC28J60 на вход 1A HCT08 а выход SO SD карты - на вход 1B. Выход HCT08 пускаете на вход MISO атмеги, больше к этой цепи ничего не подключать!
Входы 1A и 1B HCT08 в такой схеме нужно подтянуть к +3,3V.

вариант с HCT125 предпочтительнее, так как возможно у вас с SD карты снимается питание и без питания на карте линия MISO занулится.

Ведь судя по даташиту HCT08 выплевывает "1" на Y только тогда, когда и на A, и на B есть "1". Т.е. получается сигнал должен идти и от флэшки, и от ENC28J60, чтобы MISO получал в нужный момент "1"? Где ошибка в моем понимании?

Кстати, а есть ли смысл ставить дополнительно между MISO Меги и другими девайсами резистор? Если да, то посоветуйте, пожалуйста, примерный номинал rolleyes.gif
_3m
Цитата(kernel @ Feb 15 2010, 17:36) *
...
Ведь судя по даташиту HCT08 выплевывает "1" на Y только тогда, когда и на A, и на B есть "1". Т.е. получается сигнал должен идти и от флэшки, и от ENC28J60, чтобы MISO получал в нужный момент "1"? Где ошибка в моем понимании?

Ваша ошибка в том что вы учитываете только "1" которая вас интересует а HC08 вам выдает еще и "0" про который вы забыли. Посмотрите таблицу истинности:
Код
FUNCTION TABLE
INPUT  OUTPUT
nA nB  nY
L  L   L
L  H   L
H  L   L
H  H   H

Логический ноль это не значит "отсутствие 1", это значит что выход замкнут на общий.

Цитата
Кстати, а есть ли смысл ставить дополнительно между MISO Меги и другими девайсами резистор? Если да, то посоветуйте, пожалуйста, примерный номинал rolleyes.gif

На скоростях атмеги резистор можно не ставить. А можно и поставить 10-20 Ом чисто ради эстетики. Толку от его наличия или отсутствия никакого.
kernel
Мммм.. не совсем понял я. Вот есть, например, на входе А одно устройство, на входе В - другое. Устройство на входе А, например, что-то передает, на В - не передает. Т.е., как я понимаю (но, видимо, не правильно), А=1(в какие-то моменты), а В=0(всегда, пока устройство молчит), т.е. A=L|H, B=L, Y=L? blink.gif
_3m
Цитата(kernel @ Feb 15 2010, 18:34) *
...Вот есть, например, на входе А одно устройство, на входе В - другое. Устройство на входе А, например, что-то передает, на В - не передает. Т.е., как я понимаю (но, видимо, не правильно), А=1(в какие-то моменты), а В=0(всегда, пока устройство молчит), т.е. A=L|H, B=L, Y=L? blink.gif

Да, вы правильно написали. Если на одном из входов L то на выходе тоже L.
Поэтому для того чтобы схема работала обязательно нужна подтяжка обоих линий SO на VDD. Когда устройство не выбрано у него CS=1 и линия SO в Z состоянии, за счет подтяжки на ней получится H уровень который позволит работать другому устройству.
kernel
Спасибо! Теперь все понял.
serge71
Если низковольтное устройство толерантно к 5 вольтовому уровню, то делитель на вход SO не нужен, и достаточно подтяжки меги, соответственно управляя CS низковольных устройств, а выбор им необходим, переводим неактивное устройство в z-состояние. Кстати поиск avr + sd или avr + siemens дает много ответов
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.