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

📄 main.c

📁 This zip describes an ISO7816 configuration to read the ATR. Includes main.html file for help. For u
💻 C
字号:
//*----------------------------------------------------------------------------
//*         ATMEL Microcontroller Software Support  -  ROUSSET  -
//*----------------------------------------------------------------------------
//* The software is delivered "AS IS" without warranty or condition of any
//* kind, either express, implied or statutory. This includes without
//* limitation any warranty or condition with respect to merchantability or
//* fitness for any particular purpose, or against the infringements of
//* intellectual property rights of others.
//*----------------------------------------------------------------------------
//* File Name           : main.c
//* Object              : main application written in C
//* Creation            : ODi   06/26/2002
//*
//*----------------------------------------------------------------------------
#include <string.h>
#include <stdio.h>
#include "AT91RM9200.h"
#include "lib_AT91RM9200.h"

#define printf	AT91F_DBGU_Printk

/*----------------------------*/
/* Answer To Reset Definition */
/*----------------------------*/
extern void AT91F_DBGU_Printk(char *);

char AT91F_ISO_GetChar()
{
	while (
		(!AT91F_US_RxReady(AT91C_BASE_US0)) &
		(!AT91F_US_RxReady((AT91PS_USART)AT91C_BASE_DBGU))
	
	);
	return AT91F_US_GetChar(AT91C_BASE_US0);
}

int main()
{
	unsigned int i, j, y;
	char atr[30];
	char msg[80];

	AT91F_US_EnableRx((AT91PS_USART) AT91C_BASE_DBGU);
	
	printf("-I- ======================================\n\r");
	printf("-I- AT91RM9200 basic ISO7816 example\n\r");
	printf("-I- --------------------------------------\n\r");
	printf("-I- Plug a Class A SC, ATR will be read\n\r");
	printf("-I- ======================================\n\r");

	// Open PIO & PMC for USART0: ISO7816
	AT91F_PIO_CfgPeriph(AT91C_BASE_PIOA, (AT91C_PIO_PA19 | AT91C_PIO_PA17), 0);


	// Configure PA21 (5V/3V) in output to select Class A SC (5V)
	AT91F_PIO_CfgOutput(AT91C_BASE_PIOA, AT91C_PIO_PA21);
	AT91F_PIO_SetOutput(AT91C_BASE_PIOA, AT91C_PIO_PA21);

	// Configure PA20 (RESET) in output low level
	AT91F_PIO_CfgOutput(AT91C_BASE_PIOA, AT91C_PIO_PA20);
	AT91F_PIO_ClearOutput(AT91C_BASE_PIOA, AT91C_PIO_PA20);

	// Configure PC14 as input (signal !READY of the SC reader)
	AT91F_PMC_EnablePeriphClock(AT91C_BASE_PMC, ((unsigned int) 1 << AT91C_ID_PIOC));
	AT91F_PIO_CfgInput (AT91C_BASE_PIOC, AT91C_PIO_PC14);
	
	while (1) {
		 AT91F_US_GetChar((AT91PS_USART)AT91C_BASE_DBGU);
	
		// Wait for a connection
		while (AT91F_PIO_GetInput(AT91C_BASE_PIOC) & AT91C_PIO_PC14);
		printf("-I- Smart cart detected\n\r");

		// Configure USART0
		AT91F_US0_CfgPMC();
		AT91F_US_Configure (AT91C_BASE_US0, 60000000, AT91C_US_ISO_READER_MODE, 9600, 0);
		AT91C_BASE_US0->US_BRGR = 0x3c; /// 60MHz/60 = 1MHz
		AT91F_US_EnableRx(AT91C_BASE_US0);
		AT91F_US_EnableTx(AT91C_BASE_US0);
	
		// Wait for 1 sec
		//tick = *(AT91C_ST_CRTR) + 2;
		//while (tick != *(AT91C_ST_CRTR));
	
		// Configure PA20 (RESET) in output high level
		AT91F_PIO_CfgOutput(AT91C_BASE_PIOA, AT91C_PIO_PA20);
		AT91F_PIO_SetOutput(AT91C_BASE_PIOA, AT91C_PIO_PA20);
		
		i = 0;
		// Read ATR TS
		atr[i++] = AT91F_ISO_GetChar();
		// Read ATR T0
		atr[i] = AT91F_ISO_GetChar();
		y = atr[i++] & 0xF0;
		
		// Read ATR Ti
		while (y) {
			if (y & 0x10)   // TA[i]
				atr[i++] = AT91F_ISO_GetChar();
			if (y & 0x20)   // TB[i]
				atr[i++] = AT91F_ISO_GetChar();
			if (y & 0x30)   // TC[i]
				atr[i++] = AT91F_ISO_GetChar();
			if (y & 0x40) { // TD[i]
				atr[i] = AT91F_ISO_GetChar();
				y =  atr[i++] & 0xF0;
			}
			else
				y = 0;
		}
		
		printf("ATR = ");
		for (j = 0; j < i; ++j) {
			sprintf(msg, "%02x ", atr[j]);
			printf(msg);
		}
		printf("\n\r");
		
		// Wait for a de-connection
		while ( !(AT91F_PIO_GetInput(AT91C_BASE_PIOC) & AT91C_PIO_PC14) );
		printf("-I- Smart cart disconnected\n\r");
		// Clear the reset
		AT91F_PIO_ClearOutput(AT91C_BASE_PIOA, AT91C_PIO_PA20);
	}
}

⌨️ 快捷键说明

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