LOW
и на mfrc522 HIGH
, а когда надо получать/отправлять данные с mfrc522 давать на его CS LOW
, а на CS карты HIGH
руками подавать сигнал на второй CS, по окончании транзакции -- вернуть всё в исходное состояние.
речь об этом модуле.да, речь идёт именно об этом модуле, но я повесил RFID модуль(mfrc522) на отдельную линию SS(CS) но оно так и не заработало. Мне кажется что это из-за того что в начале я инициализирую SPI через
SPI.begin(SCK, MISO, MOSI, SS);
таким образом инициализируется и SD карта. На всякий случай вот тут весь код. #include <SPI.h>
#include <MFRC522.h>
#define RST_PIN 2 // Пин rfid модуля RST
#define SS_PIN 15 // Пин rfid модуля SS
MFRC522 rfid(SS_PIN, RST_PIN);
int sarfdata = 0;
int sarfdata2 = 0;
MFRC522::MIFARE_Key key; // Объект ключа
MFRC522::StatusCode status; // Объект статуса
int read_uid[4];
int uid_RuCat[4] = {109,90,165,33};
void setup() {
Serial.begin(9600); // Инициализация Serial
SPI.begin(); // Инициализация SPI
rfid.PCD_Init(); // Инициализация модуля
rfid.PCD_SetAntennaGain(rfid.RxGain_max); // Установка усиления антенны
rfid.PCD_AntennaOff(); // Перезагружаем антенну
rfid.PCD_AntennaOn(); // Включаем антенну
for (byte i = 0; i < 6; i++) { // Наполняем ключ
key.keyByte[i] = 0xFF; // Ключ по умолчанию 0xFFFFFFFFFFFF
}
}
void loop() {
// Занимаемся чем угодно
static uint32_t rebootTimer = millis(); // Важный костыль против зависания модуля!
if (millis() - rebootTimer >= 1000) { // Таймер с периодом 1000 мс
rebootTimer = millis(); // Обновляем таймер
digitalWrite(RST_PIN, HIGH); // Сбрасываем модуль
delayMicroseconds(2); // Ждем 2 мкс
digitalWrite(RST_PIN, LOW); // Отпускаем сброс
rfid.PCD_Init(); // Инициализируем заного
}
if (!rfid.PICC_IsNewCardPresent()) return; // Если новая метка не поднесена - вернуться в начало loop
if (rfid.PICC_ReadCardSerial()){
Serial.print("ID: ");
for (uint8_t i = 0; i < 4; i++) { // Цикл на 4 итерации
Serial.print(rfid.uid.uidByte[i]);
Serial.print(" ");
read_uid[i] = rfid.uid.uidByte[i];
}
} // Если метка не читается - вернуться в начало loop
else{
Serial.println("ERROR: the card is not readable");
return;
}
sarfdata = uid_RuCat[0] + uid_RuCat[1] + uid_RuCat[2] + uid_RuCat[3];
//Serial.print("data1 ");
//Serial.println(sarfdata);
sarfdata2 = read_uid[0] + read_uid[1] + read_uid[2] + read_uid[3];
//Serial.print("data2 ");
//Serial.println(sarfdata2);
if (sarfdata == sarfdata2){
Serial.println("Welcome");
delay(3000);
}
else{
Serial.println("ERROR: Identification error, try again");
delay(3000);
}
}
а вот ошибка:c:\Users\admin\Documents\Arduino\libraries\MFRC522\src\MFRC522Extended.cpp: In member function 'MFRC522::StatusCode MFRC522Extended::TCL_Transceive(TagInfo*, byte*, byte, byte*, byte*)':
c:\Users\admin\Documents\Arduino\libraries\MFRC522\src\MFRC522Extended.cpp:824:34: error: ordered comparison of pointer with integer zero ('byte*' {aka 'unsigned char*'} and 'int')
824 | if (backData && (backLen > 0)) {
| ~~~~~~~~^~~
c:\Users\admin\Documents\Arduino\libraries\MFRC522\src\MFRC522Extended.cpp:847:42: error: ordered comparison of pointer with integer zero ('byte*' {aka 'unsigned char*'} and 'int')
847 | if (backData && (backLen > 0)) {
| ~~~~~~~~^~~
exit status 1
Compilation error: exit status 1
А что, через uart не заработало, вроде через него собирались?Не нашёл нужной библиотеки с нормальной документацией, да и теперь немного поменял концепцию и использование uart стало не так необходимо.