Превосходный ответ от Михаила. Но я вижу проблему. Когда микроконтроллер на метке выполняет I2C-чтение энергонезависимой памяти в устройстве NFC, может показаться, что он рискует помешать пингу, выполняемому телефоном.
Я использую телефон Motorola G6 Play с чем-то очень похожим на тег M24LR-DISCOVERY, который имеет M24LR04E-R. [Я воспроизвел результаты для ST25DV.] Метка питается от настольного источника, а НЕ от сбора энергии для этого эксперимента.
Когда тег находится в поле телефона, я вижу активность в логарифме отладчика Android каждые 130 мс или около того.
2020-10-13 19:38:50.555 4209-4411/? I/libnfc_nci: [INFO:NativeNfcManager.cpp(793)] nfaConnectionCallback: Connection Event = 15
2020-10-13 19:38:50.555 4209-4411/? I/libnfc_nci: [INFO:NativeNfcManager.cpp(1389)] nfaConnectionCallback: NFA_PRESENCE_CHECK_EVT
2020-10-13 19:38:50.680 4209-28960/? I/libnfc_nci: [INFO:NativeNfcTag.cpp(1953)] nativeNfcTag_doPresenceCheck
2020-10-13 19:38:50.680 4209-28960/? I/libnfc_nci: [INFO:NativeNfcTag.cpp(1997)] nativeNfcTag_doPresenceCheck: handle=0
2020-10-13 19:38:50.694 4209-4411/? I/libnfc_nci: [INFO:NativeNfcManager.cpp(793)] nfaConnectionCallback: Connection Event = 15
2020-10-13 19:38:50.694 4209-4411/? I/libnfc_nci: [INFO:NativeNfcManager.cpp(1389)] nfaConnectionCallback: NFA_PRESENCE_CHECK_EVT
2020-10-13 19:38:50.820 4209-28960/? I/libnfc_nci: [INFO:NativeNfcTag.cpp(1953)] nativeNfcTag_doPresenceCheck
2020-10-13 19:38:50.820 4209-28960/? I/libnfc_nci: [INFO:NativeNfcTag.cpp(1997)] nativeNfcTag_doPresenceCheck: handle=0
Похоже, Android проверяет наличие тега. В это время я вижу, что выход RF_BUSY M24LR становится низким примерно на 15 мс каждые 130 мс или около того. Я связываю это с активностью Android выше.
Если затем микроконтроллер выполняет чтение блока через i2c памяти M24LR, то вскоре после этого телефон воспроизводит звуковой сигнал уведомления. Случилось так, что телефон потерял связь с меткой и снова подключился. Выходные данные logcat для этого времени показывают, что это происходит без предупреждения.
2020-10-13 19:38:51.335 4209-4411/? I/libnfc_nci: [INFO:NativeNfcManager.cpp(793)] nfaConnectionCallback: Connection Event = 15
2020-10-13 19:38:51.335 4209-4411/? I/libnfc_nci: [INFO:NativeNfcManager.cpp(1389)] nfaConnectionCallback: NFA_PRESENCE_CHECK_EVT
2020-10-13 19:38:51.335 4209-28960/? I/libnfc_nci: [INFO:NativeNfcTag.cpp(2173)] nativeNfcTag_doPresenceCheck: tag absent
2020-10-13 19:38:51.335 4209-28960/? D/NativeNfcTag: Tag lost, restarting polling loop
2020-10-13 19:38:51.335 4209-28960/? I/libnfc_nci: [INFO:NativeNfcTag.cpp(1392)] nativeNfcTag_doDisconnect: enter
2020-10-13 19:38:51.335 4209-28960/? I/libnfc_nci: [INFO:NativeNfcTag.cpp(1414)] nativeNfcTag_doDisconnect: exit
2020-10-13 19:38:51.336 4209-28960/? D/NfcService: Discovery configuration equal, not updating.
2020-10-13 19:38:51.336 4209-28960/? D/NativeNfcTag: Stopping background presence check
2020-10-13 19:38:51.344 4209-4411/? I/libnfc_nci: [INFO:NativeNfcManager.cpp(793)] nfaConnectionCallback: Connection Event = 6
2020-10-13 19:38:51.344 4209-4411/? I/libnfc_nci: [INFO:NativeNfcManager.cpp(1121)] nfaConnectionCallback: NFA_DEACTIVATED_EVT: Type=0, gIsTagDeactivating=0
2020-10-13 19:38:51.344 4209-4411/? I/libnfc_nci: [INFO:NativeNfcManager.cpp(5280)] notifyPollingEventwhileNfcOff: sDiscCmdwhleNfcOff=0
2020-10-13 19:38:51.344 4209-4411/? I/libnfc_nci: [INFO:NativeNfcTag.cpp(921)] getReconnectState = 0x0
2020-10-13 19:38:51.345 4209-4411/? I/libnfc_nci: [INFO:NfcTag.cpp(189)] NfcTag::setDeactivationState: state=0
2020-10-13 19:38:51.345 4209-4411/? I/libnfc_nci: [INFO:NfcTag.cpp(1358)] NfcTag::resetTechnologies
2020-10-13 19:38:51.345 4209-4411/? I/libnfc_nci: [INFO:NativeNfcTag.cpp(263)] nativeNfcTag_abortWaits
Отключение подключения, очевидно, наносит ущерб любому приложению, работающему на телефоне, которое пытается обменяться информацией с тегом.
Я попытался использовать сигнал BUSY, чтобы микроконтроллер на метке не запускал какие-либо операции чтения i2c, когда выполнялся RF-доступ, но проблема все еще возникает. Я предполагаю, что проблема связана с пингом RF, когда происходит доступ к памяти, но я только предполагаю.
Кажется, что шансы на разрыв соединения увеличиваются с увеличением количества прочитанных байтов (поддерживая идею конфликта). Чтение одного байта часто может пройти без разрыва соединения.
Может ли это быть действительно правильным поведением? Неужели ничего нельзя сделать, чтобы предотвратить это? Как OP (или я) использовал бы эти устройства для реализации системы, в которой микроконтроллер на метке мог бы читать / записывать память устройства NFC для обмена информацией с приложением, работающим на телефоне? Как я уже сказал, я наблюдал это как с M24LR, так и с ST25DV.
[Извините, если это скорее вопрос, чем ответ, но я хотел пролить больше света на эту тему.]
person
Richard
schedule
14.10.2020