日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當前位置:首頁 > > 嵌入式案例Show
[導(dǎo)讀]什么是韋根協(xié)議?如何實現(xiàn)?本文詳細解讀。

01 前言

今年疫情期間,為了便于管理,智能門禁系統(tǒng)被廣泛應(yīng)用,市面上大量的門禁終端都是使用韋根協(xié)議進行通訊。什么是韋根協(xié)議?如何實現(xiàn)?本文詳細解讀。

02 韋根協(xié)議介紹

Wiegand(韋根)協(xié)議是由摩托羅拉公司制定的一種通訊協(xié)議,它適用于涉及門禁控制系統(tǒng)的讀卡器和卡片的許多特性;其協(xié)議并沒有定義通訊的波特率、也沒有定義數(shù)據(jù)長度。它有很多格式,標準的韋根26-bit是最常用的格式。

此外,還有34-bit、36-bit、44-bit等格式。而標準的26-bit格式是一個開放式的格式,這就意味著任何支持韋根26-bit輸入\輸出的設(shè)備都可以互相連接進行通信。

韋根數(shù)據(jù)輸出由兩條數(shù)據(jù)線DATA0和DATA1,和公共的信號地GND組成。在沒有數(shù)據(jù)輸出時,DATA0和DATA1都保持高電平(典型為+5V電平),若輸出'0'時,DATA0輸出低脈沖而DATA1保持為高電平,輸出'1'時,DATA1輸出低脈沖而DATA0保持為高。典型的低脈沖寬度為50us,輸出每一bit之前的間隔為1ms(實際的信號電平和時序由實際的韋根讀卡器決定)。下圖為韋根時序圖

韋根26:一個“韋根包”有26位數(shù)據(jù),第1位為第1到第13位的偶校驗,最后1位為第14到第26位的奇校驗,中間24位為數(shù)據(jù)位。

韋根34:即一個“韋根包”有34位數(shù)據(jù),格式為第1位為第1到第17位的偶校驗,最后1位為第18到第34位的奇校驗,中間32位為數(shù)據(jù)位。

03 軟件實現(xiàn)

本文實現(xiàn)韋根協(xié)議26bit/34bit的接收和數(shù)據(jù)解析,在數(shù)據(jù)接收時采用一個循環(huán)緩沖數(shù)組進行接收,通過中斷接收,以信號的下降沿觸發(fā),不用判斷脈沖寬度,只要做個計時器,做個超時判斷數(shù)據(jù)接收完成進行處理。

管腳初始化和外部中斷初始化:

//頭文件中對管腳進行定義PC9 DATA0 PC8 DATA1#define DATA0_GPIO_PORT GPIOC#define DATA0_GPIO_PIN GPIO_Pin_9#define DATA0_GPIO_MODE GPIO_Mode_IN_FLOATING#define DATA0_GPIO_EXTI_PORT_SOURCE GPIO_PortSourceGPIOC#define DATA0_GPIO_EXTI_PIN_SOURCE GPIO_PinSource9#define DATA0_EXTI_LINE EXTI_Line9#define DATA0_EXTI_TRIGGER EXTI_Trigger_Falling#define DATA0_EXTI_IRQ EXTI9_5_IRQn #define DATA1_GPIO_PORT GPIOC#define DATA1_GPIO_PIN GPIO_Pin_8#define DATA1_GPIO_MODE GPIO_Mode_IN_FLOATING#define DATA1_GPIO_EXTI_PORT_SOURCE GPIO_PortSourceGPIOC#define DATA1_GPIO_EXTI_PIN_SOURCE GPIO_PinSource8#define DATA1_EXTI_LINE EXTI_Line8#define DATA1_EXTI_TRIGGER EXTI_Trigger_Falling#define DATA1_EXTI_IRQ EXTI9_5_IRQn //C文件中進行初始化/**----------------------------------------------------------------- * @函數(shù)名 wiegand_init * @功能   初始化wiegand接口,和外部中斷配置 *  * @參數(shù) 無 * @返回值 u8 0表示初始化完成***----------------------------------------------------------------*/u8 wiegand_init(void){ NVIC_InitTypeDef NVIC_InitStructure; EXTI_InitTypeDef EXTI_InitStructure;  GPIO_InitTypeDef GPIO_InitStructure;  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);  GPIO_InitStructure.GPIO_Pin = DATA0_GPIO_PIN; GPIO_InitStructure.GPIO_Mode = DATA0_GPIO_MODE;  GPIO_Init(DATA0_GPIO_PORT, &GPIO_InitStructure);  GPIO_InitStructure.GPIO_Pin = DATA1_GPIO_PIN; GPIO_InitStructure.GPIO_Mode = DATA1_GPIO_MODE;  GPIO_Init(DATA1_GPIO_PORT, &GPIO_InitStructure);  GPIO_EXTILineConfig(DATA0_GPIO_EXTI_PORT_SOURCE, DATA0_GPIO_EXTI_PIN_SOURCE);  EXTI_InitStructure.EXTI_Line = DATA0_EXTI_LINE; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = DATA0_EXTI_TRIGGER; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure);  NVIC_InitStructure.NVIC_IRQChannel = DATA0_EXTI_IRQ; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure);   GPIO_EXTILineConfig(DATA1_GPIO_EXTI_PORT_SOURCE, DATA1_GPIO_EXTI_PIN_SOURCE);  EXTI_InitStructure.EXTI_Line = DATA1_EXTI_LINE; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = DATA1_EXTI_TRIGGER; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure);  NVIC_InitStructure.NVIC_IRQChannel = DATA1_EXTI_IRQ; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure);   return 0;}

外部中斷接收處理:

void EXTI9_5_IRQHandler(void){ if(EXTI_GetFlagStatus(DATA0_EXTI_LINE)) //DATA0數(shù)據(jù)觸發(fā) { EXTI_ClearFlag(DATA0_EXTI_LINE); if(g_wiegandType.Flag.StartFlag == 0) //數(shù)據(jù)接收開始標志 { g_wiegandType.Flag.StartFlag = 1; g_wiegandType.DataIn.DataLen = 0; g_wiegandType.DataIn.Data[g_wiegandType.DataIn.DataLen++] = 0; //數(shù)據(jù)0存入數(shù)組 g_wiegandType.bitIntervalTime = MAX_BIT_INTERVAL_TIME; //數(shù)據(jù)位超時處理 } else { g_wiegandType.DataIn.Data[g_wiegandType.DataIn.DataLen++] = 0; g_wiegandType.bitIntervalTime = MAX_BIT_INTERVAL_TIME;  }  } if(EXTI_GetFlagStatus(DATA1_EXTI_LINE)) //DATA1數(shù)據(jù)觸發(fā) { EXTI_ClearFlag(DATA1_EXTI_LINE); if(g_wiegandType.Flag.StartFlag == 0) { g_wiegandType.Flag.StartFlag = 1; g_wiegandType.DataIn.DataLen = 0; g_wiegandType.DataIn.Data[g_wiegandType.DataIn.DataLen++] = 1; //數(shù)據(jù)1存入數(shù)組 g_wiegandType.bitIntervalTime = MAX_BIT_INTERVAL_TIME; } else { g_wiegandType.DataIn.Data[g_wiegandType.DataIn.DataLen++] = 1; g_wiegandType.bitIntervalTime = MAX_BIT_INTERVAL_TIME;  }  if(g_colStatus == 1) { COL1_LOW(); } else { COL1_HIGH(); } } }

收到一組數(shù)據(jù)后進行解析:

/**----------------------------------------------------------------- * @函數(shù)名 wiegand26 * @功能 wiegand26數(shù)據(jù)解析 *  * @參數(shù) 無 * @返回值 u8 >0表示數(shù)據(jù)異常***----------------------------------------------------------------*/u8 wiegand26(void){ u8 i; u32 result; u8 odd = 0; u8 even = 0; if (g_wiegandType.DataIn.DataLen != 26) { return 1; } result = 0; for (i = 0; i < 24; ++i) { if(g_wiegandType.DataIn.Data[i+1] == 1) { result |= 1<<(23-i); if(i<12) { even++; } else { odd++; } } } g_wiegandType.result = result; if(even%2) //偶校驗判斷 {  if(g_wiegandType.DataIn.Data[0]!=1) return 3; } else { if(g_wiegandType.DataIn.Data[0]==1) return 3; } if(odd%2)//奇校驗判斷 {  if(g_wiegandType.DataIn.Data[25]==1) return 3; } else { if(g_wiegandType.DataIn.Data[25]!=1) return 3; } return 0;}/**----------------------------------------------------------------- * @函數(shù)名 wiegand34 * @功能 wiegand34數(shù)據(jù)解析 *  * @參數(shù) 無 * @返回值 u8 》0表示數(shù)據(jù)異常***----------------------------------------------------------------*/u8 wiegand34(void){ u8 i; u32 result; u8 odd = 0; u8 even = 0; if (g_wiegandType.DataIn.DataLen != 34) { return 1; } result = 0; for (i = 0; i < 32; ++i) { if(g_wiegandType.DataIn.Data[i+1] == 1) { result |= 1<<(31-i); if(i<16) { even++; } else { odd++; } } } g_wiegandType.result = result; if(even%2) {  if(g_wiegandType.DataIn.Data[0]!=1) return 3; } else { if(g_wiegandType.DataIn.Data[0]==1) return 3; } if(odd%2) {  if(g_wiegandType.DataIn.Data[33]==1) return 3; } else { if(g_wiegandType.DataIn.Data[33]!=1) return 3; } return 0;}

處理好的數(shù)據(jù)通過調(diào)試串口輸出,查看和自己的發(fā)送的卡號是否一致,如果異常請檢查DATA0和DATA1是否接反。

04 結(jié)語

韋根協(xié)議是一個比較簡單的單工通信,很容易理解,如果有問題歡迎討論



免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺僅提供信息存儲服務(wù)。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動電源

在工業(yè)自動化蓬勃發(fā)展的當下,工業(yè)電機作為核心動力設(shè)備,其驅(qū)動電源的性能直接關(guān)系到整個系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動勢抑制與過流保護是驅(qū)動電源設(shè)計中至關(guān)重要的兩個環(huán)節(jié),集成化方案的設(shè)計成為提升電機驅(qū)動性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機 驅(qū)動電源

LED 驅(qū)動電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個照明設(shè)備的使用壽命。然而,在實際應(yīng)用中,LED 驅(qū)動電源易損壞的問題卻十分常見,不僅增加了維護成本,還影響了用戶體驗。要解決這一問題,需從設(shè)計、生...

關(guān)鍵字: 驅(qū)動電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動電源的公式,電感內(nèi)電流波動大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計 驅(qū)動電源

電動汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動汽車的核心技術(shù)之一是電機驅(qū)動控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機驅(qū)動系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動汽車的動力性能和...

關(guān)鍵字: 電動汽車 新能源 驅(qū)動電源

在現(xiàn)代城市建設(shè)中,街道及停車場照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進步,高亮度白光發(fā)光二極管(LED)因其獨特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動電源 LED

LED通用照明設(shè)計工程師會遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動電源的電磁干擾(EMI)問題成為了一個不可忽視的挑戰(zhàn)。電磁干擾不僅會影響LED燈具的正常工作,還可能對周圍電子設(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動電源

開關(guān)電源具有效率高的特性,而且開關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機重量也有所下降,所以,現(xiàn)在的LED驅(qū)動電源

關(guān)鍵字: LED 驅(qū)動電源 開關(guān)電源

LED驅(qū)動電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動電源
關(guān)閉