|
|
View previous topic :: View next topic |
Author |
Message |
ntrungtruc2003
Joined: 16 Feb 2011 Posts: 42
|
RC522 error when connect PIC16F877a |
Posted: Thu Sep 24, 2015 5:11 am |
|
|
Dear Sir.
I use MFRC522 connect to PIC16f877a using SPI sofware.
MF522_NSS --->PIN_E2
MF522_SCK --->PIN_C3
MF522_SI --->PIN_C4
MF522_SO --->PIN_C5
MF522_RST --->PIN_E0
I found this code from here
http://laptrinhpic.info/ung-dung-rfid-trong-dieu-khien-voi-pic16f877a-ccs-c/
The problem is PIC16F877A can not communicate with rc522.
The value returned by MFRC522_Request() function is equal to 2(error)
How can I fix it? Please help.
I have also try with PIC18LF4620 (3.3V)
Thank you very much.
mrfc522.c
Code: | #include "mfrc522.h"
#define MAXRLEN 18
uint8_t MFRC522_Request(uint8_t req_code,uint8_t *pTagType)
{
uint8_t status = MI_ERR;
uint16_t Length;
uint8_t Buffer[MAXRLEN];
ClearBitMask (STATUS2_REGISTER, 0x08) ;
MFRC522_WriteRegister (BIT_FRAMING_REGISTER, 0x07) ;
SetBitMask (TX_CONTROL_REGISTER, 0x03) ;
Buffer[0] = req_code;
status = MFRC522_ComMF522 (MFRC522_TRANSCEIVE, Buffer, 1, Buffer,&Length);
IF ((status == MI_OK) && (Length == 0x10))
{
* pTagType = Buffer[0];
* (pTagType + 1) = Buffer[1];
}
ELSE
{
status = MI_ERR;
}
RETURN status;
}
uint8_t MFRC522_Anticoll(uint8_t *pSnr)
{
uint8_t status;
uint8_t i, snr_check = 0;
uint16_t Length;
uint8_t Buffer[MAXRLEN];
ClearBitMask (STATUS2_REGISTER, 0x08) ;
MFRC522_WriteRegister (BIT_FRAMING_REGISTER, 0x00) ;
ClearBitMask (COLLISION_REGISTER, 0x80) ;
Buffer[0] = PICC_ANTICOLL1;
Buffer[1] = 0x20;
status = MFRC522_ComMF522 (MFRC522_TRANSCEIVE, Buffer, 2, Buffer,&Length);
IF (status == MI_OK)
{
FOR (i = 0; i < 4; i++)
{
* (pSnr + i) = Buffer[i];
snr_check ^= Buffer[i];
}
IF (snr_check != Buffer[i])
{ status = MI_ERR; }
}
SetBitMask (COLLISION_REGISTER, 0x80) ;
RETURN status;
}
uint8_t MFRC522_Select(uint8_t *pSnr)
{
uint8_t status;
uint8_t i;
uint16_t Length;
uint8_t Buffer[MAXRLEN];
Buffer[0] = PICC_ANTICOLL1;
Buffer[1] = 0x70;
Buffer[6] = 0;
FOR (i = 0; i < 4; i++)
{
Buffer[i + 2] = * (pSnr + i);
Buffer[6] ^= *(pSnr + i) ;
}
CalulateCRC (Buffer, 7,&Buffer[7]) ;
ClearBitMask (STATUS2_REGISTER, 0x08) ;
status = MFRC522_ComMF522 (MFRC522_TRANSCEIVE, Buffer, 9, Buffer,&Length);
IF ((status == MI_OK) && (Length == 0x18))
{ status = MI_OK; }
ELSE
{ status = MI_ERR; }
RETURN status;
}
uint8_t MFRC522_AuthState(uint8_t auth_mode,uint8_t addr,uint8_t *pKey,uint8_t *pSnr)
{
uint8_t status;
uint16_t Length;
uint8_t i, Buffer[MAXRLEN];
Buffer[0] = auth_mode;
Buffer[1] = addr;
FOR (i = 0; i < 6; i++)
{
Buffer[i + 2] = * (pKey + i);
}
FOR (i = 0; i < 4; i++)
{ Buffer[i + 8] = * (pSnr + i); }
status = MFRC522_ComMF522 (MFRC522_AUTHENT, Buffer, 12, Buffer,&Length);
if ((status != MI_OK) || (! (MFRC522_ReadRegister (STATUS2_REGISTER)&0x08)))
{ status = MI_ERR; }
RETURN status;
}
uint8_t MFRC522_Read(uint8_t addr,uint8_t *pData)
{
uint8_t status;
uint16_t Length;
uint8_t i, Buffer[MAXRLEN];
Buffer[0] = PICC_READ;
Buffer[1] = addr;
CalulateCRC (Buffer, 2,&Buffer[2]) ;
status = MFRC522_ComMF522 (MFRC522_TRANSCEIVE, Buffer, 4, Buffer,&Length);
IF ((status == MI_OK) && (Length == 0x90))
{
FOR (i = 0; i < 16; i++)
{ * (pData + i) = Buffer[i]; }
}
ELSE
{ status = MI_ERR; }
RETURN status;
}
uint8_t MFRC522_Write(uint8_t addr,uint8_t *pData)
{
uint8_t status;
uint16_t Length;
uint8_t i, Buffer[MAXRLEN];
Buffer[0] = PICC_WRITE;
Buffer[1] = addr;
CalulateCRC (Buffer, 2,&Buffer[2]) ;
status = MFRC522_ComMF522 (MFRC522_TRANSCEIVE, Buffer, 4, Buffer,&Length);
IF ((status != MI_OK) || (Length != 4) || ((Buffer[0]&0x0F) != 0x0A) )
{ status = MI_ERR; }
IF (status == MI_OK)
{
FOR (i = 0; i < 16; i++)
{ Buffer[i] = * (pData + i) ; }
CalulateCRC (Buffer, 16,&Buffer[16]) ;
status = MFRC522_ComMF522 (MFRC522_TRANSCEIVE, Buffer, 18, Buffer,&Length);
IF ((status != MI_OK) || (Length != 4) || ((Buffer[0]&0x0F) != 0x0A) )
{ status = MI_ERR; }
}
RETURN status;
}
uint8_t MFRC522_Value(uint8_t dd_mode,uint8_t addr,uint8_t *pValue)
{
uint8_t status;
uint16_t Length;
uint8_t i, Buffer[MAXRLEN];
Buffer[0] = dd_mode;
Buffer[1] = addr;
CalulateCRC (Buffer, 2,&Buffer[2]) ;
status = MFRC522_ComMF522 (MFRC522_TRANSCEIVE, Buffer, 4, Buffer,&Length);
IF ((status != MI_OK) || (Length != 4) || ((Buffer[0]&0x0F) != 0x0A) )
{ status = MI_ERR; }
IF (status == MI_OK)
{
FOR (i = 0; i < 16; i++)
{ Buffer[i] = * (pValue + i) ; }
CalulateCRC (Buffer, 4,&Buffer[4]) ;
Length = 0;
status = MFRC522_ComMF522 (MFRC522_TRANSCEIVE, Buffer, 6, Buffer,&Length);
IF (status != MI_ERR)
{ status = MI_OK; }
}
IF (status == MI_OK)
{
Buffer[0] = PICC_TRANSFER;
Buffer[1] = addr;
CalulateCRC (Buffer, 2,&Buffer[2]);
status = MFRC522_ComMF522 (MFRC522_TRANSCEIVE, Buffer, 4, Buffer,&Length);
IF ((status != MI_OK) || (Length != 4) || ((Buffer[0]&0x0F) != 0x0A) )
{ status = MI_ERR; }
}
RETURN status;
}
uint8_t MFRC522_BakValue(uint8_t sourceaddr, uint8_t goaladdr)
{
uint8_t status;
uint16_t Length;
uint8_t Buffer[MAXRLEN];
Buffer[0] = PICC_RESTORE;
Buffer[1] = sourceaddr;
CalulateCRC (Buffer, 2,&Buffer[2]) ;
status = MFRC522_ComMF522 (MFRC522_TRANSCEIVE, Buffer, 4, Buffer,&Length);
IF ((status != MI_OK) || (Length != 4) || ((Buffer[0]&0x0F) != 0x0A) )
{ status = MI_ERR; }
IF (status == MI_OK)
{
Buffer[0] = 0;
Buffer[1] = 0;
Buffer[2] = 0;
Buffer[3] = 0;
CalulateCRC (Buffer, 4,&Buffer[4]) ;
status = MFRC522_ComMF522 (MFRC522_TRANSCEIVE, Buffer, 6, Buffer,&Length);
IF (status != MI_ERR)
{ status = MI_OK; }
}
IF (status != MI_OK)
{ RETURN MI_ERR; }
Buffer[0] = PICC_TRANSFER;
Buffer[1] = goaladdr;
CalulateCRC (Buffer, 2,&Buffer[2]) ;
status = MFRC522_ComMF522 (MFRC522_TRANSCEIVE, Buffer, 4, Buffer,&Length);
IF ((status != MI_OK) || (Length != 4) || ((Buffer[0]&0x0F) != 0x0A) )
{ status = MI_ERR; }
RETURN status;
}
uint8_t MFRC522_Halt(VOID)
{
uint8_t status;
uint16_t Length;
uint8_t Buffer[MAXRLEN];
Buffer[0] = PICC_HALT;
Buffer[1] = 0;
CalulateCRC (Buffer, 2,&Buffer[2]) ;
status = MFRC522_ComMF522 (MFRC522_TRANSCEIVE, Buffer, 4, Buffer,&Length);
RETURN MI_OK;
}
void CalulateCRC(uint8_t *pIndata,uint8_t len,uint8_t *pOutData)
{
uint8_t i, n;
ClearBitMask (DIV_IRQ_REGISTER, 0x04) ;
MFRC522_WriteRegister (COMMAND_REGISTER, MFRC522_IDLE) ;
SetBitMask (FIFO_LEVEL_REGISTER, 0x80) ;
FOR (i = 0; i < len; i++)
{ MFRC522_WriteRegister (FIFO_DATA_REGISTER, * (pIndata + i)); }
MFRC522_WriteRegister (COMMAND_REGISTER, MFRC522_CALCCRC);
i = 0xFF;
DO
{
n = MFRC522_ReadRegister (DIV_IRQ_REGISTER);
i--;
}
WHILE ((i != 0)&& ! (n&0x04));
pOutData[0] = MFRC522_ReadRegister (CRC_RESULT_L_REGISTER);
pOutData[1] = MFRC522_ReadRegister (CRC_RESULT_M_REGISTER);
}
uint8_t MFRC522_Reset(VOID)
{
output_bit (MF522_RST, 1) ;
delay_us (1);
output_bit (MF522_RST, 0) ;
delay_us (1);
output_bit (MF522_RST, 1) ;
delay_us (1);
MFRC522_WriteRegister (COMMAND_REGISTER, MFRC522_RESETPHASE) ;
delay_us (1);
MFRC522_WriteRegister (MODE_REGISTER, 0x3D);
MFRC522_WriteRegister (TIMER_RELOAD_L_REGISTER, 30);
MFRC522_WriteRegister (TIMER_RELOAD_H_REGISTER, 0) ;
MFRC522_WriteRegister (TMODE_REGISTER, 0x8D) ;
MFRC522_WriteRegister (TIMER_PRESCALER_REGISTER, 0x3E) ;
MFRC522_WriteRegister (TX_ASK_REGISTER, 0x40) ;
RETURN MI_OK;
}
uint8_t MFRC522_ReadRegister(uint8_t Address)
{
uint8_t i, ucAddr;
uint8_t ucResult = 0;
output_bit (MF522_SCK, 0);
output_bit (MF522_NSS, 0);
ucAddr = ( (Address<<1)&0x7E)|0x80;
//Write spi
FOR (i = 8; i > 0; i--)
{
output_bit (MF522_SI, ((ucAddr&0x80) == 0x80));
output_bit (MF522_SCK, 1);
ucAddr <<= 1;
output_bit (MF522_SCK, 0);
}
//SPI read
FOR (i = 8; i > 0; i--)
{
output_bit (MF522_SCK, 1);
ucResult <<= 1;
ucResult|= (INT1) input (MF522_SO);
output_bit (MF522_SCK, 0);
}
output_bit (MF522_NSS, 1);
output_bit (MF522_SCK, 1);
RETURN ucResult;
}
void MFRC522_WriteRegister(uint8_t Address, uint8_t value)
{
uint8_t i, ucAddr;
output_bit (MF522_SCK, 0);
output_bit (MF522_NSS, 0);
ucAddr = ( (Address<<1)&0x7E);
FOR (i = 8; i > 0; i--)
{
output_bit (MF522_SI, ( (ucAddr&0x80) == 0x80));
output_bit (MF522_SCK, 1);
ucAddr <<= 1;
output_bit (MF522_SCK, 0);
}
FOR (i = 8; i > 0; i--)
{
output_bit (MF522_SI, ( (value&0x80) == 0x80));
output_bit (MF522_SCK, 1);
value <<= 1;
output_bit (MF522_SCK, 0);
}
output_bit (MF522_NSS, 1);
output_bit (MF522_SCK, 1);
}
void SetBitMask(uint8_t reg,uint8_t mask)
{
uint8_t tmp = 0x0;
tmp = MFRC522_ReadRegister (reg);
MFRC522_WriteRegister (reg, tmp|mask); // set bit mask
}
void ClearBitMask(uint8_t reg,uint8_t mask)
{
uint8_t tmp = 0x0;
tmp = MFRC522_ReadRegister (reg);
MFRC522_WriteRegister (reg, tmp&~mask); // clear bit mask
}
uint8_t MFRC522_ComMF522(uint8_t Command,
uint8_t * pInData,
uint8_t InLenByte,
uint8_t * pOutData,
uint16_t * pOutLenBit)
{
uint8_t status = MI_ERR;
uint8_t irqEn = 0x00;
uint8_t waitFor = 0x00;
uint8_t lastBits;
uint8_t n;
uint16_t i;
SWITCH (Command)
{
CASE MFRC522_AUTHENT:
irqEn = 0x12;
waitFor = 0x10;
BREAK;
CASE MFRC522_TRANSCEIVE:
irqEn = 0x77;
waitFor = 0x30;
BREAK;
DEFAULT:
BREAK;
}
MFRC522_WriteRegister (IE_REGISTER, irqEn|0x80) ;
ClearBitMask (IRQ_REGISTER, 0x80) ;
MFRC522_WriteRegister (COMMAND_REGISTER, MFRC522_IDLE) ;
SetBitMask (FIFO_LEVEL_REGISTER, 0x80) ;
FOR (i = 0; i < InLenByte; i++)
{
MFRC522_WriteRegister (FIFO_DATA_REGISTER, pInData[i]);
}
MFRC522_WriteRegister (COMMAND_REGISTER, Command);
IF (Command == MFRC522_TRANSCEIVE)
{ SetBitMask (BIT_FRAMING_REGISTER, 0x80); }
i = 600; //25ms
DO
{
n = MFRC522_ReadRegister (IRQ_REGISTER);
i--;
}
WHILE ((i != 0)&& ! (n&0x01) && ! (n&waitFor));
ClearBitMask (BIT_FRAMING_REGISTER, 0x80) ;
IF (i != 0)
{
if ( ! (MFRC522_ReadRegister (ERROR_REGISTER)&0x1B))
{
status = MI_OK;
IF (n&irqEn&0x01)
{
status = MI_NOTAGERR;
}
IF (Command == MFRC522_TRANSCEIVE)
{
n = MFRC522_ReadRegister (FIFO_LEVEL_REGISTER);
lastBits = MFRC522_ReadRegister (CONTROL_REGISTER)&0x07;
IF (lastBits)
{
* pOutLenBit = (n - 1) * 8 + lastBits;
}
ELSE
{
* pOutLenBit = n*8;
}
IF (n == 0)
{
n = 1;
}
IF (n > MAXRLEN)
{
n = MAXRLEN;
}
FOR (i = 0; i < n; i++)
{
pOutData[i] = MFRC522_ReadRegister (FIFO_DATA_REGISTER);
}
}
}
ELSE
{
status = MI_ERR;
}
}
SetBitMask (CONTROL_REGISTER, 0x80); // stop timer now
MFRC522_WriteRegister (COMMAND_REGISTER, MFRC522_IDLE);
RETURN status;
}
void MFRC522_AntennaOn ()
{
uint8_t i;
i = MFRC522_ReadRegister (TX_CONTROL_REGISTER);
IF (! (i&0x03))
{
SetBitMask (TX_CONTROL_REGISTER, 0x03);
}
}
VOID MFRC522_AntennaOff ()
{
ClearBitMask (TX_CONTROL_REGISTER, 0x03);
} |
mfrc522.h
Code: | #ifndef __MFRC522_H
#define __MFRC522_H
#include "mfrc522.h"
uint8_t MFRC522_Reset(void);
void MFRC522_AntennaOn(void);
void MFRC522_AntennaOff(void);
uint8_t MFRC522_Request(uint8_t req_code,uint8_t *pTagType);
uint8_t MFRC522_Anticoll(uint8_t *pSnr);
uint8_t MFRC522_Select(uint8_t *pSnr);
uint8_t MFRC522_AuthState(uint8_t auth_mode,uint8_t addr,uint8_t *pKey,uint8_t *pSnr);
uint8_t MFRC522_Read(uint8_t addr,uint8_t *pData);
uint8_t MFRC522_Write(uint8_t addr,uint8_t *pData);
uint8_t MFRC522_Value(uint8_t dd_mode,uint8_t addr,uint8_t *pValue);
uint8_t MFRC522_BakValue(uint8_t sourceaddr, uint8_t goaladdr);
uint8_t MFRC522_Halt(void);
uint8_t MFRC522_ComMF522(uint8_t Command,
uint8_t *pInData,
uint8_t InLenByte,
uint8_t *pOutData,
uint16_t *pOutLenBit);
void CalulateCRC(uint8_t *pIndata,uint8_t len,uint8_t *pOutData);
void MFRC522_WriteRegister(uint8_t Address,uint8_t value);
uint8_t MFRC522_ReadRegister(uint8_t Address);
void SetBitMask(uint8_t reg,uint8_t mask);
void ClearBitMask(uint8_t reg,uint8_t mask);
/*********************************************************************************
*********************************************************************************/
//MF522 Command word
#define MFRC522_IDLE 0x00
#define MFRC522_AUTHENT 0x0E
#define MFRC522_RECEIVE 0x08
#define MFRC522_TRANSMIT 0x04
#define MFRC522_TRANSCEIVE 0x0C
#define MFRC522_RESETPHASE 0x0F
#define MFRC522_CALCCRC 0x03
// Mifare_One card command word
#define PICC_REQIDL 0x26
#define PICC_REQALL 0x52
#define PICC_ANTICOLL1 0x93
#define PICC_ANTICOLL2 0x95
#define PICC_AUTHENT1A 0x60
#define PICC_AUTHENT1B 0x61
#define PICC_READ 0x30
#define PICC_WRITE 0xA0
#define PICC_DECREMENT 0xC0
#define PICC_INCREMENT 0xC1
#define PICC_RESTORE 0xC2
#define PICC_TRANSFER 0xB0
#define PICC_HALT 0x50
#define DEF_FIFO_LENGTH 64 //FIFO size=64byte
//------------------MFRC522 Register---------------
// PAGE 0
#define RFU00 0x00
#define COMMAND_REGISTER 0x01
#define IE_REGISTER 0x02
#define DIV_IE_REGISTER 0x03
#define IRQ_REGISTER 0x04
#define DIV_IRQ_REGISTER 0x05
#define ERROR_REGISTER 0x06
#define STATUS1_REGISTER 0x07
#define STATUS2_REGISTER 0x08
#define FIFO_DATA_REGISTER 0x09
#define FIFO_LEVEL_REGISTER 0x0A
#define WATER_LEVEL_REGISTER 0x0B
#define CONTROL_REGISTER 0x0C
#define BIT_FRAMING_REGISTER 0x0D
#define COLLISION_REGISTER 0x0E
#define RFU0F 0x0F
// PAGE 1
#define RFU10 0x10
#define MODE_REGISTER 0x11
#define TX_MODE_REGISTER 0x12
#define RX_MODE_REGISTER 0x13
#define TX_CONTROL_REGISTER 0x14
#define TX_ASK_REGISTER 0x15
#define TX_SEL_REGISTER 0x16
#define RX_SEL_REGISTER 0x17
#define RX_THRESHOLD_REGISTER 0x18
#define DEMOD_REGISTER 0x19
#define RFU1A 0x1A
#define RFU1B 0x1B
#define MIFARE_REGISTER 0x1C
#define RFU1D 0x1D
#define RFU1E 0x1E
#define SERIAL_SPEED_REGISTER 0x1F
// PAGE 2
#define RFU20 0x20
#define CRC_RESULT_M_REGISTER 0x21
#define CRC_RESULT_L_REGISTER 0x22
#define RFU23 0x23
#define MOD_WIDTH_REGISTER 0x24
#define RFU25 0x25
#define RF_CONFIG_REGISTER 0x26
#define GSN_REGISTER 0x27
#define CWF_CONFIG_REGISTER 0x28
#define MODGS_CONFIG_REGISTER 0x29
#define TMODE_REGISTER 0x2A
#define TIMER_PRESCALER_REGISTER 0x2B
#define TIMER_RELOAD_H_REGISTER 0x2C
#define TIMER_RELOAD_L_REGISTER 0x2D
#define TIMER_VALUE_H_REGISTER 0x2E
#define TIMER_VALUE_L_REGISTER 0x2F
// PAGE 3
#define RFU30 0x30
#define TEST_SEL_1_REGISTER 0x31
#define TEST_SEL_2_REGISTER 0x32
#define TEST_PIN_EN_REGISTER 0x33
#define TEST_PIN_VALUE_REGISTER 0x34
#define TEST_BUS_REGISTER 0x35
#define AUTO_TEST_REGISTER 0x36
#define VERSION_REGISTER 0x37
#define ANALOG_TEST_REGISTER 0x38
#define TEST_ADC1_REGISTER 0x39
#define TEST_ADC2_REGISTER 0x3A
#define TEST_ADC_REGISTER 0x3B
#define RFU3C 0x3C
#define RFU3D 0x3D
#define RFU3E 0x3E
#define RFU3F 0x3F
//And MF522 The error code is returned when communication
#define MI_OK 0
#define MI_NOTAGERR 1
#define MI_ERR 2
#endif
|
main.c
Code: | #include <16F877A.h>
#device ADC=10
#FUSES NOWDT //No Watch Dog Timer
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used FOR I/O
#use delay(crystal=12MHz)
#define DELAY 10
#define RC PIN_E0
#define LCD_ENABLE_PIN PIN_D2
#define LCD_RS_PIN PIN_D0
#define LCD_RW_PIN PIN_D1
#define LCD_DATA4 PIN_D4
#define LCD_DATA5 PIN_D5
#define LCD_DATA6 PIN_D6
#define LCD_DATA7 PIN_D7
/*
SPI SS RFID-RC522(SDA) - SlaveSelect (SS)
SPI SDI RFID-RC522(MOSI)
SPI SDO RFID-RC522(MISO)
SPI SCK RFID-RC522(SCK)
*/
#define MF522_NSS PIN_E2
#define MF522_SCK PIN_C3
#define MF522_SI PIN_C4
#define MF522_SO PIN_C5
#define MF522_RST PIN_E0
#include <LCD_TM.c>
//#include <Built_in.h>
typedef SIGNED char int8_t;
typedef SIGNED int int16_t;
typedef SIGNED long int32_t;
typedef UNSIGNED char uint8_t;
typedef UNSIGNED int uint16_t;
typedef UNSIGNED long uint32_t;
typedef float FLOAT32_t;
#include "mfrc522.c"
uint8_t data2[4] = {0x12,0,0,0};
uint8_t DefaultKey[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
uint8_t g_ucTempbuf[20];
void main()
{
uint8_t status;
uint8_t TempStr[30];
uint8_t Str[30];
lcd_init ();
//printf (LCD_PUTC, "\f MuaLinhKien.Vn \nPIC 16 / 18 Basic Kit");
status = MFRC522_Write (1, Str);
printf (LCD_PUTC, "\n %4x", status);
status = MFRC522_BakValue (1, 2);
status = MFRC522_Value (PICC_DECREMENT, 1, data2);
MFRC522_Reset () ;
MFRC522_AntennaOff ();
MFRC522_AntennaOn ();
delay_ms (2000);
// printf (LCD_PUTC, "%2X", status);
WHILE (true)
{
//REQUEST
status = MFRC522_Request (PICC_REQALL, g_ucTempbuf);
printf (LCD_PUTC, "\n %4x", status);
IF (status != MI_OK)
{
//LED_GREEN = 1;
CONTINUE;
}
//LED_GREEN = 0;
status = MFRC522_Anticoll (g_ucTempbuf);
IF (status != MI_OK)
{
CONTINUE;
}
// printf (LCD_PUTC, "\n %4x", status);
printf (LCD_PUTC, "\fID:%2X:%2X:%2X:%2X", (uint16_t)g_ucTempbuf[0], (uint16_t) g_ucTempbuf[1], (uint16_t) g_ucTempbuf[2], (uint16_t) g_ucTempbuf[3]);
status = MFRC522_Select (g_ucTempbuf);
//LUA CHON CARD
IF (status != MI_OK)
{ CONTINUE; }
status = MFRC522_AuthState (PICC_AUTHENT1A, 1, DefaultKey, g_ucTempbuf);
IF (status != MI_OK)
{ CONTINUE; }
status = MFRC522_Read (1, g_ucTempbuf);
IF (status != MI_OK)
{ CONTINUE; }
g_ucTempbuf[15] = 0;
printf (LCD_PUTC, "\n %s", g_ucTempbuf);
MFRC522_Halt () ; //Ngu dong
}
}
|
|
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9229 Location: Greensville,Ontario
|
|
Posted: Thu Sep 24, 2015 5:55 am |
|
|
hmm.. most modules these days are 3 volt devices so connecting them to a 5 volt PIC is bad! Without seeing your hardware schematic it is very possible you've destroyed the RFID module. If the driver was written for the 877A and wired correctly then contact the creator of the driver as he is the best person to ask why it doesn't work.
If it really is a 3 volt device then use a 3 volt PIC. Most(all) PICs these days do have an 'L' version.
All this is assuming you've gotten the 1Hz LED program to run properly.
Jay |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19520
|
|
Posted: Wed Oct 07, 2015 2:34 am |
|
|
Start with you need to be using the LF4620, not the 877A.
You are over-driving the inputs of the MFRC522, and the module will not produce the output needed to drive the PIC reliably.
I see Temtronic has just made the same comment. You may well have damaged either the PIC or the device. :(
You cannot connect 3.3v devices directly to 5v devices and expect them to work (there are a few exceptions, some 3.3v devices have '5v tolerant' inputs, and some PIC inputs have a low enough threshold to be driven by 3v devices - but _not_ SPI_). It's like expecting a Diesel car to run on petrol....
So you either need to add buffering, or use the 3.3v PIC.
Unfortunately, the way the driver is written, the error code doesn't actually tell you anything, except that it didn't work. So once you have connected the 3.3v device (remember that on SPI, the SDO line on the PIC goes to the data in line on the device, and the SDI line on the PIC is fed from the data out line on the device), you need to add some diagnostics, and actually display what value you are getting back from each read. You then have a hope of starting to do some diagnostics, assuming the device is not damaged... |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|