Autor Tema: Cómo acceder a los bloques de memoria de una tarjeta RFID  (Leído 1870 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Sebas

  • PIC10
  • *
  • Mensajes: 1
Cómo acceder a los bloques de memoria de una tarjeta RFID
« en: 01 de Agosto de 2019, 14:06:48 »
Buenos días,

Actualmente estoy intentando acceder (solo me interesa la lectura) a las posiciones de memoria que poseen estos tags, tengo entendido que son 64 bloques (0-63) cada uno de 16 bytes. Hasta ahora, con un RC522 y un compilador CCS, he logrado solamente leer la ID propia de cada tarjeta más no la totalidad de su memoria y, en la web solo encuentro información de Arduino usando la librería de 'miguelbalboa'.

En concreto, no estoy usando la comunicación SPI propia del PIC16F887 ya que otro elemento usa I2C y el microcontrolador comparte pines en ambos protocolos. Sin embargo, con la librería adjunta es posible realizar la conexión con el RC522 mediante software y funciona sin problemas (no es de mi autoría pero la comparto por si a alguien le puede resultar útil).

Aún así, esta no cuenta con una función para leer la memoria de las tarjetas, solo con una para leer el serial 'MFRC522_ReadCardSerial'. Por tanto, me puse a leer su código con el objeto de identificar en qué momento se establece la posición de memoria en esta función, pero solo logro obtener un arreglo vacío o de ceros.

Por ejemplo, este es un fragmento de la función mencionada:

Código: C++
  1. char _status;
  2.   unsigned unLen;
  3.   MFRC522_Wr( BITFRAMINGREG, 0x00 );                
  4.   serNum[0] = PICC_ANTICOLL;
  5.   serNum[1] = 0x20;
  6.   MFRC522_Clear_Bit( STATUS2REG, 0x08 );
  7.   _status = MFRC522_ToCard( PCD_TRANSCEIVE, serNum, 2, serNum, &unLen );

Según tengo entendido, 0x20 es la dirección de memoria y PICC_ANTICOLL (0x93) es el código de función, por decirlo así. Además, el valor leído se guarda en el arreglo 'serNum' (trabaja con un puntero). Así que, intento esperanzado el siguiente código:

Código: C++
  1. unsigned char status;
  2.   unsigned int unLen;
  3.  
  4.   serNum[0] = PICC_READ; //código 0x30
  5.   serNum[1] = blockAddr; //dirección de 0 a 69
  6.    
  7.   //MFRC522_CRC(recvData,2, &recvData[2]);
  8.   status= MFRC522_ToCard(PCD_TRANSCEIVE, serNum, 4, serNum, &unLen);

Pero no consigo leer ningún bloque a pesar de eso (no podía ser tan simple), lo que me lleva a cuestionar en qué estoy fallando. Igualmente en la hoja de datos del 522 no encontré información respecto a esos códigos de función como el 0x30, solo sé por la librería que su valor junto con la dirección se ingresa al registro FIFODATAREG (buffer).

Muchas gracias de antemano por cualquier aporte o sugerencia.
« Última modificación: 01 de Agosto de 2019, 14:28:59 por Sebas »


 

anything