论坛元老
 
- 积分
- 3448
- 金钱
- 3448
- 注册时间
- 2017-7-4
- 在线时间
- 869 小时
|
发表于 2017-12-2 17:01:47
|
显示全部楼层
2年前上一东家写的,韦根34程序,完美运行。另:单片机io接韦根线要加RC滤波,否则很容易被干扰。
[mw_shl_code=c,true]//源文件
#include "main.h"
#define USEING_INTERR //中断方式
static u8 u_EvenCheck = 2; //偶检验
static u8 u_OddCheck = 2; //奇校验
static u8 u_EvenNums = 0; //偶校验软件比较
static u8 u_OddNums = 0; //奇校验软件比较
static u8 u_DataBits = 0; //当前接收数据位数
u8 IDData[4]; //4字节ID号
#ifdef USEING_INTERR //中断方式读取韦根数据
/***********************************************************
* 函数名:WiegandInit
* 功能 :外部中断引脚初始化
* 输入 : 无
* 输出 :无
**********************************************************/
void WiegandInit(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(WIEGAND_RCC_PORT | RCC_APB2Periph_AFIO,ENABLE);
GPIO_InitStructure.GPIO_Pin = WIEGAND_DATA0_GPIO | WIEGAND_DATA1_GPIO;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //下拉输入
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(WIEGAND_PORT, &GPIO_InitStructure);
//Data0 中断线 PB12
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource12);
EXTI_InitStructure.EXTI_Line = EXTI_Line12;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
//Data1 中断线 PB13
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource13);
EXTI_InitStructure.EXTI_Line = EXTI_Line13;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
//中断优先级,尽可能设为最高优先级
NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn; //使能按键所在的外部中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01; //抢占优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00; //子优先级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道
NVIC_Init(&NVIC_InitStructure);
}
/***********************************************************
* 函数名:EXTI15_10_IRQHandler
* 功能 :两数据线中断函数
* 输入 : 无
* 输出 :无
**********************************************************/
void EXTI15_10_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line12) != RESET)
{ //Data0 -> 低电平表示1位0
if (u_DataBits == 0)
{ //偶校验
u_EvenCheck = 0;
}
else if (u_DataBits == (WG_DATA_BITS -1))
{ //奇校验
u_OddCheck = 0;
}
else
{ //数据,4字节、高位在前
IDData[(WG_DATA_BITS - 2 - u_DataBits) / 8] &= ~(0x1 << ((WG_DATA_BITS - 2 - u_DataBits) % 8));
}
u_DataBits++;
EXTI_ClearITPendingBit(EXTI_Line12);
}
else if(EXTI_GetITStatus(EXTI_Line13) != RESET)
{ //Data1 -> 低电平表示1位1
if (u_DataBits == 0)
{ //偶校验
u_EvenCheck = 1;
}
else if (u_DataBits == (WG_DATA_BITS -1))
{ //奇校验
u_OddCheck = 1;
}
else
{ //数据,4字节、高位在前
IDData[(WG_DATA_BITS - 2 - u_DataBits) / 8] |= (0x1 << ((WG_DATA_BITS - 2 - u_DataBits) % 8));
if(u_DataBits < WG_DATA_BITS / 2)
u_EvenNums++; //计算1的个数来作偶校验
else if(u_DataBits < WG_DATA_BITS - 1)
u_OddNums++; //计算1的个数来作奇校验
}
u_DataBits++;
EXTI_ClearITPendingBit(EXTI_Line13);
}
}
/***********************************************************
* 函数名:Check
* 功能 :奇偶校验,确定读出数据书否正确
* 输入 : 无
* 输出 :0->校验成功,数据有效 1->校验失败,数据无效
**********************************************************/
u8 DataCheck(void)
{
u8 oddcheck,evencheck;
if(u_DataBits >= WG_DATA_BITS)
{ //数据接收完才校验
//u_DataBits = 0;
if(u_EvenNums % 2 == 0)
evencheck = 0; //偶数个1
else
evencheck = 1; //奇数个1
if(u_OddNums % 2 == 0)
oddcheck = 1; //偶数个1
else
oddcheck = 0; //奇数个1
u_EvenNums = 0;
u_OddNums = 0; //清零
if((u_EvenCheck == evencheck) && (u_OddCheck == oddcheck))
{ //校验成功
u_EvenCheck = 2;
u_OddCheck = 2;
return 0; //和实际的校验码一起返回成功
}
else
{ //校验失败
u_EvenCheck = 2;
u_OddCheck = 2;
return 1;
}
}
else
return 2;
}
#else //查询方式初始化
/***********************************************************
* 函数名:WiegandInit
* 功能 :Wiegan数据线引脚初始化,
* 输入 : 无
* 输出 :无
**********************************************************/
void WiegandInit(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(WIEGAND_RCC_PORT | RCC_APB2Periph_AFIO,ENABLE);
GPIO_InitStructure.GPIO_Pin = WIEGAND_DATA0_GPIO | WIEGAND_DATA1_GPIO;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(WIEGAND_PORT, &GPIO_InitStructure);
}
/***********************************************************
* 函数名:GetWiegandData
* 功能 :查询方式获取Wiegand数据
* 输入 : 无
* 输出 :无
**********************************************************/
u8 GetWiegandData(void)
{
}
#endif
//串口打印
void IDDataPrintf(void)
{
u8 CheckFlag = 0;
u8 Buff[6],i;
if(u_DataBits >= WG_DATA_BITS)
{
CheckFlag = DataCheck();
if(CheckFlag == 0)
{
#if 0
USART_printf(USART1,"%s " "%d " "%d " "%d " "%d ","ID:", IDData[0],IDData[1],IDData[2],IDData[3]);
USART_send_string("\n");
USART_send_string("DataBits/Check: ");
USART_printf(USART1, "%d " "%d\n ",u_DataBits,CheckFlag);
#else
for (i = 0;i < 4;i++)
Buff = IDData;
Buff[i++] = u_DataBits;
Buff = CheckFlag;
g_Driver.OnSendCanData(Buff,6,0);
#endif
}
else if(CheckFlag == 1)
{
#if 0
USART_send_string("Read Data Failed\n");
#else
for (i = 0;i < 4;i++)
Buff = IDData;
Buff[i++] = u_DataBits;
Buff = CheckFlag;
g_Driver.OnSendCanData(Buff,6,0);
#endif
}
u_DataBits = 0;
}
}
//头文件
#ifndef _WIEGAND_H_
#define _WIEGAND_H_
// Wiegand 数据格式
#define WG_DATA_BITS 34 //韦根34格式
// Wiegand 数据线接口
#define WIEGAND_PORT GPIOB
#define WIEGAND_DATA1_GPIO GPIO_Pin_13
#define WIEGAND_DATA0_GPIO GPIO_Pin_12
#define WIEGAND_RCC_PORT RCC_APB2Periph_GPIOB
#define WIEGAND_DATA1 PBin(13)
#define WIEGAND_DATA0 PBin(12)
// 外部函数
extern void WiegandInit(void);
extern void IDDataPrintf(void);
#endif[/mw_shl_code] |
|