Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arduino ESP32 RFID RC522-固件版本0x0+;通信错误_Arduino_Rfid_Esp32 - Fatal编程技术网

Arduino ESP32 RFID RC522-固件版本0x0+;通信错误

Arduino ESP32 RFID RC522-固件版本0x0+;通信错误,arduino,rfid,esp32,Arduino,Rfid,Esp32,因此,我使用带有TTGO显示屏的ESP32(请参见下图了解引脚),我想使用RC522 RFID模块,但是,我遇到了通信错误,固件版本未知。我正在使用ArduinoIDE、SPI库和MFRC522库 我花了一整天的时间浏览互联网,在论坛上读了很多帖子,并尝试了提供的解决方案(例如:焊接引脚,再次检查接线…)。我还阅读和观看了无数的教程,但都没有用。当我尝试在Arduino UNO上使用RFID模块时,一切都很好,但我必须使用ESP32。我觉得我什么都试过了,所以我只是希望有人也遇到了同样的问题,

因此,我使用带有TTGO显示屏的ESP32(请参见下图了解引脚),我想使用RC522 RFID模块,但是,我遇到了通信错误,固件版本未知。我正在使用ArduinoIDE、SPI库和MFRC522库

我花了一整天的时间浏览互联网,在论坛上读了很多帖子,并尝试了提供的解决方案(例如:焊接引脚,再次检查接线…)。我还阅读和观看了无数的教程,但都没有用。当我尝试在Arduino UNO上使用RFID模块时,一切都很好,但我必须使用ESP32。我觉得我什么都试过了,所以我只是希望有人也遇到了同样的问题,并找到了解决办法

下面是我的代码,这是MFRC522库的DumpInfo示例,稍作修改,因为正如我所说的,我尝试了一系列“解决方案”。RC522有8个引脚:3.3V、GND、RST、RQ、MOSI、MISO、SCK和SDA。3.3V连接至ESP32的3.3V,ESP32的接地至接地。RST是连接到GPIO22(定义为RST_引脚)的复位引脚。SDA是连接到GPIO21(定义为SS_引脚)的从属选择引脚。然后是分别连接到GPIO25、GPIO26和GPIO27的SCK、MOSI和MISO引脚(定义为SCK_引脚、MOSI_引脚和MISO_引脚)。RQ引脚用于我们不需要的中断,因此它不连接任何东西

#include <SPI.h>
#include <MFRC522.h>

#define RST_PIN   22  //GPIO22
#define SS_PIN    21  //GPIO21
#define MISO_PIN  27  //GPIO27
#define MOSI_PIN  26  //GPIO26
#define SCK_PIN   25  //GIPO25

MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance
SPIClass spi(HSPI);

void setup() {
    Serial.begin(9600);     // Initialize serial communications with the PC
    while (!Serial);        // Do nothing if no serial port is opened (added for Arduinos based on ATMEGA32U4)
    spi.begin(SCK_PIN, MISO_PIN, MOSI_PIN);
    spi.setDataMode(SPI_MODE3);
    mfrc522.PCD_Init();     // Init MFRC522
    delay(5000);            // Optional delay. Some board do need more time after init to be ready, see Readme
    mfrc522.PCD_DumpVersionToSerial();  // Show details of PCD - MFRC522 Card Reader details
    Serial.println(F("Scan PICC to see UID, SAK, type, and data blocks..."));
}

void loop() {
    // Reset the loop if no new card present on the sensor/reader. This saves the entire process when idle.
    if ( ! mfrc522.PICC_IsNewCardPresent()) {
        return;
    }

    // Select one of the cards
    if ( ! mfrc522.PICC_ReadCardSerial()) {
        return;
    }

    // Dump debug info about the card; PICC_HaltA() is automatically called
    mfrc522.PICC_DumpToSerial(&(mfrc522.uid));
}

正如我提到的,这是最后的手段。我希望有人也遇到过同样的情况,并能提供一些有用的信息,我希望这些信息我还没有读过。

我当时的情况与你完全相同:我的MFRC-522在Uno上运行良好,但在ESP32上不起作用。我是来寻求帮助的,你的问题把我引向了正确的方向。在我的代码中,SPI.begin()调用的参数缺失:SCK_PIN、MISO_PIN和MOSI_PIN。没有这些参数,我的ESP32无法读取数据。我已经测试并确认pinMode(SS_PIN,OUTPUT)和spi.setDataMode(spi_MODE3)调用对于它的工作不是必需的,但是必须像在spi.begin(SCK_PIN,MISO_PIN,MOSI_PIN)上一样传递参数

我使用不同的pin码,这是我的工作代码和你的唯一区别。以下是我的定义:

#define RST_PIN   22  
#define SS_PIN    21  
#define MISO_PIN  19 
#define MOSI_PIN  23 
#define SCK_PIN   18 
我知道你一定没有读到这篇文章,但我希望我能像你帮助我一样帮助别人。谢谢


Bruno

您是否尝试使用相同的SPI总线和2个芯片选择(一个用于显示,另一个用于mfrc522)?或者您正在尝试使用多个SPI总线?在这两种情况下,我认为您没有正确配置这两个SPI。1) 我没有看到显示器的SS配置。2) 对于mfrc522,它依赖于调用标准
spi.begin()
来正确配置总线。3) 对于ESP32,
spi.begin()
不会自动设置SS,因此必须显式使用
pinMode(SS,输出)
。4) 根据引脚图,显示器使用标准VSPI,您是否有理由将其更改为使用HSPI?此外,ESP32
spi.bein()
的功能原型是
spi.begin(SCK、MISO、MOSI、SS)
,如果您不传入SS,它会将其设置为您可能使用的默认pin。@h由于您的注释有意义,因此我尝试更改代码中的某些内容,但仍然得到相同的结果。谢谢你的尝试!为了回答您的问题,我没有尝试使用相同的SPI总线或多个SPI总线,实际上我不需要显示器。我仍然认为问题可能是我没有正确配置SPI总线,尽管我不知道应该如何进行配置。此外,当我添加pinMode(SS_PIN,OUTPUT)并将SPI.begin(…)更改为SPI.begin(),我仍然会收到一个错误,但这次固件版本是0xFF。如果您暂时不关心显示,这样会容易些,我也许能帮你缩小范围。但我不熟悉TTGO板,也没有带mfrc522。TTGO板引脚表明LCD使用VSPI,但它没有显示HSPI的引脚。您尝试用作HSPI的引脚与HSPI的标准ESP32开发板不匹配,因此首先要做的是确认您使用的是TTGO板定义的正确HSPI引脚。您能验证一下吗?
spi.setDataMode(spi\u MODE3)
是自2014年以来被弃用的方法。现在的SPI配置是通过使用
SPI.beginraction(SPIsettings)
建立事务来完成的。除非您正在编写自己的SPI库,否则所有这些都应该由您使用的库负责。所有Arduino板,无论是ESP32还是Arduino Uno,都有一组默认的管脚,这些管脚是根据每个板的标准命名约定定义的。因此,如果您根据电路板使用这些管脚,或者使用标准命名(如SS、MOSI、SCK、MISO)来定义管脚,则不需要将这些管脚作为
SPI.begin()的参数传入。
#define RST_PIN   22  
#define SS_PIN    21  
#define MISO_PIN  19 
#define MOSI_PIN  23 
#define SCK_PIN   18