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 演示说明¶
将beacon发送端的串口(P00和P01)接到PC的USB端口上。
观察PC串口工具的输出结果。
打开安卓手机NRF Connect App,观察扫描到的beacon包。
4.1 演示结果¶
串口输出的log:
手机App NRF Connect扫描到的结果:
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%