Nano + EthernetShield ENC28J60

select2
Offline
Зарегистрирован: 31.10.2012

Коллеги, здравствуйте!

Прошу помощи. Уже мозг сломал.

Есть схема расширения входов на 74LS165. Стандартная. Работает по SPI. Хорошо работает, вопросов нет.

Но тут поставил вот такой сервер на ENC28J60: http://www.ebay.com/itm/ENC28J60-Webserver-module-Ethernet-Shield-for-Ar....

Сервер сам по себе тоже работает нормально. Но если установить сервер совместно с 74LS165, то входы работать перестали! Убил ДВА дня и только осциллографом увидел, что при подключенном Ethernet-шилде MISO сильно искажается - на осцилле он виден как постоянка приверно 2,5В!

Естественно, данные искажаются. Стоит убрать шилд, как вход начинает работать нормально. Шилд без платы 74LS165 так же работает нормально.

По схеме Ethernet-шилда MISO сразу с ENC28J60 идет на AVR. Мой модуль так же: выход 74LS165 идет напрямую на  MISO (D12). Я так понимаю, что происходит аппаратный конфликт - 74LS165 и ENC28J60 просто давят друг друга.

Подскажите как быть? Подтянуть на Vcc? Реально отупел уже..

select2
Offline
Зарегистрирован: 31.10.2012

Еще добавлю: при этом Eth-shield и 74LS595 вместе работаю нормально: там один выход MISO контроллера одновременно подключается к двум входам: MISO Eth-shield и MISO 74LS595.

Чувствую, что решение тривиальное, просто отупел уже.

Ткните, пожалуйста, носом уже.

leshak
Offline
Зарегистрирован: 29.09.2011

>Ткните, пожалуйста, носом уже.

zanuda.mode(ON);

Да запросто: схему подключения нужно телепатически отгадывать? Со скетчем - тоже самое. Все сами обо всем догадаются.

zanuda.mode(OFF);

Можно конечно строить догадки по поводу SS пина, но это будут догадки.

Почитайте вот ветку Ethernet shield c sd картой. Не пишет на карту. | Аппаратная платформа Arduino

Там речь про Wiznet и SD карту, но суть может быть таже самая - два устройства на одном SPI.

Решение - либо разносить SS пины и включать устройсва по очереди, либо одно из них уносить с аппаратного SPI и использовать програмный.

В вашем случае - думаю проще это со сдвиговым делать. Так как ему не нужен "полноценный SPI" и относительно не сложно программно они рулятся. А возможно это будет даже не "проще", а единствено возможно. Не уверен что сдвиговый нормально поймет SS пин (лень счас вникать).

 

 

 

select2
Offline
Зарегистрирован: 31.10.2012

Схемы прилагаю.

Блин! Опять при вставке картинки сбросил форму с текстом!

Писать красиво опять не стану.

Кратко: проблема локализована - конфликт двух выходов на входе MISO МК.

Решение через ShiftOut работает. Проверено уже, но дико медленно. Нужно получать 48-64 бита. Так вот во столько раз и медленнее. Даже больше. Это критично для задачи.

Рассматриваю решение железное: мультиплексирование MISO. Вопрос: нужно ли так же мультиплексировать аппатарный SS (D10)? Учавствует ли он при работе SPI.transfer()?

select2
Offline
Зарегистрирован: 31.10.2012

Скетч:

//Эта процедура считывает 16-битовое значении из модуля ввода
uint16_t ReadInputState() {
  uint16_t value = 0;
  digitalWrite(SS_IN, LOW);                            // Загрузим данные с паралельных входов в регистр
  digitalWrite(SS_IN, HIGH);                           // Для этого сформируем отрицательный импульс на 1 ноге ИР9
  value = (SPI.transfer(0) << 8) + SPI.transfer(0);    // Считаем по SPI значение первых 8 бит и вторые 8 бит и занесем все в 16-битную value
  return value;                                        // Вернем полученное значение
}

Этот фрагмент возвращает мусор при подключении модуля Ethernet-shield. Без этого модуля - работает как нужно.
 

 

toc
Offline
Зарегистрирован: 09.02.2013

вы тут используете spi. А перед этим нужно подать HIGH  на ss ( slave select ) ethernet модуля, чтобы он отключился от шины. В его библиотеке должен быть метод, который это делает. Может disable какой-нибудь.