• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

3 провода SPI

evgeny2k

New member
День добрый всем! Пытаюсь стыковать NodeMCU (прошивка MicroPython v1.8.2-84) и оптический сенсор ADNS-5020-en. Эта связка упорно не хочет работать. Пробовал назначать один пин для miso и mosi (spi = SPI( baudrate=115200, polarity=1, phase=1, sck=Pin(4), mosi=Pin(5), miso=Pin(5)). При чтении регистра всегда получаю в ответе b'\xff' . При переключении режима пина в зависимости от типа операции (Pin(5, Pin.IN) на чтение и Pin(5, Pin.OUT) на запись), картина не меняется.
Второй вариант подключения - используются разные пины для mosi и miso, но они соединены перемычкой. В результате получаю в ответ на запрос адрес запрашиваемого регистра. Все операции разделены переключением NCS согласно даташиту. Перепробовал наверное уже всё, что возможно. По сему прошу помощи у знающих людей. Как завести 3-проводный SPI?
 

evgeny2k

New member
Т.е. GPIO12 и GPIO13 были замкнуты между собой? И если CS не использовал, то как выбирал чип? В моем случае CS используется и для разграничения операций (прописано в даташите ADNS-5020-en). Он же функционально и как RESET. И опять же, если без CS, а пины MISO и MOSI замкнуты, то имеем уже не 3-х, а 2-х проводное соединение :)
Сегодня пытался подключить акселерометр по 3-х проводной схеме. Те же грабли один в один.
 

evgeny2k

New member
Вот именно так и получается. MOSI и MISO сидят на одной линии. Поэтому и имеем 3 линии:
1- MOSI+MISO
2- CS
3- SCLK
Вот ссылочка на статью. Тут описано подключение моего сенсора к ардуино. Обратите внимание на табличку Connections и надпись под ней:"On the Arduino, MISO and MOSI are tied together".
Теперь касательно CS. Ниже цитаты из даташита:
Chip Select Operation
The serial port is activated after NCS goes low. If NCS
is raised during a transaction, the entire transaction
is aborted and the serial port will be reset. This is true
for all transactions. After a transaction is aborted, the
normal address-to-data or transaction-to-transaction
delay is still required before beginning the next trans-
action. To improve communication reliability, all serial
transactions should be framed by NCS
...
В коде ардуино так и сделано. Каждая операция начинается с переключения состояния CS и заканчивается им же.
 

evgeny2k

New member
Ну что же Вы мне пытаетесь рассказать как SPI работает по 4 проводам? Мой вопрос касается 3-х проводного варианта, когда MOSI и MISO сидят на одной линии. И задан вопрос тем людям, кто конкретно имеет опыт работы с таким подключением на ESP8266 с micropython на борту. Похоже придётся ковырять исходники микропитона и смотреть, как там реализована работа SPI. В коде для ардуино (ссылка в моём посте выше) есть вот такой интересный момент: pinMode(MOSI, INPUT) и pinMode(MOSI, OUTPUT):
Код:
unsigned int ADNS_read(unsigned int address){
  unsigned int data;
  digitalWrite(nCS,LOW);
  SPI.transfer(address);
  pinMode(MOSI, INPUT);
  data = SPI.transfer(0x00);
  pinMode(MOSI, OUTPUT);
  digitalWrite(nCS,HIGH);
  return(data);
}
То же самое я сделал и на питоне. В моём первом посте это описано. Но не работает! Вот я и пытаюсь выяснить, кто же виноват, кривая программная реализация модуля работы с SPI в Python или что-то еще не так (у меня руки кривые?). Ежели есть люди, которые смогли что-то запустить на Python с 3-х проводным вариантом подключения SPI, значит с модулем SPI в micropython всё хорошо и вероятно это я что-то где-то не так делаю. И значит люди поправят меня. Другой вариант, если скажут, что тоже мучались, но не взлетело. Значит прямая дорожка в питонячьи исходники. Вот и всё, что мне нужно.
 

evgeny2k

New member
Можете привести ссылку на документацию где закорочены эти два вывода.
Ой, посмотрел пост, в котором должна была быть ссылка... Нету. Наверное забыл вставить. Даю здесь:
WildCircuits: Optical Mouse Hacking
Описано подключение оптического сенсора ADNS-5020-en к ардуино. Ну и даташит на ADNS-5020-en тоже никто не отменял:
ADNS-5020-EN datasheet(11/24 Pages) AVAGO | Optical Mouse Sensor
 

evgeny2k

New member
Может Вы таки глянете в даташит на сенсор и перевернете несколько страниц, прежде чем что-то писать? Для начала гляньте вот на эту схемку из даташита, где показано рекомендованное подключение чипа к контроллеру.
ADNS-5020-EN datasheet(7/24 Pages) AVAGO | Optical Mouse Sensor
Потом, с пониманием схематики, открываем первую страницу даташита:
ADNS-5020-EN datasheet(1/24 Pages) AVAGO | Optical Mouse Sensor
... и читаем вот такой текст:
The sensor is programmed via registers through a three-
wire SPI interface. It is housed in an 8-pin staggered dual
in-line package (DIP)

Можно посмотреть и другие странички. Тогда возникнет полное понимание того, что надпись SDIO на выводе чипа - это не название интерфейса, а всего лишь придуманное производителем обозначение ноги со смысловым содержанием MISO+MOSI в одном флаконе.
 

evgeny2k

New member
Вот согласно статье и делал. Только вместо Arduino - ESP, и язык Micropython. Просто портировал код Arduino на Python. И не работает. Потому и пишу в форум. Не ради спора об интерфейсах. Я проверил стандартный вариант подключения SPI 4 линии на имеющемся 10DOF и всё взлетело. Этот 10DOF также может по 3-х проводному варианту работать. Попробовал - не взлетело. Проблема точно такая же, как и с оптическим сенсором. Склонен думать, что таки в питонячей реализации SPI какой-то затык, но хотелось бы уточнить. Может кто-то таки заводил 3-х проводной вариант на micropython? Может какая-то хитрость есть?
 

Юрий Ботов

Moderator
Команда форума
Затык скорее всего в том, что вы соединяете 2 ноги, и нога выхода шунтирует ногу входа. По идее, ее, когда она не используется, надо переводить в высокоимпедансное состояние. Как бы делал я... Мышиный датчик живет в двух режимах: инициализации - когда в его регистры записываются снаружи параметры и рабочем, когда датчик гонит наружу информацию о движении. Оба этих режима - однонаправленые. Поэтому ногу контроллера X соединяем с CDIO датчика, а ногу контроллера Y через балластные 10K сажаем на землю.
В начале инициализации назначаем MOSI контроллера на ногу X, а MISO на ногу Y. Вбрасываем в датчик пачку параметров.
В конце инициализации назначаем MISO контроллера на ногу X, а MOSI на ногу Y. Потом тупо ловим то что прилетает из датчика по SPI.
Как то так.
 

nikolz

Well-known member
Затык скорее всего в том, что вы соединяете 2 ноги, и нога выхода шунтирует ногу входа. По идее, ее, когда она не используется, надо переводить в высокоимпедансное состояние. Как бы делал я... Мышиный датчик живет в двух режимах: инициализации - когда в его регистры записываются снаружи параметры и рабочем, когда датчик гонит наружу информацию о движении. Оба этих режима - однонаправленые. Поэтому ногу контроллера X соединяем с CDIO датчика, а ногу контроллера Y через балластные 10K сажаем на землю.
В начале инициализации назначаем MOSI контроллера на ногу X, а MISO на ногу Y. Вбрасываем в датчик пачку параметров.
В конце инициализации назначаем MISO контроллера на ногу X, а MOSI на ногу Y. Потом тупо ловим то что прилетает из датчика по SPI.
Как то так.
Можно иначе.
Надо ногу на вывод переводить в третье состояние перед режимом ввод. Это можно сделать сменив режим работы у этого пина на пин ввода.
Но об это я писал с самого начала, что надо переписать драйвер либо добавить соответствующий код перед сменой режима.
Вообще-то не очень понятно зачем получать геморой с микро питоном, если можно тоже самое получить с луа либо с СИ. На си вообще задача решается без проблем.
 

evgeny2k

New member
Вопрос снят. Сам виноват, не досмотрел. Из 3 купленных чипов ADNS-5020-en один оказался s2707. Этот гад визуально как две капли воды похож на 5020, но имеет USB интерфейс :) А я, зная, что покупал 5020 даже не посмотрел на маркировку! Прошу прощения, что занял у вас время!
А на счет управления состоянием ног, дык я в первом посте это описывал. Именно так и делал, менял режим вход\выход в зависимости от операции. Теперь понятно, почему не работало :) Сейчас работает :) Еще раз всей аудитории мои извинения
 
Сверху Снизу