#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 <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)
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.
#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
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(
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.