EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册  
 
x
 
SYD8821是具有全球领先低功耗(RX 2.4mA @-94.5dBm灵敏度,TX 4.3mA @0dBm输出功率)的蓝牙低功耗SOC芯片,在极低电流下实现了优异的射频性能,搭配176kB SRAM,512kB flash,非常适合中高阶可穿戴、智能家居、物联网等低功耗应用。 SYD8821 ISO7816接口模块说明! G: k1 \/ O% k# m4 s# X& t  w 
SYD8821内部集成一组硬件ISO7816接口,用户可直接通过该接口与SIM卡、CPU卡、Smart卡等支持7816的卡片进行通信。本文章介绍通过8821从IC卡获取一组随机数和打印初始化相关的ATR(复位应答)信息。6 o+ W6 f3 _1 _/ o 
一、电路连接 
  ~% F4 I' i3 u& O# k; K- Y![]()  
9 g! {! ^2 \1 E实物图连接 
6 v- [6 _6 s1 }5 f![]()  硬件设计注意: 
! E/ x9 b1 ?2 e7 A(1)、7816的data这个IO需要接外部上拉电阻4.7K 二、软件工程1 Q* [( C9 Q+ L" [  d 
(1)将7816驱动文件(atr_decoder.c、sc_reader.c、tpdu.c)加载到keil工程中* @, ^2 R- j& O" x5 N6 d. F; X) Q" P 
 ) D4 l0 v4 d2 J3 ?, w 
(2)相关代码 
: e7 \1 w! M! B- S2 J8 p3 n1、7816初始化' \4 r# }! W0 o* F 
void sc_test_init(void). G0 C! `# u1 O; V 
{ 
6 d- k. ~5 |" X$ b7 Z8 e5 [pad_mux_write(25, 11); //VCCCTL 
. O( p* \1 u' \2 }+ d- Kpad_mux_write(26, 11); //DET7 c& I' x6 u& T9 n! e' m 
pad_mux_write(27, 11); //CLK7 u# H7 b, [  T4 L# s 
pad_mux_write(28, 11); //IO 
* f5 H# p2 E9 dpad_mux_write(29, 11); //RST6 E& H3 ?9 w2 `2 S# m 
sc_reader_enable();1 B% b, v' b! P& V5 W: k- n 
}+ [; e  L& G" g 
/* Configure module settings /  T  W, m3 Y+ q# a 
void sc_reader_enable(void)6 x& j* C! F7 w+ Z  j 
{ 
  b8 g" Q" s% T; m% `8 M) ~, @SYS_CTRL->CLK_SC_EN = 1;- S1 q7 i+ B0 w0 b. f1 ^% ~ 
/ Configure RESET & ACTIVATE timeout to maximum /2 a6 t3 J; `9 i" i2 N, T6 ^7 Q! y( W 
SC_CTRL->RESET_DURATION = 400; 
8 |" G- }9 j+ f: |0 A3 \3 ISC_CTRL->ACTIVATE_DURATION = 30;/ X5 l  s) U  [/ @2 m 
/ Configure FIFO threshold, FIFO size is 8, set half to inform*/+ ]6 W1 q1 o3 E6 H4 g, k7 J 
SC_CTRL->RX_FIFO_THRESHOLD = 0x4; 
5 s; A; j1 H5 j* vSC_CTRL->TX_FIFO_THRESHOLD = 0x4;% r# M. X% p. O9 K+ W+ @5 M 
/* Retry configuration /- a) y, x3 z* x0 D5 l* n 
SC_CTRL->TX_RETRY_CNT = 3;0 s3 F( x8 g: n3 \; E* P. b 
SC_CTRL->RX_RETRY_CNT = 3; 
" G2 g8 l9 N5 Z/ Enable RX FIFO Timeout */2 `6 Q- m. L4 m: y; j 
SC_CTRL->RX_TIMEOUT_DETECT_EN = true; sc_reader_spec_default();8 e) h# C8 \+ q% ]0 L 
/* Enable TX/RX / 
% X9 B4 h' }3 O' N! FSC_CTRL->TX_ENABLE = true; 
% J7 Y5 s) S4 r+ }1 }  G) FSC_CTRL->RX_ENABLE = true; 
7 Z. U8 _: J- B) H}- J" q; _  X1 M 
/ Reset module configuration */ 
, P3 e4 E/ A+ _: ]% h5 Pstatic void sc_reader_spec_default(void): J& G, j& B! s( r 
{ 
! k! D8 `2 D) p, i5 ]- `NVIC_DisableIRQ(ISO7816_IRQn); 
) z! Z1 x$ X) _! [& \atr_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- f: y, V2 r" u6 W) [
 
 
 } 
/ X* H, s$ [- v- D( \# k* [7 @2、main函数 
7 ^( Q* P) L. X' ]' N: K4 ?2 Xint main() 
# ~" y, A. ?' \, p1 T8 \{* V( u( y, }1 |- G& i 
__disable_irq();' j! V7 o% w. q 
ble_init();" O6 g( z, h1 p" f( o: _* I 
sys_mcu_clock_set(MCU_CLOCK_64_MHZ);0 n# \4 ~' m8 {. V. x 
// RC bumping6 j2 O5 T: F" \ 
sys_mcu_rc_calibration(); 
+ h3 ?& _, h1 g' P" @' Q- ~) Q6 [+ F#ifdef USER_32K_CLOCK_RCOSC+ I$ T+ h  p7 B  w/ Z; b 
sys_32k_clock_set(SYSTEM_32K_CLOCK_LPO); 
; U6 e, X1 J6 _6 s' r4 n$ V3 kdelay_ms(500); 
! L& z+ e) d: Y2 ELPOCalibration();//这是内部RC32k晶振的校准函数 经过该函数后定时器能够得到一个比较准确的值 
+ C- B: Y: H* G9 [#else 
: t$ G8 a% z7 T& P( Jsys_32k_clock_set(SYSTEM_32K_CLOCK_XO);+ X, E  S( ^: }8 A; g, w 
#endif 
1 j) A" j. Z: Kgpio_init(); //gpio初始化# K$ P8 K+ v' r! m: [ 
#ifdef SYD_RTT_DEBUG4 s4 j9 f5 M+ F0 w 
DebugLogInit(); 
( w; D1 f, Z0 Tdbg_printf(“SYD RTT Init\r\n”); 
- T9 v9 d; u- J6 d1 ]' o- P#endif 
. O' z# A" \$ Y#ifdef DEBUG 
: N$ x5 ^$ K/ j+ I& J# `dbg_init(); 
" G9 |7 m' m" V* T  D  `PMU_CTRL->UART_EN = 1; 
% Z: H  `" |5 ~+ f. `/ {+ B- z#else+ b- h+ c- Q* p, f8 g* m+ L( Y 
PMU_CTRL->UART_EN = 0;9 d2 o; ]3 K& ?9 n( ^( X 
#endif: I0 P7 b2 ?/ i 
#if defined(DEBUG) || defined(SYD_RTT_DEBUG)1 ]  D4 b  u2 A; ? 
dbg_printf(“syd8821_2018-05-15 \r\n”);$ Q& M. _+ T# l3 ~& Y 
dbg_printf(“SYD-TEK.Inc\r\n”); 
: y9 q5 {5 o4 q- @+ ^6 b#endif 
  [% p" `8 a& ~  X__enable_irq();3 _' ]+ |; f: \5 {( U. [9 d" R* C+ ^ 
gap_s_adv_start(); 
5 Z" m# i3 ~7 R# g6 V#if defined(DEBUG) || defined(SYD_RTT_DEBUG)9 m' F" t& V! ]' k3 h$ N+ J7 s 
DBGPRINTF((“gap_s_adv_start\r\n”)); 
% N, Q; z6 J/ Y5 e, _#endif. }1 a3 T( s: Q( l* g 
sc_test_init();9 P8 Y( U4 ]# E$ k8 O 
while(1) 
6 z2 S$ I' Q, B  o( l& l{ 
* u5 [: L$ P( N' t. `6 _sc_reader_task(); 
$ f2 T/ D) ]- X. N  k  c( g3 ~gpo_toggle(GPIO_25);//test9 v0 H9 @6 O; n) ?3 B# |' a. y 
} 
+ l3 \+ e9 _0 _}& f8 X+ T+ I1 r0 o9 V4 Z 
3、7816中断处理2 ^2 q+ @; g! Q4 P8 I" }) V 
1> 8821的7816中断标志 
3 a2 S& m, e' Z8 F2 W6 p; `. s![]()  
/ _/ R9 G! O+ ]; o& e& d0 u5 u* w2> 中断函数 
  W6 K2 X- \; _+ @![]()  
. j& m( x0 l; n( j3 f4、7816 任务处理(状态机) 
! \& j9 ~% a3 b7 N+ O1 @& j  s " k4 V9 L& d& o4 K 
三、获取IC卡随机数实验- L6 x! x- H1 _ 
1> 发送和接收回调实现' e& r( \6 @0 @6 ]% O. J" r! n 
![]()  2> 在IC卡被激活后,即8821收到ATR并进行处理后,进行实验处理 
$ y5 n8 x" B  S* @: j+ R![]()  3> 实验结果 
( n6 K$ w* s" F; B* u串口打印8 V& O* s/ X: C2 n 
![]()  ! M* F. v/ y* F; O% N* g- { 
 |