整整一个礼拜, 整了...大约40个小时吧, 最少..

下面是结果, 只能做一个delay延时.:

unsigned char Time;
unsigned char IrValue[6];
#pragma vector = P0INT_VECTOR
__interrupt void P0_ISR(void){
    unsigned char j,k;
    unsigned int err;
    if(P0IFG & 2){      //如果中断标识符的确是P0_1
        Time=0;                    
        ifr_delay_ms(1);   //等1ms
        if(IRIN==0)       //如果仍然是低电平, 排除掉    
        {    
          //P0_3Low();      //拉低P0_3
          
          err=1000;        //做一个错误计数器, 避免程序卡死                                          
          while((IRIN==0)&&(err>0))       //等待P0_1回到高电平, 根据红外的特性,理论上要等9ms
          {            
            ifr_delay_100us(1);       //等待100us, 理论上, err只会--大约90次.
            err--;
          }
            
          if(IRIN==1)        //回到高电平后
          {
            //P0_3High();     //拉高P0_3
            err=500;        //一样未免卡死, 重新定义错误计数器
            while((IRIN==1)&&(err>0))    //等待P0_1的下降沿.                
            {                
              ifr_delay_100us(1);    //一次等100us
              err--;            
            }    
            //P0_3Low();
            for(k=0;k<4;k++)        //一共获取4个字节        
            {            
              for(j=0;j<8;j++)        //每个字节8个bit
              {                
                err=60;                    //err恢复计数
                while((IRIN==0)&&(err>0))        //等待P1_0的低电平过去                                   
                {  
                  //P0_3Low();
                  ifr_delay_100us(1);            //等100us, 理论上, 这个长度是560us, 大约5-6个周期                                      
                  err--;                                           
                }
                                            
                err=500;            //err恢复    
                while((IRIN==1)&&(err>0))                
                {    
                  //P0_3High();                  
                  ifr_delay_100us(1);       // 等100us, 这就有两种情况, 一种是bit为1, 高电平长度是1120us, 11个周期, 如果是bit 0, 就是560us, 5-6个周期.                     
                  Time++;                
                  err--;                
                  if(Time>30)              //如果等待得太长,就特么算了, 出错了.
                    {            
                      EA=1;                            
                      return;        
                    }                
                }
                                            
                IrValue[k]>>=1;            //做一个位移动, 因为红外是从低位开始传输的.
                if(Time>=8)            
                {                    
                  IrValue[k]|=0x80;       //大于8个周期, 基本确定是1
                }        
                Time=0;    
              }    
            }
          }
                    
          if(IrValue[2]!=~IrValue[3])   //这里是做了一个红外协议的校验,就是数据码是互补的, 如果不是互补的, 证明出错了.
          {
            return;
          }
        }
        key_nop();
      
        P0IFG &= ~(1 << 1);
        P0IF = 0;
        EA = 1;
    }else{
        P0IFG = 0;
        P0IF = 0;
    }
}

并且修改蓝牙连接配置:

// Minimum connection interval (units of 1.25ms, 80=100ms) if automatic parameter update request is enabled
#define DEFAULT_DESIRED_MIN_CONN_INTERVAL     240

// Maximum connection interval (units of 1.25ms, 800=1000ms) if automatic parameter update request is enabled
#define DEFAULT_DESIRED_MAX_CONN_INTERVAL     320

// Slave latency to use if automatic parameter update request is enabled
#define DEFAULT_DESIRED_SLAVE_LATENCY         4

// Supervision timeout value (units of 10ms, 1000=10s) if automatic parameter update request is enabled
#define DEFAULT_DESIRED_CONN_TIMEOUT          600

// Whether to enable automatic parameter update request when a connection is formed
#define DEFAULT_ENABLE_UPDATE_REQUEST         TRUE

// Connection Pause Peripheral time value (in seconds)
#define DEFAULT_CONN_PAUSE_PERIPHERAL         6

在simplePeripheral.c文件里面.

下面说说为什么要delay, 因为delay是看上去最傻逼的做法.

从头说起:

这是红外的一个例子数据包:

实际抓到的是这样:

嗯, 是反过来的, 因为发射跟接收是反的.

这不是重点.

下面才是重点.

OK, 我的第一个想法是, 起一个timer, 这个timer每隔大约10个或者100个us做一次计数, 然后每个上升沿或者下降沿比对上一个mark点的这个计数值, 就知道中间过了多久.

结果事与愿违的是, 我发现最后拿到的数据总是出错, 本来发的是4个byte分别是0x00,0xFF, 0x0C,0xF3, 但是出错几率高达20%,很多时候是00, e0, 0E什么的..

后来我将计数器timer做成能输出高低电平的,这样方便我观察, 真的发现, 计数器每个大约几十个ms, 就会有个gap, (忘了截图), 证明这个timer在这个gap中被人打断了, 打断得连timer中断都没进去.

接下来我就各种更改中断优先级.

要知道, 2541中断优先级, 只有4个等级, 0,1,2,3换成二级制是00, 01, 10, 11, 总之, RF的中断肯定是最高优先级, 广播吧, 大概.

总之, 修改中断优先级不解决任何问题.

最后, 还是delay吧...不过设置了

#define DEFAULT_DESIRED_SLAVE_LATENCY         4

相信断开连接的情况会好点儿?

测试中...

TI CC2541的红外控制的更多相关文章

  1. TI CC2541的LED控制

    现在终于进入到蓝牙SPI的环节了, 下面还要研究I2C, 所以第一步, 先点灯, 就是GPIO控制吧. 参考一下LEd的初始化: void HalLedInit (void){#if (HAL_LED ...

  2. 蓝牙(BLE)应用框架接口设计和应用开发——以TI CC2541为例

    本文从功能需求的角度分析一般蓝牙BLE单芯片的应用框架(SDK Framework)的接口设计过程,并以TI CC2541为例说明BLE的应用开发方法. 一.应用框架(Framework) 我们熟知的 ...

  3. IAR 9+ 编译 TI CC2541 出现 Segment ISTACK (size: 0xc0 align: 0) is too long for segment definition.

    IAR 9+ 编译 TI CC2541 出现 Segment ISTACK (size: 0xc0 align: 0) is too long for segment definition. Segm ...

  4. 树莓派 LED+蜂鸣+声音传感器+红外模块组合打造声控/红外控制LED

    昨天搞了控制LED,玩了第一个,剩下的就感觉很简单了,这里记录一下 先来几张照片 玩了蜂蜜模块才发现规律,一般这种模块,都会有三个针脚,VCC(3.3V或5V供电输出针脚).GNC(对应GPIO针脚的 ...

  5. 用Arduino对Apple手表进行远程红外控制

    描写叙述 用于控制随意红外设备的Apple手表及iPhone应用. IOS应用发送HTTP请求至一个或多个带有以太网插板的Arduino.Arduino正在解析http请求并发送红外信号.Arduin ...

  6. TI CC2541 BLE协议栈蓝牙MAC 地址

    在Flash中有一块只读区域,从地址0x780E开始,蓝牙的MAC以小端方式存放在里面. 在TI的Peripheral例程里面,添加一个特征值,只读属性,6字节长度(蓝牙MAC长度为48-bit,6字 ...

  7. TI CC2541的狗日的Key

    被突如其来的一个bug困扰了好几天, 起因是, 按键接的红外接收器, 结果发现, 一旦按下之后, IEN1, P0IE的标识位bit5, 被不知道特么的谁归0了, 也就是说, 按键只能被按下一次, 再 ...

  8. TI CC2541的整体目标

    1. App端会发送一定数量的byte过来蓝牙, 每2个byte是一个汉字的编码. 2. 拿到汉字编码之后, 统计字符数量, 然后通过SPI, 搜索编码 3. 收到的编码, 每个汉字字符有32个byt ...

  9. TI CC2541的中断优先级设置.

    实际看到的中断优先级设置是这样的:

随机推荐

  1. Android App截包工具

    用于分析App通过网络与服务器交互的过程,至于教程,网上很多,软件叫Fiddler

  2. Hibernate SQLQuery简单实用,做链接查询

    工单里面可能有0个告警,一个或多个告警,当工单中没有告警的时候也需要将工单显示出来,所以就需要使用工单和告警的做链接查询,下面是具体实例 表: CREATE TABLE `alarm` ( `id` ...

  3. jquery ui autocomplete 实现点击文本框,出现所有查询信息效果,与bootstrap结合使用修改样式

    直接看代码 <!doctype html> <html lang="en"> <head> <meta charset="utf ...

  4. jquery-validation 使用

    jquery-validation 使用 一.用前必备 官方网站:http://bassistance.de/jquery-plugins/jquery-plugin-validation/ API: ...

  5. java中类的继承

    我们都知道java的四大特性:抽象.继承.封装.多态: 那么关于继承有哪些特性呢?下面看具体实例: (1) public class Person { public  int a=2; public  ...

  6. what's the difference between dim as and dim as new?

    what's the difference between dim as and dim as new? There is no difference with value types (Intege ...

  7. 淘宝天猫网站停止支持IE6、IE7浏览器,你还在用xp吗?

    2016年4月14日,是科比正式告别篮球的最后一场球赛.大家都在忙着各种纪念和怀念着看科比打球的青葱岁月.不过已经完美谢幕.而我们今天要说的是微软的IE6.IE7浏览器.淘宝网和天猫商城正式停止支持I ...

  8. JavaScript 代码 优化笔记

    1. 判断某个元素是否在数组中. setCheckNodes : function (zNodes, checkIds){ var that = this; that.setAllNodesUnche ...

  9. 在MVC3中修改KindEditor实现图片删除

    编辑器KindEditor可以上传图片,但却不能删除图片,因此我们通过修改一些文件,对KindEditor进行扩展,使得KindEditor能删除服务器上的图片. 主要方法就是:在图片空间中浏览图片, ...

  10. Git reset 常见用法

    Git reset 1. 文件从暂存区回退到工作区 2. 版本回退 1.1 git reset HEAD filename :回退文件,将文件从暂存区回退到工作区 //也可以使用 git reset ...