85 lines
8.3 KiB
C
85 lines
8.3 KiB
C
/********************************** IR V3.5a 说明 ***********************************************
|
||
|
||
IR模块用于控制“STC-B学习板”上红外发送与接收控制,支持PWM、PPM红外编码协议的发送,PWM红外编码的接收,可用于制作红外遥控器、红外通信等。
|
||
IR模块提供1个驱动函数、5个API应用函数、1个红外接收事件(enumEventIrRxd:红外Ir上收到一个数据包)。
|
||
IR模块已不与串口通信(uart和uart2)冲突,可用与它们同时工作。(以前冲突)
|
||
|
||
(1) void IrInit(unsigned char Protocol):IR模块初始化函数。
|
||
函数参数:unsigned char Protocol,定义红外协议。
|
||
Protocol 暂仅提供取值:NEC_R05d(定义红外协议基本时间片时长 = 13.1*Protocol uS)
|
||
函数返回值:无
|
||
|
||
(2) char IrTxdSet(unsigned char *pt,unsigned char num):以自由编码方式控制IR发送:可用于编写任意编码协议的红外发送,如各种电器红外遥控器等
|
||
函数参数:unsigned char *pt,指向待发送红外编码数据的首地址。编码规则如下:
|
||
码1红外发送时长,码1红外发送停止时长 //单位:协议基本时间片的个数值,最大255。如当协议基本时间片为0.56mS时,
|
||
,码2红外发送时长,码2红外发送停止时长 //如当协议基本时间片为0.56mS时,数值1代表0.56mS时长,3代表1.68mS时长,......
|
||
......
|
||
......
|
||
,码n红外发送时长,码n红外发送停止时长
|
||
unsigned char num,待发送红外编码数据的大小(字节数)
|
||
函数返回值:enumIrTxOK:调用成功,即所设定的发送数据包请求已被系统sys正确接受,sys将尽硬件资源最大可能及时发送数据。
|
||
enumIrTxFailure:调用失败(主要原因是:红外发送正忙(上一数据包未发完)、或红外正在接收一个数据包进行中
|
||
(同IrPrint()函数返回值)
|
||
补充说明:参照该格式定义和电器遥控器编码格式,可实现任何38KHz红外遥控器功能。
|
||
|
||
(3) char IrPrint(void *pt, unsigned char num)://以NEC的PWM编码方式发送数据,可用于符合该函数发送格式的部分电器遥控器;与GetIrRxNum()、SetIrRxd()配合,可进行红外双机通信;等
|
||
//红外发送数据格式为:引导码:发(16*基本时间片),停(8*基本时间片)。0.56mS时:发9mS、停4.5mS
|
||
数据编码:"0" -- 发(1*基本时间片),停(1*基本时间片)
|
||
"1" -- 发(1*基本时间片),停(3*基本时间片)
|
||
先发高位、后发低位
|
||
结束码:发(1*基本时间片),停(1*基本时间片)
|
||
//非阻塞函数,该函数从被调用到返回大约1uS左右时间,但所指定的数据经红外发送完毕则需要较长时间(每字节大约需要10mS量级时间)。
|
||
//IrPrint()函数用法完全类似与uart模块的Uart1Print()和Uart2Print()用法,(仅num参数为unsigned char,可参照使用)
|
||
函数参数:void *pt :指定发送数据包位置(数据包不含引导码、结束码信息,仅待发送的有效数据)
|
||
unsigned char num:发送数据包大小(字节数,不含引导码、结束码)
|
||
函数返回值:enumIrTxOK:调用成功,即所设定的发送数据包请求已被系统sys正确接受,sys将尽硬件资源最大可能及时发送数据。
|
||
enumIrTxFailure:调用失败(主要原因是:红外发送正忙(上一数据包未发完)、或红外正在接收一个数据包进行中
|
||
(同IrTxdSet()函数返回值)
|
||
|
||
(4) void SetIrRxd(void *RxdPt,unsigned char RxdNmax):设置红外接收数据包存放位置、每个数据包最大字节数。
|
||
收到一个数据包(至少1字节数据)时将产生numEventIrRxd事件。与它机IrPrint()函数配合,可实现红外数据通信
|
||
函数参数: void char *RxdPt:指定接收数据包存放区(首地址)
|
||
unsigned char RxdNmax:指定每个数据包接收最大字节数。当收到的数据大于Nmax后,将被丢弃。
|
||
函数返回值:无
|
||
|
||
(5) unsigned char GetIrRxNum(void):获取收到的红外接收数据包实际字节数。与SetIrRxd()配合,可实现红外数据包接收。(它机应使用IrPrint()函数发送数据包)
|
||
返回取值 <= Ir接收缓冲区最大字节数(RxdNmax定义)。如果实际红外数据包字节数大于RxdNmax,收到的多余字节数将不被存储(也不进行计数)
|
||
函数参数: 无
|
||
函数返回值:红外接收数据包大小(字节数)。
|
||
当收到一个数据包的numEventIrRxd事件产生后,可用该函数获取红外接收数据包的大小(字节数)。其它时间访问,其值不确定
|
||
|
||
(6) char GetIrStatus(void): 获取Ir状态
|
||
函数返回值:enumIrFree:红外空闲
|
||
enumIrBusy:红外正忙(正在发送数据包,或正在接收数据包)
|
||
|
||
(7) 红外接收事件enumEventIrRxd:红外Ir上收到一个符合格式的数据包(红外格式见IrPrint()函数说明)。
|
||
如果接收数据包实际字节数大于Ir接收缓冲区最大字节数(RxdNmax定义),也在收到数据包结束符后产生enumEventIrRxd事件
|
||
|
||
补充说明:
|
||
(1) 串口1、串口2波特率可独立设置,互不影响.
|
||
(2) 串口1、串口2、红外通信可同时工作,互不影响
|
||
(3) 串口1、串口2用法基本上完全一致,红外通信用法也基本相同。不同地方是:
|
||
a,串口1固定在USB接口上,可用于与计算机通信;而串口2可初始化在EXT扩展、或485接口上(在485接口上时仅单工工作);
|
||
b,红外通信速率固定不可变(大约相当于500~800 bps),通信时没有包头匹配功能。红外模块除通信功能外,还提供用于电器红外遥控的应用函数;
|
||
c,红外通信模块仅为单工工作。不发送时自动进入接收状态;有数据发送时自动进入发送状态,但正在接收数据包过程中不会进入发送状态。
|
||
|
||
编写:徐成(电话18008400450) 2021年8月24日设计,2021年11月5日更新
|
||
*/
|
||
|
||
#ifndef _IR_H_
|
||
#define _IR_H_
|
||
|
||
extern void IrInit(unsigned char Protocol); //IR模块初始化。参数:定义红外IR基本周期
|
||
enum IrProtocalName {NEC_R05d=43}; //定义红外IR协议基本周期 = 43*1000/76 = 566 (uS)
|
||
|
||
extern char IrTxdSet(unsigned char *pt,unsigned char num); //以自由编码方式控制IR发送:可用于编写任意编码协议的红外发送,如各种电器红外遥控器等
|
||
extern char IrPrint(void *pt, unsigned char num); //以NEC的PWM编码方式发送数据,可用于符合该函数发送格式的部分电器遥控器;与SetIrRxd()配合,可进行红外双机通信;等
|
||
extern void SetIrRxd(void *RxdPt,unsigned char RxdNmax); //设置红外接收数据包存放位置、每个数据包最大字节数。收到一个数据包(至少1字节数据)时将产生numEventIrRxd事件。与它机IrPrint()函数配合,可实现红外数据通信
|
||
extern unsigned char GetIrRxNum(void); //当收到一个数据包的numEventIrRxd事件产生后,可用该函数获取红外接收数据包的大小(字节数)。其它时间访问,其值不确定
|
||
extern char GetIrStatus(void); //获取Ir状态,enumIrFree:红外接口空闲, enumIrBusy,红外接口正忙
|
||
|
||
enum IrActName {enumIrFree=0 //红外发送空闲
|
||
,enumIrBusy // 忙
|
||
,enumIrTxOK // 发送成功
|
||
,enumIrTxFailure}; // 发送失败(正忙)
|
||
#endif |