Autor Tema: 16F887 con lector RFID RC522 por protocolo SPI  (Leído 19792 veces)

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

Desconectado josb86

  • PIC10
  • *
  • Mensajes: 12
16F887 con lector RFID RC522 por protocolo SPI
« en: 29 de Octubre de 2013, 16:01:47 »
Como estan quisiera que me ayudaran con un problema que tengo les ceunto tengo un modulo RC522 que es un lector de tarjetas rfid MIFARE, el modulo cuenta con el integrado MFRC522






las caracteristicas del lector son:

Product model: MF522 - AN
Working current: 13 - and ma/dc 3.3 V
Idle current: 10-13 ma/dc 3.3 V
Dormancy current: < 80 ua
Peak current: < 30 ma
Operating frequency: 13.56 MHz
Card read distance: 0 ~ sixty mm (mifare1 card)
Interface: SPI
Data transmission rate: the biggest 10 mbit/s
Support the card type: mifare1 S50, mifare1 S70, mifare UltraLight, mifare Pro, mifare Desfire PULS CPU (fudan CPU card)
Physical properties: size: mm x 60 mm
environment
Working temperature: Celsius - and - 80 degrees
Storage temperature: Celsius - - 85 degrees
Humidity: 5%, 95% relative humidity

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

en la pagina 10 de este PDF hablan de como se hace para que el lector lea. El problema es que no he podido leer el código de las tarjetas por medio del micro.


Código: [Seleccionar]
#include <pru_spi.h>
#use SPI( MASTER, DO = PIN_C5, DI = PIN_C4, CLK = PIN_C3, CLOCK_LOW=1, ENABLE=PIN_C2, BITS = 8, MSB_FIRST, stream = RFID, ENABLE_ACTIVE=1 )


void main()
{
   setup_comparator(NC_NC_NC_NC);
   int i=0;
   Char value[8]="n";


   while(TRUE)
   {
   

   output_high(pin_C2);

   for(i=0;i<8;i++){
      value[i]=SPI_XFER(RFID, 0x30);
   }

   output_low(pin_C2);
   fprintf(RF,"%s\n\r",value);


   }

}



#include <pru_spi.h>

Código: [Seleccionar]
#include <16F887.h>
#device adc=16

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES HS                       //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES PUT                      //Power Up Timer
#FUSES NOMCLR                   //Master Clear pin used for I/O
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES BORV21                   //Brownout reset at 2.1V

#use delay(clock=20000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C7,rcv=PIN_C6,bits=8,stream=RF)



por ultimo encontré esta libreria para arduino, de alli saque el numero 0X30

https://github.com/JoyLabs/arduino/blob/master/libraries/RFID/MFRC522.h



agradecería su ayuda

Desconectado omix

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 244
Re: 16F887 con lector RFID RC522 por protocolo SPI
« Respuesta #1 en: 29 de Octubre de 2013, 16:33:48 »
Hola,
yo utilizo ese mismo integrado en un lector que he desarrollado para el trabajo, pero en mi caso utilizo conexión RS232. En cualquier caso, para hacer mi librería tome como partida esa misma que comentas y me funciona correctamente. A groso modo lo que tienes que tener en cuenta en el proceso para realizar para hacer una lectura del numero de serie seria lo siguiente:
- Inicializar correctamente el MFRC522, para ello verifica lo que escribes en los registros (solo hay que hacerlo una vez si va a estar alimentado continuamente).
- Activar la antena.
- Realizar búsqueda de tags en el campo, para eso realiza una petición de lectura del tipo de tarjetas que hay, debería devolverte un valor de 2 bytes que indica el tipo de tarjeta que es (Mifare 1K, Mifare 4K, Ultralight, S50, etc).
- Una vez que has detectado que hay tarjetas disponibles para leer, se realiza una lectura del número de serie con el método Anticoll de nivel 1, que si se trata de una tarjeta  con identificador de 4 bytes solamente debes ejecutar este método. Si fuese de 7 bytes, tendrás que ejecutar select tag con la parte del identificador recibido en el anticoll de nivel 1 y ejecutar posteriormente un anticoll de nivel 2 para obtener el resto del identificador.

Espero que esto te aclare un poco el proceso de lectura.

Saludos.

Desconectado josb86

  • PIC10
  • *
  • Mensajes: 12
Re: 16F887 con lector RFID RC522 por protocolo SPI
« Respuesta #2 en: 29 de Octubre de 2013, 20:02:51 »
Hola,
yo utilizo ese mismo integrado en un lector que he desarrollado para el trabajo, pero en mi caso utilizo conexión RS232. En cualquier caso, para hacer mi librería tome como partida esa misma que comentas y me funciona correctamente. A groso modo lo que tienes que tener en cuenta en el proceso para realizar para hacer una lectura del numero de serie seria lo siguiente:
- Inicializar correctamente el MFRC522, para ello verifica lo que escribes en los registros (solo hay que hacerlo una vez si va a estar alimentado continuamente).
- Activar la antena.
- Realizar búsqueda de tags en el campo, para eso realiza una petición de lectura del tipo de tarjetas que hay, debería devolverte un valor de 2 bytes que indica el tipo de tarjeta que es (Mifare 1K, Mifare 4K, Ultralight, S50, etc).
- Una vez que has detectado que hay tarjetas disponibles para leer, se realiza una lectura del número de serie con el método Anticoll de nivel 1, que si se trata de una tarjeta  con identificador de 4 bytes solamente debes ejecutar este método. Si fuese de 7 bytes, tendrás que ejecutar select tag con la parte del identificador recibido en el anticoll de nivel 1 y ejecutar posteriormente un anticoll de nivel 2 para obtener el resto del identificador.

Espero que esto te aclare un poco el proceso de lectura.

Saludos.



los comandos para lo que me comentas son estos?

Código: [Seleccionar]
#define PCD_IDLE              0x00               //NO action; cancel current commands
#define PCD_AUTHENT           0x0E               //verify password key
#define PCD_RECEIVE           0x08               //receive data
#define PCD_TRANSMIT          0x04               //send data
#define PCD_TRANSCEIVE        0x0C               //send and receive data
#define PCD_RESETPHASE        0x0F               //reset
#define PCD_CALCCRC           0x03               //CRC check and caculation

//Mifare_One card command bits
#define PICC_REQIDL           0x26               //Search the cards that not into sleep mode in the antenna area
#define PICC_REQALL           0x52               //Search all the cards in the antenna area
#define PICC_ANTICOLL         0x93               //prevent conflict
#define PICC_SElECTTAG        0x93               //select card
#define PICC_AUTHENT1A        0x60               //verify A password key
#define PICC_AUTHENT1B        0x61               //verify B password key
#define PICC_READ             0x30               //read
#define PICC_WRITE            0xA0               //write
#define PICC_DECREMENT        0xC0               //deduct value
#define PICC_INCREMENT        0xC1               //charge up value
#define PICC_RESTORE          0xC2               //Restore data into buffer
#define PICC_TRANSFER         0xB0               //Save data into buffer
#define PICC_HALT             0x50               //sleep mode

Desconectado omix

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 244
Re: 16F887 con lector RFID RC522 por protocolo SPI
« Respuesta #3 en: 30 de Octubre de 2013, 18:52:52 »
Si esos son los comandos, si miras el código del enlace que que comentas, lo que tendrías que hacer es llamar a las siguientes funciones:

- MFRC522::Init(); // Inicialización y activación de la antena
- MFRC522::Request(..); // Busca tarjetas en el campo
- MFRC522::Anticoll(...); // Lee el número de serie de la tarjeta

Estas dos ultimas funciones las puedes llamar periódicamente, para buscar automáticamente tarjetas (por ejemplo cada segundo).

Un saludo.

Desconectado josb86

  • PIC10
  • *
  • Mensajes: 12
Re: 16F887 con lector RFID RC522 por protocolo SPI
« Respuesta #4 en: 02 de Noviembre de 2013, 16:59:53 »
Si esos son los comandos, si miras el código del enlace que que comentas, lo que tendrías que hacer es llamar a las siguientes funciones:

- MFRC522::Init(); // Inicialización y activación de la antena
- MFRC522::Request(..); // Busca tarjetas en el campo
- MFRC522::Anticoll(...); // Lee el número de serie de la tarjeta

Estas dos ultimas funciones las puedes llamar periódicamente, para buscar automáticamente tarjetas (por ejemplo cada segundo).

Un saludo.

hola de nuevo, quisiera hacerte una consulta cuando ellos hacen esto:


Write_MFRC522(TModeReg, 0x8D);

en void MFRC522::Init(void)


que estan haciendo?

arriba dice que :
#define     TModeReg              0x2A


osea es como si enviara

spi_write(0x01);
y despues
spi_write(0x0F);               
y despues
spi_write(0x2A);
y despues
spi_write(0x8D);

??

no entiendo que es ese comando Write_MFRC522(

Desconectado omix

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 244
Re: 16F887 con lector RFID RC522 por protocolo SPI
« Respuesta #5 en: 04 de Noviembre de 2013, 17:13:38 »
Citar
hola de nuevo, quisiera hacerte una consulta cuando ellos hacen esto:


Write_MFRC522(TModeReg, 0x8D);

en void MFRC522::Init(void)


que estan haciendo?

arriba dice que :
#define     TModeReg              0x2A


osea es como si enviara

spi_write(0x01);
y despues
spi_write(0x0F);               
y despues
spi_write(0x2A);
y despues
spi_write(0x8D);

??

no entiendo que es ese comando Write_MFRC522(

Hola,
ahí lo que esta haciendo con la función "Write_MFRC522" es escribir en los registros internos del MFRC522, en el ejemplo que comentas esta escribiendo en el registro "TModeReg" el valor 0x8D, puedes ver en el datasheet que dicho registro es el 0x2A.

Un saludo.

Desconectado AG1

  • PIC16
  • ***
  • Mensajes: 105
Re: 16F887 con lector RFID RC522 por protocolo SPI
« Respuesta #6 en: 15 de Noviembre de 2013, 13:47:06 »
He utilizado un módulo muy parecido al tuyo, que  también utiliza el chip MFRC522 y la conexión SPI :


He hecho el enlace SPI con un 16F628A y funciona bastante bién:

Toda la información necesaria para hacer funcionar el módulo la he obtenido del archivo RFID-MC522.ZIP que puedes descargar de la red.

Salu2.

« Última modificación: 15 de Noviembre de 2013, 14:00:37 por AG1 »

Desconectado agiofelipe2

  • PIC10
  • *
  • Mensajes: 3
Re: 16F887 con lector RFID RC522 por protocolo SPI
« Respuesta #7 en: 18 de Diciembre de 2013, 11:46:21 »
Hola AG1.
¿Me podría ayudar con este proyecto, he descargado el archivo  RFID-MC522.ZIP  pero es muy confuso y los comentarios están en chino.

Desconectado eguitart

  • PIC10
  • *
  • Mensajes: 1
Re: 16F887 con lector RFID RC522 por protocolo SPI
« Respuesta #8 en: 10 de Enero de 2014, 10:38:26 »
Hola AG1.
¿Me podría ayudar con este proyecto, he descargado el archivo  RFID-MC522.ZIP  pero es muy confuso y los comentarios están en chino.


Alguien logro hacer andar el RFID-RC522 programando en CCS ?
Gracias

Desconectado Elwood

  • PIC10
  • *
  • Mensajes: 5
Re: 16F887 con lector RFID RC522 por protocolo SPI
« Respuesta #9 en: 18 de Enero de 2014, 15:28:35 »
AG1, he probado tu programa, esta muy bien. Me gustaría migrarlo a ensamblador. También he pensado en utilizar un micro que lleve SPI MASTER.
Si pudieras publicar el código para ver como se controla el RC-522 y el modulo I2C-LCD seria de gran ayuda.

Gracias anticipadas.
« Última modificación: 18 de Enero de 2014, 18:00:21 por Elwood »

Desconectado leodesgo

  • PIC10
  • *
  • Mensajes: 2
Re: 16F887 con lector RFID RC522 por protocolo SPI
« Respuesta #10 en: 12 de Abril de 2014, 05:06:06 »
Hola !

Estoy trabajando con el lector tambien. Soy principiante en los PIC, asi que me ha llevado un tiempo tan solo usar el oscilador interno... jaja.

Mi problema es que no me da respuesta el modulo. La patita MOSI si esta recibiendo señal pero MISO esta muerta.  Aquello de los 3.3V y que el micro de 5 a la salida podrá haberlo dañado?

Estoy usando este codigo en MikroC que encontre.

http://microcontrolandos.blogspot.mx/2014/02/pic-rfid-mfrc522.html

Desconectado marcelocoppari

  • PIC10
  • *
  • Mensajes: 1
Re: 16F887 con lector RFID RC522 por protocolo SPI
« Respuesta #11 en: 01 de Junio de 2014, 15:31:26 »
Hola, yo también estoy intentando comunicar un MFRC522 con un PIC, en mi caso un 18f4550 utilizando CCS y por el momento no he logrado resultados favorables, alguno logró hacerlo andar con CCS?