10_ble_tx BLE广播发送例程

一、简介

本例程演示 PAN211 芯片的BLE广播发送功能,包含在三个广播通道上发送广播包。

二、条件说明

频点:2402MHz/2426MHz/2480MHz
芯片工作模式:PAN211_CHIPMODE_BLE
CRC:3字节
数据速率:1Mbps
SPI类型:3线SPI
广播地址:{0xcc,0xcc,0xcc,0xcc,0xcc,0xcc}
广播数据:包含设备名称和厂商数据
工作模式:普通型
发送功率:9dBm
睡眠时间:3000ms

三、接口(移植)实现

  1. 根据硬件实现以下配置:

  • SPI_CS引脚配置为推挽输出

  • SPI_SCK引脚配置为推挽输出

  • SPI_DATA引脚配置为推挽输出或输入模式,低功耗模式下需配置为输入模式并启用上拉电阻

#define SPI_CS_HIGH      CS_PIN = 1      /* 将SPI_CS引脚设置为高电平 */
#define SPI_CS_LOW       CS_PIN = 0      /* 将SPI_CS引脚设置为低电平 */
#define SPI_SCK_HIGH     SCK_PIN = 1     /* 将SPI_SCK引脚设置为高电平 */
#define SPI_SCK_LOW      SCK_PIN = 0     /* 将SPI_SCK引脚设置为低电平 */
#define SPI_DATA_HIGH    DATA_PIN = 1    /* 将SPI_DATA引脚设置为高电平 */
#define SPI_DATA_LOW     DATA_PIN = 0    /* 将SPI_DATA引脚设置为低电平 */
#define SPI_DATA_STATUS  DATA_PIN        /* 读取SPI_DATA引脚状态 */
#define SPI_DATA_OUTPUT  GPIO_SetModeByPin(P4_3, GPIO_MODE_OUTPUT)  /* 配置SPI_DATA引脚为输出模式 */
#define SPI_DATA_INPUT   GPIO_SetModeByPin(P4_3, GPIO_MODE_INPUT)   /* 配置SPI_DATA引脚为输入模式 */
  1. 根据实际使用的MCU修改SPI接口初始化代码:

/**
 * @brief 初始化PAN211 3线SPI接口
 * @param 无
 * @return 无
 * @note 该函数配置SPI_SCK、SPI_CS和SPI_DATA引脚为GPIO模式,并设置为输出模式
 * @note PAN211没有独立中断引脚,可开启SPI_DATA引脚中断复用功能
 * @note PAN216具有独立中断引脚,可通过P4_5来检测PAN216的中断事件
 */
void BSP_3LineSPIInit(void)
{
    CLK_AHBPeriphClockCmd(CLK_AHBPeriph_GPIO, ENABLE);

    // 将引脚配置为GPIO模式,以软件SPI实现
    SYS_ConfigMFP(P4_0, SYS_MFP_GPIO); // SPI_SCK
    SYS_ConfigMFP(P4_1, SYS_MFP_GPIO); // SPI_CS
    SYS_ConfigMFP(P4_3, SYS_MFP_GPIO); // SPI_DATA
    SYS_ConfigMFP(P4_5, SYS_MFP_GPIO); // IRQ引脚,PAN211未使用

    GPIO_SetModeByPin(P4_1, GPIO_MODE_OUTPUT); // 配置SPI_CS为输出模式
    GPIO_SetModeByPin(P4_0, GPIO_MODE_OUTPUT); // 配置SPI_SCK为输出模式
    GPIO_SetModeByPin(P4_3, GPIO_MODE_OUTPUT); // 配置SPI_DATA为输出模式,后续根据时序需要设置为输入模式
    GPIO_SetModeByPin(P4_5, GPIO_MODE_INPUT);  // PAN211没有中断引脚,PAN216有中断引脚,配置为输入模式

    P41 = 1; // SPI_CS置高,表示未选中
    P40 = 0; // SPI_SCK置低,SPI时钟极性为低电平有效
    P43 = 0; // SPI_DATA置低

    GPIO_EnablePullupPath(P4, BIT3); // 将SPI_DATA引脚设置为输入模式,并启用上拉电阻
}

四、应用范例

根据需要配置BLE广播包的内容,以下是一个示例广播包的配置:

/* BLE广播包结构:
 * 
 * 总长度:19字节
 * 
 * 1. 广播地址(6字节):0xCC,0xCC,0xCC,0xCC,0xCC,0xCC
 *    - 标识广播设备的蓝牙地址
 *    - 接收端通过此地址识别发送设备
 * 
 * 2. AD Structure 1 - 设备名称(7字节):
 *    - Length(1字节):0x06 - 表示后续数据长度为6字节
 *    - Type(1字节):0x09 - Complete Local Name类型
 *    - Data(5字节):'P','A','N','T','H' - 设备名称"PANTH"
 * 
 * 3. AD Structure 2 - 制造商数据(6字节):
 *    - Length(1字节):0x05 - 表示后续数据长度为5字节
 *    - Type(1字节):0xFF - Manufacturer Specific Data类型
 *    - Company ID(2字节):0x58,0x58 - 制造商标识
 *    - Custom Data(2字节):0xAA,0xBB - 自定义数据(如温湿度)
 * 
 * 在BLE扫描工具中的显示效果:
 * - 设备名称:PANTH
 * - 原始数据:CC CC CC CC CC CC 06 09 50 41 4E 54 48 05 FF 58 58 AA BB
 * - 广播地址:CC:CC:CC:CC:CC:CC
 * - 广播类型:Manufacturer Specific Data
 * - 制造商数据:58 58 AA BB
 * - 注意:广播地址和制造商数据可以根据实际需求进行修改。
 */
unsigned char BleTxPacket[19] = 
{
    /* AdvA Addr */
    0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,

    /* AD Structure */
    0x06, 0x09,

    /* Local name: PANTH */
    'P', 'A', 'N', 'T', 'H',

    /* manufacturer specific data, the last two bytes are temperature and humidity. */
    0x05, 0xFF, 0x58, 0x58, 0xAA, 0xBB,
};

配置为BLE广播发送模式,在三个广播通道上发送广播包:

/**
 * @brief 该函数用于在指定的BLE广播通道上发送广播包
 * @param Channel BLE广播通道,范围从0到79
 *           - CH37 2402MHz
 *           - CH38 2426MHz
 *           - CH39 2480MHz
 * @param WhitenInitVal BLE广播通道对应的白化初始值
 *           - 2402MHz: 0x53
 *           - 2426MHz: 0x33
 *           - 2480MHz: 0x73
 * @return 无
 */
void BLE_Broadcast(unsigned char Channel, unsigned char WhitenInitVal)
{
    unsigned char IRQFlag; /* IRQFlag为PAN211中断标志变量 */

    PAN211_SetChannel(Channel);             /* 设置BLE广播通道频率 */
    PAN211_SetWhiteInitVal(WhitenInitVal);  /* 设置BLE广播通道对应的白化初始值 */

    PAN211_WriteFIFO(BleTxPacket, sizeof(BleTxPacket));  /* 将待发送的数据写入PAN211 TX FIFO */
    PAN211_TxStart();         /* PAN211进入发送状态并开始送数据 */
    while (!IRQDetected());   /* 等待SPI_DATA/IIC_SDA引脚变低,指示发送完成 */
    while ((PAN211_GetIRQFlags() & RF_IT_TX_IRQ) == 0);

    PAN211_ClearIRQFlags(0xFF);
}

int main(void)
{
    /* MCU 初始化 */

    if (PAN211_Init() != 1) /* 初始化并校准PAN211芯片 */
    {
        printf("PAN211初始化失败。\r\n");
        while (1);
    }

    PAN211_ClearIRQFlags(0xFF); /* 清除所有PAN211中断标志 */

    while (1)
    {
        printf("发送计数:%d\r\n", ++TxCount);
        BLE_Broadcast(2, 0x53);    /* 在2402MHz频率上发送广播包 */
        BLE_Broadcast(26, 0x33);   /* 在2426MHz频率上发送广播包 */
        BLE_Broadcast(80, 0x73);   /* 在2480MHz频率上发送广播包 */

        BSP_Led2Toggle();      /* 切换LED2状态 */

        PAN211_EnterSleep();   /* 进入休眠模式 */ 
        BSP_DelayMs(SLEEP_MS); /* 休眠3000ms */
        PAN211_ExitSleep();    /* 退出休眠模式 */
    }
}

五、例程演示

使用步骤:

  1. 找到一块PAN211x开发板,作为测试设备。

  2. 用Type-C数据线供电。

  3. 用跳线帽连接电源跳线P9。

  4. 将电源切换开关S1切换至“USB”端。

  5. 将本例程烧录到开发板上。

  6. 打开串口调试助手,设置波特率为115200,数据位8位,无校验位,停止位1位,选择开发板的串口,点击连接。

  7. 观察串口调试助手,开发板会打印发送计数,并在三个BLE广播通道上发送广播包,随后进入休眠状态,延时3000ms后退出休眠状态继续发送。

  8. 在BLE扫描工具中可以看到发送的广播包。

image

Tx端日志示例:

Tx Count:1
Tx Count:2
Tx Count:3

Rx端日志示例:

Rx done[96]
Header:0x42 RxLen:19
Payload:CC CC CC CC CC CC 06 09 50 41 4E 54 48 05 FF 58 
58 AA BB