SYN531R 433M解码程序

#define _start_us_min   160  //9ms
#define _start_us_max   240  //12ms
#define _num0_us_min    18   //0.8ms
#define _num0_us_max    28   //1.4ms
#define _num1_us_min    4    //200us
#define _num1_us_max    12   //600us

void soft_count_433m(void);
void soft_decode_433m(void);

/* 定时器超时回调函数 */
static rt_err_t time2out_cb(rt_device_t dev, rt_size_t size)
{
//    static uint8_t clk;
//    rt_kprintf("tick is :%d !\n", rt_tick_get());
//    rt_pin_write(BLE_RST, (clk++)%2);
    soft_count_433m();
//    return 0;
}

int hw_433M_init(void)
{
    rt_err_t ret = RT_EOK;
    rt_hwtimerval_t timeout_s;      /* 定时器超时值 */
    rt_device_t hw_dev = RT_NULL;   /* 定时器设备句柄 */
    rt_hwtimer_mode_t mode;         /* 定时器模式 */
    /* 查找设备 */
    hw_dev = rt_device_find(HWTIMER_433M_NAME);
    if(hw_dev == RT_NULL)
    {
        rt_kprintf("find %s failed\t\n", HWTIMER_433M_NAME);
        return RT_ERROR;
    }
    /* 查找设备成功 */
//    rt_kprintf("find %s success \t\n",HWTIMER_433M_NAME);


    /* 以读写的方式打开设备 */
    ret = rt_device_open(hw_dev, RT_DEVICE_OFLAG_RDWR);
    if (ret != RT_EOK)
    {
        rt_kprintf("open %s device failed!\n", HWTIMER_433M_NAME);
        return ret;
    }

    /* 设置回调函数 */
    rt_device_set_rx_indicate(hw_dev, time2out_cb);

    /* 设置定时器工作模式为周期定时 */
    mode = HWTIMER_MODE_PERIOD;
    ret = rt_device_control(hw_dev, HWTIMER_CTRL_MODE_SET, &mode);
    if (ret != RT_EOK)
    {
        rt_kprintf("set mode failed! ret is :%d\n", ret);
        return ret;
    }

    /* 配置超时值 */
    timeout_s.sec = 0;
    timeout_s.usec = 50;
    if (rt_device_write(hw_dev, 0, &timeout_s, sizeof(timeout_s)) != sizeof(timeout_s))
    {
       rt_kprintf("set timeout value failed\n");
       return RT_ERROR;
    }
    /* 延时500ms */
    rt_thread_mdelay(3500);

//    /* 读取定时器当前值 */
//    rt_device_read(hw_dev, 0, &timeout_s, sizeof(timeout_s));
//    rt_kprintf("Read: Sec = %d, Usec = %d\n", timeout_s.sec, timeout_s.usec);

    return RT_EOK;
}

/**----------------------------------------------------------------------------------------------**
 **函数名  :低电平脉宽测量函数
 **功能说明:计算低电平时间(LOW),50us调用一次
 **----------------------------------------------------------------------------------------------**/
uint16_t Low;    //低电平计数
uint32_t RF_Data_END; //最终数据
void soft_count_433m()//接受码计数函数
{
    static uint8_t  Jump_flag; //电平跳变标志

    if(rt_pin_read(DATA_433M) == 0)   //低电平
    {
        Low++;
        if(Jump_flag)
            Jump_flag=0;  //Jump_flag由0→1代表 低→高 跳变
    }
    else if(rt_pin_read(DATA_433M) == 1)      //高电平
    {
        if(!Jump_flag)
        {
            Jump_flag=1;            //Jump_flag由1→0代表 高→低 跳变
            soft_decode_433m();
            Low=0;
        }
    }
}
/**----------------------------------------------------------------------------------------------**
 **函数名  :解码函数
 **----------------------------------------------------------------------------------------------**/
void soft_decode_433m()//接受码处理函数
{
    static uint32_t RF_data,RF_data_temp;
    static uint8_t  CNT_Num, start_flag, RF_Value_Cnt, release_key;//接收位数据的个数 收到同步码标志 长按计数 松手计数
    static uint16_t crc_out;
    if(start_flag==0) //未收到同步码
    {
        if(( Low > _start_us_min ) && ( Low < _start_us_max ))  //同步码 10-12.5ms
        {
            start_flag = 1;
            CNT_Num = 0;//数据长度
            RF_data = 0;
        }
        else
        {
            RF_Value_Cnt=0;
            release_key++;
            if(release_key > 200) //10ms
                release_key = 200;
        }
    }
    else if((start_flag==1) && (CNT_Num<24))
    {
        if(( Low > _num0_us_min ) && ( Low < _num0_us_max ))                //数据 0 1.2ms
        {
            RF_data = RF_data<<1;
            CNT_Num++;
        }
        else if(( Low > _num1_us_min ) && ( Low < _num1_us_max ))           //数据 1  0.4ms
        {
            RF_data = RF_data<<1;
            RF_data|=1;
            CNT_Num++;
        }
        else
        {
            start_flag=0;//异常情况重新接收
            CNT_Num=0;
        }
    }

    if(CNT_Num==24)//地址码(20)+按键码(4)
    {
        release_key=0;
        RF_Value_Cnt++;
        if(RF_Value_Cnt > 200)//收到完整帧多少次
            RF_Value_Cnt = 200;

        if(RF_Value_Cnt == 1)  //比较第一二次
            RF_data_temp = RF_data;
        else if((RF_Value_Cnt == 2) && (RF_data_temp == RF_data))
        {
            RF_Data_END = RF_data;
            rt_kprintf("433 receive data is %04x\r\n", RF_Data_END);
        }
        RF_data = 0;

        CNT_Num=0;
        start_flag=0;  //重新收取数据
    }
}

关于定时方面的配置参考使用rtthread硬件定时器中遇到的问题

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页