17_longrange_ble_tx BLE Long Range发送例程

一、简介

本例程演示 PAN211 芯片的BLE Long Range 发射功能。

BLE Long Range 模式也称为 Coded PHY 模式,在蓝牙 5 协议版本中引入,其目的是为了满足蓝牙应用在长距离通信上的需求。 原始的蓝牙协议支持1Mbps和2Mbps通信速率。长距离模式在1Mbps的基础上经过编码,每个数据位由2或8个符号表示,也就是S2或S8编码模式。编码后的速率变成了500Kbps或250kbps,如下表:

image-20250424144159618

下图反映了这种编码模式在帧格式上如何体现:

image-20250424144222575

图中,FEC Block 1 始终使用 S8 编码。CI(编码指示符)用于指示在 FEC 块 2 中使用哪种编码方案(S=2 或 S=8)。FEC Block 2 根据 CI 的配置使用 S2 或 S8 编码。

PAN211 在发射模式的1Mbps和250kbps下都支持S2和S8编码,在接受模式下,只要开启了相应的配置,硬件自动识别编码标识符,可以同时接收S2或S8的数据包。

二、条件说明

频点:2402MHz
芯片工作模式:PAN211_CHIPMODE_BLE
CRC:3字节
数据速率:1Mbps
SPI类型:3线SPI
地址:{0x33, 0xCC, 0x33, 0xCC}
数据:包含设备名称和厂商数据
工作模式:普通型
发送功率:9dBm
发送周期:500ms

三、接口(移植)实现

  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引脚中断复用功能
 */
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 Long Range 发送模式,并在指定的通道上每隔一段时间发送1次数据包:

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

    PAN211_SetTxAddr(Addr, 4);       /* 设置 PAN211 的发送地址,地址宽度在S2/S8模式下只能为4Bytes */
    PAN211_SetRxAddr(0, Addr, 4);    /* 设置 PAN211 的接收地址,地址宽度在S2/S8模式下只能为4Bytes */

    while (1)
    {
        unsigned char TxLen = sizeof(TxBuf);  /* TxLen为待发送数据长度 */

        PAN211_WriteReg(0x0A, TxLen);   /* 写发送数据长度到发送长度寄存器 */
        PAN211_WriteFIFO(TxBuf, TxLen); /* 将待发送的数据写入PAN211 TX FIFO */
        PAN211_TxStart();               /* PAN211进入发送状态并开始送数据 */

        while (!IRQDetected()); /* 等待SPI_DATA/IIC_SDA引脚变低,指示发送完成 */

        IRQFlag = PAN211_GetIRQFlags(); /* 获取中断标志 */
        if (IRQFlag & RF_IT_TX_IRQ)
        {
            PAN211_ClearIRQFlags(RF_IT_ALL_IRQ);  /* 清除中断标志 */
            printf("Tx Count:%d\r\n", ++TxCount); /* 打印发送次数 */
        }

        BSP_Led2Toggle();  /* 切换LED2状态 */
        BSP_DelayMs(500);  /* 延时500ms后再发送下一包数据 */
    }
}

五、例程演示

使用步骤:

  1. 找到两块PAN211x开发板,分别作为Tx端和Rx端。

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

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

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

  5. 将本例程烧录到Tx端开发板上,Rx端开发板上烧录“18_longrange_rx”例程。

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

  7. 观察Tx端和Rx端的串口调试助手,Tx端会打印发送次数,Rx端会打印接收数据。

TX端日志:

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