irda红外收发器应用.docx
- 文档编号:17366070
- 上传时间:2023-07-24
- 格式:DOCX
- 页数:42
- 大小:420.32KB
irda红外收发器应用.docx
《irda红外收发器应用.docx》由会员分享,可在线阅读,更多相关《irda红外收发器应用.docx(42页珍藏版)》请在冰点文库上搜索。
irda红外收发器应用
《FPGA原理及应用》
课程设计
课程设计目的
本文设计实现一个基于FPGA的红外遥控解码和实现FPGA与PC机的串口通信
系统主要包括四大模块:
每个模块对应的作用分别如下:
1)红外遥控器解码模块:
主要是通过红外接收头接收红外遥控器发送的红外波形,通过FPGA对其进
行解调和解码,得到遥控器每个按键对应的命令码。
2)FPGA串口发送模块:
FPGA解码获得遥控器每个按键对应的命令码后,需要将其发送到PC机上,
以控制PC机上的多媒体播放器。
3)PC串口接收模块:
PC端需要控制串口,以获取串口传入的数据,也即是遥控器对应的命令码。
得到该码后,需要将其映射到PC机系统的按键事件,以控制PC机上的软件(这里是用XBMC多媒体播放器来演示)。
4)多媒体演示模块:
采用现有的XBMC多媒体中心来实现。
XBMC是一个跨平台的媒体娱乐中心
软件(http:
//xbmc.org/download/),它可以播放音视频、浏览图片、查看天气、管理存储器上的媒体资源文件、系统设置、支持游戏手柄等功能下面对每一个模块的设计细节进行详细的介绍。
三、关键模块设计细节
3.1红外遥控器解码模块
本模块的功能主要是通过红外接收头接收红外遥控器发送的红外波形,通过FPGA对其进行解调和解码,得到遥控器每个按键对应的命令码。
1)红外遥控基本知识
通用红外遥控系统由发射和接收两大部分组成。
应用编/解码专用集成电路芯
片来进行控制操作,如图3-1所示。
发射部分包括键盘矩阵、编码调节(增强发射效率)、LED红外发送器;接收部分包括光、电转换放大器、解调、解码电路。
红外鑫控器一|\-体化红外昨头
I1:
1|
图3-1:
通用红外遥控系统
遥控发射器专用芯片很多,也存在很多编码协议。
NanoBoard2的遥控器采用
的是广泛的NEC协议,这里简述下该协议。
该协议采用脉宽调制的串行码,以脉宽为0.565ms、间隔0.56ms、周期为
1.125ms的组合表示二进制的“0”以脉宽为0.565ms、间隔1.685ms、周期为2.25ms的组合表示二进制的“1”其波形如图3-2所示:
2.25nv
bit'0B一I
图3-2:
0与1的波形
当我们按下遥控器的按键时,遥控器将发出一串二进制代码,我们称它为一
帧数据。
可将它们分为5部分,分别为引导码、用户码、用户反码、数据码和数
据反码,共32bit。
如图3-3所示:
遥控器发射代码时,均是低位在前。
高位在后。
其中引导码高电平为9ms低电平为4.5ms,当接收到此码时,表示一帧数据的开始。
解码的关键是如何识别"0"和"1",从位的定义我们可以发现"0"和"1"均以0.565ms的低电平开始,不同的是高电平的宽度不同,"0"为0.56ms,"1"为1.68ms,所以必须根据高电平的宽度区别"0"和"1"。
2)本系统遥控解码
NanoBoard2的遥控器采用的是广泛的NEO议。
在NanoBoard2的外设板PB03提供了红外收发器(infraredtransceiver)。
在AltiumDesigner的库中也提供了该红外收发器的编程控制接口(FPGAPB03Port-Plugin.lntLib中)。
如图3-4所示。
图3-4:
NB2板上红外资源
但该收发器采用的是Vishay半导体公司的TFDU6102收发芯片,其中并不像
一般的红外接收模块一样,这款芯片不提供红外解调功能。
所以我们通过AltiumDesigner提供的Wishbone的红外解调解码IP核来实现解调和解码功能。
该IP核在AltiumDesigner的FPGAPeripherals(Wishbone).lntLib中,其引脚如图3-5所示:
IRRemoteControl
图3-5:
WB_IRDE引脚图
各引脚的功能简述如下:
左边的部分是红外的控制信号。
右边的部分是遵守Wishbone规范的从设备接口,具体说明如下:
CLK_I:
外部输入时钟信号。
RST_I:
同步复位信号,高电平有效。
DAT_O()/DAT_I():
主设备和从设备的之间的数据信号,数据可以由主设备传送给从设备,也可以由从设备传送给主设备。
一对主设备和从设备之间最多存在两条数据总线,一条用于主设备向从设备传输数据,另外一条用于从设备向主设备传输数据。
ADR_l[3:
0]:
地址信号,主设备输出地址到从设备。
ACK_O主从设备间的操作结束方式信号。
ACK为高表示成功。
操作总是在某一总线周期内完成的,因此操作结束方式也称为总线周期结束方式。
CYC_I:
总线周期信号CYC_I有效代表一个主设备请求总线使用权或者正在占有总线,但是不一定正在进行总线操作(是否正在进行总线操作取决于选通信号STB_I是否有效)。
只有该信号有效,Wishbone主设备和从设备接口的其它信号才有意义。
STB」:
选通信号。
选通有效代表主设备发起一次总线操作。
WE」写使能信号,代表当前周期中进行的操作是写操作还是读操作。
1代表写,0代表读。
这样我们就可以通过FPGA去控制WB_IRDE来获得解码后的32bit遥控码。
WB_IRDE提供了四个寄存器:
ClockDividerRegister(CLK_DIV)、ControlRegister(CTRL)、StatusRegister(STATUS)和DataRegister(DATA)。
我们需要读写这四个寄存器来配置WB_IRDE和读取红外码。
WB_IRDE采用的是标准的Wishbone数据传输握手协议。
我们将该协议总结如下:
a)单次读操作:
在时钟上升沿i,主设备将地址信号ADR_O(放到总线上,将WE_(置为低表示读操作,将CYC_OS高表示操作正在进行,将STB_C置高表示操作开始。
在时钟上升沿i+1到达之前,从设备检测到主设备发起的操作,将适当的数据放到主设备的输入信号DAT_I(),将主设备的ACK_I置高作为对主设备STB_O的响应。
在时钟上升沿i+1,主设备发现ACK_I信号为高,将DAT_I()采样,并将STB_O和CYC_OS为低表示操作完成。
从设备发现STB_OS低后,也将主设备的输入信号ACK_I置低。
b)单次写操作:
在时钟上升沿i,主设备将地址信号ADR_O(放到总线上,将数据信号DAT_O()放到总线上,将WE_OS高表示写操作,将CYC_OS高表示操作正在进行,将STB_O置高表示操作开始。
在时钟上升沿i+1到达之前,从设备检测到主设备发起的操作,将主设备的ACK_I置高作为对主设备STB_O勺响应。
在时钟上升沿i+1,从设备将DAT_I()采样;主设备发现ACK_I信号为高,将STB_O和CYC_Ot为低表示操作完成;从设备发现STB_OS低后,也将主设备的ACK_I置低。
具体的寄存器配置和读写参考altium提供的wiki:
WB_IRRC-Accessible
InternalRegisters。
另外,该说明文档里面时钟分频寄存器ClockDivider
Register(CLK_DIV)的设置值的公式存在错误。
因为该寄存器的值提供解调红外
波形的载波频率。
所以这个值的设置必须准确,否则无法解调。
所以这个错误使
得调试过程中耗费了很长时间。
后来通过对原理的理解,自己推导到了正确的公式。
该IP核采用的时钟分频是通过24bit相位累加器来实现的。
它在wiki上提供的确定分频该寄存器的值的公式是:
CLK_DIV=(fcarrier*8000000h)/fCLK_I
这里的8000000h应该是1000000h(24bit也就是224=1000000h才正确。
我们设计的原理图如图3-6所示:
图3-6:
红外解码模块原理图
我们的FPGA空制模块在IrDA.v文件中实现。
我们采用的是verilog硬件描述语言。
具体的verilog代码见附录。
3.2FPGA串口发送模块
1)串口基础知识
串口通信是指使用一条数据线(另外需要地线,可能还需要控制线),将数据一位一位地依次传输,每一位数据占据一个固定的时间长度。
其只需要少数几条线就可以在系统间交换信息,特别使用于计算机与计算机、计算机与外设之间的远距离通信。
使用串口通信时,发送和接收到的每一个字符实际上都是一次一位的传送的,每一位为1或者为0。
如图3-7所示。
图3-7:
串行通信原理
串行异步通信即RS232通信,是主机与外部硬件设备的常用通讯方式。
可以双向传输。
其数据格式如图3-8所示。
图3-8:
异步通信的数据格式
2)本系统串行通信发送模块设计
NanoBoard2的主板提供了RS232的串行接口。
在AltiumDesigner的库中也
提供了该接口的编程控制接口(FPGANB2DSK01Port-Plugin.lntLib中)。
如图
3-9所示:
图3-9:
板上RS232的串行接口
在verilog代码中,我们需要根据我们选择的串口的波特率来对输入时钟进
行分频得到串行通信的每一个数据位所需要的时间。
然后按照图3-8所示的串行
通信的数据格式将8bit的数据发送出去。
闲时我们将串口发射的信号线UART_TX_一直保持在高。
当我们需要发送数据时,将其拉低并保持一个数据位的时间,再将8bit的数据从低位到高位一位一位的通过发送出去。
然后再发送一
个停止位。
这里我们不添加校验位。
这时候一个8bit的数据就成功通过串口发送出去了。
我们设计的原理图如图3-10所示:
UJiDfB
IrDA_v.v
'TRILOGMODULE:
IrDAWB
CYCSTB0ackT1~
ADRpR.qlr5删"
DATAJI3L.0J_
DAT.CopI.O]
VCC
图3-10:
串口发送模块原理图
我们的FPGA空制模块在UART_TX.V文件中实现。
然后在IrDA.v文件中实例化。
这样就把串口发送模块嵌入到红外解码模块中。
具体的verilog代码见附录。
3.3PC串口接收和键盘映射模块
PC端需要控制串口,以获取串口传入的数据,也即是遥控器对应的命令码。
得到该码后,需要将其映射到PC机系统的按键事件,以控制PC机上的软件(这里是用XBM(多媒体播放器来演示)。
1)串口接收
在Windows系统中,串口和其它通信设备是作为文件处理的。
串口的打开、关闭、读取和写入所用的函数与操作文件的函数完全一致。
我们通过CreateFile()函数“打开”串口。
函数创建或打开以下对象并返回一个句柄,可以用来访问对象:
文件、管道、mailslots、通信资源、磁盘设备(WindowsNT只有)、consoles等。
HANDLECreateFile(
LPCTSTRlpFileName,//指向文件名的指针
DWORDdwDesiredAccess,//访问模式(写/读)
DWORDdwShareMode,/共/享模式
LPSECURITY_ATTRIBUTESlpSecurityAttributes,//指向安全属性的指针
DWORDdwCreationDisposition,//如何创建
DWORDdwFlagsAndAttributes,//文件属性
HANDLEhTemplateFile//用于复制文件句柄
);
打开串口之后,我们再通过ReadFile()函数从文件指针指向的位置开始将数据读出到来。
BOOLReadFile(
HANDLEhFile,//文件的句柄
LPVOIDlpBuffer,//用于保存读入数据的一个缓冲区
DWORDnNumberOfBytesToRead,/要/读入的字节数
LPDWORDlpNumberOfBytesRead,//指向实际读取字节数的指针
LPOVERLAPPEDlpOverlapped//该结构定义了一次异步读取操作
);
2)键盘映射模块
通过串口获得每个遥控按键对应的8bit,也就是一个字节的码后。
我们需要将其与遥控器具体的按键功能对应。
例如Altium的遥控器的“向左”这个按键的红外指令码是0x47。
当我们接收到这个码后,我们就映射到PC机键盘上面的“向左”的键盘值。
我们用Windows提供了Keybd_event这个函数来模拟键盘。
通过调用它来产生“向左”这个按键的键值。
这个键值会发送到系统上,然后当前的活动程序将会捕捉到这个按键,然后达到控制软件的目的。
Keybd_event能触发一个按键事件,Keybd_event共有四个参数,第一个为按键的虚拟键值,如回车键为vk_return。
第二个参数为扫描码,一般不用设置,用0代替就行。
第三个参数为选项标志,如果为keydown则置0即可,如果为keyup则设成“KEYEVENTF_KEYUP第四个参数一般也是置0即可。
下面两行代码就实
现了模拟键盘“向左”的按键按下然后放开的效果:
keybd_event(VK_LEFT,0,0,0);//keydown
keybd_event(VK_LEFT,0,KEYEVENTF_KEYUP,O);//keyup
具体源码见附录。
3.4多媒体演示模块
该模块的作用是演示我们对遥控器解码的有效性。
采用现有的XBM(多媒体中
心来实现。
XBMC是一个跨平台的媒体娱乐中心软件,它可以播放音视频、浏览图片、查看天气、管理存储器上的媒体资源文件、系统设置、支持游戏手柄等功能。
其效果图见图3-11。
图3-11:
XBM(多媒体软件
四、主要代码
4.1FPGA端
lrDA_v.v
2.//FileName:
IrDA_v.v
3.//ModuleName:
ThisisIrDAcontrolmodule
4.//Description:
ReceivetheIrDAcode,thendecodeitandtransmitthecode
toPCthoughCOM
5.//Author:
ZouXiaoyi
6.//HomePage:
7.//Date:
2013/06/08
8.//Rev.:
0.1
9.//===========================================================================
10.
10.modulelrDA_WB(CLK_l,ACK_I,INT_I,DATA_I,reset,CYC_STB_O,WE_O,ADR_O,DA
TA_O,UART_TX_O,Ir_Commad);
11.inputCLK_I;
12.inputACK_I;
13.inputINT_I;
14.input[31:
0]DATA_I;
15.inputreset;
17.
16.outputCYC_STB_O;
17.outputWE_O;
18.output[3:
0]ADR_O;
19.output[31:
0]DATA_O;
20.outputUART_TX_O;
21.output[7:
0]Ir_Commad;
24.
22.regACK_I;
23.regINT_I;
24.reg[31:
0]DATA_I;
28.
25.regCYC_STB_O;
26.regWE_O;
27.reg[3:
0]ADR_O;
28.reg[31:
0]DATA_O;
29.reg[7:
0]Ir_Commad;
30.reg[7:
0]data;
35.
31.reg[31:
0]count;
32.reg[31:
0]count2;
33.regflag;
39.
34.//ThewholeprocessofIrDAdecoder
35.always@(posedgeCLK_I)
36.begin
43.
//countposedgeofclk
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
if(reset)//initializebegin
count=32'dO;count2=32'dO;
flag=1'bO;
CYC_STB_O=1'bO;
START=1'bO;
end
//1)initialize
//nal+Registers
case(count)
32'd0:
begin
Ir_Commad=8'b0000_1111;//initializestate
count=32'd1;
end
32'd1:
begin
//writeClockDividerRegister(CLK_DIV)Register
ADR_O=4'h0;
DATA_O[31:
0]=32'h0000_7D3E;//32'h0000_3219for50M
Hz32'h0000_7D3Efor20MHz
WE_O=1'b1;
CYC_STB_O=1'b1;
count=32'd2;
end
32'd2:
begin
if(ACK_I)//waitingforackbegin
CYC_STB_O=1'b0;count=32'd3;
end
else
count=32'd2;
end
32'd3:
begin
//writeControlRegister
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
ADR_O=4'h1;
DATA_O[31:
0]=32'h0000_0043;//43
WE_O=1'b1;
CYC_STB_O=1'b1;
count=32'd4;
end
32'd4:
begin
if(ACK_I)//waitingforackbegin
CYC_STB_O=1'b0;count=32'd5;
count2=32'd0;
end
else
count=32'd4;
end
default:
begin
//makeinitializestragerunonce
count=32'd10;
//2)ifithasvaliddata,getit!
if(INT_I)//haveData
begin
//2.1)weneedtoreaditfromdataregister
case(count2)
32'd0:
begin
//readDataRegister
ADR_O=4'h3;
WE_O=1'b0;
CYC_STB_O=1'b1;
count2=32'd1;
end
32'd1:
begin
if(ACK_I)//waitingforack
begin
flag=1'b1;
data=DATA_I[23:
16];
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
CYC_STB_O=1'b0;
count2=32'd2;
//START=1'b1;//starttotr
ansmitthoughCOM
end
else
count2=32'd1;
end
32'd2:
begin
//2.2)writeControlRegistertoclear
bitofdataflag
ADR_0=4'h1;
DATA_O[31:
0]=32'h0000_0043;〃43
WE_0=1'b1;
CYC_STB_O=1'b1;
count2=32'd3;
end
32'd3:
begin
if(ACK_I)//waitingforack
begin
CYC_STB_O=1'b0;
count2=32'd0;
START=1'b1;//starttotransmitthoughCOM
end
else
count2=32'd3;
end
default:
begin
count2=32'd0;
end
endcase
end
else
begin
START=1'b0;//nodatatotransmit
if(flag)
171.
Ir_Commad=data;//data;
172.
else
173.
Ir_Commad=8'b1111_0000;//Nodata
174.
end
175.
end
176.
endcase
177.
end
178.
179.
180.
//ThewholeprocessofCOMtransmitmodule
181.
wireRST_B;
182.
regSTART;
183.
wireTX_BUSY;
184.
185.
assignRST_B=~reset;
186.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- irda 红外 收发 应用
![提示](https://static.bingdoc.com/images/bang_tan.gif)