EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
SYD8821是具有全球领先低功耗(RX 2.4mA @-94.5dBm灵敏度,TX 4.3mA @0dBm输出功率)的蓝牙低功耗SOC芯片,在极低电流下实现了优异的射频性能,搭配176kB SRAM,512kB flash,非常适合中高阶可穿戴、智能家居、物联网等低功耗应用。 SYD8821 ISO7816接口模块说明* y4 W8 K7 @" Q4 w
SYD8821内部集成一组硬件ISO7816接口,用户可直接通过该接口与SIM卡、CPU卡、Smart卡等支持7816的卡片进行通信。本文章介绍通过8821从IC卡获取一组随机数和打印初始化相关的ATR(复位应答)信息。- J* {) m( y/ X; B+ t2 W
一、电路连接
m5 A$ Z2 w: Y* s" N! r) A * M+ y! _8 U. I1 F3 j8 p5 i6 M+ o
实物图连接
/ u" I5 w1 E, v/ d7 f8 L' h![]() 硬件设计注意:1 e5 F1 r# w( Q' K7 w! Q
(1)、7816的data这个IO需要接外部上拉电阻4.7K 二、软件工程
5 y8 D" E9 t1 u% X(1)将7816驱动文件(atr_decoder.c、sc_reader.c、tpdu.c)加载到keil工程中+ I! f9 Q& \5 W: t+ q+ L
1 U+ z) ~& b0 [$ m7 ?- v% ^
(2)相关代码: \$ e# O$ d4 A( g/ l5 ~" d
1、7816初始化" C, t J2 m( z$ i
void sc_test_init(void)
; ^. e, E5 T# f+ f7 |* M! X{
6 N$ V# f7 ~- S L# F- n, Upad_mux_write(25, 11); //VCCCTL
: J% r n. i9 i, s! zpad_mux_write(26, 11); //DET" M9 Z$ `1 G+ ^6 r& c
pad_mux_write(27, 11); //CLK! Z+ ~, h2 m2 a9 x+ Z
pad_mux_write(28, 11); //IO4 ^4 c/ t5 k3 n; A0 S
pad_mux_write(29, 11); //RST
6 {( ~5 z! G) A- ~; m6 `4 Wsc_reader_enable();
+ G' B9 m. p" i P}4 l" d& f/ Z8 X/ `) d
/* Configure module settings /
4 L) m3 a) h/ a& Gvoid sc_reader_enable(void)
. [; \, a2 d0 p7 N! x; c) q{
5 e3 b: M7 N" O2 E; JSYS_CTRL->CLK_SC_EN = 1;
\" E% u# O, `0 A, {/ Configure RESET & ACTIVATE timeout to maximum /- |/ m; O7 u5 E$ Y+ B* s- [
SC_CTRL->RESET_DURATION = 400;" U) [$ S+ u- n2 C" _( K d0 K- a
SC_CTRL->ACTIVATE_DURATION = 30;8 y! @: t- }2 Q$ h
/ Configure FIFO threshold, FIFO size is 8, set half to inform*/
A. ^0 {& E) `% O `SC_CTRL->RX_FIFO_THRESHOLD = 0x4;
' q/ U0 m ] S _. R v& J2 BSC_CTRL->TX_FIFO_THRESHOLD = 0x4;
# ]8 o% V2 z7 G3 |0 q: d9 _; K- P3 N/* Retry configuration /
9 m- c2 f8 N. m: }) NSC_CTRL->TX_RETRY_CNT = 3;3 P K% V/ D3 I% @0 c
SC_CTRL->RX_RETRY_CNT = 3;0 }! K" i& \: d& b& F4 U
/ Enable RX FIFO Timeout */& X& r& ^6 b8 K
SC_CTRL->RX_TIMEOUT_DETECT_EN = true; sc_reader_spec_default();
8 c) U0 O- t$ h6 ?0 f) I8 |" v. N/* Enable TX/RX /# A% y# `; ]' L7 Z/ J3 p
SC_CTRL->TX_ENABLE = true;
- o5 h2 `+ o1 w1 ?" |SC_CTRL->RX_ENABLE = true;: j2 _ ^7 H" D, E% }5 d Y A4 h
}
$ J% P9 }2 p' N8 ^1 C/ Reset module configuration */! G; U$ G3 ]0 M. M5 A
static void sc_reader_spec_default(void)6 J0 r" t. X3 S8 K5 }* E) l
{3 w" y7 g0 S H" D' ]
NVIC_DisableIRQ(ISO7816_IRQn);
" Q0 x& E0 }) m z5 q% Datr_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
) _/ G% e2 T+ R3 N) R' t
}
! O0 y, h( ? P* n Y+ D2、main函数' k+ M8 t- E$ j
int main(): o, ` ~) s2 \5 h; i6 V
{" v4 L0 F- r9 [4 D3 K+ V
__disable_irq();: s; K5 j. C# B4 G, ], B
ble_init();
9 B) x% J' Y4 W1 {1 a9 qsys_mcu_clock_set(MCU_CLOCK_64_MHZ);
/ U: [# `! B) k3 }( R* W// RC bumping1 }, E1 Y) ]0 T$ ^% n- Y
sys_mcu_rc_calibration();3 Y# _: @8 f5 n7 E
#ifdef USER_32K_CLOCK_RCOSC
. @! w/ P- r* I" g osys_32k_clock_set(SYSTEM_32K_CLOCK_LPO);
3 u4 c! d% ^- b. j" vdelay_ms(500);9 ]9 a6 m) J5 ?
LPOCalibration();//这是内部RC32k晶振的校准函数 经过该函数后定时器能够得到一个比较准确的值
* F! U& s4 k( z6 y0 p6 j#else
6 j$ E! N l) n. U7 l* e1 Osys_32k_clock_set(SYSTEM_32K_CLOCK_XO);
\' H2 B8 U- d3 n0 [# A0 A/ t. [#endif
! |5 H9 M! I# E/ ^: d1 W+ fgpio_init(); //gpio初始化
; L8 Z: k- P9 m9 O' S7 w5 O. h#ifdef SYD_RTT_DEBUG, O" n! w" ~# @5 I- C
DebugLogInit(); K4 {, `$ T9 j/ o
dbg_printf(“SYD RTT Init\r\n”);
; P0 O9 c: K+ p#endif7 g. q; \) n& d% K0 N
#ifdef DEBUG7 X, |: e5 W& m5 c9 n
dbg_init();% H) i7 c5 f# K1 u$ a1 R8 p" ^
PMU_CTRL->UART_EN = 1;0 q& ]) ]' s f( Z
#else" Z O+ ^$ q) v4 U4 g q) l* y
PMU_CTRL->UART_EN = 0;
# @$ G5 E% k7 N#endif
8 W5 b) [* u: A6 M#if defined(DEBUG) || defined(SYD_RTT_DEBUG)
- u4 x6 c+ r$ ?( |dbg_printf(“syd8821_2018-05-15 \r\n”);
! D$ F8 q) h2 D1 }% jdbg_printf(“SYD-TEK.Inc\r\n”);2 ?5 ?/ G4 R! l# F4 {6 C/ ]
#endif
0 ~8 v% Y6 F/ E9 x3 x__enable_irq();
9 L: D* ] \ o* ^* f. Ugap_s_adv_start();
: `. |/ r0 x( U' k#if defined(DEBUG) || defined(SYD_RTT_DEBUG)- ~: p, g+ O0 l4 W. n8 V
DBGPRINTF((“gap_s_adv_start\r\n”));( f% j) ]3 X7 C! I3 I+ ]1 M( m
#endif' Y9 R+ F$ ~7 S0 [$ Z
sc_test_init();7 F' `! J2 W# y6 D
while(1)# q' [: e- C, a* g
{
6 H: j' v3 @+ q+ h) ~+ @& _: o. tsc_reader_task();
* P# h% K4 T. q. u# _gpo_toggle(GPIO_25);//test
! q- P" d( Y# w2 T* j f} F2 m% A$ i. ~% X+ t' |
}+ Q$ C2 m7 ?, A
3、7816中断处理
1 L* F+ x0 Z9 Y7 R3 ^! }( \, v1> 8821的7816中断标志
+ D' h0 A1 e2 D% q![]()
# t: J+ B& o0 P ~' v2> 中断函数 c0 t* q1 ~' B2 B( z* x
![]()
3 I4 M3 }# J$ q0 t! H4、7816 任务处理(状态机)9 B! O4 Q: M& [' K* `
( d4 j8 F& o8 C8 t# ]. W5 E
三、获取IC卡随机数实验1 c4 Q: A c% {! W- ^# @8 N
1> 发送和接收回调实现 A+ Q1 b. u4 C2 r' C T/ v/ \' B
![]() 2> 在IC卡被激活后,即8821收到ATR并进行处理后,进行实验处理
: Y+ i1 }: w4 I" A" y/ ?![]() 3> 实验结果) H" M/ ~! g6 N6 h
串口打印# {6 x8 c$ ^" |9 a/ F6 J/ c7 R
![]()
; c$ ^, D- h- m0 C, ]# r& Q8 W6 ~- S |