MTK平台基于EV1527的无线接收和发射程序
生活随笔
收集整理的這篇文章主要介紹了
MTK平台基于EV1527的无线接收和发射程序
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
EV1527 功能描述
1:每一幀碼有 25 位,同步位(syn)的高低電平寬度為 t:31t(先高后低),其余每一位碼的碼形有兩種,稱為“0”碼和“1”碼;“0”碼是一個(gè)高低電平寬度比為 t:3t 的脈沖(先高后低),“1”碼是一個(gè)高低電平寬度比為 3t:t 的脈沖(先高后低);一幀碼發(fā)完馬上發(fā)下一幀碼。其中 t 為振蕩頻率的 32 倍。
2:發(fā)碼時(shí)依次將 syn、C0、C1、C2、C3、C4、C5、C6、C7、C8、C9、C10、C11、C12、C13、C14、C15、C16、C17、C18、C19、D0、D1、D2、D3 的編碼發(fā)出。 C0-C19組成20位的地址碼,以區(qū)分不同的遙控設(shè)備,D0-D3組成4位按鍵碼,以實(shí)現(xiàn)不同的功能。
以433Mhz的EV1527遙控器為例
同步碼:350us高電平+10ms低電平
0碼:350us高電平+1ms低電平
1碼:1ms高電平+350us低電平
解碼代碼
#include <linux/hrtimer.h> #include <linux/ktime.h> #include <linux/delay.h> static struct hrtimer hr_timer; static ktime_t ktime; static unsigned int interval=50; /* unit: us */ #define _start_us_min 160 #define _start_us_max 240 #define _num0_us_min 15 #define _num0_us_max 25 #define _num1_us_min 0 #define _num1_us_max 10 int get_gpio_rx433(void);//獲取gpio口狀態(tài)函數(shù),請自行實(shí)現(xiàn)ulong RF_data; uchar Temp_addrl,Temp_addrh,Address_l,Address_h;//地址碼 uchar cntint,IR_Key; //接收位數(shù)據(jù)的個(gè)數(shù),數(shù)據(jù) bool start_flag=0,IR_OVER; //檢測到碼頭start_flag置1,反之置0,接收完一組數(shù)據(jù)后IR_OVER置1,反之清0 bool Jump_flag; //電平跳變標(biāo)志 uint release_key; //松手計(jì)數(shù) uint Low; //低電平計(jì)數(shù) uint RF_Value_Cnt; //長按計(jì)數(shù)/**----------------------------------------------------------------------------------------------****函數(shù)名 :低電平脈寬測量函數(shù)**功能說明:計(jì)算低電平時(shí)間(LOW),50us調(diào)用一次**----------------------------------------------------------------------------------------------**/ void soft_count(void)//接受碼計(jì)數(shù)函數(shù) {if(get_gpio_rx433()==0) //低電平{ Low++;if(Jump_flag)Jump_flag=0; //Jump_flag由0→1代表 低→高 跳變 }else if(get_gpio_rx433()==1) //高電平{if(!Jump_flag){ Jump_flag=1; //Jump_flag由1→0代表 高→低 跳變soft_decode();Low=0;}} }void soft_decode(void) {if(start_flag==0){if(( Low > _start_us_min ) && ( Low < _start_us_max )) //同步碼{start_flag=1;cntint=0;//數(shù)據(jù)長度IR_Key=0;RF_data=0;}else {RF_Value_Cnt=0;release_key++;if(release_key>500)release_key=500;}}else if((start_flag==1)&&(cntint<24)){if(( Low > _num0_us_min ) && ( Low < _num0_us_max )) //數(shù)據(jù) 0 {RF_data=RF_data<<1;cntint++;}else if(( Low > _num1_us_min ) && ( Low < _num1_us_max )) //數(shù)據(jù) 1 {RF_data=RF_data<<1;RF_data|=1;cntint++;}else {start_flag=0;cntint=0;}}if(cntint==24){release_key=0;RF_Value_Cnt++;if(RF_Value_Cnt>500)RF_Value_Cnt=500;cntint=0;start_flag=0;IR_Key=RF_data&0x0000000f; //取4位數(shù)據(jù)Temp_addrl=(RF_data>>4)&0x000000ff; //地址共20位,只取16位。Temp_addrh=(RF_data>>12)&0x000000ff;IR_OVER=1; } } enum hrtimer_restart my_hrtimer_callback( struct hrtimer *timer ) {soft_count();hrtimer_forward_now(&hr_timer, ktime_set(0, (interval%1000000)*1000)); return HRTIMER_RESTART; } 在接收開始的地方調(diào)用 hrtimer_init( &hr_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL ); ktime = ktime_set( interval/1000000, (interval%1000000)*1000 ); hr_timer.function = my_hrtimer_callback; hrtimer_start( &hr_timer, ktime, HRTIMER_MODE_REL );代碼有參考如下博文 ———————————————— 版權(quán)聲明:本文為CSDN博主「冷冷涼涼」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。 原文鏈接:https://blog.csdn.net/hallo8888/article/details/84952641編碼代碼
int gpio_tx433; void set_gpio_tx433(int enable) {gpio_set_value(gpio_tx433, enable); } void set_tx433_0(void) {gpio_set_value(gpio_tx433, 1);udelay(360);gpio_set_value(gpio_tx433, 0);mdelay(1); } void set_tx433_1(void) {gpio_set_value(gpio_tx433, 1);mdelay(1);gpio_set_value(gpio_tx433, 0);udelay(320); } void set_tx433(unsigned long addr,unsigned int key) { int i=0; int j=0; for (i=0;i<4;i++)//需要重復(fù)發(fā)射4次 { //同步碼gpio_set_value(gpio_tx433, 1);udelay(320);gpio_set_value(gpio_tx433, 0);mdelay(10); //地址碼for(j=0;j<20;j++){if((addr>>(19-j))&0x1)set_tx433_1();elseset_tx433_0();}//按鍵碼for(j=0;j<4;j++){if((key>>(3-j))&0x1)set_tx433_1();elseset_tx433_0();} } }?
總結(jié)
以上是生活随笔為你收集整理的MTK平台基于EV1527的无线接收和发射程序的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网络模拟器软件分享——Cisco Pac
- 下一篇: Git 基础知识大全