TI CC2541的红外控制
整整一个礼拜, 整了...大约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的红外控制的更多相关文章
- TI CC2541的LED控制
现在终于进入到蓝牙SPI的环节了, 下面还要研究I2C, 所以第一步, 先点灯, 就是GPIO控制吧. 参考一下LEd的初始化: void HalLedInit (void){#if (HAL_LED ...
- 蓝牙(BLE)应用框架接口设计和应用开发——以TI CC2541为例
本文从功能需求的角度分析一般蓝牙BLE单芯片的应用框架(SDK Framework)的接口设计过程,并以TI CC2541为例说明BLE的应用开发方法. 一.应用框架(Framework) 我们熟知的 ...
- 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 ...
- 树莓派 LED+蜂鸣+声音传感器+红外模块组合打造声控/红外控制LED
昨天搞了控制LED,玩了第一个,剩下的就感觉很简单了,这里记录一下 先来几张照片 玩了蜂蜜模块才发现规律,一般这种模块,都会有三个针脚,VCC(3.3V或5V供电输出针脚).GNC(对应GPIO针脚的 ...
- 用Arduino对Apple手表进行远程红外控制
描写叙述 用于控制随意红外设备的Apple手表及iPhone应用. IOS应用发送HTTP请求至一个或多个带有以太网插板的Arduino.Arduino正在解析http请求并发送红外信号.Arduin ...
- TI CC2541 BLE协议栈蓝牙MAC 地址
在Flash中有一块只读区域,从地址0x780E开始,蓝牙的MAC以小端方式存放在里面. 在TI的Peripheral例程里面,添加一个特征值,只读属性,6字节长度(蓝牙MAC长度为48-bit,6字 ...
- TI CC2541的狗日的Key
被突如其来的一个bug困扰了好几天, 起因是, 按键接的红外接收器, 结果发现, 一旦按下之后, IEN1, P0IE的标识位bit5, 被不知道特么的谁归0了, 也就是说, 按键只能被按下一次, 再 ...
- TI CC2541的整体目标
1. App端会发送一定数量的byte过来蓝牙, 每2个byte是一个汉字的编码. 2. 拿到汉字编码之后, 统计字符数量, 然后通过SPI, 搜索编码 3. 收到的编码, 每个汉字字符有32个byt ...
- TI CC2541的中断优先级设置.
实际看到的中断优先级设置是这样的:
随机推荐
- Android App截包工具
用于分析App通过网络与服务器交互的过程,至于教程,网上很多,软件叫Fiddler
- Hibernate SQLQuery简单实用,做链接查询
工单里面可能有0个告警,一个或多个告警,当工单中没有告警的时候也需要将工单显示出来,所以就需要使用工单和告警的做链接查询,下面是具体实例 表: CREATE TABLE `alarm` ( `id` ...
- jquery ui autocomplete 实现点击文本框,出现所有查询信息效果,与bootstrap结合使用修改样式
直接看代码 <!doctype html> <html lang="en"> <head> <meta charset="utf ...
- jquery-validation 使用
jquery-validation 使用 一.用前必备 官方网站:http://bassistance.de/jquery-plugins/jquery-plugin-validation/ API: ...
- java中类的继承
我们都知道java的四大特性:抽象.继承.封装.多态: 那么关于继承有哪些特性呢?下面看具体实例: (1) public class Person { public int a=2; public ...
- 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 ...
- 淘宝天猫网站停止支持IE6、IE7浏览器,你还在用xp吗?
2016年4月14日,是科比正式告别篮球的最后一场球赛.大家都在忙着各种纪念和怀念着看科比打球的青葱岁月.不过已经完美谢幕.而我们今天要说的是微软的IE6.IE7浏览器.淘宝网和天猫商城正式停止支持I ...
- JavaScript 代码 优化笔记
1. 判断某个元素是否在数组中. setCheckNodes : function (zNodes, checkIds){ var that = this; that.setAllNodesUnche ...
- 在MVC3中修改KindEditor实现图片删除
编辑器KindEditor可以上传图片,但却不能删除图片,因此我们通过修改一些文件,对KindEditor进行扩展,使得KindEditor能删除服务器上的图片. 主要方法就是:在图片空间中浏览图片, ...
- Git reset 常见用法
Git reset 1. 文件从暂存区回退到工作区 2. 版本回退 1.1 git reset HEAD filename :回退文件,将文件从暂存区回退到工作区 //也可以使用 git reset ...