1527编码协议_EV1527解码,我也贡献一个,抗干扰,自适应.....
EV1527解碼,我也貢獻一個,抗干擾,自適應, 經測試比買的解碼成功率高,具體多少沒計算,通過示波器看到;
/*
中斷處理函數 、每次中斷查詢一下電平;
手冊16個CLK(一個數據位)的時間是
最大4.24ms(4240us)/16= 265us; 最小230us/16=14us; 分頻時間是4us;
;
同步頭高電平至少4個時鐘;識別同步頭分2步
第一步高電平時間大于等于40us,小于265*4*1.2 = 1060*1.2=1270us;
第二步 低電平時間是高電平時間的31倍,留20%余量26倍-36倍之間;
計算電平時間 (高電平時間 + 低電平時間) / 32 ;
數據寬時間要在這個數值的 正負20% 之間
*/
INTERRUPT_HANDLER(EXTI_PORTA_IRQHandler, 3)
{
static U16 data_h_time;??//
static U16 data_l_time;??//
static U16??bit_time_min;
static U16??bit_time_max;
static U8??decode_KEY;
static U32 decode_ID;
U16 temp;
static U8??ev1527_rx_last;
U16 ev1527_new_time;
disableInterrupts();
ev1527_new_time??= (uint16_t)TIM2->CNTRH << 8;
ev1527_new_time |= (uint16_t)(TIM2->CNTRL);
if(EV1527_RX)??//接收編碼高電平
{
if(ev1527_rx_last==0)? ?//上次是低電平,有跳變
{
EV1527_COUNT_CLEAR;
if(ev1527_decode_state>sync_h)
{
str_ev1527_data.l_data[str_ev1527_data.l_data_write] = ev1527_new_time;
str_ev1527_data.l_data_write = (str_ev1527_data.l_data_write + 1) % EV1527_DATA_TIME_NUM;
switch(ev1527_decode_state)
{
case??sync_l:{
temp = str_ev1527_data.l_data[str_ev1527_data.l_data_read] / str_ev1527_data.h_data[str_ev1527_data.h_data_read];
if((temp >= SYNC_RATIO_MIN) && (temp <= SYNC_RATIO_MAX))
{
temp = str_ev1527_data.l_data[str_ev1527_data.l_data_read] + str_ev1527_data.h_data[str_ev1527_data.h_data_read];
str_ev1527_data.h_data_read = (str_ev1527_data.h_data_read + 1) % EV1527_DATA_TIME_NUM;
str_ev1527_data.l_data_read = (str_ev1527_data.l_data_read + 1) % EV1527_DATA_TIME_NUM;
bit_time_min = temp / 9;
bit_time_max = temp / 7;
decode_ID = 0;
decode_KEY = 0;
data_h_time = 0;
data_l_time = 0;
ev1527_decode_state = chipid_0l;
}
else
{
ev1527_decode_state = sync_h;
}
}break;
case??chipid_0l:
case??chipid_1l:
case??chipid_2l:
case??chipid_3l:
case??chipid_4l:
case??chipid_5l:
case??chipid_6l:
case??chipid_7l:
case??chipid_8l:
case??chipid_9l:
case??chipid_10l:
case??chipid_11l:
case??chipid_12l:
case??chipid_13l:
case??chipid_14l:
case??chipid_15l:
case??chipid_16l:
case??chipid_17l:
case??chipid_18l:
case??chipid_19l:
{
data_h_time += str_ev1527_data.h_data[str_ev1527_data.h_data_read];
data_l_time += str_ev1527_data.l_data[str_ev1527_data.l_data_read];
str_ev1527_data.l_data_read = (str_ev1527_data.l_data_read + 1) % EV1527_DATA_TIME_NUM;
str_ev1527_data.h_data_read = (str_ev1527_data.h_data_read + 1) % EV1527_DATA_TIME_NUM;
temp = data_h_time + data_l_time;
if(temp >= bit_time_min)
{
if(temp <= bit_time_max)
{
if(data_h_time > data_l_time)
{
decode_ID |= 0x01;
}
decode_ID <<= 1;
ev1527_decode_state++;
data_h_time = 0;
data_l_time = 0;
}
else
{
ev1527_decode_state = sync_h;
}
}
}break;
case??data_0l:
case??data_1l:
case??data_2l:
case??data_3l:
{
data_h_time += str_ev1527_data.h_data[str_ev1527_data.h_data_read];
data_l_time += str_ev1527_data.l_data[str_ev1527_data.l_data_read];
str_ev1527_data.l_data_read = (str_ev1527_data.l_data_read + 1) % EV1527_DATA_TIME_NUM;
str_ev1527_data.h_data_read = (str_ev1527_data.h_data_read + 1) % EV1527_DATA_TIME_NUM;
temp = data_h_time + data_l_time;
if(temp >= bit_time_min)
{
if(temp <= bit_time_max)
{
if(data_h_time > data_l_time)
{
decode_KEY |= 0x08;
}
if(ev1527_decode_state == data_3l)
{
ev1527_chip_ID = decode_ID;
ev1527_chip_key??= decode_KEY;
ev1527_new_sms = 1;
LED_ON(LED_01);
ev1527_decode_state = sync_h;
}
else
{
decode_KEY >>= 1;
ev1527_decode_state++;
}
data_h_time = 0;
data_l_time = 0;
}
else
{
ev1527_decode_state = sync_h;
}
}
}break;
}
}
}
ev1527_rx_last = 1;
}
else? ?? ???//接收編碼低電平
{
if(ev1527_rx_last)? ?//上次是高電平,有跳變
{
EV1527_COUNT_CLEAR;
if(ev1527_decode_state == sync_h)
{
if((ev1527_new_time >= SYNC_H_TIME_MIN) && (ev1527_new_time <= SYNC_H_TIME_MAX))
{
str_ev1527_data.l_data_read = str_ev1527_data.l_data_write=0;
str_ev1527_data.h_data_read = str_ev1527_data.h_data_write=0;
str_ev1527_data.h_data[str_ev1527_data.h_data_write] = ev1527_new_time;
str_ev1527_data.h_data_write = (str_ev1527_data.h_data_write + 1) % EV1527_DATA_TIME_NUM;
ev1527_decode_state??= sync_l;
}
}
else
{
str_ev1527_data.h_data[str_ev1527_data.h_data_write] = ev1527_new_time;
str_ev1527_data.h_data_write = (str_ev1527_data.h_data_write + 1) % EV1527_DATA_TIME_NUM;
}
}
ev1527_rx_last = 0;
}
enableInterrupts();
}
總結
以上是生活随笔為你收集整理的1527编码协议_EV1527解码,我也贡献一个,抗干扰,自适应.....的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux之离线安装Ganglia
- 下一篇: 红帽 linux 更换主板,RedHat