点击(此处)折叠或打开
- #include "gconf.h"
- #include <mdev_wdt.h>
- #include <mc200_driver.h>
- static mdev_t *gpt3_dev = NULL;
- #define SOF_HIGH_MAX 4900
- #define SOF_HIGH_MIN 4700
- #define SOF_LOW_MAX 1600
- #define SOF_LOW_MIN 1400
- #define LEVEL_0_MIN 300
- #define LEVEL_0_MAX 500
- #define LEVEL_1_MIN 600
- #define LEVEL_1_MAX 800
- #define MIN_SIZE_CODE 42
- static volatile bool bTerminated = false;
- static uint32_t data[8192];
- static uint32_t idx_data = 0;
- #define DUMP_WRAPAROUND 16
- void dump_dec(const uint32_t *data, unsigned len)
- {
- wmprintf("**** Dump @ 0x%x Len: %d ****\n\r", data, len);
- int i;
- for (i = 0; i < len;) {
- wmprintf("%8d ", data[i++]);
- if (!(i % DUMP_WRAPAROUND))
- wmprintf("\n\r");
- }
- wmprintf("\n\r******** End Dump *******\n\r");
- }
- static mdev_t *gpio_dev = NULL;
- static uint32_t lasted_v = 0;
- static bool bSOF = false;
- static void edges_callback (int pin, void *arg);
- static inline void check_capture(uint32_t value)
- {
- if (!bSOF) {
- if (1 == GPIO_ReadPinLevel(IO_433_RECV))
- {
- idx_data = 0;
- if (((lasted_v > SOF_HIGH_MIN) && (lasted_v < SOF_HIGH_MAX)) && ((value > SOF_LOW_MIN) && (value < SOF_LOW_MAX)))
- {
- data[idx_data++] = lasted_v;
- data[idx_data++] = value ;
- bSOF = true;
- }
- }
- }
- else
- {
- if (((value > LEVEL_0_MIN) && (value < LEVEL_0_MAX)) || ((value > LEVEL_1_MIN) && (value < LEVEL_1_MAX))) {
- data[idx_data++] = value;
- }
- else {
- bSOF = false;
- data[idx_data++] = value;
- }
-
- if ((!bSOF && (idx_data >= MIN_SIZE_CODE) )|| (idx_data > 250)) {
- gpio_drv_set_cb(NULL, IO_433_RECV, GPIO_INT_DISABLE, NULL, NULL);
- dump_dec(data, idx_data);
- memset(data, 0, sizeof(data));
- idx_data = 0;
- lasted_v = 0;
- bSOF = false;
- gpio_drv_set_cb(NULL, IO_433_RECV, GPIO_INT_BOTH_EDGES, NULL, edges_callback);
- }
- }
- }
- static void edges_callback (int pin, void *arg)
- {
- uint32_t value = GPT_GetCounterVal(GPT3_ID)/50; // -->> us
- gpt_drv_set(gpt3_dev, 0xFFFFFFFF/50);
- check_capture(value);
- lasted_v = value;
- }
- void waiting_RF433_info(void)
- {
- WDT_Disable();
- //init
- PMU_PowerOnVDDIO(PMU_VDDIO_D0);
- //start hwtimer
- gpt_drv_init(GPT3_ID);
- gpt3_dev = gpt_drv_open(GPT3_ID);
- gpt_drv_set(gpt3_dev, 0xFFFFFFFF/50);
- gpt_drv_start(gpt3_dev);
-
- //set gpio callback.
- gpio_drv_init();
- gpio_drv_set_cb(NULL, IO_433_RECV, GPIO_INT_BOTH_EDGES, NULL, edges_callback); //GPIO_INT_BOTH_EDGES, GPIO_INT_RISING_EDGE, GPIO_INT_FALLING_EDGE
-
- idx_data = 0;
- bSOF = false;
- lasted_v = 0;
- memset(data, 0, sizeof(data));
-
- gpio_dev = gpio_drv_open("MDEV_GPIO");
- gpio_drv_setdir(gpio_dev, IO_433_RECV, GPIO_INPUT);
- gpio_drv_close(gpio_dev);
-
- //WDT_Enable();
-
- }
- void start_rf433_recv_proc(void)
- {
- dbg("Enter Recving ...");
- bTerminated = false;
- waiting_RF433_info();
- }
- void stop_rf433_recv_proc(void)
- {
- dbg("Exit Recving ***");
- bTerminated = true;
- }
开一个定时器, 在每次 IO的边沿触发时取出所有的时间, 判断是否引导头以及是否后续数据合适, 记入数据缓冲区即可。
点击(此处)折叠或打开
- **** Dump @ 0x20000934 Len: 82 ****
- 4818 1502 358 726 368 726 358 727 364 716 365 723 372 717 366 718
- 371 725 376 715 717 366 375 718 365 719 374 719 367 716 367 717
- 375 733 714 368 722 373 716 374 363 725 713 367 375 749 718 376
- 716 390 358 723 714 372 371 722 710 377 355 726 370 721 364 721
- 720 382 361 723 367 716 375 712 723 372 367 721 364 724 361 722
- 712 32610
- ******** End Dump *******
- **** Dump @ 0x20000934 Len: 82 ****
- 4830 1486 372 715 380 706 377 704 383 701 381 711 380 707 378 710
- 376 731 374 705 726 363 382 715 371 707 381 701 382 709 380 706
- 379 728 724 359 722 367 728 363 373 718 718 376 365 712 752 374
- 716 388 360 720 720 374 363 718 719 378 360 721 370 719 363 718
- 715 393 361 726 358 721 369 719 719 371 713 384 707 373 710 385
- 359 9120
- ******** End Dump *******
- **** Dump @ 0x20000934 Len: 82 ****
- 4815 1501 356 738 351 725 363 724 360 730 358 729 355 725 366 722
- 368 763 365 727 707 377 359 728 358 727 363 723 362 725 362 723
- 364 734 715 381 708 377 711 389 352 727 708 389 343 734 708 388
- 699 400 356 730 704 385 353 729 703 383 359 730 351 737 360 725
- 706 405 346 733 355 735 355 727 704 383 699 394 695 393 698 390
- 350 9153
- ******** End Dump *******