EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
SYD8821是具有全球领先低功耗(RX 2.4mA @-94.5dBm灵敏度,TX 4.3mA @0dBm输出功率)的蓝牙低功耗SOC芯片,在极低电流下实现了优异的射频性能,搭配176kB SRAM,512kB flash,非常适合中高阶可穿戴、智能家居、物联网等低功耗应用。 SYD8821 ISO7816接口模块说明
9 ^7 b" L! ^6 i4 z ]! RSYD8821内部集成一组硬件ISO7816接口,用户可直接通过该接口与SIM卡、CPU卡、Smart卡等支持7816的卡片进行通信。本文章介绍通过8821从IC卡获取一组随机数和打印初始化相关的ATR(复位应答)信息。. i" m: s+ `" v) y) c2 \# _% f6 r
一、电路连接. n) _* f. h2 j. M6 c* g( r0 W, X' L
+ N9 H% L7 E7 s
实物图连接
9 Y3 R0 M2 a. P5 ?' e' D![]() 硬件设计注意:$ _0 ]7 ^4 i7 `4 X7 ~
(1)、7816的data这个IO需要接外部上拉电阻4.7K 二、软件工程
* d9 b' h8 r1 V* I& }(1)将7816驱动文件(atr_decoder.c、sc_reader.c、tpdu.c)加载到keil工程中! @# V- Q, f, B# a
: H) N5 c8 k2 S) P! q$ u+ s* j
(2)相关代码
8 y) Z6 P! [* l% n3 r4 A( a1、7816初始化
: @# T5 l# F% F, v. h3 W) P# F( s ~void sc_test_init(void)
7 t/ c& O( z' t: }0 x{
4 k; Z5 W1 x6 b' s/ kpad_mux_write(25, 11); //VCCCTL
1 h6 X3 [2 Q# L2 Upad_mux_write(26, 11); //DET
; l0 z3 b7 ^1 e* @( Y2 p! Fpad_mux_write(27, 11); //CLK l" i: g$ m9 v' W# {
pad_mux_write(28, 11); //IO
3 U- [$ v! n w0 Mpad_mux_write(29, 11); //RST- o4 x$ |' ?! ^
sc_reader_enable();( ?$ {7 | `- A5 p% ~
}2 `7 n% Z& s: L5 Q- F5 p" o
/* Configure module settings /. j& I& D% \9 O
void sc_reader_enable(void) G! u z% @# X2 Y$ r# D
{
. R! j# @, j" U2 a% _SYS_CTRL->CLK_SC_EN = 1;5 Y" A/ G% E1 n; ~: `) X
/ Configure RESET & ACTIVATE timeout to maximum /
, [' |* ^7 \2 U- z; ]0 X. w$ L1 ~SC_CTRL->RESET_DURATION = 400; @" j7 Q9 u) V' G- m+ T9 q$ W. p
SC_CTRL->ACTIVATE_DURATION = 30;) Q# w; ^3 |% d! v
/ Configure FIFO threshold, FIFO size is 8, set half to inform*/- u6 f3 x. Z$ n# x! J* w
SC_CTRL->RX_FIFO_THRESHOLD = 0x4;% y, m6 V T) N" e2 ^. p$ g5 D
SC_CTRL->TX_FIFO_THRESHOLD = 0x4;' g/ U' f+ P1 |5 Z6 F; U; Q
/* Retry configuration /
6 F: q: z2 |9 v4 vSC_CTRL->TX_RETRY_CNT = 3;
9 T' h5 z2 W# `" f3 gSC_CTRL->RX_RETRY_CNT = 3;
' f9 @) R* D" C/ Enable RX FIFO Timeout */! Z1 V$ W2 @7 _( J: [
SC_CTRL->RX_TIMEOUT_DETECT_EN = true; sc_reader_spec_default();
( ~; X7 p5 A Y# e/* Enable TX/RX /0 L7 M& U3 r4 Y6 B5 H; {; K
SC_CTRL->TX_ENABLE = true;
8 N( |" o) B9 G0 m! \8 oSC_CTRL->RX_ENABLE = true;
" C9 q/ K' ^% G. H( [+ Q. |0 n$ K" T} u2 }* ?' f: U3 d) ~4 E4 @$ D- |
/ Reset module configuration */; A3 V' ]) r" ]3 P! N
static void sc_reader_spec_default(void); r8 M! A5 E* d3 \, K2 \
{2 `- y( ~% U% ?6 X6 y: m
NVIC_DisableIRQ(ISO7816_IRQn);
6 h! }8 b0 l6 I' K1 xatr_reset(); SC_CTRL->EXTRA_GUARD_TIME = 0;sc_reader_set_FD(0x01);SC_CTRL->CLK_STOP_EN = false;card_clock_stoppable = false;/* Reset RX queue for ATR*/queue_reset(&sc_queue);sc_reader_enable_retry();/* Enable SC Interrupt */SC_CTRL->INTS_EN = RX_FIFO_INT | ATR_DONE | ATR_FAIL | CARD_DETECT | CARD_REMOVE | DEACTIVATE | TX_RETRY_OVER_LIMIT | RX_RETRY_OVER_LIMIT;/* Set clk to <= 5MHz */{ // Source by PCLK uint32_t clk = 64000000 / 2; clk /= 5000000; sc_reader_config_clock_div((uint16_t)clk);}/* Clear Pending Interrupt */SC_CTRL->INTS_STATE = SC_INT_ALL;NVIC_EnableIRQ(ISO7816_IRQn);- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27' ]. P o7 W1 s, \2 v+ Y9 ^7 W
}
5 c4 h9 x' Z: ^: Q% e/ Q3 K8 p2、main函数
% q2 K. I9 w4 a. Q! \int main()6 X L" B4 d6 `7 i
{
$ M4 w _/ s2 b1 O__disable_irq();6 ^& g) O: @0 V8 G* g
ble_init();1 c! J X- Q6 K) \ D2 A4 \* L2 [
sys_mcu_clock_set(MCU_CLOCK_64_MHZ);. m( S. g; K% S
// RC bumping
b( \8 `( d) W' P. U& ? X, zsys_mcu_rc_calibration();, e$ ]. l- N; X$ P1 c b7 \
#ifdef USER_32K_CLOCK_RCOSC1 e" J2 L, P+ U; i: B
sys_32k_clock_set(SYSTEM_32K_CLOCK_LPO);4 V4 X. n. h0 t D* c) b- l3 ^
delay_ms(500);
" _+ R. \$ x7 m/ [LPOCalibration();//这是内部RC32k晶振的校准函数 经过该函数后定时器能够得到一个比较准确的值
0 X' t9 s; N H) H0 w#else# Y' w- Q) r. `2 \2 c" \6 R: O$ D
sys_32k_clock_set(SYSTEM_32K_CLOCK_XO);6 y; \" W* K8 _4 W( t
#endif' `; G, }" q7 `7 F/ t/ Z7 | r0 ^
gpio_init(); //gpio初始化
: W' o9 D" W: `. T6 b' K# O#ifdef SYD_RTT_DEBUG
# Y9 U T1 v: G% e* F+ nDebugLogInit();- i: m& N8 H; @3 N$ X
dbg_printf(“SYD RTT Init\r\n”);9 _) |& b5 F1 z. {: P% r% b
#endif
' F( [. W1 |. o- g4 }+ [#ifdef DEBUG/ F5 X+ ?; B9 z- g
dbg_init();
# m3 \0 h, n3 N/ d% @" N5 nPMU_CTRL->UART_EN = 1;: f; B- p$ |8 Q5 ^: N4 i; D
#else
) r! ]/ s1 o; U+ w( j6 `PMU_CTRL->UART_EN = 0;
" R- _0 h. d4 W t% n#endif4 Q% K% F4 C7 B3 S5 g: U# n
#if defined(DEBUG) || defined(SYD_RTT_DEBUG)1 M" _$ D# g; T) D+ `
dbg_printf(“syd8821_2018-05-15 \r\n”);
" N( t2 m% o% O5 f' m% C3 rdbg_printf(“SYD-TEK.Inc\r\n”);
% ~0 `' m+ D# o2 c4 a' k#endif7 ]# W' B5 b0 u; c# Z
__enable_irq();
; ]+ ^3 N% ?+ ]4 {gap_s_adv_start();* W$ m5 M& G1 p: [- N# m e
#if defined(DEBUG) || defined(SYD_RTT_DEBUG); u/ L' ~- o; d6 V
DBGPRINTF((“gap_s_adv_start\r\n”));' C7 ?2 B& o$ K; q$ g: U
#endif
2 D/ f& r; G: w7 H* Rsc_test_init();
0 \% }. `- W/ w/ O6 e& ?' v. Gwhile(1)
/ ~* W5 w+ w7 M$ E4 {{! S; N3 F, U+ z# C# h
sc_reader_task();
5 l8 o# r5 @5 Q Egpo_toggle(GPIO_25);//test; J& T) I8 m9 R5 s9 R, R/ j
}
$ s1 K! D4 c% y; @9 x}2 \( Z2 N9 b, V2 P- P, U4 o' y
3、7816中断处理
) v+ Y, t, h6 m% d3 C% ^4 O" X1> 8821的7816中断标志
, e' n3 s3 z% {' _$ m- N![]()
9 e# V: E% m% l# y X2> 中断函数
, ]) ]* M7 |7 U' H1 f! j9 x![]()
$ s4 S y8 t( L! a& f; t4 f# S9 f) t4、7816 任务处理(状态机)
# G2 Z$ |! L. l9 y* f T4 `) f# p 4 M' h' ?* S7 `0 ^" \' |7 @
三、获取IC卡随机数实验
: |' h3 [9 W0 q% f h( `1> 发送和接收回调实现5 T- H5 n- D5 q M& {$ O* a
![]() 2> 在IC卡被激活后,即8821收到ATR并进行处理后,进行实验处理
. g% |3 m) Y y: z/ y8 W/ G![]() 3> 实验结果
! a" v! l6 _( q串口打印9 E; }; x( y- c
![]()
7 G/ m# Z) C) J5 _2 g& E/ S |