IC:

支持的芯片

Ameba SoC

RTL8721Dx

RTL8726E

RTL8720E

RTL8730E

支持状态

Y

N

N

Y

概述

红外辐射(IR)模块提供了用于红外辐射发送的硬件调制功能,以及用于接收的硬件自动捕获功能。

本章将介绍如何使用该红外辐射模块。

IR 发送

轮询发送模式

要使用IR发送功能,请执行以下步骤:

  1. 根据Pinmux表配置IR引脚复用。

    例如,若要将 PB4 用作IR Tx引脚,可调用以下函数。其他引脚的配置方法相同。

    Pinmux_Config(_PB_4, PINMUX_FUNCTION_IR_TX);
    
  2. 调用 IR_Cmd() 函数禁用IR模块。

  3. 设置参数(默认值可修改)。

    IR_StructInit(IR_InitTypeDef *IR_InitStruct);
    
  4. 使用 步骤 3 中的参数初始化硬件。

    IR_Init(IR_InitTypeDef *IR_InitStruct);
    
  5. 使用 IR_SendBuf()IR_SendData() 函数将Tx数据写入FIFO。

  6. 调用 cIR_Cmd() 函数启用IR功能,开始传输数据。

  7. 根据需要,向 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接收功能,请执行以下步骤:

  1. 根据Pinmux表配置IR引脚复用。

    例如,若要将 PB5 用作IR Rx引脚,可调用以下函数。其他引脚的配置方法相同。

    Pinmux_Config(_PB_5, PINMUX_FUNCTION_IR_RX);
    
  2. 设置参数,并根据需要修改采样频率、Rx FIFO 阈值电平、Rx计数器阈值类型、Rx计数器阈值电平、接收触发模式等参数。

    IR_StructInit(IR_InitTypeDef *IR_InitStruct);
    
  3. 使用 步骤 2 中的参数初始化硬件。

    IR_Init(IR_InitTypeDef *IR_InitStruct);
    
  4. 根据需要配置中断,并注册中断回调函数。

    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);
    
  5. 调用 IR_Cmd() 函数启用IR模块。

  6. 调用 IR_ClearRxFIFO() 函数清空Rx FIFO。

  7. 当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只需要存储载波或无载波的持续时间。

../../_images/difference_of_waveform_between_rx_learning_and_common_rx.svg

Rx学习模式与普通Rx波形对比

备注

  • 建议将中断处理函数代码放在 RAM 中,并关闭其他外设中断,以避免干扰。

  • 如果学习波形的载波频率大于 400KHz,硬件可能无法及时响应中断,从而导致载波频率解码失败。