第5单元:IRDA通信协议
单位5实验室
下载此文档
1.介绍
本单元演示如何使用中断和核心定时器解码两个IrDA协议,努力教解码用于远程设备控制的不同IrDA协议的方法。IrDA是一种无线串行通信的实现,能够进行单工以及半双工操作。
使用脉冲调制红外光束,我遇到了不少于100个IRDA编码协议。在我家周围发现的四个红外遥控装置中,没有两种使用相同的编码方案。对于用于远程控制设备的许多现有的IRDA协议,我介绍了一种用于解码和编码可以在不同方案上使用的NEC协议的方法。我已经验证了该方法,用于解码脉冲长度(也称为脉冲距离调制)协议。Lab 5将挑战您遵循所提出的方法,为自己选择的IRDA遥控设备开发接口。
一些硅器件将将NED编码IrDA解码到9600波特UART输出,如ST3679.其他硅设备将减轻脉冲编码和解码的负担,例如Microchip MCP2122,它允许直接与处理器UART接口。以上两种IrDA硬件设备设计用于实现无线视距异步通信,不与NEC IR远程控制设备接口。
2.目的:
-
通过使用模拟发现2捕获IR_RX引脚上的位流来识别IRDA协议。
-
开发执行算法来解码IRDA比特流的C函数。
-
显示接收的代码液晶显示器并发送到UART通信端口。
3.基本知识:
-
如何在Microchip®Pic32PPS微处理器上配置I / O引脚。
-
如何配置模拟发现2以显示逻辑轨迹。
-
如何实现基于嵌入式处理器的系统的设计过程。
4.单位设备清单
4.1。硬件
-
订购列表ItemworkStation计算机运行Windows 10或更高版本,Mac操作系统,或linux
此外,我们建议以下仪器:
4.2。软件
以下程序必须安装在您的开发工作站上:
5.项目外卖
-
了解IRDA协议的基础知识。
-
使用仪器来描述数据流。
-
使用处理器外部中断来解码信号时序模式。
-
使用状态机处理数据的方法。
6.基本概念
6.1。IRDA概念
据悉,99%的消费电子产品使用IRDA遥控器。1)这些遥控装置使用低成本的近红外led和光敏晶体管来发射和接收强度调制的光束。事实上,这些半导体器件有一个狭窄的,无阻碍的视野被视为要么是安全优势,要么是通信限制,这取决于你的观点。这是相对的射频通讯,如蓝牙.
IRDA通信有两个主要应用:高速数据和遥控器。遥控应用在低数据速率下使用小数据包,而高速数据应用需要一个通信堆栈管理数据包的重新组合。表6.1比较了IrDA和蓝牙的主要特性。
表6.1。IrDA和蓝牙功能比较。2)
IrDA-Data | 蓝牙 | |
---|---|---|
物理介质 | 红外 | 射频(2.4GHz的) |
通信范围 | 至少有100米 | 10厘米到100米 |
连接类型、方向 | 点对点,窄角度(30度) | 多点,全方位 |
最大数据速率 | 4Mbps(途中为16Mbps) | 1 mbps(总) |
安全 | 身体限制提供了一些内置保护 | 认证,加密,扩频 |
大概的成本 | 低于2亿美元,低于5亿美元 |
7.背景信息
7.1。IrDA物理层
Basys MX3平台配备了RoHM RPM973-H11红外通信模块,提供了数字接口,如图7.1所示。图7中所示的三个微处理器控制销。7.2是IR_TX,IR_RX和IR_PDOWD。只要IR_PDown控制信号处于高状态,ROHM RPM973-H11处于低功耗模式。IR_PDown必须处于低状态以传输或接收红外信号。IR_TX和IR_RX都是活跃低信号。
图7.1。RPM973-H11框图。
图7.2。PIC32连接到RPM841-H11红外模块的示意图。
参考文献3列出了21种用于远程控制设备的调制协议。本参考文献还列出了这些设备使用的标准载波频率。除了不同种类的编码和不同的载波频率,数据格式也有进一步的变化:有和没有预突发,命令中有不同的位数,以及不同的位长。正如人们很快意识到的,在两个IrDA设备可以通信之前,必须匹配IrDA协议。IrDA的支持在PIC32MX370数据表(参见参考文献6第20节)需要一个外部IrDA编码器/解码器,例如MC2120微芯片建议模拟设计说明ADN006.Basys MX3处理器平台不包含任何IrDA编码器/解码器硬件。罗姆RPM973-H11简单地断言IR_RX信号低时,只要一个足够强的红外信号被检测到。同样,红外领导只要IR_TX信号置位,就会打开。在Basys MX3处理器平台上使用RoHM RPM973-H11时,IR脉冲的所有编码和解码必须由PIC32处理器实现。
7.2。NEC IRDA协议的特征
NEC协议将表征以说明发现IRDA遥控器使用的协议的方法。一般过程是捕获逻辑分析器迹线并将数据配置文件与现有的IRDA协议匹配。这通常被称为逆向工程。
图7.3显示了IR领导38度调制千赫载波被确定为两者之间的周期的倒数领导脉冲。的领导在26.3 μs的载频周期中,只有2.4 μs是开启的。的占空比领导不到10%,导致功耗较低。
图7.3。IRDA 38.千赫载波信号。
图7.4显示了使用NEC协议的完整IRDA消息。每当检测到红外线时,信号都很低。NEC协议消息包含32位,以LSB发送的八个位字节组织。在9毫秒的领导者和4.5ms的间隙之后,一个560μs比特标记表示第一数据字节的LSB的开始,如图4.5所示。
图7.4。NEC IRDA控制消息的屏幕截图。
图7.5和7.6显示了部分NEC IrDA协议的扩展视图,显示了同步之后的三个24数据位。请注意,1位和0位之间的差别是每个560 μs周期38之后的间隙长度千赫调制的红外脉冲。最后一个字节包含9个脉冲突发,以允许最后一位正确框架。
图7.5。消息领导者和前三个数据位的详细信息。
图7.6。38.千赫脉冲突发定时表示两个零位和一位。
下面再现参考文献4中的图以说明NEC协议的定时。图7中的NEC协议消息的编码。7.7显示整个数据包由两个字节的数据组成:地址字节和命令字节。每个字节后面都是它的一个人的补充.这种编码的结果是尽管传输一位的时间是发送零位的时间,但是不管地址和控制字节的值如何,发送任何NEC编码消息的时间是恒定的。
图7.7。NEC编码的Irda消息。
如果遥控单元上的键被保持按下超过110ms,则连续发送不包含地址或命令数据的重复代码,如图7.8所示。
图7.8。重复NEC编码的IRDA消息的时序图。
7.3。用PIC32MX370处理器解码NEC IrDA协议
从前面的讨论可以看出,PIC32 UART并不适合实现IrDA NEC远程控制协议。我对互联网文档的调查并没有产生任何有意义的信息,关于如何实现这个设计。从我30年的微处理器设计经验来看,我认为有两种可能的方法:应用数字信号处理概念,即快速傅里叶变换(FFT),或使用PIC32输入比较能力或外部中断的边缘定时。有趣的是,这两种方法都涉及到频域概念。
IrDA信号的调制和解调涉及38的二进制编码千赫载波信号。如上所示,NEC协议的位值信息包含在38之间的周期长度中千赫红外线振荡。
我的方法是首先将端口B引脚6上IR_RX信号的PPS输入映射到外部中断INT1.如表7.1所示。的INT1.使用清单7.1所示的初始化代码,配置为在IR_RX信号的下降(负)边缘上生成一个中断。
清单7.1。INT1的初始化
//设置IrDA RX接口INT1R = 0b00000101;//将IRDA RX映射到RPB6 - > INT1 //为负边缘触发IEC0Bits的INT1设置INT1 .INT1IE = 0;//禁用INT1 IPC1BITS.INT1IP = 2;//为优先级设置中断1 2 IPC1Bits.Int1is = 0;//设置子优先级0 INTCONBITS.INT1EP = 0的中断1;//为下降边缘ifs0bits.int1if = 0设置;//清除INT1中断标志IEC0bits.int1ie = 1;//启用INT1.
表7.1。表12-1从PIC32MX370数据表进行PIC32MX370处理器的PPS输入引脚选择。
外围收件人 | [引脚名称] R SFR | (销的名字)R位 | [引脚名称] R值为RPN引脚选择 |
---|---|---|---|
INT1. | INT1R. | INT1R <握> | 0000 = RPD1. 0001 = RPG9. 0010 = RPB14. 0011 = RPD0 0100 = RPD8. 0101 = RPB6 0110 = RPD5. 0111 = RPB2. 1000 = RPF3(4) 1001 = RPF13(3) 1010 =保留 1011 = RPF2(1) 1100 = RPC2.(3) 1101 = RPE8(3) 1110 =保留 1111 =保留 |
T3CK. | t3c. | T3CKR <握> | |
IC1. | IC1R. | IC1R <握> | |
$ \ overline {(U3cts)} $ | U3CTSR | U3CTSR <握> | |
U4RX | U4RXR. | U4RXR <握> | |
U5RX. | U5RXR. | U5RXR <3:0> | |
$ \ overline {(ss2)} $ | SS2R. | SS2R <3:0> | |
OCFA | ocfar. | OCFAR <握> |
-
此选择在64针USB设备上不可用。
-
此选择仅适用于100针通用设备。
-
这种选择在64针USB和通用设备上不可用。
-
使用USBID功能时,此选择不可用。
发生中断时,核心计时器的值在40处运行兆赫被捕获。从本核心定时器值中减去先前的核心定时器值以确定中断之间的时段。如果这个时期约为560μs,a 38千赫信号存在。实际的红外脉冲长度是无关紧要的,只要它足够长,以产生处理器中断。在我们的表征案例中,实际测量的红外光束脉冲宽度为2.377 μs。
清单7.2显示了实现的C代码INT1.ISR。中断之间的时间包含了所需的信息,因此变量“t1_2”必须声明为静态。静态变量“start_timing”记住变量“t1_2”在系统重置后已经初始化。NEC解码算法所需要的唯一信息是自上次中断以来的时间。
清单7.2。INT1 ISR
void __isr(_external_1_vector,ipl2soft)ext_int1_isr(void){unsigned long t1_1;//中断当前时间静态无符号长T2_1;//以前中断的时间无符号dt_1;//边缘之间的时间间隔unsigned int bitcount = 0;//解码位数静态int start_timing = 0;//时间捕获缓冲区已初始化。t1_1 = ReadCoreTimer();if(!start_timing)//在重置后检查第一个中断{t2_1 = t1_1;//初始化以前的重置时间。start_timing = 1; } else { dt_1 = t1_1 - t2_1; // Compute time interval bitCount = irda_nec(dt_1); // Call decoding function t2_1 = t1_1; // Update time of last interrupt } IFS0bits.INT1IF = 0; // Clear the interrupt flag }
核心计时器以每1/40,000,000秒或每计数0.0025 μs的速率递增。回顾NEC的特性数据,我们发现同步周期应该报告为0.0045秒乘以每秒4000万次计数,或大约180000次核心计时器计数。当编码一个ONE位时,自上次中断以来的核心计时器计数数是(0.0025 - 0.00056)秒乘以每秒40,000,000计数,或大约67,000核心计时器计数。当编码0位时,自上次中断以来的核心计时器计数数是(0.00112 - 0.00056)秒乘以每秒40,000,000计数,或大约22400核心计时器计数。由于用于产生红外脉冲的晶体的精度是未知的,可以假定为2%的精度,并且仍然允许在符号之间进行充分的区分。表7.2列出了NEC协议符号的核心定时器计数范围。
表7.2。核心定时器计数范围。
象征 | 最小核心定时器计数 | 最大核心定时器计数 |
---|---|---|
同步 | 176400 | 183600 |
一点 | 65660 | 68340. |
零点 | 21952 | 22848 |
7.4。使用PIC32MX370处理器对NEC IRDA协议进行编码
为了为NEC协议编码IrDA, 38千赫必须生成调制的比特流。我选择产生38千赫使用PIC32处理器的PWM输出脉冲信号。表7.3是来自PIC32MX370数据表的副本,示出了OC5的PPS映射到端口B位7,其连接到IR_TX信号线。清单7.3是IRDA初始化的代码。
表7.3。PIC32MX370 PPS输出映射,用于B的Bit 7.
RPN端口PIN. | RPnR SFR | RPNR位 | 外围选择的RPnR值 |
---|---|---|---|
RPD9. | RPD9R | RPD9R <握> | 0000 =否连接 0001 = $ \眉题{(U3RTS)} $ 0010 = U4Tx. 0011 = REFCLKO 0100 = U5Tx. 0101 =保留 0110 =保留 0111 = $ \ overline {(ss1)} $ 1000 = SDO1 1001 =保留 1010 =保留 1011 = OC5. 1100 =保留 1101 = C1out. 1110 =保留 1111 =保留 |
RPG6 | RPG6R. | RPG6R <握> | |
rpb8. | RPB8R | RPB8R <握> | |
RPB15 | RPB15R | RPB15R <握> | |
RPD4. | RPD4R. | RPD4R <握> | |
RPB0. | RPB0R. | RPB0R <3:0> | |
RPE3 | RPE3R | RPE3R <握> | |
RPB7. | RPB7R. | RPB7R <握> | |
RPB2. | RPB2R | RPB2R <3:0> | |
RPF12(4) | RPF12R | RPF12R <3:0> | |
RPD12.(4) | RPD12R. | RPD12R <握> | |
RPF8(4) | RPF8R. | RPF8R <握> | |
RPC3.(4) | RPC3R | RPC3R <3:0> | |
RPE9(4) | RPE9R | RPE9R <3:0> |
38千赫通过将计时器2计数器寄存器设置为PBCLOCK除以38000产生载波信号。通过设置OC5复位时间大于Timer 2周期,PWM输出被关闭。9%的占空比38千赫通过将OC5复位时间设置为0.09倍定时器2时段的产品,打开信号。生成NEC同步信号并编码一个人和零只是根据参考3所指定的特定持续时间将PWM打开和关闭PWM的问题。
清单7.3。发送初始化
#define IRDA_38K_IDLE 264 #define IRDA_38K_ON 23 #define irda_38k_pd 262 void irda_init(void) {int i;// IrDA Power Down Control TRISGCLR = BIT_1;//将IR_pdown设置为output();LATGCLR = BIT_1;/ /设置IR_pdown (0);//设置IrDA TX接口PORTSetPinsDigitalOut(IOPORT_B, BIT_7);// IR_TX RPB7R = 0b00001011;//将OC5映射到RPB7 //开启OC5用于PWM操作OpenTimer2((T2_ON | T2_SOURCE_INT | T2_PS_1_1), IRDA_38KHZ_PD);OpenOC5 (OC_ON | OC_TIMER_MODE16 | OC_TIMER2_SRC | OC_PWM_FAULT_PIN_DISABLE), IRDA_38K_IDLE, IRDA_38K_IDLE);//设置IrDA RX接口INT1R = 0b00000101; // Mapping IrDA Rx to RPB6 --> INT1 PORTSetPinsDigitalIn(IOPORT_B, BIT_6); // IR_RX // Set up INT1 for negative edge triggering IEC0bits.INT1IE = 0; // Disable INT1 IPC1bits.INT1IP = 2; // Set Interrupt 1 for priority level 2 IPC1bits.INT1IS = 0; // Set Interrupt 1 for sub-priority level 0 INTCONbits.INT1EP = 0; // Set for falling edge IFS0bits.INT1IF = 0; // Clear the INT1 interrupt flag IEC0bits.INT1IE = 1; // Enable INT1 }
8.参考资料
-
SB -Projects NEC协议,http://www.sbprojects.com/knowledge/ir/nec.php.
-
PIC32MX330/350/370/430/450/470数据表,http://ww1.microchip.com/downloads/en/DeviceDoc/60001185E.pdf
-
了解索尼IR远程代码,LIRC文件和Arduino库,http://www.righto.com/2010/03/unterstanding-sony-ir-remote-codes-lirc.html.