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模塊比較耗電,不用時可發指令關掉天線。
2.png (735.52 KB, 下載次數: 63)
下載附件
2018-5-2 11:35 上傳
1.png (59.48 KB, 下載次數: 54)
下載附件
2018-5-2 11:35 上傳
stm32單片機源程序如下:
- //創建人:luquanw
- //MCU類型:STM32F103VET6
- #include "LED.h"
- #include "stm32f10x_lib.h"
- #include "LCD1604.h"
- #include "uart.h"
- #include "I2C.h"
- #define debug 0
- #define oldone 0
- #define newone 1
- #define GetChipInDataLevel GPIOE->IDR&0x0004 //數據返回腳 PE.2
- #define GetChipSckLevel GPIOE->IDR&0X0200 // 時鐘輸出腳 PE.9
- #define ComDemoTestPin GPIOE->ODR^=0X01 //調試程序腳 PE.0
- #define ChipVccPin GPIO_Pin_1 //有芯片電源控制腳 PE.1
- #define TestPin GPIO_Pin_3//0 測試腳PE.3
- //////////////////////////////////////////////////////////////////////////////////////
- #define KEY_SET GPIO_Pin_5 //PB5
- #define KEY_UP GPIO_Pin_8 //PB8
- #define KEY_DOWN GPIO_Pin_9 //PB9
- #define KEY_START GPIO_Pin_10 //PC10
-
- #define Read_KEY_SET (GPIOB->IDR & KEY_SET)
- #define Read_KEY_UP (GPIOB->IDR & KEY_UP)
- #define Read_KEY_DOWN (GPIOB->IDR & KEY_DOWN)
- #define Read_KEY_START (GPIOC->IDR & KEY_START)
- void Show_information(u16 type,u16 cap,u32 date,u8 color)
- { u8 flag=0;
- u8 temp;
- switch(type)
- {
- case 0x0103: LCD_write_str(0,2,"256"); break;
- case 0x0107: LCD_write_str(0,2,"257"); break;
- case 0x0111: LCD_write_str(0,2,"156"); break;
- default: flag=1; LCD_write_str(0,2,"---"); break;
- }
- if(flag) {LCD_write_str(0,2,"Unknown!");return; }
- switch(cap)
- {
- case 0x2003: LCD_write_str(9,2,"0.8L"); break;
- case 0xE803: LCD_write_str(9,2,"1L "); break;
- case 0xD007: LCD_write_str(9,2,"2L "); break;
- default: LCD_write_str(9,2,"----"); break;
- }
- switch(color)
- {
- case 0x00: LCD_write_str(5,2,"CY"); break;
- case 0x01: LCD_write_str(5,2,"MG"); break;
- case 0x02: LCD_write_str(5,2,"YL"); break;
- case 0x03: LCD_write_str(5,2,"BK"); break;
- case 0x04: LCD_write_str(5,2,"WH"); break;
- case 0x05: LCD_write_str(5,2,"CL"); break;
- default: LCD_write_str(5,2,"--"); break;
- }
- LCD_write_str(0,3,"20--/--/--");
- temp=date&0xff; //0~99
- lcd_byte(2,3,temp);
- temp=(date>>8)&0xff; //1~12
- lcd_byte(5,3,temp);
- temp=(date>>16)&0xff; //1~31
- lcd_byte(8,3,temp);
-
- }
- u8 BOXChar[]=" >>RF Chip Tester<< ";
- //u8 BOXChar[]=">>TK Series Tester<<";
- unsigned char waiting[] ="Ready to test... ";
- unsigned char Boxclear[]=" ";
- unsigned char BoxNoModel[]="<No Model> ";
- void key_IO_init(void);
- void Delay_uS1(u16 nUS);
- void Delay_mS1(u16 nMS);
- u16 key_scan(void);
- void beep_IO_init(void);
- void beep(u8 n);
- void KEY_Ready(void);
- void GPIO_Init_Function(void);
- void GPIO_Init_IN(void);
- void GPIOC_Init(void);
- void RCC_Init_Function(void);
- void TIM_Configuration(void);
- void delay(u16 T);
- void delaynms(u8 t);
- void OCWaveForChipCLKInitial(void);
- void led_IO_init(void);
- void LED_OK(unsigned char ok);
- void LED_CLEAR(void);
- void USART1_IRQHandler(void);
- void Read_Chip(unsigned char adr,unsigned char *data);
- unsigned char Write_Chip(unsigned char adr,unsigned char *data);
- unsigned char Check_Chip_UID( char *bufback);
- unsigned char Control_DThink( char *bufin, char *bufref,unsigned char innum,unsigned char outnum);
- u8 f; //清除UART接收緩存
- u8 DTBuf[40]; //UART接收緩存
- u8 WDATA[4]; //寫入數據緩存
- /*
- AA BB 05 00 00 00 04 01 05 //讀模塊ID
- =》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
- AA BB 06 00 00 00 08 01 31 38 //設置模式
- =》AA BB 06 00 11 12 08 01 00 0A
- AA BB 06 00 00 00 0C 01 01 0C //打開天線
- =>AA BB 06 00 11 12 0C 01 00 0E
- AA BB 05 00 00 00 00 10 10//多卡讀UID
- =》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
- AA BB 05 00 00 00 01 10 11 //讀單卡UID
- =》AA BB 0F 00 11 12 01 10 00 00 7B 5B F1 2C 00 01 04 E0 0A
- */
- u8 Read_Dthink_ID[9]={0xAA,0xBB,0x05,0x00,0x00,0x00,0x04,0x01,0x05};
- u8 Dthink_ID[26]= {0xAA,0xBB,0x16,0x00,0x11,0x12,0x04,0x01,0x00,
- 0x44,0x2D,0x54,0x68,0x69,0x6E,0x6B,0x5F,0x4D,
- 0x35,0x30,0x20,0x56,0x31,0x2E,0x36,0x77};//返回參考
- u8 SET_MODE[10]={0xAA,0xBB,0x06,0x00,0x00,0x00,0x08,0x01,0x31,0x38};
- u8 MODE[10]={0xAA,0xBB,0x06,0x00,0x11,0x12,0x08,0x01,0x00,0x0A}; //返回參考
- u8 OPEN_ANT[10]={0xAA,0xBB,0x06,0x00,0x00,0x00,0x0C,0x01,0x01,0x0C};
- u8 ANT[10]={0xAA,0xBB,0x06,0x00,0x11,0x12,0x0C,0x01,0x00,0x0E}; //返回參考
- u8 OFF_ANT[10]={0xAA,0xBB,0x06,0x00,0x00,0x00,0x0C,0x01,0x00,0x0D};
- u8 OFFANT[10]={0xAA,0xBB,0x06,0x00,0x11,0x12,0x0C,0x01,0x00,0x0E}; //返回參考
- u8 READ_ONE_CARD_UID[9]={0xAA,0xBB,0x05,0x00,0x00,0x00,0x01,0x10,0x11};
- //u8 READ_ONE_CARD_UID[9]={0xAA,0xBB,0x05,0x00,0x11,0x12,0x01,0x10,0x12};
- u8 CARD_UID[25];
- char buf[0x20];
- char typebuf[16];
- char typeref[16];
- char typebuf1[16];
- #define RED 0
- #define GREEN 1
- //**********************************************************************
- int main(void)
- {
- u8 num,i,j,t,adress,EPNNUM,LOOPHERE,newType=oldone,EPNCHIP=0;
- u8 flag,EPNNUM_BEFORE=0;
- RCC_Init_Function();
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
- GPIO_Init_Function();
- KEY_Ready();
- beep_IO_init();
- LED_CLEAR();
- LED_OK(RED);
- TIM_Configuration();
- OCWaveForChipCLKInitial();
- USART_Configuration(19200);
- USART2_Configuration(9600);
-
- Init_I2C();
-
- delaynms(200);
- UART2_SendString("\r\n\r\n\r\n\r\nInitial D-Think.......");
-
- flag=0; //記錄開機初始化過程狀態
- flag|=Control_DThink(Read_Dthink_ID,Dthink_ID,9,20); //查詢模塊的ID
- flag|=Control_DThink(SET_MODE,MODE,10,10); //設置工作模式
- flag|=Control_DThink(OPEN_ANT,ANT,10,10); //打開天線
- flag|=Control_DThink(OFF_ANT,OFFANT,10,10); //關掉天線
- if(flag)
- {UART2_SendString("\r\n\r\nInitial Error! ");beep(3); while(1);}
- else
- {UART2_SendString("\r\n\r\nInitial OK! "); beep(1);}
- delaynms(200); delaynms(200);
- for(j=0;j<16;j++)typebuf[j]=0xff;
- for(j=0;j<16;j++)typebuf1[j]=0xff;
- for(j=0;j<16;j++)typeref[j]=0xff;
-
-
-
- while(1)
- {
- while(Read_KEY_START&&Read_KEY_SET)delaynms(10);
- if(Read_KEY_START==0)//YES按鍵應答
- {
- UART2_SendString("\r\n\r\n\r\n================START================\r\n\r\n\r\n\r\n");
- Delay_mS1(10);
- flag=0;
- //(1)打開天線=============================================================================
- flag=Control_DThink(OPEN_ANT,ANT,10,10); //打開天線
- Delay_mS1(100);
- if(flag)
- {
- UART2_SendString("\r\nOPEN Antenna Error!");
- Control_DThink(OFF_ANT,OFFANT,10,10); //關掉天線
- beep(3);
- goto giveup;
- }
- //(2)判斷芯片UID=========================================================================
- flag|=Check_Chip_UID(CARD_UID); //CARD_UID是實際讀出的UID串,每個芯片不一樣,所以不判斷
- LED_CLEAR();
- if(flag)
- {
- UART2_SendString("\r\n No Chip! ");
- Control_DThink(OFF_ANT,OFFANT,10,10); //關掉天線
- beep(3);
- goto giveup;
- }
-
- // AA BB /0F00/1112/0110/00/00/ 9A AA 02 6B 00 01 04 E0 AE
- UART2_SendString("\r\nUID: "); //AA BB /0F 00 /11 12 /01 10 /00/ 00 /[7B 5B F1 2C 00 01 04 E0] /0A
- // for(i=10;i<18;i++)
- for(i=0;i<19;i++)
- UART2_HEX(CARD_UID[i]);
- UART2_SendString("\r\n\r\n\r\nDATA:\r\n\r\n");
-
-
- //讀XX地址上的數據=============================================================
- for(t=0;t<0x1c;t++)
- {
- for(j=0;j<4;j++)typebuf[j]=0xff;
- adress=t;
- UART2_SendString("\r\n(");
- UART2_HEX(t);
- UART2_SendString("):");
- Read_Chip(adress,WDATA);
- for(i=0;i<4;i++)typebuf[i]=WDATA[i];
- for(i=0;i<4;i++)
- UART2_HEX(typebuf[i]);
- }
- beep(1);
- giveup:
- delaynms(30);
- while(Read_KEY_START==0);
- }
-
- }
-
- }
- void key_IO_init(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- GPIO_InitStructure.GPIO_Pin = KEY_SET|KEY_UP|KEY_DOWN;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
- GPIO_Init(GPIOB, &GPIO_InitStructure);
-
- GPIO_InitStructure.GPIO_Pin = KEY_START;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
- GPIO_Init(GPIOC, &GPIO_InitStructure);
- }
- void Delay_uS1(u16 nUS)
- {
- u8 i;
- while (nUS--)
- {
- for (i=0;i<8;i++){;;}
- }
- }
- void Delay_mS1(u16 nMS)
- {
- while(nMS--)
- {
- Delay_uS1(1000);
- }
- }
- u16 key_scan(void)
- {u16 key_value;
- if((Read_KEY_START))return 0;
- Delay_mS1(30);
- if((Read_KEY_START))return 0;
- if(!Read_KEY_START)key_value=KEY_START;
- Delay_mS1(50);
- return key_value;
- }
- void beep_IO_init(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- /* Configure PC. as Output push-pull */
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_Init(GPIOB, &GPIO_InitStructure);
- GPIO_ResetBits(GPIOB, GPIO_Pin_13 );
- }
- void beep(u8 n)
- {u8 i;
- for(i=0;i<n;i++)
- {
- GPIO_SetBits(GPIOB,GPIO_Pin_13);
- Delay_mS1(60);
- GPIO_ResetBits(GPIOB,GPIO_Pin_13 );
- Delay_mS1(60);
- }
- }
- void KEY_Ready(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- GPIO_InitStructure.GPIO_Pin = KEY_SET|KEY_UP|KEY_DOWN;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
- GPIO_Init(GPIOB, &GPIO_InitStructure);
-
- GPIO_InitStructure.GPIO_Pin = KEY_START;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
- GPIO_Init(GPIOC, &GPIO_InitStructure);
- 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)。
-
- }
- /***********************GPIO初始化子函數*********************/
- void GPIO_Init_Function(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- GPIO_InitTypeDef GPIO_InitStruct; //聲明GPIO_InitTypeDef類型的結構體
- GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;//8;// | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 ;
- GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;//復用推挽輸出GPIO_Mode_Out_PP;
- GPIO_Init(GPIOE,&GPIO_InitStruct);
- /* UART1*/
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOA, &GPIO_InitStructure);
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
- GPIO_Init(GPIOA, &GPIO_InitStructure);
- /*PAD5作為US2的TX端,打開復用,負責發送數據 */
- /*
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE); //使能GPIOD時鐘
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
- GPIO_PinRemapConfig(GPIO_Remap_USART2, ENABLE);
- GPIO_StructInit(&GPIO_InitStructure);
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
- GPIO_Init(GPIOD , &GPIO_InitStructure);
-
- //PD6作為US2的RX端,負責接收數據
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
- GPIO_Init(GPIOD, &GPIO_InitStructure);
- */
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //使能GPIOD時鐘
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
- // RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); // 不重映射
- // GPIO_PinRemapConfig(GPIO_Remap_USART2, ENABLE);
- GPIO_StructInit(&GPIO_InitStructure);
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //PA2作為US2的TX端,
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
- GPIO_Init(GPIOA , &GPIO_InitStructure);
-
- //PA3作為US2的RX端,
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
- GPIO_Init(GPIOA, &GPIO_InitStructure);
- }
- void GPIO_Init_IN(void)
- {
- GPIO_InitTypeDef GPIO_InitStruct; //聲明GPIO_InitTypeDef類型的結構體
- GPIO_InitStruct.GPIO_Pin = GPIO_Pin_2 ;// | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 ;
- GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;//GPIO_Mode_Out_PP;//GPIO_Mode_AF_PP;//復用推挽輸出
- GPIO_Init(GPIOE,&GPIO_InitStruct);
- }
- void GPIOC_Init(void)
- {
- GPIO_InitTypeDef GPIO_InitStruct; //聲明GPIO_InitTypeDef類型的結構體
- GPIO_InitStruct.GPIO_Pin = 0XFFFF;//GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;
- GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;//GPIO_Mode_AF_PP;//復用推挽輸出
- GPIO_Init(GPIOC,&GPIO_InitStruct);
- }
- /***********************RCC初始化子函數*********************/
- //Note:系統復位后,HSI振蕩器被選為系統時鐘。
- void RCC_Init_Function(void)
- {
- RCC_DeInit(); //Resets the RCC clock configuration to the default reset state.
- RCC_HSEConfig(RCC_HSE_ON); //外部8MHz高速時鐘使能.
- while(RCC_WaitForHSEStartUp() == RESET); //等待外部高速時鐘就緒
- // RCC_HCLKConfig(RCC_SYSCLK_Div1); //設置AHB的分頻系數:AHB clock = SYSCLK
- // RCC_PCLK2Config(RCC_HCLK_Div1); //設置APB2的分頻系數:APB2 clock = HCLK
- RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);//9);//RCC_PLLMul_2); //選擇外部高速時鐘作為PLL
- RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //選擇PLLCLK作為系統時鐘
- // RCC_SYSCLKConfig(RCC_SYSCLKSource_HSE);
- //RCC_SYSCLKConfig(RCC_SYSCLKSource_HSI);
- RCC_PLLCmd(ENABLE); //PLL使能
- while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); //等待PLL就緒
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE); //使能GPIOE時鐘
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE); //使能GPIOC時鐘
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE); //使能GPIOD時鐘
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //使能AFIO時鐘
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); //使能GPIOB時鐘
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //使能GPIOA時鐘
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
-
- }
- //*********************************************
- //TIM模塊設置
- void TIM_Configuration(void)
- {
- TIM_TimeBaseInitTypeDef TIM_BaseInitStructure;
- TIM_OCInitTypeDef TIM_OCInitStructure;
- //TIM1基本計數器設置 /72MHZ/(3+1)= 18MHZ;1/18= 0.05555555555us ////0.0555*(10+1)= 0.61111us=612ns,與測試結果一致
- TIM_BaseInitStructure.TIM_Period = 10;//0xffff; //這里必須是65535 ARR
- TIM_BaseInitStructure.TIM_Prescaler = 1;//3;//71;//1;//0;//71;//71; //預分頻71,即72分頻,得1M 72M/N
- TIM_BaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;//0;系統時鐘分頻 72MHZ
- TIM_BaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
- TIM_BaseInitStructure.TIM_RepetitionCounter = 0; //只有TIME1和TIME8有
- TIM_TimeBaseInit(TIM1, &TIM_BaseInitStructure);
- //TIM1_OC1模塊設置
- TIM_OCStructInit(& TIM_OCInitStructure);
- TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle; //管腳輸出模式:翻轉
- // TIM_OCInitStructure.TIM_Pulse = 0;//10;//30;//35;//200;//100;//2000; //翻轉周期:2000個脈沖 //設置了待裝入捕獲比較寄存器的脈沖值。它的取值必須在0x0000和0xFFFF之間。
- TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //使能TIM1_CH1通道
- TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //輸出為正邏輯
- TIM_OC1Init(TIM1, &TIM_OCInitStructure); //寫入配置
- //清中斷
- TIM_ClearFlag(TIM1, TIM_FLAG_CC1);
- //TIM1中斷源設置,開啟相應通道的捕捉比較中斷
- TIM_ITConfig(TIM1, TIM_IT_CC1, DISABLE);//ENABLE);//
- //TIM1開啟
- TIM_Cmd(TIM1, DISABLE);
- //通道輸出使能
- TIM_CtrlPWMOutputs(TIM1, ENABLE);
- }
- /*******************************************************************************
- * Function Name : USART1_IRQHandler
- * Description : This function handles USART1 global interrupt request.
- * Input : None
- * Output : None
- * Return : None
- *******************************************************************************/
- void USART1_IRQHandler(void)
- { u8 temp;
- if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
- {
- temp=USART_ReceiveData(USART1);
- if(f==0) //在發送新指令時,f要清0
- {
- memset(DTBuf, 0, 40); //系統函數,清0
- DTBuf[f++]=temp;
- }
- else
- {
- if(f<40)
- {
- DTBuf[f++]=temp;
- }
- }
- USART_ClearITPendingBit(USART1,USART_IT_RXNE);
- }
- USART_ReceiveData(USART1);
- }
- //***********************延時子函數*********************/
- void delay(u16 T)
- {
- while(T--);
- }
- void delaynms(u8 t)
- {
- while(t--) delay(8192);
- }
- //*******************************************
- //**********************************************************************
- void TurnOffPowerSub(void) //關掉芯片電源 //PE1 STM VCC
- {
- while(!(GetChipSckLevel )); //PE9, wait H
- while(GetChipSckLevel ); //wait L
- TIM_Cmd(TIM1, DISABLE);//TIM1->CR1 &= CR1_CEN_Reset;//
- GPIO_ResetBits(GPIOE, ChipVccPin ); //PE1 ;GPIOA->BRR |=0X02; //=0 這些位可讀可寫并只能以字(16位)的形式操作。
- }
- //**********************************************************************
- void TurnOnPower(void)
- {
- GPIO_SetBits(GPIOE, ChipVccPin );//GPIOA->BSRR |=0X02; //=1
- TIM_Cmd(TIM1, ENABLE);
- }
- //********************
- void OCWaveForChipCLKInitial(void)
- {
- // 設置TIMx_CR1寄存器中的UDIS位,可以禁止更新事件
- TIM1->DIER &=0xfffd; //TIM1->DIER:DMA/中斷使能寄存器(TIMx_DIER :位1 CC1IE:允許捕獲/比較1中斷 P243
- TIM1->CCMR1&=0xFFF7; //禁止預裝載
- TIM1->CCR1=10;//10;//30;//2;//4;//8;//15;//30; 裝入比較初值
- TIM1->ARR=10;//10;//30;//4;//8;//16;//30; //預裝載的值
- TIM1->CCMR1|=0x0008; //捕獲/比較模式寄存器1(TIMx_CCMR1) :位3OC1PE:輸出比較1預裝載使能 p246
- TIM1->CR1 |= 0x0081; //TIMx_CR1 位7 ARPE:自動重裝載預裝載允許位 //位4 DIR:方向 0:計數器向上計數;1:計數器向下計數。位0 CEN:允許計數器 P190
- TIM1->CR1 &=0XFFEF;
- TurnOnPower();
- delay(50);
- while (!(TIM1->SR &0x0002)); //狀態寄存器(TIMx_SR).CC1IF///位1 CC1IF:捕獲/比較1 中斷標記 p244
- TIM1->SR &=0XFFFD;//清除捕獲/比較1 中斷標記//TIM1->SR = (u16)~TIM_IT_CC1;
- TIM1->ARR =144;//144;//TIM1->CCR1+15;//2;//4;//8;//15;//30;
- delay(50);
- TurnOffPowerSub();
- delay(50);
- }
- unsigned char Control_DThink( char *bufin, char *bufref,unsigned char innum,unsigned char outnum)
- {
- unsigned char i,flg=0;
- f=0; //全局變量f=0表示清除UART的接收緩存
-
- UART1_SendString(bufin,innum);
- Delay_mS1(30);
- for(i=0;i<outnum;i++)
- {
- if(DTBuf[i]!=bufref[i])
- {
- flg|=1; //與參考數據不一致
- break;
- }
- }
- return flg;//1--error
- }
- unsigned char Check_Chip_UID( char *bufback)
- {
- unsigned char i,j,flg=0;
- f=0; //全局變量f=0表示清除UART的接收緩存
- for(i=0;i<19;i++) //返回數據串包括UID
- {
- bufback[i]=0;
- }
- UART1_SendString(READ_ONE_CARD_UID,9); //OK返回19字節(0x13);NG返回10字節(0x0A)
- Delay_mS1(30);
-
- if(f<0x13)//UID讀出字串的正常長度判斷
- {
- flg=1;
- return flg;
- }
- if(DTBuf[8]) //00表示成功
- {
- flg=1;
- return flg;
- }
- j=0;
- if(f<50)
- for(i=0;i<f;i++) //返回數據串包括UID
- {
- if((DTBuf[i]==0xAA)&&(DTBuf[i+1]==0x00))
- {
- bufback[j++]=DTBuf[i];
- i++;
- }
- else
- {
- bufback[j++]=DTBuf[i];
- }
- }
- return flg;
- }
- unsigned char Write_Chip(unsigned char adr,unsigned char *data)
- {
- unsigned char i,j,flg=0;
- u8 SDTBuf[40]; //UART發送指令串緩存
- f=0; //全局變量f=0表示清除UART的接收緩存
- SDTBuf[0]=0XAA;SDTBuf[1]=0XBB;SDTBuf[2]=19; SDTBuf[3]=0X00;SDTBuf[4]=0X00;SDTBuf[5]=0X00;
- SDTBuf[6]=0X06;SDTBuf[7]=0X10;
- for(i=0;i<9;i++) //8~16
- {
- SDTBuf[i+8]=CARD_UID[9+i];
- }
- SDTBuf[17]=adr; j=18;
- SDTBuf[j++]=data[0]; //18
- if(WDATA[0]==0xAA)
- SDTBuf[j++]=0X00; //19
- SDTBuf[j++]=data[1];
- if(WDATA[1]==0xAA)
- SDTBuf[j++]=0X00;
- SDTBuf[j++]=data[2];
- if(WDATA[2]==0xAA)
- SDTBuf[j++]=0X00;
- SDTBuf[j++]=data[3];
- if(WDATA[3]==0xAA)
- SDTBuf[j++]=0X00;
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
0.jpg (26.71 KB, 下載次數: 60)
下載附件
2018-5-2 16:25 上傳
下載(此代碼年代久遠,采用的老版本的庫和老版本Keil編寫的):
STM32 dthink讀寫射頻卡工程.7z
(583.27 KB, 下載次數: 22)
2023-5-8 04:38 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
D-Think_M50D DataSheet_ CN(ISO15693).pdf
(897.02 KB, 下載次數: 14)
2018-5-2 11:37 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|