IR - swm

本 demo 主要介绍 IR 以软件模式收发数据。

硬件连接

本 demo 使用到的 gpio 参考 board_ir_gpio_init ,将红外发射二极管和接收头与 IR 引脚连接,具体连接方式如下表(以BL808为例):

硬件连接

开发板 IR 引脚

外接模块

VCC

红外接收头 VCC

GND

红外接收头 GND

RX(GPIO17)

红外接收头 OUT

VCC

红外发射二极管正极

TX(GPIO11)

红外发射二极管负极

软件实现

更详细的代码请参考 examples/peripherals/ir/ir_swm

1board_init();
  • board_init 中会开启 IR 时钟,并选择 IR 时钟源和分频。

1board_ir_gpio_init();
  • 配置相关引脚为 IR 功能

1uint16_t tx_buffer[] = { 1777, 1777, 3555, 3555, 1777, 1777, 1777, 1777, 1777, 1777,
2                         3555, 1777, 1777, 1777, 1777, 3555, 3555, 1777, 1777, 3555, 1777 };
3struct bflb_ir_tx_config_s tx_cfg;
4
5irtx = bflb_device_get_by_name("irtx");
6
7/* TX init */
8tx_cfg.tx_mode = IR_TX_SWM;
9bflb_ir_tx_init(irtx, &tx_cfg);
  • 获取 irtx 句柄

  • 设置 tx_mode 为 SWM 模式,调用 bflb_ir_tx_init(irtx, &tx_cfg) 初始化 ir tx

 1uint16_t rx_buffer[30];
 2uint8_t rx_len;
 3struct bflb_ir_rx_config_s rx_cfg;
 4
 5irrx = bflb_device_get_by_name("irrx");
 6
 7/* RX init */
 8rx_cfg.rx_mode = IR_RX_SWM;
 9rx_cfg.input_inverse = true;
10rx_cfg.deglitch_enable = false;
11rx_cfg.end_threshold = 3999;
12bflb_ir_rx_init(irrx, &rx_cfg);
13
14/* Enable rx, wait for sending */
15bflb_ir_rx_enable(irrx, true);
  • 获取 irrx 句柄

  • 设置 rx_mode 为 SWM 模式,调用 bflb_ir_rx_init(irrx, &rx_cfg) 初始化 ir rx

  • 调用 bflb_ir_rx_enable(irrx, true) 使能 ir rx,等待数据发送

1bflb_ir_swm_send(irtx, tx_buffer, sizeof(tx_buffer) / sizeof(tx_buffer[0]));
2rx_len = bflb_ir_swm_receive(irrx, rx_buffer, 30);
  • 调用 bflb_ir_swm_send(irtx, tx_buffer, sizeof(tx_buffer) / sizeof(tx_buffer[0])) 发送 tx_buffer 中的数据

  • 调用 bflb_ir_swm_receive(irrx, rx_buffer, 30) 将接收到的数据存放在 rx_buffer 中

编译和烧录

参考 环境搭建

实验现象

按下开发板中 RST 按键,串口打印接收到的数据。