OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4902|回复: 7

韦根26数据解析

[复制链接]

11

主题

85

帖子

0

精华

初级会员

Rank: 2

积分
148
金钱
148
注册时间
2016-3-16
在线时间
15 小时
发表于 2017-12-2 16:37:38 | 显示全部楼层 |阅读模式
1金钱
这是我用逻辑分析仪接收的波形,但是不知道怎么解析,求大神帮忙!

韦根波形.png
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

685

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
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]
回复

使用道具 举报

50

主题

1805

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6662
金钱
6662
注册时间
2016-5-29
在线时间
910 小时
发表于 2017-12-2 18:59:23 | 显示全部楼层
什么软件,图形这么漂亮?
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2017-12-3 00:48:44 | 显示全部楼层
帮顶
回复

使用道具 举报

50

主题

1805

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6662
金钱
6662
注册时间
2016-5-29
在线时间
910 小时
发表于 2017-12-4 09:44:14 | 显示全部楼层
楼主查一下就知道韦根是怎么回事了.韦根很简单的.26BIT数据,传达3字节内容.有两个位是校验位吧.一根阴线,一  根阳线.阳线代表1,阴线代表0.
回复

使用道具 举报

11

主题

85

帖子

0

精华

初级会员

Rank: 2

积分
148
金钱
148
注册时间
2016-3-16
在线时间
15 小时
 楼主| 发表于 2017-12-14 13:01:35 | 显示全部楼层
操作系统 发表于 2017-12-2 18:59
什么软件,图形这么漂亮?

逻辑分析仪的界面
回复

使用道具 举报

11

主题

85

帖子

0

精华

初级会员

Rank: 2

积分
148
金钱
148
注册时间
2016-3-16
在线时间
15 小时
 楼主| 发表于 2017-12-14 13:01:49 | 显示全部楼层
Acuity 发表于 2017-12-2 17:01
2年前上一东家写的,韦根34程序,完美运行。另:单片机io接韦根线要加RC滤波,否则很容易被干扰。
[mw_shl ...

感谢,我再看看
回复

使用道具 举报

9

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
83
金钱
83
注册时间
2017-5-21
在线时间
18 小时
发表于 2018-7-22 13:47:28 来自手机 | 显示全部楼层
学习了
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-19 05:10

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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