当前文档版本为 v1.2.0,您可以访问当前页面的 开发中 版本以获取最近可能的更新。

PRF: BLE BEACON

1 功能概述

此项目演示了2.4G模拟蓝牙广播包发送功能,每隔100ms在37、38、39信道发送一次beacon包。

扫描端(参考prf_ble_scan)接收发送端的beacon包和空中其他蓝牙广播包,并将接收到的广播数据数据通过串口打印出来。

2 环境要求

  • board: 支持 2.4G 功能的开发板

  • uart: 显示串口输出log

  • PC串口工具:Panchip Serial Assistant V0.0.009.exe

  • NRF Connect App

3 编译和烧录

例程位置:zephyr\samples_panchip\proprietary_radio\prf_ble_beacon

使用 ZAL 工具可以对其进行编译、烧录、打开 VS Code 调试等操作。关于 ZAL 工具的详细介绍请参考:Zephyr APP Launcher 工具介绍

4 演示说明

  1. 将beacon发送端的串口(P00和P01)接到PC的USB端口上。

  2. 观察PC串口工具的输出结果。

  3. 打开安卓手机NRF Connect App,观察扫描到的beacon包。

4.1 演示结果

  1. 串口输出的log:

    image

    发射端Log

  2. 手机App NRF Connect扫描到的结果:

    image

    NRF Connect 扫描beacon包

5 开发说明

beacon包发射例程每隔100ms分别在37、38、39信道上发送一包2.4G数据,串口log每隔100ms会连续输出三次”tx done”

5.1 beacon包发射初始化

pan_prf_config_t tx_config = {
    .work_mode			= PRF_MODE_NORMAL_M1,
    .chip_mode			= PRF_CHIP_MODE_SEL_NORDIC,
    .trx_mode			= PRF_TX_MODE,
    .phy				= PRF_PHY_1M,
    .crc				= PRF_CRC_SEL_CRC24,
    .src				= PRF_SRC_SEL_EN,
    .dev				= PRF_DEV_BLE,
    .rx_timeout			= 1000,
    .rf_channel			= ADV_CHANNEL_1,
    .tx_no_ack			= ENABLE,
    .nrf52_mode			= ENABLE,
    .rx_length			= 0,
    .addr_length		= 4,
    .addr			= { 0xd6, 0xbe, 0x89, 0x8e },
    .tx_power			= 0,
    .pid_manual_flag	= DISABLE,
    .crc_include_addr	= DISABLE,
};

2.4G初始化配置说明如下:

初始化配置的结构体“pan_prf_config_t”

Type

Description

work_mode

使用帧结构自定义模式

chip_mode

帧结构兼容NORDIC协议

trx_mode

2.4g发射模式

phy

1M PHY

crc

CRC 24bit

src

开扰码

dev

devation兼容蓝牙模式

rx_timeout

rx的超时时间,此例程RX无作用

rf_channel

蓝牙广播的37信道,2402

tx_no_ack

tx发送不接收ack

nrf52_mode

打开NORDIC协议长包模式

rx_length

接收payload长度为0

addr_length

接入地址的长度4

addr

接入地址设为蓝牙包的接入地址0x8e89bed6

tx_power

发射功率0dbm

pid_manual_flag

不使用pid

crc_include_addr

crc作用域不包括地址

5.2 beacon包频点、帧格式设置

设置代码如下:

void set_ble_frame_format(void)
{
	PRI_RF->R01_INT_CTL &= ~R01_INT_PRI_ENDIAN_Msk;//使用小端模式
	PRI_RF->R04_RX_ADDR_M |= R04_RX_ADDR_M_HDR_LEN_EXIST_Msk;//使能长度字段
	PRI_RF->R04_RX_ADDR_M &= ~R04_RX_ADDR_M_HDR_LEN_NUMB_Msk;//使能header字段
	PRI_RF->R04_RX_ADDR_M |= (2 << 9);
	PRI_RF->R06_TX_ADDR_M |= (0x02 << 16);/* tx header 0x2,ADV_NONCONN_IND;
	0x0,ADV_IND;0x4,SCAN_RSP; */	//往tx header字段填入广播报文类型(不可连接广播)
}

__ramfunc void set_ble_channel(uint16_t channel)
{
	uint8_t channel_id = 0;
	uint8_t sca_value = 0;

	if (channel == 2402) {
		channel_id = 37;
	} else if ((channel < 2426) && (channel > 2402)) {
		channel_id = (channel - 2404) / 2;
	} else if (channel == 2426) {
		channel_id = 38;
	} else if ((channel < 2480) && (channel > 2426)) {
		channel_id = (channel - 2406) / 2;
	} else if (channel == 2480) {
		channel_id = 39;
	}//不同的频点映射不同的channel id,例程只使用2402、2426、2480三个频点

	sca_value = (bit_reverse(channel_id) >> 1) | 0x01;//根据channel id计算扰码初始值

	panchip_prf_reinit();		//重新初始化prf

	panchip_prf_set_chn(channel);//设置频点

	panchip_white_init_value(sca_value);//设置扰码初始值

	set_ble_frame_format();//beacon帧格式设置

	panchip_prf_set_data(&tx_payload);//payload设置
}

5.3 payload设置

payload包含广播包地址和广播数据,如下所示:

panchip_prf_payload_t tx_payload = {
.data_length	= 36,
.data		= { 0xff, 0x22, 0x33, 0x00, 0x05, 0x06,
    0x02, 0x01, 0x06, 0x1A, 0x0ff,
    0xd1, 0x07, /* Panchip */
    0x02, 0x15, /* iBeacon */
    0x18, 0xee, 0x15, 0x16, /* UUID[15..12] */
    0x01, 0x6b, /* UUID[11..10] */
    0x4b, 0xec, /* UUID[9..8] */
    0xad, 0x96, /* UUID[7..6] */
    0xbc, 0xb9, 0x6d, 0x16, 0x6e, 0x97, /* UUID[5..0] */
    0x00, 0x00, /* Major */
    0x00, 0x00, /* Minor */
    0xc8 },		/* RSSI */			/* mac addr(06 05 00 33 22 ff) + adv data */
};

5.4 中断处理

例程只有tx中断,其他中断无响应。tx完成后打印“tx done”,然后切频点,在下一个频点发送。

void event_tx_fun(void)
{
	printk("tx done\n");

	if (adv_channel_index  < ADV_CHANNEL_NUM) {
		adv_channel_index++;
		if (adv_channel_index == 2) {
			set_ble_channel(ADV_CHANNEL_2);
		} else if (adv_channel_index == 3) {
			set_ble_channel(ADV_CHANNEL_3);
		}
		panchip_prf_trx_start();
	} else {
		adv_channel_index = 1;
		set_ble_channel(ADV_CHANNEL_1);
	}
}

6 RAM/Flash资源使用情况

Memory region         Used Size  Region Size  %age Used
FLASH:       31308 B       384 KB      7.96%
SRAM:       11504 B        64 KB     17.55%