題:
與多個RC522 RFID讀取器共享MISO問題
Jesse Mount
2015-12-01 20:52:27 UTC
view on stackexchange narkive permalink

所以在過去的8.5個小時(幾乎不停地)中,我一直在試圖找出一個問題,並且用盡了所有可能想到的搜索內容。

我正在建立一個謎題這需要在1個Arduino上使用5個RFID讀取器,但是為了進行測試,我只使用了2個。

兩個讀取器都是獨立工作的,我可以讀取小卡的UID,這就是全部我需要做,但是一旦我讓他們共享MISO行,它就會停止打印任何內容。我不知道為什麼。

這兩個閱讀器都有一個通用的外部3.3v電源和地,它們共享所有其他線路,但有一個單獨的從機選擇。為了進行測試,我將它們的兩條MISO電纜都放入了麵包板上,​​然後通過PIN 12引入了Arduino,但是只有將一根電纜插入麵包板上時,它才會打印出UID。

我需要做一些特別的事情來使這項工作嗎?共享MISO線的讀者是否有理由打破它?即使我不初始化其中之一,僅因為插入它的事實仍然會破壞它。我嘗試將一個設置為HIGH,將一個設置為LOW,兩者都設置為LOW,兩者都設置為HIGH,沒有任何改變。

另外,還有一些讓我感到困惑的事情,那就是將LOW激活以激活SS,但是當MISO線中僅插入1時,似乎並不重要,它始終處於打印狀態……

我在草圖上做了一些測試,不久之前,意識到將兩者插入MISO時,草圖都不會越過該行(也是循環的第一行)

  if(!mfrc522_2.PICC_IsNewCardPresent() )return;  

我知道其他所有東西都在工作,因為當MISO線中沒有插入其他任何東西時,它都可以工作,但是當其他所有東西都插入時,我也需要它工作。 / p>

請請,如果您有任何想法,請告訴我。

我正在使用MFRC522庫

編輯:

這基本上是我正在使用的設置: enter image description here

我沒有使用任何電壓轉換器或移位器,arduino的所有電壓均為5v,但讀取器的電源則來自外部3.3v電源就像之前提到的那樣。

我很確定這是我正在使用的RC522的數據表,儘管我不確定是V1還是V2,但是鑑於它們之間的差異,我不知道認為不重要:

http://www.nxp.com/documents/data_sheet/MFRC522.pdf

我不知道他們是否能夠像下面的人一樣共享MISO線路,我以為我可以做到?

您正在使用沒有電壓轉換器的5V arduino板,對嗎?如果是這樣,則說明您不符合這些模塊的規格,因此可能會使它們發生故障
讀者單獨工作的@frarugi87,認為這不是問題。同樣,MISO是Arduino的輸入,據說3V3系統的輸出到5V系統的輸入可以正常工作。
Jesse Mount,請編輯問題並指定使用的電壓;是否使用電壓轉換器/移位器;以及讀者的型號。雖然SPI從設備通常使用漏極開路輸出,所以MISO可以連接在一起,而有些則不能。沒有型號,誰能說?
@jwpat7當然,您指的是三態輸出,而不是漏極開路輸出...
@Majenko,,謝謝,這就是我關於SPI的意思。誤認為IIC。
-1
傑西·芒特(Jesse Mount),也許看看[raspberrypi.org/forums](https://www.raspberrypi.org/forums/viewtopic.php?f=91&t=70756)上2014年5月6日下午發布的帖子,並在此處指明如果您的RFC22與此處顯示的2之一匹配(第三個鏈接錯誤)。該帖子還告訴您如何驗證協議是否為SPI等。請注意,該線程表示您的連接圖應該可以,但是如果不顧一切,您可以使用多路復用器,例如74LS153將允許您選擇4行中的1行
我看到的那個看起來像紅色的那個,但它是藍色的。['Image Here'。](http://img.td-imgs.com/images/24/83/262483_130300060699139324.jpg)我確定它正在使用SPI,因為我從RC522與串行通信沒有問題。我唯一遇到的問題是使用多個端口。如果另外一個RC522插入MISO線路,則將導致通信錯誤,並阻止任何數據從任一設備的串行輸出,無論第二個設備是否是否啟動或SS引腳處於哪種邏輯狀態。
實際上,@jwpat7的問題不在arduino方面,而在設備方面。如果我沒記錯的話,您在只能支持3.8V的引腳上發送5V(Vcc + 0.5)。因此,您的規格不合格。如果它們即使在這些條件下也能正常工作,但是您可以從此設置中期待奇怪的行為。恕我直言,要做的第一件事是將5V輸入降低至3.3V。甚至無源分壓器也可以工作。然後,當您確定要按照規範工作時,可以修改其他內容
您能在哪裡找到答案?我有一個類似的問題。 http://arduino.stackexchange.com/questions/29494/connecting-saleae-logic-8-to-miso-pin-12-on-uno-3-w-nrf24l01-halts-program類似的聲音可能是同一類型問題。
我沒有發表評論的名聲,但我要感謝邁克爾。他的解決方案是完美的,我被困了好幾天。因此,帶有軟件SPI的Multi RFID很有魅力!
三 答案:
Michael
2017-05-10 05:12:18 UTC
view on stackexchange narkive permalink

我很晚才加入此對話,但是也許我的回答可以幫助剛剛正在研究此問題的人。

我能夠讓七個RC522讀者在一個Arduino上工作!我的解決方案與您的想法非常相似,只是我使用了MISO引腳代替了SS引腳。

Unique MISO diagram

引腳如何工作,所有這些都是從主機(Arduino)到從機(RC522)的輸出,除了MISO引腳是從從機到主機的輸入。

所以我為每個RC522掃描器在Arduino上提供了自己的MISO引腳,其餘的引腳與所有掃描器共享。

要使其與代碼一起使用,我發現的最簡單的解決方案是初始化一個新的每次我想從RC522之一讀取數據時,RFID都使用相應的MISO引腳。

這對Arduino很有用,因為您可以將多個數字引腳設置為MISO,但是我還沒有弄清楚使其能夠在Raspberry Pi上運行(不使用多路復用器),因為Pi具有一些用於MISO的特定引腳。

這是一些示例代碼。它使用的是Sunfounder庫(此處是一個教程: 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狀態; uchar str [MAX_LEN]; //搜索卡,返回卡類型status = rfid.request(PICC_REQIDL,str); if(狀態!= MI_OK){返回; } //顯示卡類型rfid.showCardType(str); //防止衝突,返回4個字節的卡的序列號status = rfid.anticoll(str);
if(狀態== MI_OK){memcpy(serNum,str,5); rfid.showCardID(serNum); //顯示卡ID Serial.println(); Serial.println(); } delay(100); rfid.halt(); //命令卡進入睡眠模式}  
您使用的是Arduino Uno還是其他Arduino之一?
如何將數字引腳分配為MISO?您將哪個庫用於SPI?
-1
我和@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);'就像更改我提供的味o引腳一樣簡單。因此,例如,我將執行`rfid.begin(2,4,5,7,3,6);`檢查一個讀取器,然後執行`rfid.begin(2,4,5,8,3,6); `檢查下一個閱讀器,依此類推。
邁克爾,你真棒!我在一周內無法連接5個rfid模塊時遇到了問題,但沒有任何幫助。您解決了我的問題,謝謝。它完美地工作:)
-1
嘿,您節省了我的時間。謝謝。我只是想知道為什麼那個圖書館不在圖書館或其他地方?
實際上,“技巧”並不是真正來自Sunfounder的RFID LIB,而是他們正在使用的“子庫”,它位於同一文件夾中,並且是.. SoftSPI!這個lib似乎有點像軟件序列,因為它允許您聲明要用於SPI的PINS。很有意思!!!!
bigjosh
2015-12-02 08:12:17 UTC
view on stackexchange narkive permalink

查看MFR522的數據表,尚不清楚它是否甚至支持多點SPI。未選擇芯片時,它沒有提及SPI輸出引腳的狀態。它還提到該芯片使用從選擇線來檢測啟動時要使用的通信模式,但是沒有提及啟動後該芯片將如何響應該引腳上的變化。

考慮到這一點,再加上您的庫中的事實似乎也不支持與多個MFR522的連接,我想這是該芯片僅支持1:1 SPI鏈接。

此外,SPI時序特性數據表指定了在開始通信之前,SS(稱為NSS)必須處於多高的狀態,但沒有指定SS變低之後多長時間(MISO進入三態),這對於了解芯片是否支持多點連接非常重要。 SPI。

所有這些都由您看到的行為來備份。如果兩個芯片同時在驅動MISO線,那麼當兩個芯片都連接時將無法進行通信。

要支持多個MFR522連接,您可以...

  1. 使用多路復用緩衝器一次只能將SPI線啟用到一個芯片。缺點是您需要額外的硬件,但好處是您可以在進行線性調用之前選擇所需的MFR522來完整使用現有的庫。

  2. 將每個MFR522連接到不同的GPIO Arduino上的引腳,並分別將SPI與每個芯片連接。好處是您不需要任何額外的硬件,並且在訪問MFR522的方式上可能具有很大的靈活性。不利的一面是,您將不得不將此位經過修改的SPI改造到庫中或使用(或編寫)其他庫。

  3. ol>

    我已經看過很多次這個問題了這些年來,因此,如果您確實選擇了選項#2,請發布您的代碼,以便其他人可以使用它!

    實驗

    我建議您執行此操作,以了解您的芯片是否與多點SPI兼容...

    1. 使用RC522閱讀器啟動系統。
    2. 檢查並確保其正常工作。
    3. 從RC522斷開SS和MISO線的連接,以便它們不再與Arduino(或其他任何東西)連接。保持RC522處於通電狀態-如果將其複位,則可能會失去自動檢測到的SPI配置。
    4. 使用跳線將SS線接地。
    5. 將MISO線接地
    6. 使用萬用表檢查MISO線上的電壓。
    7. 使用1K歐姆電阻將MISO線連接至Vcc。
    8. >使用萬用表檢查MISO線上的電壓。
    9. 將SS線連接到Vcc。
    10. 重複步驟3-6。
    11. ol>

      將獲得的4個電壓讀數報告回表,我們應該給出答案!

儘管數據手冊可能會更清楚,但如果未選擇,則聲稱是SPI外設的芯片極不可能最終無法使MISO線處於三態。無論如何,它應該易於測試。
我傾向於同意,但是快速的Google搜索顯示出很多人都存在完全相同的問題-將第二個MFRC522連接到MISO線會阻止第一個工作。另請注意,其他NXP數據表在可用時特別提到了三態(即PCF85063BTL指出SPI數據輸出線“在不驅動時是高阻抗的”)。如果沒有手頭的幾個芯片進行測試,就無法知道當然可以,但是基於所有證據,我認為該芯片很可能不支持多點SPI。
如果有人在紐約市(LMC)擁有2種這樣的產品,我們可以對其進行分類,以獲得最終的權威答案!
您不需要其中兩個來測試該行為-您可以使用一個電阻來測試它。
“事實上,您的庫也似乎不支持與多個MFR522的連接”-似乎並非如此。它包含使用多個閱讀器的示例代碼:https://github.com/miguelbalboa/rfid/blob/master/examples/ReadUidMultiReader/ReadUidMultiReader.ino
Rodrigo Franco
2017-08-22 03:43:35 UTC
view on stackexchange narkive permalink

我不知道每個模塊在sck和mosi中是否都具有上拉電阻,這可能是因為通過線連接的每個模塊的電阻都會降低。因此,也許模塊不能降低電壓,所以沒有通信。用萬用表檢查Vcc和MOSI之間的電阻,通常必須在4.7k左右。希望這會有所幫助。



該問答將自動從英語翻譯而來。原始內容可在stackexchange上找到,我們感謝它分發的cc by-sa 3.0許可。
Loading...