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 даже не посмотрел на маркировку! Прошу прощения, что занял у вас время!
А на счет управления состоянием ног, дык я в первом посте это описывал. Именно так и делал, менял режим вход\выход в зависимости от операции. Теперь понятно, почему не работало :) Сейчас работает :) Еще раз всей аудитории мои извинения
 
Сверху Снизу