⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cardmifare.c

📁 Source Code Source Code Source Code Source Code Source Code Source Code Source Code Source Code Sour
💻 C
字号:
/* +-------------------------------------------------------------------+ */
/* | Project : 1920.010 SCR-ALBM1 (13.56MHz MIFARE Programmer)         | */
/* | Module  : CardMifare.c                                            | */
/* | Author  : Lucio Faustinelli / Paolo Muchetti                      | */
/* | Company : AVE S.p.A. / INFOTECNICA S.r.l.                         | */
/* | Released: September, 27 2008                                      | */
/* | Revision: YZ078.00 (FW - First Official Release)                  | */
/* | Revision: YZ079.00 (EEPROM - First Official Release)              | */
/* | Revised : September 27, 2008                                      | */
/* | Revisor : AVE S.p.A. (Lucio FAUSTINELLI)                          | */
/* | Notes   : --------------                                          | */
/* +-------------------------------------------------------------------+ */
/* | Purpose : This module contains functions to find, read and write  | */
/* |           the RFID transponder Card                               | */
/* +-------------------------------------------------------------------+ */
/* | Resources: INT2_vect: Data comunication with Chip Mifare         | */
/* +-------------------------------------------------------------------+ */
/* | Functions: int main( void )                                       | */
/* |			void initBoardMifare( void )                           | */
/* |			void init_Rfid (uint8_t segnAcustico)                  | */
/* |			uint8_t getRfid (void)                                 | */
/* |			void init_Clock (void)                                 | */
/* |			void init_Port (void)                                  | */
/* |            void init_INT2 (void)                                  | */
/* |			uint8_t readBlockRfid (uint8_t block)                  | */
/* |			uint8_t gesWriteChipRfid(uint8_t rileggi, uint8_t block, uint8_t *bufData) | */
/* |            uint8_t verificaDati(uint8_t *buff1, uint8_t *buff2, uint8_t len)          | */
/* +---------------------------------------------------------------------------------------+ */

// G L O B A L
#include <stdio.h>

// L O C A L S
#include "LetExtDef.h"
#include "Spi.h"
#include "MfErrNo.h"
#include "MfRc500.h"
#include "PICCCmdConst.h"
#include "CardMifare.h"

#include <util/delay.h>
#include <string.h>

/* +-------------------------------------------------------------------+ */
/* |                        V A R I A B L E S                          | */
/* +-------------------------------------------------------------------+ */
uint8_t atq[2];
uint8_t snr[4];
uint8_t sak[1];
/*const*/ uint8_t keyA[6] = {0x08, 0x07, 0x3D, 0xC6, 0x9B, 0x4E};	// 08073DC69B4E
/*const*/ uint8_t keyB[6] = {0x24, 0x53, 0xCA, 0xF7, 0xD2, 0x39};	// 2453CAF7D239
/*const*/ uint8_t keyFF[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
uint8_t accCondition[4] = {0x78, 0x77, 0x88, 0xFF};
uint8_t bufMifare[NUM_BYTE_BLOCK];
uint8_t bufTemp[NUM_BYTE_BLOCK];
uint8_t coded_keyA[12];
uint8_t coded_keyB[12];
int8_t retunVal;
uint8_t statoChip;
uint8_t sectorAutenticato = NOT_SECTOR_AUTEN;
uint8_t offsetSectTra;

uint8_t bufAddress[4];

int8_t enableRetry;
int8_t nRetry;



//--------------------------------------------------------------------------
//	init_Rfid
//
//  -Descrizione :	Init Micro per la comunicazione con Mifare
//
//	-Parametri   :	segnAcustico --> attiva il buzzer
//
//	-Return      :  -
//--------------------------------------------------------------------------
void init_Rfid (uint8_t segnAcustico)
{
 	if ( Mf500PcdConfig()== MI_OK )
	;
/*
	{
 		if (segnAcustico)
 		{
	 		_LED_(LED_GN, 0);
	 		buzzer_on(20);
			_delay_ms(10);
			_LED_(0, LED_GN);
		}
		else
		{
	 		_LED_(LED_GN, 0);
	 		_delay_ms(200);
	 		_LED_(0, LED_GN);
	 		_delay_ms(200);
		}
	}
*/
	else if ( Mf500PcdConfig()== MI_RESETERR )
	;
/*
	{
 		if (segnAcustico)
		{
			_LED_(LED_RD, 0);
			buzzer_on(50);
			_delay_ms(100);
			buzzer_on(50);
			_delay_ms(100);
			buzzer_on(50);
			_delay_ms(100);
			_LED_(0, LED_RD);
		}
		else
		{
	 		_LED_(LED_RD, 0);
	 		_delay_ms(200);
	 		_LED_(0, LED_RD);
	 		_delay_ms(200);
		}
	}
*/
	Mf500HostCodeKey(keyA, coded_keyA);
	Mf500HostCodeKey(keyB, coded_keyB);
}

//--------------------------------------------------------------------------
//	init_INT2
//
//  -Descrizione :	Inizializzazione dell'interrupt 2
//
//	-Parametri   :	-
//
//	-Return      :  -
//--------------------------------------------------------------------------
void init_INT2 (void)
{
	// Abilitazione interrupt esterno INT 2
	EIMSK |= (1 << INT2);

	// The falling edge of INT2 generates asynchronously an interrupt request.
	EICRA |= (1 << ISC21);
	EICRA &= ~(1 << ISC20);
}
//--------------------------------------------------------------------------
//	ISR INT2
//
//  -Descrizione :	Funzione di asservimento dell'interrupt esterno INT2
//					necessaria per la gestione del MIFARE
//
//	-Parametri   :	-
//
//	-Return      :  -
//--------------------------------------------------------------------------
ISR(INT2_vect)
{
	SingleResponseIsr();
}

/* +-------------------------------------------------------------------+ */
/* | i n i t C A R D (  )                               15 Aprile 2008 | */
/* | Funzione per l'inizializzazione delle risorse e delle variabili   | */
/* | usate per la lettura di una carta transponder                     | */
/* | Parametri passati   : Nessuno                                     | */
/* | Parametri ritornati : Nessuno                                     | */
/* +-------------------------------------------------------------------+ */
void initBoardMifare( void )
{

//	TCCR1B = /*_BV( ICES1 ) |*/ _BV( CS11 ) /*| _BV( ICNC1 )*/;
//	TCCR1B &= ~( _BV( CS12 ) | _BV( CS10 ) );
//	TCCR1B = /*_BV( ICES1 ) |*/ _BV( CS11 );
//	TIMSK1 &= ~( _BV( TOIE1 ) | _BV( OCIE1A ) | _BV( OCIE1B ) ); // clear not used interrupt
//	//TIFR1 |= _BV( ICF1 );							// clear first interrupt
//	TCCR1A	= 0x00;
//	ICR1 = 0;

	init_INT2  ();	// inizializzazione INT2 usato per MIFARE
	init_SPI   ();	// inizializzazione SPI hardware

	// Reset HW al chip MIFARE
	PORTB |= (1 << RSTPD);
	_delay_ms(1);
	PORTB &= ~(1 << RSTPD);
	_delay_ms(1);

}
//--------------------------------------------------------------------------
//	getSecBlkByte
//
//  -Descrizione : 	Ricavo Settore, ID Blocco, ID Byte rispetto alla mappa AVE
//
//	-Parametri   :	Indirizzo espresso in byte della posizione nella mappa AVE
//
//	-Return      :  ADD_ERR 0 = errore indirizzo non valido
//					ADD_OK 1 = indirizzo Ok
//					ADD_CTRL_WORD 2 = Control Word
//					ADD_PROT_WORD 3 = Protection Word
//
//--------------------------------------------------------------------------
uint8_t getSecBlkByte(uint8_t addByte)
{
	uint8_t numW;
	uint8_t resto;

	numW = (addByte / N_BYTE_WORD);

	// Verifico sia nel offset corretto
	switch(numW)
	{
	case ID_WORD_AVEPINCODE:
		// Errore non si pu

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -