找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3248|回复: 1
打印 上一主题 下一主题
收起左侧

STM32操作D-THINK射频模块对射频卡进行数据采集、读写的源码与资料

[复制链接]
跳转到指定楼层
楼主
1.利用STM32F103VET6的UART1对D-THINK进行通信操作;
2.stm32的uart2进行读写数据显示,方便调试模块;
3.D-think支持ISO15693的射频卡协议;
4.D-think支持IIC/USB/UART通信;
5.VCC接5V;
6.MCU的RX/TX与模块的TX/RX对接;
7.D-think模块比较耗电,不用时可发指令关掉天线。


stm32单片机源程序如下:
  1. //创建人:luquanw
  2. //MCU类型:STM32F103VET6

  3. #include "LED.h"         
  4. #include "stm32f10x_lib.h"
  5. #include "LCD1604.h"
  6. #include "uart.h"
  7. #include "I2C.h"

  8. #define debug 0

  9. #define oldone 0
  10. #define newone 1

  11. #define GetChipInDataLevel GPIOE->IDR&0x0004   //数据返回脚         PE.2
  12. #define GetChipSckLevel GPIOE->IDR&0X0200      // 时钟输出脚   PE.9
  13. #define ComDemoTestPin GPIOE->ODR^=0X01         //调试程序脚         PE.0
  14. #define ChipVccPin GPIO_Pin_1                        //有芯片电源控制脚  PE.1


  15. #define TestPin GPIO_Pin_3//0                  测试脚PE.3

  16. //////////////////////////////////////////////////////////////////////////////////////
  17. #define  KEY_SET   GPIO_Pin_5          //PB5
  18. #define  KEY_UP    GPIO_Pin_8         //PB8
  19. #define  KEY_DOWN  GPIO_Pin_9         //PB9
  20. #define  KEY_START GPIO_Pin_10         //PC10
  21.         
  22. #define  Read_KEY_SET    (GPIOB->IDR & KEY_SET)
  23. #define  Read_KEY_UP     (GPIOB->IDR & KEY_UP)
  24. #define  Read_KEY_DOWN   (GPIOB->IDR & KEY_DOWN)
  25. #define  Read_KEY_START  (GPIOC->IDR & KEY_START)


  26. void Show_information(u16 type,u16 cap,u32 date,u8 color)
  27. {        u8 flag=0;
  28.         u8 temp;
  29.         switch(type)
  30.         {
  31.                 case 0x0103:   LCD_write_str(0,2,"256"); break;
  32.                 case 0x0107:   LCD_write_str(0,2,"257"); break;
  33.                 case 0x0111:   LCD_write_str(0,2,"156"); break;
  34.                 default:  flag=1;  LCD_write_str(0,2,"---"); break;
  35.         }
  36.         if(flag) {LCD_write_str(0,2,"Unknown!");return; }
  37.         switch(cap)
  38.         {
  39.                 case 0x2003:   LCD_write_str(9,2,"0.8L"); break;
  40.                 case 0xE803:   LCD_write_str(9,2,"1L  "); break;
  41.                 case 0xD007:   LCD_write_str(9,2,"2L  "); break;
  42.                 default:       LCD_write_str(9,2,"----"); break;
  43.         }
  44.         switch(color)
  45.         {
  46.                 case 0x00:   LCD_write_str(5,2,"CY"); break;
  47.                 case 0x01:   LCD_write_str(5,2,"MG"); break;
  48.                 case 0x02:   LCD_write_str(5,2,"YL"); break;
  49.                 case 0x03:   LCD_write_str(5,2,"BK"); break;
  50.                 case 0x04:   LCD_write_str(5,2,"WH"); break;
  51.                 case 0x05:   LCD_write_str(5,2,"CL"); break;
  52.                 default:     LCD_write_str(5,2,"--"); break;
  53.         }
  54.         LCD_write_str(0,3,"20--/--/--");
  55.         temp=date&0xff;         //0~99
  56.     lcd_byte(2,3,temp);
  57.         temp=(date>>8)&0xff;  //1~12

  58.         lcd_byte(5,3,temp);
  59.         temp=(date>>16)&0xff;  //1~31

  60.         lcd_byte(8,3,temp);

  61.         

  62. }


  63.   u8 BOXChar[]=" >>RF Chip Tester<< ";
  64. //u8 BOXChar[]=">>TK Series Tester<<";

  65. unsigned char waiting[] ="Ready to test...    ";
  66. unsigned char Boxclear[]="                    ";
  67. unsigned char BoxNoModel[]="<No Model> ";


  68. void key_IO_init(void);
  69. void Delay_uS1(u16 nUS);
  70. void Delay_mS1(u16 nMS);
  71. u16 key_scan(void);
  72. void beep_IO_init(void);
  73. void beep(u8 n);
  74. void KEY_Ready(void);
  75. void GPIO_Init_Function(void);
  76. void GPIO_Init_IN(void);
  77. void GPIOC_Init(void);
  78. void RCC_Init_Function(void);
  79. void TIM_Configuration(void);
  80. void delay(u16 T);
  81. void delaynms(u8 t);
  82. void OCWaveForChipCLKInitial(void);
  83. void led_IO_init(void);
  84. void LED_OK(unsigned char ok);
  85. void LED_CLEAR(void);
  86. void USART1_IRQHandler(void);
  87. void Read_Chip(unsigned char adr,unsigned char *data);
  88. unsigned char Write_Chip(unsigned char adr,unsigned char *data);
  89. unsigned char Check_Chip_UID( char *bufback);
  90. unsigned char Control_DThink( char *bufin, char *bufref,unsigned char innum,unsigned char outnum);


  91. u8 f;         //清除UART接收缓存
  92. u8 DTBuf[40];  //UART接收缓存

  93. u8 WDATA[4];  //写入数据缓存
  94. /*
  95. AA BB 05 00 00 00 04 01 05   //读模块ID
  96. =》AA BB 16 00 11 12 04 01 00 44 2D 54 68 69 6E 6B 5F 4D 35 30 20 56 31 2E 36 77

  97. AA BB 06 00 00 00 08 01 31 38  //设置模式
  98. =》AA BB 06 00 11 12 08 01 00 0A

  99. AA BB 06 00 00 00 0C 01 01 0C  //打开天线
  100. =>AA BB 06 00 11 12 0C 01 00 0E

  101. AA BB 05 00 00 00 00 10 10//多卡读UID
  102. =》AA BB 18 00 11 12 00 10 00 00 C6 59 F1 2C 00 01 04 E0 00 7B 5B F1 2C 00 01 04 E0 AC


  103. AA BB 05 00 00 00 01 10 11 //读单卡UID
  104. =》AA BB 0F 00 11 12 01 10 00 00 7B 5B F1 2C 00 01 04 E0 0A

  105.    */

  106. u8 Read_Dthink_ID[9]={0xAA,0xBB,0x05,0x00,0x00,0x00,0x04,0x01,0x05};
  107. u8 Dthink_ID[26]=     {0xAA,0xBB,0x16,0x00,0x11,0x12,0x04,0x01,0x00,
  108.                       0x44,0x2D,0x54,0x68,0x69,0x6E,0x6B,0x5F,0x4D,
  109.                                           0x35,0x30,0x20,0x56,0x31,0x2E,0x36,0x77};//返回参考

  110. u8 SET_MODE[10]={0xAA,0xBB,0x06,0x00,0x00,0x00,0x08,0x01,0x31,0x38};
  111. u8 MODE[10]={0xAA,0xBB,0x06,0x00,0x11,0x12,0x08,0x01,0x00,0x0A}; //返回参考

  112. u8 OPEN_ANT[10]={0xAA,0xBB,0x06,0x00,0x00,0x00,0x0C,0x01,0x01,0x0C};
  113. u8 ANT[10]={0xAA,0xBB,0x06,0x00,0x11,0x12,0x0C,0x01,0x00,0x0E};        //返回参考

  114. u8 OFF_ANT[10]={0xAA,0xBB,0x06,0x00,0x00,0x00,0x0C,0x01,0x00,0x0D};
  115. u8 OFFANT[10]={0xAA,0xBB,0x06,0x00,0x11,0x12,0x0C,0x01,0x00,0x0E};        //返回参考


  116. u8 READ_ONE_CARD_UID[9]={0xAA,0xBB,0x05,0x00,0x00,0x00,0x01,0x10,0x11};
  117. //u8 READ_ONE_CARD_UID[9]={0xAA,0xBB,0x05,0x00,0x11,0x12,0x01,0x10,0x12};
  118. u8 CARD_UID[25];


  119. char buf[0x20];
  120. char typebuf[16];
  121. char typeref[16];
  122. char typebuf1[16];

  123. #define RED 0
  124. #define GREEN 1


  125. //**********************************************************************
  126. int main(void)
  127. {

  128.    u8 num,i,j,t,adress,EPNNUM,LOOPHERE,newType=oldone,EPNCHIP=0;
  129.    u8 flag,EPNNUM_BEFORE=0;

  130.    RCC_Init_Function();         
  131.    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
  132.    GPIO_Init_Function();

  133.    KEY_Ready();
  134.    beep_IO_init();
  135.    LED_CLEAR();
  136.    LED_OK(RED);
  137.    TIM_Configuration();


  138.    OCWaveForChipCLKInitial();
  139.    USART_Configuration(19200);
  140.    USART2_Configuration(9600);


  141.   

  142.    Init_I2C();
  143.                                  
  144.    delaynms(200);
  145.    UART2_SendString("\r\n\r\n\r\n\r\nInitial D-Think.......");
  146.    

  147.    flag=0; //记录开机初始化过程状态

  148.    flag|=Control_DThink(Read_Dthink_ID,Dthink_ID,9,20);        //查询模块的ID

  149.    flag|=Control_DThink(SET_MODE,MODE,10,10);   //设置工作模式

  150.    flag|=Control_DThink(OPEN_ANT,ANT,10,10);           //打开天线

  151.    flag|=Control_DThink(OFF_ANT,OFFANT,10,10);        //关掉天线

  152.    if(flag)                        
  153.           {UART2_SendString("\r\n\r\nInitial Error!   ");beep(3); while(1);}
  154.    else
  155.           {UART2_SendString("\r\n\r\nInitial OK!     "); beep(1);}

  156.     delaynms(200);  delaynms(200);  
  157.         for(j=0;j<16;j++)typebuf[j]=0xff;
  158.         for(j=0;j<16;j++)typebuf1[j]=0xff;
  159.         for(j=0;j<16;j++)typeref[j]=0xff;
  160.         

  161.         
  162.                   
  163.      while(1)
  164.          {         

  165.     while(Read_KEY_START&&Read_KEY_SET)delaynms(10);
  166.         if(Read_KEY_START==0)//YES按键应答
  167.     {
  168.                            UART2_SendString("\r\n\r\n\r\n================START================\r\n\r\n\r\n\r\n");

  169.                      Delay_mS1(10);
  170.                           flag=0;
  171.             //(1)打开天线=============================================================================
  172.                     flag=Control_DThink(OPEN_ANT,ANT,10,10);           //打开天线
  173.                         Delay_mS1(100);
  174.                     if(flag)                        
  175.                     {
  176.                         UART2_SendString("\r\nOPEN Antenna Error!");
  177.                                 Control_DThink(OFF_ANT,OFFANT,10,10);        //关掉天线
  178.                             beep(3);
  179.                                 goto giveup;
  180.                         }        

  181.                    //(2)判断芯片UID=========================================================================
  182.                         flag|=Check_Chip_UID(CARD_UID);        //CARD_UID是实际读出的UID串,每个芯片不一样,所以不判断
  183.                         LED_CLEAR();
  184.                         if(flag)
  185.                         {
  186.                             UART2_SendString("\r\n No Chip! ");
  187.                                 Control_DThink(OFF_ANT,OFFANT,10,10);        //关掉天线
  188.                                 beep(3);
  189.                                 goto giveup;
  190.                         }
  191.                         
  192.                                                                                    // AA BB /0F00/1112/0110/00/00/         9A AA 02 6B 00 01 04 E0   AE
  193.                     UART2_SendString("\r\nUID:  "); //AA BB /0F 00 /11 12 /01 10 /00/ 00 /[7B 5B F1 2C 00 01 04 E0] /0A
  194.                    // for(i=10;i<18;i++)
  195.                      for(i=0;i<19;i++)
  196.                            UART2_HEX(CARD_UID[i]);
  197.                          UART2_SendString("\r\n\r\n\r\nDATA:\r\n\r\n");

  198.                                 
  199.          


  200.             //读XX地址上的数据=============================================================
  201.                   for(t=0;t<0x1c;t++)
  202.                   {        
  203.                     for(j=0;j<4;j++)typebuf[j]=0xff;
  204.                         adress=t;
  205.                         UART2_SendString("\r\n(");
  206.                         UART2_HEX(t);
  207.                         UART2_SendString("):");
  208.                         Read_Chip(adress,WDATA);
  209.                         for(i=0;i<4;i++)typebuf[i]=WDATA[i];
  210.                         for(i=0;i<4;i++)
  211.                           UART2_HEX(typebuf[i]);
  212.                }                        
  213.                         beep(1);

  214.                         giveup:
  215.                         delaynms(30);
  216.                            while(Read_KEY_START==0);
  217.                         }

  218.            
  219.          }
  220.                                  
  221. }










  222. void key_IO_init(void)
  223. {
  224.   GPIO_InitTypeDef GPIO_InitStructure;
  225.   GPIO_InitStructure.GPIO_Pin = KEY_SET|KEY_UP|KEY_DOWN;
  226.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
  227.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  228.   GPIO_Init(GPIOB, &GPIO_InitStructure);

  229.   GPIO_InitStructure.GPIO_Pin = KEY_START;
  230.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
  231.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  232.   GPIO_Init(GPIOC, &GPIO_InitStructure);
  233. }

  234. void Delay_uS1(u16 nUS)
  235. {
  236.         u8 i;
  237.         while (nUS--)
  238.         {
  239.                 for (i=0;i<8;i++){;;}
  240.         }
  241. }

  242. void Delay_mS1(u16 nMS)
  243. {
  244.         while(nMS--)
  245.         {
  246.                 Delay_uS1(1000);
  247.         }
  248. }
  249. u16 key_scan(void)
  250. {u16 key_value;               
  251.   if((Read_KEY_START))return 0;
  252.    Delay_mS1(30);                    
  253.   if((Read_KEY_START))return 0;
  254.   if(!Read_KEY_START)key_value=KEY_START;
  255.   Delay_mS1(50);
  256.   return key_value;
  257. }        


  258. void beep_IO_init(void)
  259. {
  260.   GPIO_InitTypeDef GPIO_InitStructure;
  261.    /* Configure PC. as Output push-pull */
  262.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
  263.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
  264.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  265.   GPIO_Init(GPIOB, &GPIO_InitStructure);
  266.   GPIO_ResetBits(GPIOB, GPIO_Pin_13 );
  267. }
  268. void beep(u8 n)
  269. {u8 i;
  270. for(i=0;i<n;i++)
  271. {
  272.   GPIO_SetBits(GPIOB,GPIO_Pin_13);
  273.   Delay_mS1(60);
  274.   GPIO_ResetBits(GPIOB,GPIO_Pin_13 );
  275.   Delay_mS1(60);
  276.   }
  277. }  
  278. void KEY_Ready(void)
  279. {
  280.   GPIO_InitTypeDef GPIO_InitStructure;
  281.   GPIO_InitStructure.GPIO_Pin = KEY_SET|KEY_UP|KEY_DOWN;
  282.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
  283.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  284.   GPIO_Init(GPIOB, &GPIO_InitStructure);

  285.   GPIO_InitStructure.GPIO_Pin = KEY_START;
  286.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
  287.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  288.   GPIO_Init(GPIOC, &GPIO_InitStructure);

  289.     AFIO->MAPR  |=0X000000C0;//P84 位7:6TIM1_REMAP[1:0]:定时器1的重映像 =11: 完全映像(ETR/PE7,CH1/PE9,CH2/PE11,CH3/PE13,CH4/PE14,BKIN/PE15,CH1N/PE8,CH2N/PE10,CH3N/PE12)。
  290.   
  291. }

  292. /***********************GPIO初始化子函数*********************/
  293. void GPIO_Init_Function(void)
  294. {
  295.          GPIO_InitTypeDef GPIO_InitStructure;  
  296.          GPIO_InitTypeDef GPIO_InitStruct; //声明GPIO_InitTypeDef类型的结构体
  297.          GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;//8;// | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 ;
  298.          GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
  299.          GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;//复用推挽输出GPIO_Mode_Out_PP;
  300.          GPIO_Init(GPIOE,&GPIO_InitStruct);

  301.   /* UART1*/
  302.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
  303.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  304.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  305.   GPIO_Init(GPIOA, &GPIO_InitStructure);
  306.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
  307.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  308.   GPIO_Init(GPIOA, &GPIO_InitStructure);




  309.    /*PAD5作为US2的TX端,打开复用,负责发送数据  */
  310.            /*
  311.      RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE); //使能GPIOD时钟
  312.      RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);         
  313.          RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
  314.           GPIO_PinRemapConfig(GPIO_Remap_USART2, ENABLE);  

  315.       GPIO_StructInit(&GPIO_InitStructure);
  316.           GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;  
  317.           GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  318.           GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  
  319.           GPIO_Init(GPIOD , &GPIO_InitStructure);  
  320.         
  321.            //PD6作为US2的RX端,负责接收数据   
  322.           GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
  323.           GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;  
  324.           GPIO_Init(GPIOD, &GPIO_InitStructure);  

  325.                  */
  326.      RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //使能GPIOD时钟
  327.      RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);         
  328.         // RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);  //        不重映射
  329.         //  GPIO_PinRemapConfig(GPIO_Remap_USART2, ENABLE);  

  330.       GPIO_StructInit(&GPIO_InitStructure);
  331.           GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;    //PA2作为US2的TX端,
  332.           GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  333.           GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  
  334.           GPIO_Init(GPIOA , &GPIO_InitStructure);  
  335.         
  336.            //PA3作为US2的RX端,
  337.           GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
  338.           GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;  
  339.           GPIO_Init(GPIOA, &GPIO_InitStructure);  


  340. }

  341. void GPIO_Init_IN(void)
  342. {
  343.          GPIO_InitTypeDef GPIO_InitStruct; //声明GPIO_InitTypeDef类型的结构体
  344.          GPIO_InitStruct.GPIO_Pin = GPIO_Pin_2 ;// | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 ;
  345.          GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
  346.          GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;//GPIO_Mode_Out_PP;//GPIO_Mode_AF_PP;//复用推挽输出
  347.          GPIO_Init(GPIOE,&GPIO_InitStruct);
  348. }

  349. void GPIOC_Init(void)
  350. {
  351.          GPIO_InitTypeDef GPIO_InitStruct; //声明GPIO_InitTypeDef类型的结构体
  352.          GPIO_InitStruct.GPIO_Pin = 0XFFFF;//GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;
  353.          GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
  354.          GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;//GPIO_Mode_AF_PP;//复用推挽输出
  355.          GPIO_Init(GPIOC,&GPIO_InitStruct);
  356. }

  357. /***********************RCC初始化子函数*********************/
  358. //Note:系统复位后,HSI振荡器被选为系统时钟。
  359. void RCC_Init_Function(void)
  360. {
  361.          RCC_DeInit(); //Resets the RCC clock configuration to the default reset state.
  362.          RCC_HSEConfig(RCC_HSE_ON); //外部8MHz高速时钟使能.
  363.          while(RCC_WaitForHSEStartUp() == RESET); //等待外部高速时钟就绪
  364. //         RCC_HCLKConfig(RCC_SYSCLK_Div1); //设置AHB的分频系数:AHB clock = SYSCLK
  365. //         RCC_PCLK2Config(RCC_HCLK_Div1); //设置APB2的分频系数:APB2 clock = HCLK
  366.          RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);//9);//RCC_PLLMul_2); //选择外部高速时钟作为PLL
  367.          RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //选择PLLCLK作为系统时钟
  368. //         RCC_SYSCLKConfig(RCC_SYSCLKSource_HSE);
  369.          //RCC_SYSCLKConfig(RCC_SYSCLKSource_HSI);
  370.          RCC_PLLCmd(ENABLE); //PLL使能
  371.          while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); //等待PLL就绪
  372.          RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE); //使能GPIOE时钟
  373.            RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE); //使能GPIOC时钟
  374.          RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE); //使能GPIOD时钟
  375.      RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
  376.      RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //使能AFIO时钟
  377.      RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); //使能GPIOB时钟
  378.            RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //使能GPIOA时钟
  379. RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);


  380. }
  381. //*********************************************

  382. //TIM模块设置
  383. void TIM_Configuration(void)
  384. {
  385.     TIM_TimeBaseInitTypeDef TIM_BaseInitStructure;
  386.     TIM_OCInitTypeDef TIM_OCInitStructure;
  387.     //TIM1基本计数器设置         /72MHZ/(3+1)=  18MHZ;1/18= 0.05555555555us ////0.0555*(10+1)= 0.61111us=612ns,与测试结果一致
  388.     TIM_BaseInitStructure.TIM_Period = 10;//0xffff;                      //这里必须是65535          ARR
  389.     TIM_BaseInitStructure.TIM_Prescaler = 1;//3;//71;//1;//0;//71;//71;                       //预分频71,即72分频,得1M         72M/N
  390.     TIM_BaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;//0;系统时钟分频 72MHZ
  391.     TIM_BaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
  392.     TIM_BaseInitStructure.TIM_RepetitionCounter = 0; //只有TIME1和TIME8有
  393.     TIM_TimeBaseInit(TIM1, &TIM_BaseInitStructure);

  394.     //TIM1_OC1模块设置
  395.     TIM_OCStructInit(& TIM_OCInitStructure);  
  396.     TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle;             //管脚输出模式:翻转
  397.    // TIM_OCInitStructure.TIM_Pulse = 0;//10;//30;//35;//200;//100;//2000;   //翻转周期:2000个脉冲 //设置了待装入捕获比较寄存器的脉冲值。它的取值必须在0x0000和0xFFFF之间。
  398.     TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;   //使能TIM1_CH1通道
  399.     TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;       //输出为正逻辑
  400.     TIM_OC1Init(TIM1, &TIM_OCInitStructure);                        //写入配置

  401.     //清中断
  402.     TIM_ClearFlag(TIM1, TIM_FLAG_CC1);

  403.     //TIM1中断源设置,开启相应通道的捕捉比较中断
  404.     TIM_ITConfig(TIM1, TIM_IT_CC1,  DISABLE);//ENABLE);//         

  405.     //TIM1开启
  406.     TIM_Cmd(TIM1, DISABLE);
  407.     //通道输出使能
  408.     TIM_CtrlPWMOutputs(TIM1, ENABLE);
  409. }

  410. /*******************************************************************************
  411. * Function Name  : USART1_IRQHandler
  412. * Description    : This function handles USART1 global interrupt request.
  413. * Input          : None
  414. * Output         : None
  415. * Return         : None
  416. *******************************************************************************/
  417. void USART1_IRQHandler(void)
  418. {         u8 temp;
  419.          if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
  420.           {
  421.             temp=USART_ReceiveData(USART1);
  422.                 if(f==0)  //在发送新指令时,f要清0
  423.                  {
  424.              memset(DTBuf, 0, 40);        //系统函数,清0
  425.                  DTBuf[f++]=temp;
  426.                  }
  427.                 else
  428.                  {
  429.                  if(f<40)
  430.                   {
  431.                                  DTBuf[f++]=temp;
  432.                   }
  433.                 }

  434.                 USART_ClearITPendingBit(USART1,USART_IT_RXNE);
  435.           }        
  436.           USART_ReceiveData(USART1);
  437. }

  438. //***********************延时子函数*********************/
  439. void delay(u16 T)
  440. {
  441.         while(T--);
  442. }


  443. void delaynms(u8 t)
  444. {
  445.         while(t--) delay(8192);
  446. }

  447. //*******************************************

  448. //**********************************************************************
  449. void TurnOffPowerSub(void)        //关掉芯片电源           //PE1 STM VCC
  450. {
  451.            while(!(GetChipSckLevel )); //PE9,    wait H
  452.      while(GetChipSckLevel ); //wait L
  453.          TIM_Cmd(TIM1, DISABLE);//TIM1->CR1 &= CR1_CEN_Reset;//
  454.      GPIO_ResetBits(GPIOE, ChipVccPin ); //PE1 ;GPIOA->BRR  |=0X02; //=0          这些位可读可写并只能以字(16位)的形式操作。
  455. }
  456. //**********************************************************************
  457. void TurnOnPower(void)
  458. {
  459.   GPIO_SetBits(GPIOE, ChipVccPin );//GPIOA->BSRR |=0X02; //=1
  460.   TIM_Cmd(TIM1, ENABLE);
  461.   }

  462.   //********************
  463. void OCWaveForChipCLKInitial(void)
  464. {
  465.          // 设置TIMx_CR1寄存器中的UDIS位,可以禁止更新事件
  466.    TIM1->DIER &=0xfffd;          //TIM1->DIER:DMA/中断使能寄存器(TIMx_DIER :位1 CC1IE:允许捕获/比较1中断  P243
  467.    TIM1->CCMR1&=0xFFF7;          //禁止预装载
  468.    TIM1->CCR1=10;//10;//30;//2;//4;//8;//15;//30; 装入比较初值
  469.    TIM1->ARR=10;//10;//30;//4;//8;//16;//30;           //预装载的值
  470.    TIM1->CCMR1|=0x0008; //捕获/比较模式寄存器1(TIMx_CCMR1) :位3OC1PE:输出比较1预装载使能        p246
  471.    TIM1->CR1 |= 0x0081;        //TIMx_CR1 位7 ARPE:自动重装载预装载允许位          //位4 DIR:方向  0:计数器向上计数;1:计数器向下计数。位0 CEN:允许计数器  P190
  472.    TIM1->CR1 &=0XFFEF;
  473.    TurnOnPower();
  474.         delay(50);
  475.          while (!(TIM1->SR &0x0002));  //状态寄存器(TIMx_SR).CC1IF///位1 CC1IF:捕获/比较1 中断标记                p244                        
  476.     TIM1->SR &=0XFFFD;//清除捕获/比较1 中断标记//TIM1->SR = (u16)~TIM_IT_CC1;
  477.     TIM1->ARR =144;//144;//TIM1->CCR1+15;//2;//4;//8;//15;//30;        
  478.         delay(50);
  479.     TurnOffPowerSub();        
  480.         delay(50);         
  481.         }

  482. unsigned char Control_DThink( char *bufin, char *bufref,unsigned char innum,unsigned char outnum)
  483. {
  484.    unsigned char i,flg=0;
  485.    f=0;  //全局变量f=0表示清除UART的接收缓存
  486.             
  487.    UART1_SendString(bufin,innum);
  488.    Delay_mS1(30);
  489.    for(i=0;i<outnum;i++)
  490.    {
  491.          if(DTBuf[i]!=bufref[i])
  492.          {        
  493.              flg|=1;  //与参考数据不一致
  494.                  break;
  495.           }
  496.    }
  497.    return flg;//1--error
  498. }
  499. unsigned char Check_Chip_UID( char *bufback)
  500. {
  501.             unsigned char i,j,flg=0;
  502.                     f=0;  //全局变量f=0表示清除UART的接收缓存
  503.                         for(i=0;i<19;i++)        //返回数据串包括UID
  504.                         {
  505.                                 bufback[i]=0;
  506.                         }
  507.                         UART1_SendString(READ_ONE_CARD_UID,9); //OK返回19字节(0x13);NG返回10字节(0x0A)
  508.                         Delay_mS1(30);
  509.                

  510.                     if(f<0x13)//UID读出字串的正常长度判断
  511.                         {
  512.                                 flg=1;
  513.                                 return flg;
  514.                         }
  515.                      if(DTBuf[8])        //00表示成功
  516.                         {
  517.                                 flg=1;
  518.                                 return flg;
  519.                         }
  520.                         j=0;
  521.                         if(f<50)
  522.                         for(i=0;i<f;i++)        //返回数据串包括UID
  523.                         {        
  524.                                 if((DTBuf[i]==0xAA)&&(DTBuf[i+1]==0x00))
  525.                                 {
  526.                                         bufback[j++]=DTBuf[i];
  527.                                         i++;
  528.                                 }
  529.                                 else
  530.                                 {
  531.                                         bufback[j++]=DTBuf[i];
  532.                                 }
  533.                         }

  534.                         return flg;

  535. }

  536. unsigned char Write_Chip(unsigned char adr,unsigned char *data)
  537. {
  538.             unsigned char i,j,flg=0;
  539.                         u8 SDTBuf[40]; //UART发送指令串缓存

  540.                     f=0;  //全局变量f=0表示清除UART的接收缓存

  541.                         SDTBuf[0]=0XAA;SDTBuf[1]=0XBB;SDTBuf[2]=19; SDTBuf[3]=0X00;SDTBuf[4]=0X00;SDTBuf[5]=0X00;
  542.                         SDTBuf[6]=0X06;SDTBuf[7]=0X10;
  543.                         for(i=0;i<9;i++)   //8~16
  544.                         {
  545.                                 SDTBuf[i+8]=CARD_UID[9+i];
  546.                         }
  547.                         SDTBuf[17]=adr; j=18;
  548.                         SDTBuf[j++]=data[0]; //18
  549.                         if(WDATA[0]==0xAA)
  550.                                 SDTBuf[j++]=0X00; //19
  551.                         SDTBuf[j++]=data[1];
  552.                         if(WDATA[1]==0xAA)
  553.                                 SDTBuf[j++]=0X00;
  554.                         SDTBuf[j++]=data[2];
  555.                         if(WDATA[2]==0xAA)
  556.                                 SDTBuf[j++]=0X00;
  557.                         SDTBuf[j++]=data[3];
  558.                         if(WDATA[3]==0xAA)
  559.                                 SDTBuf[j++]=0X00;
  560. ……………………

  561. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码


下载(此代码年代久远,采用的老版本的库和老版本Keil编写的):
STM32 dthink读写射频卡工程.7z (583.27 KB, 下载次数: 22)
D-Think_M50D DataSheet_ CN(ISO15693).pdf (897.02 KB, 下载次数: 14)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:228186 发表于 2018-5-2 17:27 | 只看该作者
谢谢楼主,无私奉献!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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