📄 main.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 + -