Chinaunix首页 | 论坛 | 博客
  • 博客访问: 9463820
  • 博文数量: 1750
  • 博客积分: 12961
  • 博客等级: 上将
  • 技术积分: 20091
  • 用 户 组: 普通用户
  • 注册时间: 2009-01-09 11:25
个人简介

偷得浮生半桶水(半日闲), 好记性不如抄下来(烂笔头). 信息爆炸的时代, 学习是一项持续的工作.

文章分类

全部博文(1750)

文章存档

2024年(26)

2023年(26)

2022年(112)

2021年(217)

2020年(157)

2019年(192)

2018年(81)

2017年(78)

2016年(70)

2015年(52)

2014年(40)

2013年(51)

2012年(85)

2011年(45)

2010年(231)

2009年(287)

分类: Android平台

2015-06-25 18:57:29


点击(此处)折叠或打开

  1. #include "gconf.h"
  2. #include <mdev_wdt.h>
  3. #include <mc200_driver.h>

  4. static mdev_t *gpt3_dev = NULL;

  5. #define SOF_HIGH_MAX    4900
  6. #define SOF_HIGH_MIN    4700
  7. #define SOF_LOW_MAX    1600
  8. #define SOF_LOW_MIN    1400

  9. #define LEVEL_0_MIN    300    
  10. #define LEVEL_0_MAX    500    
  11. #define LEVEL_1_MIN    600    
  12. #define LEVEL_1_MAX    800    

  13. #define MIN_SIZE_CODE    42

  14. static volatile bool bTerminated = false;
  15. static uint32_t data[8192];
  16. static uint32_t idx_data = 0;


  17. #define DUMP_WRAPAROUND 16
  18. void dump_dec(const uint32_t *data, unsigned len)
  19. {
  20.     wmprintf("**** Dump @ 0x%x Len: %d ****\n\r", data, len);

  21.     int i;
  22.     for (i = 0; i < len;) {
  23.         wmprintf("%8d ", data[i++]);
  24.         if (!(i % DUMP_WRAPAROUND))
  25.             wmprintf("\n\r");
  26.     }

  27.     wmprintf("\n\r******** End Dump *******\n\r");
  28. }

  29. static mdev_t *gpio_dev = NULL;
  30. static uint32_t lasted_v = 0;
  31. static bool bSOF = false;

  32. static void edges_callback (int pin, void *arg);

  33. static inline void check_capture(uint32_t value)
  34. {
  35.     if (!bSOF) {
  36.         if (1 == GPIO_ReadPinLevel(IO_433_RECV))
  37.         {
  38.             idx_data = 0;

  39.             if (((lasted_v > SOF_HIGH_MIN) && (lasted_v < SOF_HIGH_MAX)) && ((value > SOF_LOW_MIN) && (value < SOF_LOW_MAX)))
  40.             {
  41.                 data[idx_data++] = lasted_v;
  42.                 data[idx_data++] = value ;
  43.                 bSOF = true;
  44.             }
  45.         }
  46.     }
  47.     else
  48.     {
  49.         if (((value > LEVEL_0_MIN) && (value < LEVEL_0_MAX)) || ((value > LEVEL_1_MIN) && (value < LEVEL_1_MAX))) {
  50.             data[idx_data++] = value;
  51.         }
  52.         else {
  53.             bSOF = false;
  54.             data[idx_data++] = value;
  55.         }
  56.         
  57.         if ((!bSOF && (idx_data >= MIN_SIZE_CODE) )|| (idx_data > 250)) {
  58.             gpio_drv_set_cb(NULL, IO_433_RECV, GPIO_INT_DISABLE, NULL, NULL);
  59.             dump_dec(data, idx_data);
  60.             memset(data, 0, sizeof(data));
  61.             idx_data = 0;
  62.             lasted_v = 0;
  63.             bSOF = false;
  64.             gpio_drv_set_cb(NULL, IO_433_RECV, GPIO_INT_BOTH_EDGES, NULL, edges_callback);
  65.         }
  66.     }
  67. }

  68. static void edges_callback (int pin, void *arg)
  69. {    
  70.     uint32_t value = GPT_GetCounterVal(GPT3_ID)/50; // -->> us
  71.     gpt_drv_set(gpt3_dev, 0xFFFFFFFF/50);

  72.     check_capture(value);    
  73.     lasted_v = value;        
  74. }

  75. void waiting_RF433_info(void)
  76. {
  77.     WDT_Disable();
  78.     //init
  79.     PMU_PowerOnVDDIO(PMU_VDDIO_D0);

  80.     //start hwtimer    
  81.     gpt_drv_init(GPT3_ID);    
  82.     gpt3_dev = gpt_drv_open(GPT3_ID);
  83.     gpt_drv_set(gpt3_dev, 0xFFFFFFFF/50);
  84.     gpt_drv_start(gpt3_dev);
  85.     
  86.     //set gpio callback.
  87.     gpio_drv_init();
  88.     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
  89.     
  90.     idx_data = 0;
  91.     bSOF = false;
  92.     lasted_v = 0;
  93.     memset(data, 0, sizeof(data));
  94.     
  95.     gpio_dev = gpio_drv_open("MDEV_GPIO");
  96.     gpio_drv_setdir(gpio_dev, IO_433_RECV, GPIO_INPUT);
  97.     gpio_drv_close(gpio_dev);
  98.     
  99.     //WDT_Enable();    
  100.     
  101. }

  102. void start_rf433_recv_proc(void)
  103. {
  104.     dbg("Enter Recving ...");
  105.     bTerminated = false;    

  106.     waiting_RF433_info();    
  107. }

  108. void stop_rf433_recv_proc(void)
  109. {
  110.     dbg("Exit Recving ***");
  111.     bTerminated = true;
  112. }

开一个定时器, 在每次 IO的边沿触发时取出所有的时间, 判断是否引导头以及是否后续数据合适, 记入数据缓冲区即可。


点击(此处)折叠或打开

  1. **** Dump @ 0x20000934 Len: 82 ****
  2.     4818 1502 358 726 368 726 358 727 364 716 365 723 372 717 366 718
  3.      371 725 376 715 717 366 375 718 365 719 374 719 367 716 367 717
  4.      375 733 714 368 722 373 716 374 363 725 713 367 375 749 718 376
  5.      716 390 358 723 714 372 371 722 710 377 355 726 370 721 364 721
  6.      720 382 361 723 367 716 375 712 723 372 367 721 364 724 361 722
  7.      712 32610
  8. ******** End Dump *******
  9. **** Dump @ 0x20000934 Len: 82 ****
  10.     4830 1486 372 715 380 706 377 704 383 701 381 711 380 707 378 710
  11.      376 731 374 705 726 363 382 715 371 707 381 701 382 709 380 706
  12.      379 728 724 359 722 367 728 363 373 718 718 376 365 712 752 374
  13.      716 388 360 720 720 374 363 718 719 378 360 721 370 719 363 718
  14.      715 393 361 726 358 721 369 719 719 371 713 384 707 373 710 385
  15.      359 9120
  16. ******** End Dump *******
  17. **** Dump @ 0x20000934 Len: 82 ****
  18.     4815 1501 356 738 351 725 363 724 360 730 358 729 355 725 366 722
  19.      368 763 365 727 707 377 359 728 358 727 363 723 362 725 362 723
  20.      364 734 715 381 708 377 711 389 352 727 708 389 343 734 708 388
  21.      699 400 356 730 704 385 353 729 703 383 359 730 351 737 360 725
  22.      706 405 346 733 355 735 355 727 704 383 699 394 695 393 698 390
  23.      350 9153
  24. ******** End Dump *******


阅读(3200) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~