Проблема совместного использования MISO с несколькими RFID-считывателями RC522
Примерно в течение последних 8,5 часов (почти без остановок) я пытался разобраться в одной проблеме и исчерпал все возможные варианты поиска, которые только мог придумать.
Я создаю головоломку, для которой требуется 5 RFID-считывателей на 1 Arduino, но для тестирования я использовал только 2.
Оба считывателя работают независимо, я могу считывать идентификаторы маленьких карточек, и это все, что мне нужно сделать, но как только я заставляю их использовать общую линию МИСО, она просто перестает что-либо печатать. Я понятия не имею, почему.
Оба считывателя имеют общий внешний источник питания 3,3 В и заземление, они имеют общие все остальные линии, но имеют индивидуальный выбор ведомого устройства. Для тестирования я вставил оба их МИСО-кабеля в макет, который затем подключается к Arduino на ВЫВОДЕ 12, но он будет печатать UID только тогда, когда к макету подключен только ОДИН кабель.
Итак, есть ли что-то особенное, что мне нужно сделать, чтобы это сработало? Есть ли причина, по которой читатели, разделяющие линию МИСО, нарушили бы ее? Даже если я не инициализирую один из них, просто потому, что он подключен, он все равно нарушается. Я пробовал устанавливать один на ВЫСОКИЙ, а другой на НИЗКИЙ, оба на НИЗКИЙ, оба на ВЫСОКИЙ, ничего не меняет.
Кроме того, что-то еще меня смущает, он должен быть активным на НИЗКОМ уровне, чтобы активировать SS, но когда к линии MISO подключен только 1, кажется, не имеет значения, в каком состоянии он находится, он всегда печатает...
Минуту назад я провел небольшое тестирование своего скетча и понял, что когда оба они подключены к MISO, скетч не будет продвигаться дальше этой строки (которая также является первой строкой в цикле).
if ( ! mfrc522_2.PICC_IsNewCardPresent())
return;
Я знаю, что все остальное работает, потому что оно работает, когда к линии МИСО больше ничего не подключено, но мне нужно, чтобы оно работало, когда все остальные тоже подключены.
Пожалуйста, пожалуйста, пожалуйста, если у вас есть какие-либо идеи, дайте мне знать.
Я использую библиотеку MFRC522
РЕДАКТИРОВАТЬ:
Это в основном та настройка, которую я использую:
Я не использую никаких преобразователей или переключателей напряжения, все 5 В от arduino, за исключением питания считывателей, которое поступает от внешнего источника питания 3,3 В, как упоминалось ранее.
Я почти уверен, что это спецификация для RC522, которую я использую, хотя я не уверен, является ли это V1 или V2, но, учитывая различия между ними, я не думаю, что это имеет значение:
http://www.nxp.com/documents/data_sheet/MFRC522.pdf
Я не знаю, могут ли они делиться линиями МИСО, как сказал кто-то ниже, я просто предположил, что смогу?
@Jesse Mount, 👍6
Обсуждение3 ответа
Глядя на техническое описание MFR522, неясно, поддерживает ли он даже multidrop SPI. В нем ничего не упоминается о состоянии выходных контактов SPI, когда чип не выбран. В нем также упоминается, что чип использует линию выбора ведомого устройства, чтобы определить, какой режим связи использовать при запуске, но ничего не говорится о том, как чип будет реагировать на изменения в этом выводе после запуска.
Учитывая это, наряду с тем фактом, что ваша библиотека, похоже, также не поддерживает подключения к нескольким MFR522, я предполагаю, что этот чип поддерживает только SPI-соединение 1 к 1.
Кроме того, временные характеристики SPI в техническом описании указывают, как долго SS (называемый NSS) должен быть высоким, прежде чем может начаться обмен данными, но не указывают, через какое время после того, как SS становится низким, MISO переходит в трехфазное состояние, что было бы важно знать, если чип поддерживает SPI multidrop.
Все это подкрепляется поведением, которое вы наблюдаете. Если оба чипа управляют линией MISO одновременно, то связь будет невозможна, когда оба подключены.
Чтобы поддерживать несколько подключений MFR522, вы могли бы ...
Используйте буфер мультиплексирования, чтобы одновременно подключать линии SPI только к одному чипу. Недостатком является то, что вам потребуется дополнительное оборудование, но плюсом является то, что вы, вероятно, могли бы использовать существующую библиотеку без изменений, выбрав нужный MFR522 перед выполнением линейных вызовов.
Подключите каждый MFR522 к разным выводам GPIO на Arduino и подключите SPI к каждому чипу независимо. Положительным моментом является то, что вам не нужно никакого дополнительного оборудования, и у вас потенциально есть большая гибкость в отношении доступа к MFR522. Недостатком является то, что вам придется модифицировать этот бит-битный SPI в библиотеку или использовать (или написать) другую библиотеку.
Я видел, как этот вопрос возникал много раз на протяжении многих лет, поэтому, если вы выберете вариант № 2, пожалуйста, опубликуйте свой код, чтобы другие могли его использовать!
Эксперимент
Я бы предложил вам сделать это, чтобы выяснить, совместимы ли ваши чипы с multi-drop SPI ...
- Включите питание вашей системы с помощью считывателя RC522.
- Проверьте и убедитесь, что это работает.
- Отсоедините линии SS и MISO от RC522, чтобы они больше не были подключены к Arduino (или чему-либо еще). Оставьте RC522 включенным - при сбросе он может потерять автоматически определяемую конфигурацию SPI.
- Используйте перемычку для соединения линии SS с землей.
- Подключите линию MISO к заземлению с помощью резистора 1 Ком.
- Используйте мультиметр, чтобы проверить напряжение на линии МИСО.
- Подключите линию MISO к Vcc с помощью резистора 1 Ком.
- Используйте мультиметр, чтобы проверить напряжение на линии МИСО.
- Подключите линию SS к Vcc.
- Повторите шаги 3-6.
Приведите таблицу из 4 показаний напряжения, которые вы получили, и мы должны получить наш ответ!
Хотя спецификация могла бы быть более четкой, крайне маловероятно, что микросхема, которая утверждает, что является периферийным устройством SPI, не сможет в конечном итоге выполнить тристацию линии MISO, если она не выбрана. Во всяком случае, это должно быть легко проверено., @Chris Stratton
Я был бы склонен согласиться, но быстрый поиск в Google показывает, что многие люди сталкиваются с точно такой же проблемой - подключение 2-го MFRC522 к линии MISO не позволяет работать 1-му. Также обратите внимание, что в других таблицах данных NXP конкретно упоминается tristate, когда они доступны (т.Е. В PCF85063BTL указано, что линия вывода данных SPI "является высокоимпедансной, когда она не работает". Не имея под рукой пары чипов для тестирования, невозможно быть уверенным, но, основываясь на всех доказательствах, я думаю, что, скорее всего, этот чип не поддерживает multidrop SPI., @bigjosh
Если у кого-нибудь есть 2 из них в районе Нью-Йорка, LMK и мы можем изучить их и получить окончательный авторитетный ответ!, @bigjosh
Вам не нужны два из них, чтобы проверить это поведение - вы можете проверить это с помощью одного и одного резистора., @Chris Stratton
"наряду с тем фактом, что ваша библиотека также, похоже, не поддерживает подключения к нескольким MFR522" - это не похоже на правду. Он содержит пример кода для использования нескольких считывателей: https://github.com/miguelbalboa/rfid/blob/master/examples/ReadUidMultiReader/ReadUidMultiReader.ino, @Jules
Я присоединяюсь к этому разговору ОЧЕНЬ поздно, однако, возможно, мой ответ может помочь кому-то, кто только сейчас занимается этим вопросом.
Мне удалось заставить СЕМЬ считывателей RC522 работать на одном Arduino! Мое решение было очень похоже на вашу идею, за исключением того, что вместо контакта SS я использовал контакт MISO.
Если вы посмотрите, как работают контакты, все они являются выходами, идущими от ведущего устройства (Arduino) к подчиненным устройствам (RC522), ЗА исключением вывода MISO, который является входом, идущим от подчиненных устройств к ведущему устройству.
Поэтому я дал каждому сканеру RC522 его собственный вывод MISO на Arduino, а остальные выводы были общими для всех сканеров.
Чтобы заставить его работать с кодом, самым простым решением, которое я нашел, было инициализировать новый RFID-код, используя соответствующий MISO-контакт каждый раз, когда я хотел считывать данные с одного из RC522.
Это сработало для Arduino, потому что вы можете установить несколько цифровых контактов как MISO, однако я еще не понял, как заставить это работать на Raspberry Pi (без использования мультиплексора), потому что у Pi есть несколько определенных контактов, которые используются для MISO.
Я пользовался старой библиотекой Sunfounder. В нижней части этой страницы (http://wiki.sunfounder.cc/index.php?title=Mifare_RC522_Module_RFID_Reader), если вы загрузите zip-файл "RFID-RC522_test_experiment", в него будет включена библиотека. Просто скопируйте и вставьте папку RFID1 в папку библиотеки Arduino. Вот простой учебник для этой библиотеки: https://www.sunfounder.com/learn/RFID_kit_V1_for_Arduino/lesson-29-rfid-entrance-guard-system-rfid-kit-v1-0-for-arduino.html
Вот несколько примеров кода. Это довольно некрасиво, но это сработало.
void checkRFID(int i){
if(i==0){
rfid.begin(2,4,5,7,3,6);
}
if(i==1){
rfid.begin(2,4,5,8,3,6);
}
if(i==2){
rfid.begin(2,4,5,9,3,6);
}
if(i==3){
rfid.begin(2,4,5,10,3,6);
}
if(i==4){
rfid.begin(2,4,5,11,3,6);
}
if(i==5){
rfid.begin(2,4,5,12,3,6);
}
if(i==6){
rfid.begin(2,4,5,13,3,6);
}
delay(100);
rfid.init();
uchar status;
uchar str[MAX_LEN];
// Поисковая карта, типы возвращаемых карт
status = rfid.request(PICC_REQIDL, str);
if (status != MI_OK)
{
return;
}
// Показать тип карты
rfid.showCardType(str);
//Предотвратите конфликт, верните 4 байта серийного номера карты
status = rfid.anticoll(str);
if (status == MI_OK)
{
memcpy(serNum, str, 5);
rfid.showCardID(serNum);//показать идентификатор карты
Serial.println();
Serial.println();
}
delay(100);
rfid.halt(); // переводит карту в спящий режим
}
вы использовали Arduino Uno или один из других Arduino?, @sa_leinad
Как вы назначаете цифровые контакты как MISO? Какую библиотеку вы использовали для своего SPI?, @sa_leinad
@sa_leinad Я использовал обычный Arduino Uno, @Michael
@sa_leinad и я использовали библиотеку sunfounder. Вот их учебное пособие: https://www.sunfounder.com/learn/RFID_kit_V1_for_Arduino/lesson-29-rfid-entrance-guard-system-rfid-kit-v1-0-for-arduino.html
С помощью их библиотеки вы инициализируете RFID, предоставляя все пин-коды, которые должны использоваться для каждого пин-кода RC522, например: "rfid.begin (irq, sck, mosi, miso, nss, rst);" так что это было так же просто, как изменить пин-код miso, который я предоставил.
Так, например, я бы сделал rfid.begin (2,4,5,7,3,6);
для проверки одного считывателя, затем сделал rfid.begin (2,4,5,8,3,6);
для проверки следующего считывателя и так далее., @Michael
Майкл, ты потрясающий!!! У меня были проблемы с подключением 5 rfid-модулей в течение недели, и ничего не помогало. Вы исправили мою проблему, спасибо. Это работает отлично :), @Taras Sadovyy
@Michael вы подключили только SCK, MOSI, SS, MISO? вы оставили не подключенными IRQ и RST? Пин-код SS - это ПДД, верно?, @Gaucho
Эй, чувак, ты сэкономил мне время. Спасибо. Мне просто интересно, почему этой библиотеки нет в библиотеках или других местах?, @Ashot Khanamiryan
На самом деле, "трюк" на самом деле произошел не от библиотеки RFID от Sunfounder, а от используемой ими "вспомогательной библиотеки", которая находится в той же папке и которая есть.... СофтСПИ! Эта библиотека, по-видимому, немного похожа на программный serial, поскольку она позволяет вам объявлять нужные контакты для SPI. Очень интересно!!!!, @Peter
Я не знаю, имеет ли каждый модуль сопротивление подтягиванию в sck и mosi, если это так, возможно, что для каждого модуля, подключенного по этим линиям, сопротивление становится ниже. так что, возможно, модуль не может сбросить напряжение, поэтому нет связи. проверьте с помощью мультиметра сопротивление между Vcc и MOSI, обычно оно должно составлять около 4,7 К. надеюсь, это могло бы помочь.
- Arduino UNO + Ethernet Shield + ЖК-дисплей + RFID, но RFID не работает
- Как подключить устройство SPI к плате Etherntet на Arduino Uno
- SPI между ведущим arduino и ведомым arduino
- Как использовать SPI на Arduino?
- OVF в последовательном мониторе вместо данных
- Использование прерываний с RC522
- Как отправить строку с подчиненного устройства Arduino с помощью SPI?
- rfid_default_keys проверить с помощью RC522
Вы используете плату arduino 5 В без преобразователей напряжения, верно? Если это так, то у вас отсутствуют спецификации для этих модулей, так что это может привести к их неисправности, @frarugi87
@frarugi87, то, что читатели работают индивидуально, говорит о том, что проблема не в этом. Кроме того, MISO является входом для Arduino, а выходы 3V3-system на входы 5V-system, как говорят, работают нормально., @James Waldby - jwpat7
Джесси Маунт, пожалуйста, отредактируйте вопрос и укажите используемые напряжения; используются ли преобразователи / переключатели напряжения; и номера моделей считывателей. В то время как подчиненные устройства SPI обычно используют выходы с открытым сливом, чтобы MISO можно было подключить вместе, некоторые этого не делают. Без номера модели, кто может сказать?, @James Waldby - jwpat7
@jwpat7 Конечно, вы имеете в виду выходы с тремя состояниями, а не выходы с открытым сливом..., @Majenko
@Majenko, спасибо, это то, что я должен был иметь в виду, говоря о SPI. Я по ошибке подумал о IIC., @James Waldby - jwpat7
@jwpat7 Кстати, я не могу найти упоминания о трех состояниях в MISO в техническом описании MFRC522. Это не значит, что его нет, но и не значит, что он есть..., @Majenko
Джесси Маунт, возможно, посмотрите сообщение от 06 мая 2014 года в 11:34 вечера на [raspberrypi.org/forums ](https://www.raspberrypi.org/forums/viewtopic.php?f=91&t=70756 ) и укажите здесь, соответствует ли ваш RFC22 одному из 2, показанных там (3-я ссылка неверна). В этом посте также рассказывается, как проверить, является ли протокол SPI и т.д. Обратите внимание, что этот поток подразумевает, что ваша схема подключения должна быть в порядке, но если вы в отчаянии, вы можете использовать мультиплексор, например, 74LS153 позволит вам выбрать 1 строку из 4, @James Waldby - jwpat7
Тот, что у меня, похож на красный, но он синий. ["Изображение здесь".](http://img.td-imgs.com/images/24/83/262483_130300060699139324.jpg ) Я уверен, что он использует SPI, так как у меня нет проблем с общением с последовательным номером RC522. Единственная проблема, с которой я сталкиваюсь, - это использование более 1. Если к линии MISO подключен другой RC522, это вызывает ошибку связи и предотвращает распечатку любых данных на последовательном устройстве с любого устройства, независимо от того, инициировано 2-е устройство или нет, или в каком логическом состоянии установлены контакты SS., @Jesse Mount
@jwpat7 на самом деле проблема не на стороне arduino, а на стороне устройства. Вы отправляете 5 В на контакты, которые могут поддерживать только 3,8 В, если я правильно помню (Vcc + 0,5). Итак, вы работаете на основе спецификаций. Если они работают даже в этих условиях, все в порядке, но вы можете ожидать странного поведения от этой настройки. ИМХО, первое, что нужно сделать, это снизить напряжение на входах 5 В до 3,3. Может работать даже пассивный делитель напряжения. Затем, когда вы будете уверены, что работаете в соответствии со спецификациями, вы можете изменить что-то еще, @frarugi87
Где вы смогли что-нибудь выяснить? У меня похожая проблема. http://arduinoprosto.ru/q/29494/connecting-saleae-logic-8-to-miso-pin-12-on-uno-3-w-nrf24l01-halts-program ; Похоже, это может быть проблема того же типа., @Brennan Cheung
У меня нет репутации, чтобы комментировать, но я хочу поблагодарить Майкла. Его решение идеально, я застрял на несколько дней. Итак, Мульти RFID с программным обеспечением SPI работает как шарм!, @Marko Grujic