支持的芯片
Ameba SoC |
RTL8721Dx |
RTL8726E |
RTL8720E |
RTL8730E |
---|---|---|---|---|
支持状态 |
Y |
N |
N |
Y |
概述
红外辐射(IR)模块提供了用于红外辐射发送的硬件调制功能,以及用于接收的硬件自动捕获功能。
本章将介绍如何使用该红外辐射模块。
IR 发送
轮询发送模式
要使用IR发送功能,请执行以下步骤:
根据Pinmux表配置IR引脚复用。
例如,若要将 PB4 用作IR Tx引脚,可调用以下函数。其他引脚的配置方法相同。
Pinmux_Config(_PB_4, PINMUX_FUNCTION_IR_TX);
调用
IR_Cmd()
函数禁用IR模块。设置参数(默认值可修改)。
IR_StructInit(IR_InitTypeDef *IR_InitStruct);
使用 步骤 3 中的参数初始化硬件。
IR_Init(IR_InitTypeDef *IR_InitStruct);
使用
IR_SendBuf()
或IR_SendData()
函数将Tx数据写入FIFO。调用
cIR_Cmd()
函数启用IR功能,开始传输数据。根据需要,向 FIFO 写入更多数据。
备注
在 步骤 2 到 步骤 6 中,建议先禁用IR功能,在将数据写入 FIFO 后再启用IR功能。
在 步骤 5 中,在向 FIFO 写入数据前,请注意将数据转换为Tx FIFO 寄存器能够识别的合适格式。
特别说明
Tx FIFO偏移问题
如果想判断TX FIFO 中的数据是否全部发送完毕,应检查Tx FIFO 空标志,而不是 TX_FIFO_OFFSET。
发送最后一包数据无法使状态机进入空闲状态问题
如果写入Tx FIFO 的最后一包数据无法使发送状态机进入空闲状态,建议在启用IR Tx之前,先向Tx FIFO写入一些数据包。
具体操作请参考 轮询发送模式 中的 步骤 2 到 步骤 6。
IR 接收
中断接收模式
要使用IR接收功能,请执行以下步骤:
根据Pinmux表配置IR引脚复用。
例如,若要将 PB5 用作IR Rx引脚,可调用以下函数。其他引脚的配置方法相同。
Pinmux_Config(_PB_5, PINMUX_FUNCTION_IR_RX);
设置参数,并根据需要修改采样频率、Rx FIFO 阈值电平、Rx计数器阈值类型、Rx计数器阈值电平、接收触发模式等参数。
IR_StructInit(IR_InitTypeDef *IR_InitStruct);
使用 步骤 2 中的参数初始化硬件。
IR_Init(IR_InitTypeDef *IR_InitStruct);
根据需要配置中断,并注册中断回调函数。
IR_INTConfig(IR_DEV, IR_RX_INT_ALL_EN, ENABLE); InterruptRegister((IRQ_FUN) IR_irq_handler, IR_IRQ, (u32)NULL, 10); InterruptEn(IR_IRQ, 10);
调用
IR_Cmd()
函数启用IR模块。调用
IR_ClearRxFIFO()
函数清空Rx FIFO。当Rx FIFO 阈值中断触发时,调用
IR_ReceiveBuf()
和IR_ReceiveData()
函数从Rx FIFO 读取数据,并在中断处理函数中进一步处理。
备注
在 步骤 7 中,为了正确解码接收到的数据,请了解Rx FIFO 寄存器中的数据格式。
波形反转问题:在接收结束时,如果波形反转,请在
Ir_nec_protocol.h
文件中定义 INVERSE_DATA,并设置IR_InitStruct.IR_RxCntThrType = IR_RX_COUNT_HIGH_LEVEL
。
Rx 学习模式
Rx学习的过程与普通Rx类似。
不同之处在于,在中断处理函数中,Rx学习需要存储Rx波形的每个脉冲,而普通Rx只需要存储载波或无载波的持续时间。
Rx学习模式与普通Rx波形对比
备注
建议将中断处理函数代码放在 RAM 中,并关闭其他外设中断,以避免干扰。
如果学习波形的载波频率大于 400KHz,硬件可能无法及时响应中断,从而导致载波频率解码失败。