完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
嗨,谢谢你的帮助。几天前我张贴了,但是我改变了一些事情。旧的图解:HTTPS://www. McCHIP.COM/FUMMS/M10598ASPX.RC522不与我的PIC16LF1459一起工作。我得到了错误的SPI通信,这就是为什么我重新启动一个项目。现在我有一个完美的SPI通信。当我在一个寄存器里写东西,然后读寄存器时,我得到了发送的值。我检查了一些老师的TSI SPI通信。现在,我只是想看看卡是否接近读卡器,或者如果没有卡。帮助问题:-我得到了绿色,所以它的意思是我们得到MiErr-我们得到了这个命令的0x00 08:这意味着有一个碰撞位错误,数据表说。我不知道该怎么办。
以上来自于百度翻译 以下为原文 Hi, Thanks for your help. I posted some days ago But i change some things. Old post for schematics : https://www.microchip.com/forums/m1055498.aspx The RC522 doesnt work with my PIC16LF1459. I got a wrong SPI communication, its why i restart a project. Now i have a perfect SPI communication. When i write something in a register and then i read the register, i got the value send. I check thsi SPI communication with some teachers. Now, i just try to see if a card is close to the reader or if there isnt any cards. Help for the problem : - I got the GREENLED so its mean we get MI_ERR - We got 0x0008 for this command : pound2 = ReadRegister(ERRORREG); It's mean there is a collision bit error said the datasheet. I dont know how to proceed. rc522.h #include #include #include #include #include #define GREENLED LATCbits.LATC4 #define REDLED LATCbits.LATC5 /* CARACTERISTIQUES Tension d'Alim : 3.3V Suporte ISO / IEC 14443A/MIFARE Distance maxi de fonctionnement :40 milímetres Interface SPI (Hardware ou Software) Buffer FIFO de 64 bytes Consommation 13 ~ 26mA Temperature : -25 ~ +85 */ //0x0044 = Mifare_UltraLight //0x0004 = Mifare_One (S50) //0x0002 = Mifare_One (S70) //0x0008 = Mifare_Pro (X) //0x0344 = Mifare_DESFire //MF522 Command word #define PCD_IDLE 0x00 //NO action; Cancel the current command #define PCD_AUTHENT 0x0E //Authentication Key #define PCD_RECEIVE 0x08 //Receive Data #define PCD_TRANSMIT 0x04 //Transmit data #define PCD_TRANSCEIVE 0x0C //Transmit and receive data, #define PCD_RESETPHASE 0x0F //Reset #define PCD_CALCCRC 0x03 //CRC Calculate // Mifare_One card command word #define PICC_REQIDL 0x26 // find the antenna area does not enter hibernation #define PICC_REQALL 0x52 // find all the cards antenna area #define PICC_ANTICOLL 0x93 // anti-collision #define PICC_SElECTTAG 0x93 // election card #define PICC_AUTHENT1A 0x60 // authentication key A #define PICC_AUTHENT1B 0x61 // authentication key B #define PICC_READ 0x30 // Read Block #define PICC_WRITE 0xA0 // write block #define PICC_DECREMENT 0xC0 // debit #define PICC_INCREMENT 0xC1 // recharge #define PICC_RESTORE 0xC2 // transfer block data to the buffer #define PICC_TRANSFER 0xB0 // save the data in the buffer #define PICC_HALT 0x50 // Sleep //And MF522 The error code is returned when communication #define MI_OK 0 #define MI_NOTAGERR 1 #define MI_ERR 2 //------------------MFRC522 Register--------------- //Page 0:Command and Status #define RESERVED00 0x00 // reserved for future use #define COMMANDREG 0x01 // starts and stops command execution #define COMMIENREG 0x02 // enable and disable interrupt request control bits #define DIVLENREG 0x03 // enable and disable interrupt request control bits #define COMMIRQREG 0x04 // interrupt request bits #define DIVIRQREG 0x05 // interrupt request bits #define ERRORREG 0x06 // error bits showing the error status of the last command executed #define STATUS1REG 0x07 // communication status bits #define STATUS2REG 0x08 // receiver and transmitter status bits #define FIFODATAREG 0x09 // input and output of 64 byte FIFO buffer #define FIFOLEVELREG 0x0A // number of bytes stored in the FIFO buffer #define WATERLEVELREG 0x0B // level for FIFO underflow and overflow warning #define CONTROLREG 0x0C // miscellaneous control registers #define BITFRAMINGREG 0x0D // adjustments for bit-oriented frames #define COLLREG 0x0E // bit position of the first bit-collision detected on the RF interface #define RESERVED01 0x0F // reserved for future use //PAGE 1:Command #define RESERVED10 0x10 // reserved for future use #define MODEREG 0x11 // defines general modes for transmitting and receiving #define TXMODEREG 0x12 // defines transmission data rate and framing #define RXMODEREG 0x13 // defines reception data rate and framing #define TXCONTROLREG 0x14 // controls the logical behavior of the antenna driver pins TX1 and TX2 #define TXAUTOREG 0x15 // controls the setting of the transmission modulation #define TXSELREG 0x16 // selects the internal sources for the antenna driver #define RXSELREG 0x17 // selects internal receiver settings #define RXTHRESHOLDREG 0x18 // selects thresholds for the bit decoder #define DEMODREG 0x19 // defines demodulator settings #define RESERVED11 0x1A // reserved for future use #define RESERVED12 0x1B // reserved for future use #define MFTXREG 0x1C // controls some MIFARE communication transmit parameters #define MFRXREG 0x1D // controls some MIFARE communication receive parameters #define RESERVED14 0x1E // reserved for future use #define SERIALSPEEDREG 0x1F // selects the speed of the serial UART interface //PAGE 2:CFG #define RESERVED20 0x20 // reserved for future use #define CRCRESULTREGM 0x21 // shows the MSB and LSB values of the CRC calculation #define CRCRESULTREGL 0x22 // shows the MSB and LSB values of the CRC calculation #define RESERVED21 0x23 // reserved for future use #define MODWIDTHREG 0x24 // controls the ModWidth setting #define RESERVED22 0x25 // reserved for future use #define RFCFGREG 0x26 // configures the receiver gain #define GSNREG 0x27 // selects the conductance of the antenna driver pins TX1 and TX2 for modulation #define CWGSPREG 0x28 // defines the conductance of the p-driver output during periods of no modulation #define MODGSPREG 0x29 // defines the conductance of the p-driver output during periods of modulation #define TMODEREG 0x2A // defines settings for the internal timer #define TPRESCALERREG 0x2B // defines settings for the internal timer #define TRELOADREGH 0x2C // defines the 16-bit timer reload value #define TRELOADREGL 0x2D // defines the 16-bit timer reload value #define TCOUNTERVALUEREGH 0x2E // shows the 16-bit timer value #define TCOUNTERVALUEREGL 0x2F // shows the 16-bit timer value //PAGE 3:TEST REGISTER #define RESERVED30 0x30 // reserved for future use #define TESTSEL1REG 0x31 // general test signal configuration #define TESTSEL2REG 0x32 // general test signal configuration and PRBS control #define TESTPINENREG 0x33 // enables pin output driver on pins D1 to D7 #define TESTPINVALUEREG 0x34 // defines the values for D1 to D7 when it is used as an I/O bus #define TESTBUSREG 0x35 // shows the status of the internal test bus #define AUTOTESTREG 0x36 // controls the digital self test #define VERSIONREG 0x37 // shows the software version #define ANALOGTESTREG 0x38 // controls the pins AUX1 and AUX2 #define TESTDAC1REG 0x39 // defines the test value for TestDAC1 #define TESTDAC2REG 0x3A // defines the test value for TestDAC2 #define TESTADCREG 0x3B // shows the value of ADC I and Q channels #define RESERVED31 0x3C // reserved for production tests #define RESERVED32 0x3D // reserved for production tests #define RESERVED33 0x3E // reserved for production tests #define RESERVED34 0x3F // reserved for production tests // ************************************************************* void MFRC522_Clear_Bit( char addr, char mask ); void MFRC522_Set_Bit( char addr, char mask ); void MFRC522_Reset(void); void MFRC522_AntennaOn(void); void MFRC522_AntennaOff(void); void MFRC522_Init(void); char MFRC522_ToCard( char command, char *sendData, char sendLen, char *backData, unsigned *backLen ); char MFRC522_Request( char reqMode, char *TagType ); void MFRC522_CRC( char *dataIn, char length, char *dataOut ); char MFRC522_SelectTag( char *serNum ); void MFRC522_Halt(void); char MFRC522_Auth( char authMode, char BlockAddr, char *Sectorkey, char *serNum ); char MFRC522_Write( char blockAddr, char *writeData ); char MFRC522_Read( char blockAddr, char *recvData ); char MFRC522_AntiColl( char *serNum ); char MFRC522_isCard( char *TagType ); char MFRC522_ReadCardSerial( char *str ); unsigned char MFRC_getVersion(void); void WriteRegister(uint8_t reg, uint8_t val); //void WriteAddress(uint8_t reg, uint8_t num, uint8_t* addr); uint8_t ReadRegister(uint8_t reg); //void WriteCommand(uint8_t command); //void WritePayload(uint8_t num, uint8_t* data); |
|
相关推荐
2个回答
|
|
RC522.CMANE.C
以上来自于百度翻译 以下为原文 rc522.c #include #include "rc522.h" #include #include #include #include #include #include "user.h" #include "system.h" #include "spi.h" // Write to the register void WriteRegister(uint8_t reg, uint8_t val) { CSN = 0; // CSN enable, negative logic //MSB first, first command then value SPI_transfer(( reg << 1 ) & 0x7E); SPI_transfer(val); CSN = 1; // CSN disable } /* //Address is 3-5 bytes, LSB first void WriteAddress(uint8_t reg, uint8_t num, uint8_t * addr) { CSN = 0; SPI_transfer(((reg<<1)&0x7E)| reg); for (int i=0; i CSN = 1; }*/ uint8_t ReadRegister(uint8_t reg) { uint8_t temp; uint8_t temp1; uint8_t temp2; CSN = 0; //CSN low, enable temp1 = 0x7E & reg; //temp1 = 0x80 | temp1; temp1 = temp1 | 0x80; temp2=SPI_transfer((( reg << 1 ) & 0x7E) | 0x80); //transfer command temp2=SPI_transfer(0x00); //PI_transfer(0x00); // Read the value back. Send 0 to stop reading. CSN = 1; return temp2; } /* void WriteCommand(uint8_t command) //write command word { CSN = 0; //active SPI_transfer(command); //transfer command CSN = 1; //inactive } void WritePayload(uint8_t num, uint8_t *data) { CSN = 0; SPI_transfer(TX_PAYLOAD); // transfer to the buffer for ( uint8_t i=0; i CSN = 1; // inactive //pulse CE CE = 1; __delay_us(12); // > 10 us CE = 0; }*/ static void MFRC522_Clear_Bit( char addr, char mask ) { WriteRegister( addr, ReadRegister( addr ) & (~mask) ); } static void MFRC522_Set_Bit( char addr, char mask ) { WriteRegister( addr, ReadRegister( addr ) | mask ); } void MFRC522_Reset() { WriteRegister( COMMANDREG, PCD_RESETPHASE ); } void MFRC522_AntennaOn() { MFRC522_Set_Bit( TXCONTROLREG, 0x03 ); } void MFRC522_AntennaOff() { MFRC522_Clear_Bit( TXCONTROLREG, 0x03 ); } void MFRC522_Init() { CSN = 1; //MFRC522_Rst = 1; MFRC522_Reset(); WriteRegister( TMODEREG, 0x8D ); //Tauto=1; f(Timer) = 6.78MHz/TPreScaler WriteRegister( TPRESCALERREG, 0x3E ); //TModeReg[3..0] + TPrescalerReg WriteRegister( TRELOADREGL, 30 ); WriteRegister( TRELOADREGH, 0 ); WriteRegister( TXAUTOREG, 0x40 ); //100%ASK WriteRegister( MODEREG, 0x3D ); // CRC value initial de 0x6363 //MFRC522_Clear_Bit( STATUS2REG, 0x08 );//MFCrypto1On=0 //MFRC522_Wr( RXSELREG, 0x86 ); //RxWait = RxSelReg[5..0] //MFRC522_Wr( RFCFGREG, 0x7F ); //RxGain = 48dB MFRC522_AntennaOn(); } /**************************************************************************/ /*! @brief Sends a command to a tag. @param cmd The command to the MFRC522 to send a command to the tag. @param data The data that is needed to complete the command. @param dlen The length of the data. @param result The result returned by the tag. @param rlen The number of valid bits in the resulting value. @returns Returns the status of the calculation. MI_ERR if something went wrong, MI_NOTAGERR if there was no tag to send the command to. MI_OK if everything went OK. */ /**************************************************************************/ char MFRC522_ToCard( char command, char *sendData, char sendLen, char *backData, unsigned int *backLen ) { char _status = MI_ERR; char irqEn = 0x00; char waitIRq = 0x00; char lastBits; char n; unsigned int i; int bilou; switch (command) { case PCD_AUTHENT: //Certification cards close { irqEn = 0x12; waitIRq = 0x10; break; } case PCD_TRANSCEIVE: //Transmit FIFO data { irqEn = 0x77; waitIRq = 0x30; break; } default: break; } WriteRegister( COMMIENREG, irqEn | 0x80 ); //Interrupt request MFRC522_Clear_Bit( COMMIRQREG, 0x80 ); //Clear all interrupt request bit MFRC522_Set_Bit( FIFOLEVELREG, 0x80 ); //FlushBuffer=1, FIFO Initialization WriteRegister( COMMANDREG, PCD_IDLE ); //NO action; Cancel the current command??? //Writing data to the FIFO for ( i=0; i < sendLen; i++ ) { WriteRegister( FIFODATAREG, sendData ); } //Execute the command WriteRegister( COMMANDREG, command ); if (command == PCD_TRANSCEIVE ) { MFRC522_Set_Bit( BITFRAMINGREG, 0x80 ); //StartSend=1,transmission of data starts } //Waiting to receive data to complete //i according to the clock frequency adjustment, the operator M1 card maximum waiting time 25ms??? //i = 0xFFFF; i = 25; do { //CommIrqReg[7..0] //Set1 TxIRq RxIRq IdleIRq HiAlerIRq LoAlertIRq ErrIRq TimerIRq n = ReadRegister( COMMIRQREG ); i--; } while ((i!=0) && !(n&0x01) && !(n&waitIRq)); //while ((i!=0) && !(n&0x01) && !(n&waitIRq)); //while ( i && !(n & 0x01) && !( n & waitIRq ) );^ bilou = ReadRegister( ERRORREG ); bilou = bilou & 0x1B ; MFRC522_Clear_Bit( BITFRAMINGREG, 0x80 ); //StartSend=0 if (i != 0) { if( !( ReadRegister( ERRORREG ) & 0x1B ) ) //BufferOvfl Collerr CRCErr ProtecolErr { _status = MI_OK; if ( n & irqEn & 0x01 ) { _status = MI_NOTAGERR; //?? } if ( command == PCD_TRANSCEIVE ) { n = ReadRegister( FIFOLEVELREG ); lastBits = ReadRegister( CONTROLREG ) & 0x07; if (lastBits) { *backLen = (n-1) * 8 + lastBits; } else { *backLen = n * 8; } if (n == 0) { n = 1; } if (n > 16) { n = 16; } //Reading the received data in FIFO for (i=0; i < n; i++) { backData = ReadRegister( FIFODATAREG ); } //backData = 0; } } else { _status = MI_ERR; } } //MFRC522_Set_Bit( CONTROLREG, 0x80 ); //MFRC522_Wr( COMMANDREG, PCD_IDLE ); return _status; } /**************************************************************************/ /* @brief Checks to see if there is a tag in the vicinity. @param mode The mode we are requsting in. @param type If we find a tag, this will be the type of that tag. 0x4400 = Mifare_UltraLight 0x0400 = Mifare_One(S50) 0x0200 = Mifare_One(S70) 0x0800 = Mifare_Pro(X) 0x4403 = Mifare_DESFire @returns Returns the status of the request. MI_ERR if something went wrong, MI_NOTAGERR if there was no tag to send the command to. MI_OK if everything went OK. */ /**************************************************************************/ char MFRC522_Request( char reqMode, char *TagType ) { char _status; unsigned backBits; //The received data bits WriteRegister( BITFRAMINGREG, 0x07 ); //TxLastBists = BitFramingReg[2..0] ??? TagType[0] = reqMode; _status = MFRC522_ToCard( PCD_TRANSCEIVE, TagType, 1, TagType, &backBits ); if ( (_status != MI_OK) || (backBits != 0x10) ) { _status = MI_ERR; } return _status; } /* void MFRC522_CRC( char *dataIn, char length, char *dataOut ) { char i, n; MFRC522_Clear_Bit( DIVIRQREG, 0x04 ); MFRC522_Set_Bit( FIFOLEVELREG, 0x80 ); //Escreve dados no FIFO for ( i = 0; i < length; i++ ) { WriteRegister( FIFODATAREG, *dataIn++ ); } WriteRegister( COMMANDREG, PCD_CALCCRC ); i = 0xFF; //Espera a finalização do Calculo do CRC do { n = ReadRegister( DIVIRQREG ); i--; } while( i && !(n & 0x04) ); //CRCIrq = 1 dataOut[0] = ReadRegister( CRCRESULTREGL ); dataOut[1] = ReadRegister( CRCRESULTREGM ); } char MFRC522_SelectTag( char *serNum ) { char i; char _status; char size; unsigned recvBits; char buffer[9]; //MFRC522_Clear_Bit( STATUS2REG, 0x08 ); //MFCrypto1On=0 buffer[0] = PICC_SElECTTAG; buffer[1] = 0x70; for ( i=2; i < 7; i++ ) { buffer = *serNum++; } MFRC522_CRC( buffer, 7, &buffer[7] ); _status = MFRC522_ToCard( PCD_TRANSCEIVE, buffer, 9, buffer, &recvBits ); if ( (_status == MI_OK) && (recvBits == 0x18) ) { size = buffer[0]; } else { size = 0; } return size; } //hibernation void MFRC522_Halt() { unsigned unLen; char buff[4]; buff[0] = PICC_HALT; buff[1] = 0; MFRC522_CRC( buff, 2, &buff[2] ); MFRC522_Clear_Bit( STATUS2REG, 0x80 ); MFRC522_ToCard( PCD_TRANSCEIVE, buff, 4, buff, &unLen ); MFRC522_Clear_Bit( STATUS2REG, 0x08 ); } char MFRC522_Auth( char authMode, char BlockAddr, char *Sectorkey, char *serNum ) { char _status; unsigned recvBits; char i; char buff[12]; //Verify the command block address + sector + password + card serial number buff[0] = authMode; buff[1] = BlockAddr; for ( i = 2; i < 8; i++ ) { buff = Sectorkey[i-2]; } for ( i = 8; i < 12; i++ ) { buff = serNum[i-8]; } _status = MFRC522_ToCard( PCD_AUTHENT, buff, 12, buff, &recvBits ); if ( ( _status != MI_OK ) || !( ReadRegister( STATUS2REG ) & 0x08 ) ) { _status = MI_ERR; } return _status; } char MFRC522_Write( char blockAddr, char *writeData ) { char _status; unsigned recvBits; char i; char buff[18]; buff[0] = PICC_WRITE; buff[1] = blockAddr; MFRC522_CRC( buff, 2, &buff[2] ); _status = MFRC522_ToCard( PCD_TRANSCEIVE, buff, 4, buff, &recvBits ); if ( (_status != MI_OK) || (recvBits != 4) || ( (buff[0] & 0x0F) != 0x0A) ) { _status = MI_ERR; } if (_status == MI_OK) { for ( i = 0; i < 16; i++ ) //Data to the FIFO write 16Byte { buff = writeData; } MFRC522_CRC( buff, 16, &buff[16] ); _status = MFRC522_ToCard( PCD_TRANSCEIVE, buff, 18, buff, &recvBits ); if ( (_status != MI_OK) || (recvBits != 4) || ( (buff[0] & 0x0F) != 0x0A ) ) { _status = MI_ERR; } } return _status; } char MFRC522_Read( char blockAddr, char *recvData ) { char _status; unsigned unLen; recvData[0] = PICC_READ; recvData[1] = blockAddr; MFRC522_CRC( recvData, 2, &recvData[2] ); _status = MFRC522_ToCard( PCD_TRANSCEIVE, recvData, 4, recvData, &unLen ); if ( (_status != MI_OK) || (unLen != 0x90) ) { _status = MI_ERR; } return _status; } char MFRC522_AntiColl( char *serNum ) { char _status; char i; char serNumCheck = 0; unsigned unLen; WriteRegister( BITFRAMINGREG, 0x00 ); //TxLastBists = BitFramingReg[2..0] serNum[0] = PICC_ANTICOLL; serNum[1] = 0x20; MFRC522_Clear_Bit( STATUS2REG, 0x08 ); _status = MFRC522_ToCard( PCD_TRANSCEIVE, serNum, 2, serNum, &unLen ); if (_status == MI_OK) { for ( i=0; i < 4; i++ ) { serNumCheck ^= serNum; } if ( serNumCheck != serNum[4] ) { _status = MI_ERR; } } return _status; } //0x0044 = Mifare_UltraLight //0x0004 = Mifare_One (S50) //0x0002 = Mifare_One (S70) //0x0008 = Mifare_Pro (X) //0x0344 = Mifare_DESFire char MFRC522_isCard( char *TagType ) { if (MFRC522_Request( PICC_REQIDL, TagType ) == MI_OK) return 1; else return 0; } char MFRC522_ReadCardSerial( char *str ) { char _status; _status = MFRC522_AntiColl( str ); str[5] = 0; if (_status == MI_OK) return 1; else return 0; } */ main.c /******************************************************************************/ /* Files to Include */ /******************************************************************************/ #if defined(__XC) #include #elif defined(HI_TECH_C) #include #endif #include #include #include #include "system.h" /* System funct/params, like osc/peripheral config */ #include "user.h" /* User funct/params, such as InitApp */ #include "rc522.h" #include "spi.h" /******************************************************************************/ /* User Global Variable Declaration */ /******************************************************************************/ // CONFIG1 #pragma config FOSC = INTOSC // Oscillator Selection Bits (ECH, External Clock, High Power Mode (4-20 MHz): device clock supplied to CLKIN pins) #pragma config WDTE = OFF // Watchdog Timer Enable (WDT disabled) #pragma config PWRTE = OFF // Power-up Timer Enable (PWRT disabled) #pragma config MCLRE = ON // MCLR Pin Function Select (MCLR/VPP pin function is MCLR) #pragma config CP = OFF // Flash Program Memory Code Protection (Program memory code protection is disabled) #pragma config BOREN = OFF // Brown-out Reset Enable (Brown-out Reset enabled) #pragma config CLKOUTEN = OFF // Clock Out Enable (CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin) #pragma config IESO = OFF // Internal/External Switchover Mode (Internal/External Switchover Mode is enabled) #pragma config FCMEN = OFF // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor is enabled) // CONFIG2 #pragma config WRT = OFF // Flash Memory Self-Write Protection (Write protection off) #pragma config CPUDIV = NOCLKDIV // CPU System Clock Selection Bit (CPU system clock divided by 6) #pragma config USBLSCLK = 48MHz // USB Low SPeed Clock Selection bit (System clock expects 48 MHz, FS/LS USB CLKENs divide-by is set to 8.) #pragma config PLLMULT = 3x // PLL Multipler Selection Bit (3x Output Frequency Selected) #pragma config PLLEN = DISABLED // PLL Enable Bit (3x or 4x PLL Enabled) #pragma config STVREN = OFF // Stack Overflow/Underflow Reset Enable (Stack Overflow or Underflow will cause a Reset) #pragma config BORV = LO // Brown-out Reset Voltage Selection (Brown-out Reset Voltage (Vbor), low trip point selected.) #pragma config LPBOR = OFF // Low-Power Brown Out Reset (Low-Power BOR is disabled) #pragma config LVP = OFF // Low-Voltage Programming Enable (High-voltage on MCLR/VPP must be used for programming) /******************************************************************************/ /* User Global Variable Declaration */ /******************************************************************************/ void main(void) { /* Configure the oscillator for the device */ ConfigureOscillator(); /* Initialize I/O and Peripherals for application */ SPI_init(); //WriteRegister(NRF_CONFIG, 0x00); // turn off module //CSN = 0; //Initialisation of the RFID module MFRC522_Init(); unsigned TagType; int pound; int pound2; while(1) { /* TEST */ /* WriteRegister(TMODEREG, 0x8D); //WriteRegister(TPrescalerReg, 0x3E);*/ pound = ReadRegister(TMODEREG); // TEST spi communication pound2 = ReadRegister(TPRESCALERREG); // TEST spi communication pound2 = ReadRegister(ERRORREG); /* if (pound = 0xF) { __delay_ms(200); }*/ /*FIN TEST */ if (MFRC522_Request( PICC_REQIDL, TagType ) == MI_OK) { REDLED = 1; } else if (MFRC522_Request( PICC_REQIDL, TagType ) == MI_ERR) { GREENLED = 1; } else if (MFRC522_Request( PICC_REQIDL, TagType ) == MI_NOTAGERR) { GREENLED = 1; REDLED = 1; } } } |
|
|
|
欢迎来到“真正的工作”开始,数据表和可用的代码给你提供解决冲突的所有信息(主要是找到特定卡的标识符,然后与这张卡通信)。在读者的范围内只有一张卡片。但从长远来看,你必须学会如何应对这些碰撞。
以上来自于百度翻译 以下为原文 Welcome to where the "real work" starts The datasheet and the available code gives you about everything to resolve a collision. (It's mainly about finding the identifier of a specific card, then communicating exclusively with this card.) Option: The simple way to start with would be to make sure that there's only a single card within the range of the reader. But on the long run you will have to learn how to cope with these collisions anyway. |
|
|
|
只有小组成员才能发言,加入小组>>
5083 浏览 9 评论
1956 浏览 8 评论
1892 浏览 10 评论
请问是否能把一个ADC值转换成两个字节用来设置PWM占空比?
3120 浏览 3 评论
请问电源和晶体值之间有什么关系吗?PIC在正常条件下运行4MHz需要多少电压?
2190 浏览 5 评论
638浏览 1评论
520浏览 1评论
有偿咨询,关于MPLAB X IPE烧录PIC32MX所遇到的问题
378浏览 1评论
PIC Kit3出现目标设备ID(00000000)与预期的设备ID(02c20000)不匹配。是什么原因
542浏览 0评论
444浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-10-4 09:04 , Processed in 1.160888 second(s), Total 79, Slave 63 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号