查看: 2766|回复: 4

[求助] 关于7816demo中CLK设置问题

[复制链接]

该用户从未签到

4

主题

12

帖子

0

注册会员

Rank: 2

积分
72
最后登录
2015-4-16
发表于 2015-1-20 15:58:27 | 显示全部楼层 |阅读模式
本帖最后由 mscs13179 于 2015-1-20 16:16 编辑
  1. void main (void)
  2. {
  3.   unsigned int i,core_clk_mhz,periph_clk_mhz;     
  4.   extern int mcg_clk_hz,core_clk_khz,periph_clk_khz;
  5. #ifdef VLPR_TEST
  6.   int fast_irc_freq = 4000000;
  7.         /* auto trim internal fast IRC to 4MHz */
  8.         atc(FAST_IRC, fast_irc_freq, mcg_clk_hz);
  9.         
  10.         /* PEE -> PBE */
  11.         mcg_clk_hz = pee_pbe(CLK0_FREQ_HZ);
  12.         /* PBE -> FBE */
  13.         mcg_clk_hz = pbe_fbe(CLK0_FREQ_HZ);
  14.         /* FBE -> FBI */
  15.         mcg_clk_hz = fbe_fbi(fast_irc_freq,FAST_IRC);
  16.         /* FBI -> BLPI */
  17.         mcg_clk_hz = fbi_blpi(fast_irc_freq,FAST_IRC);   
  18.         SIM_CLKDIV1  =  0x00110000;   
  19.         core_clk_khz = mcg_clk_hz/1000;
  20.         periph_clk_khz = core_clk_khz;
  21.         /* Change UART baud rate to 19200 under VLPR mode*/
  22.         uart_init (TERM_PORT, core_clk_khz, 19200);
  23.         printf("\n In blpi mode now ready for entry into VLPR  \n\n");
  24.         enter_vlpr(0);
  25.         PORTC_PCR3 = ( PORT_PCR_MUX(1));
  26.         PORTA_PCR18 = PORT_PCR_MUX(4);//PTA18 as FTM_CLKIN0
  27. #endif
  28.         core_clk_mhz = core_clk_khz/1000;
  29.         periph_clk_mhz = periph_clk_khz/1000;
  30.       
  31.         <span style="background-color: Red;">//CPU =96M, Bus =48M
  32.         //init GPIO, refer to the Firebird Daughter card schematic
  33.         </span>
  34.         // SIM0_VEN - LCD_P33/PTC13/UART4_CTS
  35.         PORTC_PCR13 = PORT_PCR_MUX(1);
  36.         GPIOC_PDOR &= ~(SIM0_VEN_BIT); //VEN set as 0
  37.         GPIOC_PDDR |= (SIM0_VEN_BIT);
  38.          
  39.         // SIM0_RST - LCD_P39/PTC19/UART3_CTS
  40.         PORTC_PCR19 = PORT_PCR_MUX(1);
  41.         GPIOC_PDOR &= ~(SIM0_RST_BIT); //reset set as 0
  42.         GPIOC_PDDR |= (SIM0_RST_BIT);
  43.         
  44. #ifndef VLPR_TEST// in VLPR mode , use FB_CLK for SIM_CLK         
  45.         // SIM0_CLK - LCD_P46/PTD6/FTM0_CH6/FTM0_FLT0
  46.         PORTD_PCR6 = PORT_PCR_MUX(4);//FTM0
  47. #endif                  
  48.         // SIM0_PD - LCD_P38/PTC18/UART3_RTS
  49.         PORTC_PCR18 = PORT_PCR_MUX(1);
  50.         GPIOC_PDDR &= ~(SIM0_PD_BIT);//GPIO input
  51.          
  52.         // SIM0_DATA - LCD_P47/PTD7/CMT_IRO/_UART0_TX
  53.         PORTD_PCR7 = PORT_PCR_MUX(3);
  54.         //PORTB_PCR17 = PORT_PCR_MUX(3);
  55.           printf("\n Kinetis ISO7816 test \n");
  56.         
  57.         if(SIM_PD)
  58.           printf("No Smart Card insert in slot 0\n");
  59.         while(SIM_PD);
  60.         printf("Smart Card inserted in slot 0\n");
  61. #ifndef VLPR_TEST        
  62.         //init the SIM clock, using FTM0_CH6
  63.         SIM_SCGC6 |= SIM_SCGC6_FTM0_MASK;
  64.         FTM0_STATUS;
  65.         FTM0_STATUS = 0;
  66.         //prescale = 1, clock source = bus clock
  67.         <font color="Red">FTM0_CNTIN = 0;</font>

  68.         FTM0_C6SC = FTM_CnSC_MSA_MASK|FTM_CnSC_ELSA_MASK; //ELSB:ELSA= 0b01, MSB:MSA= 0b01 means output compare, tougle output on match
  69.         FTM0_C6V = 1;
  70.         <font color="Red">FTM0_MOD = (periph_clk_mhz/2)/SIM_CLK -1; //generate 2MHz CLK
  71. </font>
  72.         FTM0_MODE |= FTM_MODE_FTMEN_MASK;
  73.         FTM0_OUTMASK &= ~FTM_OUTMASK_CH6OM_MASK;
  74.         <font color="Red">FTM0_SC = FTM_SC_PS(0)|
  75.                   FTM_SC_CLKS(1);</font>
  76. #else
  77.         PORTC_PCR3 = ( PORT_PCR_MUX(0x5));
  78. #endif   
  79.         //init UART to ISO7816 format
  80.         //The SIM_CLK is 2MHz, so the baudrate is 2M/372
  81.         status = IDLE_STATE;
  82.         i = (uint16)((core_clk_mhz)*Fi/(SIM_CLK * 16));
  83. //        SIM_SOPT5 = SIM_SOPT5_UART0TXSRC(0)|SIM_SOPT5_UART0RXSRC(0);
  84.         SIM_SCGC4 |=  SIM_SCGC4_UART0_MASK;
  85.         UART0_BDH |= UART_BDH_SBR(((i & 0x1F00) >> 8));
  86.         UART0_BDL = (uint8)(i & UART_BDL_SBR_MASK);
  87. #ifdef VLPR_TEST
  88.         UART0_C4 = 0x10;  //refine the baudrate
  89. #else
  90.         UART0_C4 = 0x00;
  91. #endif
  92.         //printf("UART0_WP7816T1 = 0x%x\n",UART0_WP7816T1);
  93.         UART0_WP7816T0 = 1; UART0_WF7816 = 1;//set the WT = 960*1*1 =960 etu
  94. //       UART0_WP7816T0 = 1; UART0_WF7816 = 10;//set the WT = 960*1*10 =9600 etu
  95.         //UART0_C7816 |= UART_C7816_TTYPE_MASK;
  96.         //UART0_C7816 |= UART_C7816_ISO_7816E_MASK;
  97.         //printf("UART0_WP7816T1 = 0x%x\n",UART0_WP7816T1);
  98.         //one wire mode, 9bit mode, Even parity
  99.         UART0_C1 = UART_C1_LOOPS_MASK |
  100.                    UART_C1_RSRC_MASK |
  101.                    UART_C1_M_MASK |
  102. //                 UART_C1_PT_MASK| //set Odd parity to see if the NACK error detect and retransfer
  103.                    UART_C1_PE_MASK;
  104.         
  105.         UART0_S2 = 0;
  106. #ifdef INVERSE
  107.         UART0_S2 |= UART_S2_MSBF_MASK | UART_S2_RXINV_MASK;  // inverse mode
  108. #endif
  109.         UART0_MODEM = 0;
  110.         UART0_C3 |= (UART_C3_ORIE_MASK|UART_C3_NEIE_MASK|UART_C3_FEIE_MASK|UART_C3_PEIE_MASK);
  111. #ifdef INVERSE
  112. //        UART0_C3 |= UART_C3_TXINV_MASK; //inverse mode
  113. #endif
  114.         UART0_C4 &= ~(UART_C4_MAEN1_MASK|UART_C4_MAEN2_MASK);
  115.         UART0_C5 = 0;
  116.         UART0_C7816 = UART_C7816_INIT_MASK |
  117.                       UART_C7816_ISO_7816E_MASK |
  118.                       UART_C7816_ONACK_MASK |
  119.                       UART_C7816_ANACK_MASK;
  120.         UART0_C2 =   UART_C2_TE_MASK | UART_C2_RE_MASK;
  121.         
  122. #ifdef  NACK_THRESHOLD_TEST
  123. //        UART0_PFIFO = UART_PFIFO_TXFE_MASK | UART_PFIFO_RXFE_MASK;
  124.         txt_cnt = 0;
  125.         rxt_cnt = 0;
  126.         i = 1;
  127.         UART0_ET7816 = (i<<4)|i;
  128. #endif
  129. //        UART0_IE7816 |= (UART_IE7816_WTE_MASK|UART_IE7816_CWTE_MASK|UART_IE7816_BWTE_MASK|UART_IE7816_GTVE_MASK);
  130. //        UART0_IE7816 |= (UART_IE7816_WTE_MASK|UART_IE7816_GTVE_MASK);
  131. #if 0        
  132.         UART0_C3 |= UART_C3_TXDIR_MASK; //set the TX pin as output

  133.         UART0_TL7816 = 2; //the TLEN does not count the NAD, PCB, LEN, LRC, if use CRC, it should + 1
  134.         UART0_C2 |= UART_C2_TE_MASK; //enable TX
  135.         UART0_D = 0x55;
  136.         UART0_D = 0xaa;
  137. #endif
  138.         if(ATR()!=0)
  139.         {
  140.           printf("ATR failed!\n");
  141.           goto exit0;
  142.         }
  143.         else
  144.           printf("ATR successfull!\n");

  145.         //T=0 transport
  146.         Trans_T0();
  147.         
  148.         //T=1 transport
  149.         Trans_T1();
  150. exit0:
  151.         while(1)
  152.         {
  153.          }
  154. }
复制代码
以上是7816的demo中代码,对于以上代码的理解是
1、7816协议接口的clk由FTM产生;
2、根据代码中给定sysclk 【Bus Clock=48M】,由FTM0_SC的配置可以得到 FTM_CLK=sysclk/(2^0);
又FTM0_CNT=0(默认为0);FTM0_CNTIN=0;                       
PWM周期= (MOD - CNTIN+1)*FTM_CLK
这个和代码中注释的信息generate 2MHz CLK是否是有问题【备注不定义 VLPR_TEST】
即代码中MOD=(periph_clk_mhz/2)/SIM_CLK -1=48M/2/2 -1=12M-1 【其中#define SIM_CLK 2 //in MHz from FTM0_CH6】




我知道答案 目前已有4人回答
回复

使用道具 举报

该用户从未签到

4

主题

12

帖子

0

注册会员

Rank: 2

积分
72
最后登录
2015-4-16
 楼主| 发表于 2015-1-20 16:17:52 | 显示全部楼层
回复 支持 反对

使用道具 举报

该用户从未签到

11

主题

835

帖子

0

金牌会员

Rank: 6Rank: 6

积分
1795
最后登录
2016-4-2
发表于 2015-1-31 22:48:36 | 显示全部楼层
本帖最后由 柳叶刀 于 2015-2-2 11:11 编辑

楼主的分析不错
回复 支持 反对

使用道具 举报

该用户从未签到

1

主题

825

帖子

0

金牌会员

Rank: 6Rank: 6

积分
1687
最后登录
2015-2-10
发表于 2015-1-31 22:48:37 | 显示全部楼层
K53的ISO7816的代码
回复 支持 反对

使用道具 举报

该用户从未签到

1

主题

35

帖子

0

注册会员

Rank: 2

积分
83
最后登录
2015-2-6
发表于 2015-1-31 22:49:24 | 显示全部楼层
时间好慢~
回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|恩智浦技术社区

GMT+8, 2025-7-17 17:43 , Processed in 0.093799 second(s), 24 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

快速回复 返回顶部 返回列表