EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
SYD8821是具有全球领先低功耗(RX 2.4mA @-94.5dBm灵敏度,TX 4.3mA @0dBm输出功率)的蓝牙低功耗SOC芯片,在极低电流下实现了优异的射频性能,搭配176kB SRAM,512kB flash,非常适合中高阶可穿戴、智能家居、物联网等低功耗应用。 SYD8821 ISO7816接口模块说明- f* r) N. m, N6 s
SYD8821内部集成一组硬件ISO7816接口,用户可直接通过该接口与SIM卡、CPU卡、Smart卡等支持7816的卡片进行通信。本文章介绍通过8821从IC卡获取一组随机数和打印初始化相关的ATR(复位应答)信息。: t2 o+ ?: a: f9 k1 P# |4 U
一、电路连接$ r; J, h, ?* B9 d( d9 b) S
- _) c. s* R' K2 K/ L
实物图连接
9 G5 ^; I+ O1 |" w. i% n/ K0 _5 s![]() 硬件设计注意:! l4 S( |) F q2 v6 ]9 F4 R
(1)、7816的data这个IO需要接外部上拉电阻4.7K 二、软件工程
$ s: j- X5 ~* I4 R% Q(1)将7816驱动文件(atr_decoder.c、sc_reader.c、tpdu.c)加载到keil工程中1 i; z# G2 H7 D' n: \# v' z
![]()
" u. H8 H% _, W) z: `(2)相关代码
6 F8 d }# V& C% V; D6 r5 ^1、7816初始化
# Y/ T( J) p% v5 \! i3 evoid sc_test_init(void): R/ @' |0 g, W% Q
{
2 B. l% S! a. B; J6 j; o, G0 v; G$ Hpad_mux_write(25, 11); //VCCCTL! C! G' S2 \: A5 w2 r" [/ u# H
pad_mux_write(26, 11); //DET
5 D, I% G" }* Qpad_mux_write(27, 11); //CLK1 s0 x A3 @ m6 F. N
pad_mux_write(28, 11); //IO
' i) k- [1 @& l* F! d$ w; Tpad_mux_write(29, 11); //RST6 r! y1 W3 I0 n6 l
sc_reader_enable();
4 F1 x, h$ w( a8 @+ t}
1 c) X( x! E" t- x/* Configure module settings /5 U' h! K7 W7 y" H3 Q; n
void sc_reader_enable(void)
' R: | l) g' b* S{
4 p% ]) y) }" ?3 PSYS_CTRL->CLK_SC_EN = 1;3 p: M& F3 R3 u7 s' D2 d
/ Configure RESET & ACTIVATE timeout to maximum /
& b) x' r0 F5 p9 _SC_CTRL->RESET_DURATION = 400;$ U3 s8 Q3 f5 R4 x6 x/ @8 o! v
SC_CTRL->ACTIVATE_DURATION = 30;
9 M3 l1 m, s: x% h8 j* l2 X/ Configure FIFO threshold, FIFO size is 8, set half to inform*/
9 V% D" s/ t, n, lSC_CTRL->RX_FIFO_THRESHOLD = 0x4;+ `8 P7 x2 F s) t% |
SC_CTRL->TX_FIFO_THRESHOLD = 0x4;
0 Y5 a" P8 t4 f/ e4 v/* Retry configuration /+ V$ A s* ~: Q3 c- t8 v
SC_CTRL->TX_RETRY_CNT = 3;; V; d5 j% i3 i& |% g) v% H
SC_CTRL->RX_RETRY_CNT = 3;% |* M& M$ T7 b+ t
/ Enable RX FIFO Timeout */4 r' b* Y) L% H3 R
SC_CTRL->RX_TIMEOUT_DETECT_EN = true; sc_reader_spec_default();
8 v4 I+ O6 L! _6 U& D/* Enable TX/RX /
% c/ u3 R8 ^1 \9 G1 X/ nSC_CTRL->TX_ENABLE = true;+ J: ^ Q$ \. D7 j
SC_CTRL->RX_ENABLE = true;% z/ m+ A+ l" q8 Q
}
3 v5 o# s9 q; i J- y/ Reset module configuration */" G0 a6 n9 k! a. X- E9 p) |
static void sc_reader_spec_default(void)! P# q% S% ~0 h2 M2 ?" h% q. l
{. g$ @3 f1 l4 G
NVIC_DisableIRQ(ISO7816_IRQn);
/ l! z5 l, r2 Oatr_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
- 277 @6 D6 p' Q! G8 N3 U% z6 [
}
8 D7 E- @6 u0 X% n3 V3 Z9 o2、main函数) x/ f7 q. ]& o% {
int main(). P* k+ T/ S# X2 ^7 n8 u, a, I7 x
{
3 l+ O% z( Z3 E2 |( O2 h& [__disable_irq();
{, Y# s4 g k/ L* D6 `ble_init();
0 [5 \: }8 O0 |+ m: Vsys_mcu_clock_set(MCU_CLOCK_64_MHZ);" Z5 ^! {+ K* a5 H0 Z7 e
// RC bumping
- G: Y9 \: d& g/ p/ `sys_mcu_rc_calibration();
* F/ h+ L# ], @4 N; P#ifdef USER_32K_CLOCK_RCOSC
9 ]6 l. p. Y4 Z4 r" csys_32k_clock_set(SYSTEM_32K_CLOCK_LPO);
& r* h u" N4 J, e hdelay_ms(500);9 a5 {1 ?' b+ J D5 K
LPOCalibration();//这是内部RC32k晶振的校准函数 经过该函数后定时器能够得到一个比较准确的值8 Q" X* ]5 B. N) K, B
#else
/ e* q6 `* m0 c8 ]+ Ysys_32k_clock_set(SYSTEM_32K_CLOCK_XO);8 Y/ f$ S4 n" ~+ s' O6 z: l( d8 T+ q
#endif
+ j" F" s1 w7 H d( h. b* S* Vgpio_init(); //gpio初始化" C* q7 S3 j0 {! p
#ifdef SYD_RTT_DEBUG
+ L6 k5 f4 I+ q* C: iDebugLogInit();
% b- c* {5 K9 q. udbg_printf(“SYD RTT Init\r\n”);
6 q, l; G8 d. w1 O# z% U5 R2 P# S! \ W6 s#endif6 P# v2 N, ?5 B1 @
#ifdef DEBUG
4 l, B- _* R2 X/ k5 C/ I) odbg_init();
C7 }2 j" ~' vPMU_CTRL->UART_EN = 1; j G# L, G& E6 Y8 A: N
#else
" `1 b* W& Y5 y$ M" ~# JPMU_CTRL->UART_EN = 0;/ o. s+ r: O$ b8 f/ m" ~
#endif
6 F! q4 S1 O0 A7 `4 j#if defined(DEBUG) || defined(SYD_RTT_DEBUG)2 v, Z. k, k) X4 R# Z. |- X# c
dbg_printf(“syd8821_2018-05-15 \r\n”);
: r1 [% V- s! Y3 ]; \dbg_printf(“SYD-TEK.Inc\r\n”);
* f% X% ^* ?. {( M8 t$ b& c#endif
% A, R1 x; j- B' g# h__enable_irq();
9 o9 I; Z \5 P& [( Z: Q6 j9 wgap_s_adv_start();0 W; K) L4 l) `( Z0 Q+ J' K9 y
#if defined(DEBUG) || defined(SYD_RTT_DEBUG)7 D+ w( ?! `) P4 q0 a% a% {
DBGPRINTF((“gap_s_adv_start\r\n”));' O! P b$ \$ }0 R0 Y. h
#endif
- b) W% n! s2 A3 d6 I0 psc_test_init();! h( [7 Q. u% x- J/ }. C6 u, D
while(1)) O0 O. }1 y7 y3 t3 k7 t) e( ]% R
{
: _4 C' v7 Q8 `: J$ p% Csc_reader_task();
' I1 R4 b# f- e2 Pgpo_toggle(GPIO_25);//test; l, o- W y3 B( k0 g+ Z' _, P" ?
}
6 P$ c }9 W$ x n) L, w}: ^- Y3 V; z& k8 i0 O( C# w
3、7816中断处理
6 {& [, u& S4 X! H. z1> 8821的7816中断标志
$ r1 Y( s ?5 J![]()
( J- X. x4 F4 N" U* |7 S2> 中断函数
& u2 {1 y% `' ` k/ C 9 j$ D, ?! c1 e% }
4、7816 任务处理(状态机)7 @& @! a3 ]. ?% \+ w3 ^& }+ y! t) k
![]()
' }' ]! l. j8 q三、获取IC卡随机数实验
! X' d6 k) b. a+ j- ~- }7 Q1> 发送和接收回调实现0 B a; A* X" n* [ f* C
![]() 2> 在IC卡被激活后,即8821收到ATR并进行处理后,进行实验处理
/ Y, u! o4 l5 j# p# o![]() 3> 实验结果
$ R7 V- j. `2 [. G3 r串口打印
1 X! M4 l( `6 a. R2 f" r8 Q' q![]() . l3 |: a) N a0 g6 \
|