- //定时器配置
- void RFIDTim_init(void)
- {
- TIM_TimeBaseInitTypeDef TIM_TimeBaseSt;
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
- TIM_DeInit(RFID_TIM);
- TIM_TimeBaseSt.TIM_Prescaler = 72-1; //
- TIM_TimeBaseSt.TIM_CounterMode = TIM_CounterMode_Up;
- TIM_TimeBaseSt.TIM_Period = 1000;
- TIM_TimeBaseSt.TIM_ClockDivision =TIM_CKD_DIV1;
- TIM_TimeBaseInit(RFID_TIM, &TIM_TimeBaseSt);
- TIM_Cmd(RFID_TIM, ENABLE);
- DEBUG("time init ok \n");
-
- }
- //IO及中断配置
- void RFID_Exti_Init(void){
- EXTI_InitTypeDef EXTI_InitStructure;
- GPIO_InitTypeDef GPIO_InitStructure;
- NVIC_InitTypeDef NVIC_InitStructure;
- /* Enable GPIOA clock */
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
- /* Enable AFIO clock */
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
- /* Configure PA.00 pin as input floating */
- GPIO_InitStructure.GPIO_Pin = OUT_PIN;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
- GPIO_Init(OUT_PORT, &GPIO_InitStructure);
- GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource7);//将PA7挂在中断源上
- /* Configure EXTI0 line */
- EXTI_InitStructure.EXTI_Line = EXTI_Line7;
- EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
- EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;
- EXTI_InitStructure.EXTI_LineCmd = ENABLE;
- EXTI_Init(&EXTI_InitStructure);
- EXTI_ClearITPendingBit(EXTI_Line7);
-
- /* Enable and set EXTI0 Interrupt to the lowest priority */
- NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
- NVIC_Init(&NVIC_InitStructure);
- }
- //RFID初始化
- void RFIDInit(void)
- {
- DEBUG("Start Init EM4095 RFID Module\r\n");
-
- RFIDTim_init();//定时器配置
-
- RFID_Exti_Init();//IO初始化及中断配置
- DEBUG("finish init EM4095 RFID Module\r\n");
- }
- 中断处理函数
- // Interrupt bei Flankenwechsel
- void EXTI9_5_IRQHandler(void)
- {
- static u8 N = 0;
- if(EXTI_GetITStatus(EXTI_Line7) != RESET)
- {
- if(gFlag == 0x00)
- {
- TT_Buffer[N]= TIM_GetCounter(RFID_TIM); //数组记录计时器计时时间
- TT_voltage[N]=GPIO_ReadInputDataBit(OUT_PORT,OUT_PIN);//数组保存此时IO电平
- TIM_SetCounter(RFID_TIM, 0);//计时器清0
- N++;
- if(N== 1)//cym
- {
- gFlag = 0xFF;
- }
- }
- EXTI_ClearITPendingBit(EXTI_Line7);
- }
- }
- //数据解析
- unsigned char Decode(void)
- {
- u16 min,max,avg,i,n;
- min = 0xFF;max = 0xFF;avg = 0xFF;i = 0xFF;n = 0xFF;
- //-------------------- STEP1: 找出 [平均值]
- for(i=1; i<256; i++) //---- 从1开始! 0字节是不可靠数据
- {
- if(TT_Buffer[i]<min)
- {
- min = TT_Buffer[i];
- }
- if(TT_Buffer[i]>max)
- {
- max = TT_Buffer[i];
- }
- }
- //数据过滤
- if(min<100||max>1000)
- {
- //DEBUG("\r\n min: %d max: %d ; |舍弃 ! | \r\n",min,max);
- return 0;
- }
- avg=((min+max)/2);//-----平均值
- n = 0;
- //-------------------- STEP2: 提取原始数据
- for(i=1; i<256; i++) //---- 必须从1开始! 0字节是不可靠数据
- {
- if (TT_Buffer[i]<avg )//(abs((int)TT_Buffer[i] - 245)<=70)
- {
- if (TT_voltage[i]==1)
- Bin_Buffer[n++]=0;
- else
- Bin_Buffer[n++]=1;
- }
- else if (TT_Buffer[i]>avg )//(abs((int)TT_Buffer[i] - 485)<=70)
- {
- if (TT_voltage[i]==1)
- {
- Bin_Buffer[n++]=0;
- Bin_Buffer[n++]=0;
- }
- else
- {
- Bin_Buffer[n++]=1;
- Bin_Buffer[n++]=1;
- }
- }
- }
- //-------------------- STEP3: 查找RFID头标志(9个1)
- i = n-128; //------- 有效起始点!
- while(i--)
- {
- if(FindHeader(i))
- {
- if(FindID(i))
- {
- return 1;
- }
- }
- }
- return 0;
- }
- /*=================== 查找RFID 头标志 9个1
- //--- 匹配返回:1
- //--- 无效返回:0*/
- u8 FindHeader(u16 index)
- {
- u8 n;
- if((Bin_Buffer[index]==0)&&(Bin_Buffer[index+1]==1))//cym 1/0
- {
- index++;
- index++;
- }
- else
- {
- return (0);
- }
- for(n=0; n<9; n++)
- {
- if((Bin_Buffer[index]==1)&&(Bin_Buffer[index+1]==0))//cym 0/1
- {
- index = index+2;
- }
- else
- {
- return (0);
- }
- }
- return (1);
- }
- 将头后的数据解析为实际的卡号数据。
- u8 FindID(u16 i)
- {
- u8 n;
- u8 k;
- u8 sum;
- //-------------------- STEP1: 提取RFID有效数据
- if(i)
- {
- for(n=0; n<11; n++)RFID[n] = 0x00; //------ Buffer清零
- i = i+20; //--- 有效数据流
- for(k=0; k<11; k++)
- {
- for(n=0; n<5; n++)
- {
- RFID[k] = RFID[k]<<1;
- if((Bin_Buffer[i]==1)&&(Bin_Buffer[i+1]==0))//cym 0/1
- {
- RFID[k] |= 0x01;
- }
- i += 2;
- }
- }
- }
- //---------------------------- STEP2: 校对数据
- //---------------------- X 轴校验
- for(k=0; k<10; k++)
- {
- sum = 0;
- if(RFID[k]&0x01)sum++;
- if(RFID[k]&0x02)sum++;
- if(RFID[k]&0x04)sum++;
- if(RFID[k]&0x08)sum++;
- if(RFID[k]&0x10)sum++;
- if(sum%2) //--- 偶校验出错!
- {
- // MessageBox("X 轴校验出错!");
- return 0;
- }
- }
- //------------------- Y 轴校验
- sum = 0;
- for(k=0; k<11; k++)
- {
- sum ^= RFID[k];
- }
- if(sum&0x1E) //--- 偶校验出错!
- {
- //MessageBox("Y 轴校验出错!");
- return 0;
- }
- //------------------ STEP3: 获取RFID卡号(4个字节32位)
- for(k=0; k<10; k++)
- {
- RFID[k] = RFID[k]>>1; //---去掉校验值
- }
- Vendor = 0;
- CardIDH = 0;
- CardIDL = 0;
- k = RFID[0]<<4;
- Vendor = k|RFID[1]; //--- 卡版本或供应商信息
- k = RFID[2]<<4;
- k |= RFID[3];
- CardIDH |= k<<8;
- k = RFID[4]<<4;
- k |= RFID[5];
- CardIDH |= k;
- k = RFID[6]<<4;
- k |= RFID[7];
- CardIDL |= k<<8;
- k = RFID[8]<<4;
- k |= RFID[9];
- CardIDL |= k;
- //------------------ STEP4: 显示解码结果
- return 1;
- }
|