void MFRC522_Init(void) { MFRC522_DDR |= _BV(MFRC522_CS); MFRC522_CS_High(); //digitalWrite(NRSTPD,HIGH); MFRC522_Reset(); //Timer: TPrescaler*TreloadVal/6.78MHz = 24ms Write_MFRC522(TModeReg, 0x8D); //Tauto=1; f(Timer) = 6.78MHz/TPreScaler Write_MFRC522(TPrescalerReg, 0x3E); //TModeReg[3..0] + TPrescalerReg Write_MFRC522(TReloadRegL, 30); Write_MFRC522(TReloadRegH, 0); Write_MFRC522(TxAutoReg, 0x40); //100%ASK Write_MFRC522(ModeReg, 0x3D); //CRC0x6363 //ClearBitMask(Status2Reg, 0x08); //MFCrypto1On=0 //Write_MFRC522(RxSelReg, 0x86); //RxWait = RxSelReg[5..0] //Write_MFRC522(RFCfgReg, 0x7F); //RxGain = 48dB AntennaOn(); }
/* Function: void MFRC522_Init(void) Description: Initialize all Hardware & Software configuration in RFID Reader. */ void MFRC522_Init(void) { MFRC522_Reset(); Write_MFRC522(TModeReg, 0x8D); //Tauto=1; f(Timer) = 6.78MHz/TPreScaler Write_MFRC522(TPrescalerReg, 0x3E); //TModeReg[3..0] + TPrescalerReg Write_MFRC522(TReloadRegL, 30); Write_MFRC522(TReloadRegH, 0); Write_MFRC522(TxAutoReg, 0x40); //100%ASK Write_MFRC522(ModeReg, 0x3D); //CRC初始值0x6363 ??? AntennaOn(); //打开天线 }
void RFID::MFRC522_Init(void) { digitalWrite(NRSTPD,HIGH); MFRC522_Reset(); Write_MFRC522(TModeReg, 0x8D); //Tauto=1; f(Timer) = 6.78MHz/TPreScaler Write_MFRC522(TPrescalerReg, 0x3E); //TModeReg[3..0] + TPrescalerReg Write_MFRC522(TReloadRegL, 30); Write_MFRC522(TReloadRegH, 0); Write_MFRC522(TxAutoReg, 0x40); //100%ASK Write_MFRC522(ModeReg, 0x3D); //CRC???0x6363 ??? AntennaOn(); //???? }
MFRC522::MFRC522() { /* Set Reset pin */ MFRC522_PORT.OUTCLR = 1<<MFRC522_RESET_PIN; /* Reset on */ MFRC522_PORT.DIRSET = 1<<MFRC522_RESET_PIN; /* Set as output */ MFRC522_PORT.OUTSET = 1<<MFRC522_RESET_PIN; /* Reset off */ /* Setup SPI driver */ spi_set_master_port_dir(MFRC522_PORT); spi_cs_disable(MFRC522_PORT); spi_set_mode(MFRC522_SPI,SPI_MODE_0_gc); spi_set_dord(MFRC522_SPI,SPI_DORD_MSB_FIRST); spi_enable_master(MFRC522_SPI); /* Set SPI Baudrate */ #if (MFRC522_BAUD <= F_CPU/128) MFRC522_SPI.CTRL |= SPI_PRESCALER_DIV128_gc; #elif (MFRC522_BAUD <= F_CPU/64) MFRC522_SPI.CTRL |= SPI_PRESCALER_DIV64_gc; #elif (MFRC522_BAUD <= F_CPU/32) MFRC522_SPI.CTRL |= 1<<SPI_CLK2X_bp|SPI_PRESCALER_DIV64_gc; #elif (MFRC522_BAUD <= F_CPU/16) MFRC522_SPI.CTRL |= SPI_PRESCALER_DIV16_gc; #elif (MFRC522_BAUD <= F_CPU/8) MFRC522_SPI.CTRL |= 1<<SPI_CLK2X_bp|SPI_PRESCALER_DIV16_gc; #elif (MFRC522_BAUD <= F_CPU/4) MFRC522_SPI.CTRL |= SPI_PRESCALER_DIV4_gc; #elif (MFRC522_BAUD <= F_CPU/2) MFRC522_SPI.CTRL |= 1<<SPI_CLK2X_bp|SPI_PRESCALER_DIV4_gc; #else MFRC522_SPI.CTRL |= 1<<SPI_CLK2X_bp|SPI_PRESCALER_DIV4_gc; #endif /* Set interrupt on pin MFRC522_IRQ_PIN */ MFRC522_PORT.INT0MASK = 1<<MFRC522_IRQ_PIN; MFRC522_PORT.INTCTRL = PORT_INT0LVL_HI_gc; #if MFRC522_IRQ_PIN == 0 MFRC522_PORT.PIN0CTRL = PORT_ISC_FALLING_gc|PORT_OPC_PULLUP_gc; #elif MFRC522_IRQ_PIN == 1 MFRC522_PORT.PIN1CTRL = PORT_ISC_FALLING_gc|PORT_OPC_PULLUP_gc; #elif MFRC522_IRQ_PIN == 2 MFRC522_PORT.PIN2CTRL = PORT_ISC_FALLING_gc|PORT_OPC_PULLUP_gc; #elif MFRC522_IRQ_PIN == 3 MFRC522_PORT.PIN3CTRL = PORT_ISC_FALLING_gc|PORT_OPC_PULLUP_gc; #elif MFRC522_IRQ_PIN == 4 MFRC522_PORT.PIN4CTRL = PORT_ISC_FALLING_gc|PORT_OPC_PULLUP_gc; #elif MFRC522_IRQ_PIN == 5 MFRC522_PORT.PIN5CTRL = PORT_ISC_FALLING_gc|PORT_OPC_PULLUP_gc; #elif MFRC522_IRQ_PIN == 6 MFRC522_PORT.PIN6CTRL = PORT_ISC_FALLING_gc|PORT_OPC_PULLUP_gc; #elif MFRC522_IRQ_PIN == 7 MFRC522_PORT.PIN7CTRL = PORT_ISC_FALLING_gc|PORT_OPC_PULLUP_gc; #endif for (uint16_t i=0; i<0x7FFF; i++); /* Wait routine until oscillator is ready. t >= 37.74us */ WriteReg(REG_CommandReg,COMM_SoftReset); /* Soft Reset */ WriteReg(REG_TModeReg, 0x80); /* TAuto=1; timer starts automatically at the end of the transmission in all communication modes at all speeds */ WriteReg(REG_TPrescalerReg, 0xA9); /* TPreScaler = TModeReg[3..0]:TPrescalerReg, ie 0x0A9 = 169 => f_timer=40kHz, ie a timer period of 25us. */ WriteReg(REG_TReloadRegH, 0x03); /* Reload timer with 0x3E8 = 1000, ie 25ms before timeout. */ WriteReg(REG_TReloadRegL, 0xe8); WriteReg(REG_TxASKReg, 0x40); /* Default 0x00. Force a 100 % ASK modulation independent of the ModGsPReg register setting */ WriteReg(REG_ModeReg, 0x3D); /* Default 0x3F. Set the preset value for the CRC coprocessor for the CalcCRC command to 0x6363 (ISO 14443-3 part 6.2.4) */ AntennaOn(); }