433_ev1527发送端驱动

433发送模块硬件:载波要强劲(更换天线,电阻,引脚电压3.3V等),433芯片的第5引脚电压3.3v,程序跑起来如果低于3.3v,则载波的功率太低,发送的波形,接受端学习不到。第四脚可以通过示波器看到波形。

应用程序多线程里发送433的波形会被拉长,里面有usleep函数,尝试在应用层用popen函数和实时线程FIFO,发送5次,接收端才能收到一次,但有时会失败。所以把433发送端写成驱动,用内核udelay函数,发送时用内核自旋锁,每次发送波形都很漂亮,接受端都可以受到。

/kernel/xx_433/433.c如下:

/

#include <linux/miscdevice.h>
#include <linux/delay.h>
#include <asm/irq.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/cdev.h>
#include <linux/fs.h>
#include <linux/uaccess.h>
#include <linux/errno.h>
#include <linux/device.h>
#include <linux/ioport.h>
#include <linux/io.h>
#include <linux/interrupt.h>
#include <linux/delay.h>
#include <linux/sched.h>
#include <linux/wait.h>
#include <asm/ioctl.h>
#include <linux/fs.h>
#include <linux/types.h>
#include <linux/spinlock.h>
#include <gpio.h>
#include <soc/gpio.h>

#include  "xx_433.h"

#define DEVICE_NAME "433"

spinlock_t cache_lock;


void set_gpio(void)
{
    //write(fd_v, "1", 1);
    gpio_set_value(GPIO_433, 1);
}

void clean_gpio(void)
{
    //write(fd_v, "0", 1);
    gpio_set_value(GPIO_433, 0);
}

void send_one(void)
{
    set_gpio();
    udelay(1200);
    clean_gpio();
    udelay(400);  
}

void send_zero(void)
{
    set_gpio();
    udelay(400); 
    clean_gpio();
    udelay(1200);
}

static void send_byte(unsigned char dat)
{
    unsigned char i;
    for(i = 8; i > 0; i--)
    {
        if(dat & 0x80)
        {
            send_one();
        }
        else
        {
            send_zero();
        }
        dat = dat<<1;
    }
}

void ask_send(unsigned char dat[], unsigned char len)
{
    unsigned char i;
    
    send_one();
    udelay(13*1000);  //15ms sync
    
    for(i = 0; i < len; i++)
    {
        send_byte(dat[i]);
    }
}

static long t433_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
{
    unsigned long flags ;
    unsigned char dat[16] = {0};
    unsigned char *from = (unsigned char *)arg;

    //static inline long copy_to_user(void __user *to,const void *from, unsigned long n)
    copy_from_user(dat, from, strlen(from));
    printk("cmd:%x, dat:%s\n", cmd, dat);
    if(cmd == 1)
    {
        spin_lock_irqsave(&cache_lock, flags);
        ask_send(dat, 3);
        ask_send(dat, 3);
        ask_send(dat, 3);
        ask_send(dat, 3);
        spin_unlock_irqrestore(&cache_lock, flags);    
    }

    return 0;
}

#if 0 // test
static long t433_ioctl(struct file *filp, unsigned int cmd, unsigned int arg)
{
    unsigned long flags ;
    printk("cmd:%x, arg:%s\n", cmd, to);

    char dat[3] = {0xf0, 0xf0, 0x07};
    if(cmd == 1)
    {
        spin_lock_irqsave(&cache_lock, flags);
        ask_send(dat, 3);
        ask_send(dat, 3);
        ask_send(dat, 3);
        ask_send(dat, 3);
        spin_unlock_irqrestore(&cache_lock, flags);    
    }

    return 0;
}
#endif

static struct file_operations dev_fops = {
    .owner        = THIS_MODULE,
    .unlocked_ioctl    = t433_ioctl,
};

static struct miscdevice misc = {
    .minor = MISC_DYNAMIC_MINOR,
    .name = DEVICE_NAME,
    .fops = &dev_fops,
};


static int __init dev_init(void)
{

    int ret;
    printk("433_dev_init\n");

    //static DEFINE_SPINLOCK (cache_lock); //?

    spin_lock_init(&cache_lock);

    ret = gpio_request(GPIO_433, "433_pin");
    if(ret < 0)
    {
        printk("gpio_request failed\n");    
        goto err_gpio_request;
    }
    gpio_direction_output(GPIO_433, 1);

    ret = misc_register(&misc);//应该是在/dev下出那个DEVICE_NAME
    printk ("size unsigned = %d\n", sizeof(unsigned));
    printk (DEVICE_NAME"\tinitialized\n");
    
    return ret;

err_gpio_request:
    gpio_free(GPIO_433);

    return -1;
}

static void __exit dev_exit(void)
{
    printk("dev_exit\n");
}


module_init(dev_init);
module_exit(dev_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("xxx");

/

xx_433.h

#ifndef __XX_433_H__
#define __XX_433_H__

#define GPIO_433  (39)

#endif //__XX_433_H__
/

Makefile


#obj-$(CONFIG_XX_433) += xx_433.o

obj-m += xx_433.o

KERNELDIR:=/sdk/kernel
CROSS_COMPILE:=mips-linux-uclibc-gnu-

PWD:=$(shell pwd)

default:
    $(MAKE) ARCH=mips CROSS_COMPILE=$(CROSS_COMPILE) -C $(KERNELDIR) M=$(PWD) modules

clean:
    rm -rf *.o *.order .*.cmd *.ko *.mod.c *.symvers *.tmp_versions

/

insmod  xx_433.ko

/

test.c

/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int main(int argc, char **argv)
{
    int on = 1;
    int 433_no = 1;
    int fd;

    fd = open("/dev/433", 0);
    if (fd < 0) {
        fd = open("/dev/433", 0);
    }
    if (fd < 0) {
        perror("open device 433");
        exit(1);
    }

    printf("on=%x\n",on);
    ioctl(fd, on, 433_no);
    close(fd);

    return 0;
}

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
)EV1527中断法解码 ① 设定定时器中断时间,设定为 80us,80us 进入中断进行解码。具体中断时间多少由自己 软件设定,但是中断时间不能太大。 ② 设定同步码解码范围,同步码定为 5.6ms - 16ms。进入中断判断到低电平,低电平判断 一直累加 Count_Lead++,累积低电平的采集时间,判断到高电平,就判断此时 Count_Lead 的值是否在 70 跟 200之间。(备注:5.6ms/80us=70 16ms/80us=200)。 ③ 引导头通过进入数据判断,刚开始是数据高电平,累积高电平的时间 Count_Data_Hi++, 当判断到低电平时候,判断 Count_Data_Hi 是否在 80us -2.4ms 之间。这里还没进行数据 0 跟 1 的区分,先把 Count_Data_Hi 的值保存在 Hi_Cnt 里面。 (备注:80us/80us=1 2.4ms/80us=30)。 ④ 高电平判断通过,开始判断低电平,累积低电平的时间 Count_Data_lo++,当判断到高电 平时候,判断 Count_Data_Lo 是否在 80us -2.4ms 之间。这里还没进行数据 0 跟 1 的区分, 先把 Count_Data_Lo 的值保存在 Lo_Cnt 里面。 (备注:80us/80us=1 2.4ms/80us=30)。 ⑤ 对 0 跟 1 进行区分,把 24bit 数据整理成三个 byte,存在数组 RfData[0],RfData[1], RfData[2]数组里面。 ⑥ 进行相应功能码的操作。 具体解码方法参考例子程序,因为不同的震荡电阻,1527 出来的编码长度不同,例子 程序是参考 1 lck=100us 波形来做的。具体时间参数可以根据自己的 1527 发射实际长度来 编写。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值