ST17H66低功耗蓝牙SOC开发(8)—— proprietary_rf工程讲解

本文详细介绍了基于ST17H66芯片的蓝牙智能设备在发送和接收端的数据包结构和处理流程。在发送端,数据包包含了Adv_Type、PDU_LEN、MAC_Host等字段,并通过特定的初始化函数配置发送间隔和数据长度。在接收端,设备通过设置接收间隔和长度来捕获数据,并将接收到的数据传递给应用层进行处理。整个通信过程涉及频道切换和重传机制,确保了数据的可靠传输。
摘要由CSDN通过智能技术生成

ST17H66 Proprietary_Rf 工程说明

A. Smart_Master 发送端

    1. 数据包结构解析
类型Adv_TypePDU_LENMAC_HostAdv_Segment0Adv_Segment1Net_WorkIDSegment_NumPayload
长度(Byte)1163242自定义长度

说明:

    1. PDU_LEN 为 MAC_Host 到 Payload 的长度;
    1. pack_len = PDU_LEN + 2;
    1. pack_len 最大值为 RF_PKT_MAX_LEN(256);
static void smart_rf_data_init(void)
{
    uint8_t adv_buffer[32];
    adv_buffer[0] = 0x02;
    adv_buffer[1] = 0x01;
    adv_buffer[2] = 0x06;
    adv_buffer[3] = 0x1B;
    adv_buffer[4] = 0xFF;
    adv_buffer[5] = 0x04;
    adv_buffer[6] = 0x05;
    adv_buffer[7] = 0x01;
    adv_buffer[8] = 0x02;
    adv_buffer[9] = 0x03;
    adv_buffer[10] = 0xcc; //
    adv_buffer[11] = 0x00; //
    adv_buffer[12] = 0x03; //
    adv_buffer[13] = 0xaa; //
    adv_buffer[14] = 0x00; //
    adv_buffer[15] = 0x93; //
    adv_buffer[16] = 0xaa; //
    adv_buffer[17] = 0x67; //
    adv_buffer[18] = 0xF7;
    adv_buffer[19] = 0xDB;
    adv_buffer[20] = 0x34;
    adv_buffer[21] = 0xC4;
    adv_buffer[22] = 0x03;
    adv_buffer[23] = 0x8E;
    adv_buffer[24] = 0x5C;
    adv_buffer[25] = 0x0B;
    adv_buffer[26] = 0xAA;
    adv_buffer[27] = user_data_seq;
    adv_buffer[28] = user_data_seq >> 8;
    adv_buffer[29] = user_data_seq >> 16;
    adv_buffer[30] = user_data_seq >> 24;
    uint8_t advHead[2] = {0x00, (31 + 6)};
    //tx buf date update
    osal_memcpy(&(phyBufTx[0]), &(advHead[0]), 2);     //copy tx header
    osal_memcpy(&(phyBufTx[2]), &(s_pubAddr[0]), 6);   //copy AdvA
    osal_memcpy(&(phyBufTx[8]), &(adv_buffer[0]), 31); //copy payload
...
}

以上就是SDK中初始化发送包数据格式,phyBufTx[]为RF发射数据缓存,发送的数据需要更新在缓存等待RF发送。

    //phy pktfmt config
    s_phy.Status = RF_RFPHY_IDLE;
    s_phy.txIntv = 50;           //ms
    s_phy.rxIntv = 200;          //ms
    s_phy.rxOnlyTO = 10 * 1000;  //us
    s_phy.rfChn = BLE_ADV_CHN37; //26;//
    s_pktCfg.pktFmt = RF_PKT_FMT_1M;
    s_pktCfg.pduLen = 31 + 6;
    s_pktCfg.crcFmt = LL_HW_CRC_BLE_FMT; //LL_HW_CRC_BLE_FMT;LL_HW_CRC_NULL
    s_pktCfg.crcSeed = DEFAULT_CRC_SEED;
    s_pktCfg.wtSeed = WHITEN_SEED_CH37; //DEFAULT_WHITEN_SEED;
    s_pktCfg.syncWord = DEFAULT_SYNCWORD;
    VOID osal_start_timerEx(PhyRf_TaskID, PPP_PERIODIC_TX_EVT, 1000);

初始化发送的时间间隔,s_phy.txIntv = 50;
初始化发送的数据长度,s_pktCfg.pduLen = 31 + 6;
VOID osal_start_timerEx(PhyRf_TaskID, PPP_PERIODIC_TX_EVT, 1000);开始发送数据;

    1. 数据发送
static void process_tx_done_evt(void)
{
    /**
        37->38->39 adv channel
    */
    uint8 last_index = 0;
    last_index = user_get_chn_index(s_phy.rfChn);
    if (last_index < (USER_MAX_CHN_NUMBER - 1))
    {
        s_phy.rfChn = User_chanel_Map[last_index + 1][0];
        s_pktCfg.wtSeed = User_chanel_Map[last_index + 1][1];
        phy_rf_tx();
    }
    else if (last_index == (USER_MAX_CHN_NUMBER - 1))
    {
        user_reTx_number++;
        if (user_reTx_number >= Max_ReTxNumber)
        {
            user_reTx_number = 0;
            osal_start_timerEx(PhyRf_TaskID, PPP_PERIODIC_TX_EVT, s_phy.txIntv);
            s_phy.Status = RF_RFPHY_IDLE;

            user_update_tx_sequnce();

            LOG("--next_seq=%d\n\r", user_data_seq);
        }
        else
        {
            s_phy.rfChn = User_chanel_Map[0][0];
            s_pktCfg.wtSeed = User_chanel_Map[0][1];
            phy_rf_tx();
        }
    }
    else
    {
        LOG("channel error!!\n\r");
        s_phy.Status = RF_RFPHY_IDLE;
    }
}

以上为Rf发送数据的发送流程,每一包数据在一个发送间隔中在3个通道循环发送5组。

void user_update_tx_sequnce(void)
{

    user_data_seq++;
    if (user_data_seq > 65535)
        user_data_seq = 0;

    SmartRf_Tx_DataBuf.Adv_Seq[0] = user_data_seq;
    SmartRf_Tx_DataBuf.Adv_Seq[1] = user_data_seq >> 8;
    osal_memcpy(&(phyBufTx[0]), &SmartRf_Tx_DataBuf, SmartRf_Tx_DataBuf.PduLen + 2);
}

以上为每一包数据发送完后,数据包的数据更新;

B.Smart_Slave 接收端

    1. 初始化接收
    s_phy.Status = RF_RFPHY_IDLE;
    s_phy.txIntv = 40;           //ms
    s_phy.rxIntv = 10;           //ms
    s_phy.rxOnlyTO = 10 * 1000;  //us
    s_phy.rfChn = BLE_ADV_CHN37; //26;//
    s_pktCfg.pktFmt = RF_PKT_FMT_1M;
    s_pktCfg.pduLen = 31 + 6;
    s_pktCfg.crcFmt = LL_HW_CRC_BLE_FMT; //LL_HW_CRC_BLE_FMT;LL_HW_CRC_NULL
    s_pktCfg.crcSeed = DEFAULT_CRC_SEED;
    s_pktCfg.wtSeed = WHITEN_SEED_CH37; //DEFAULT_WHITEN_SEED;
    s_pktCfg.syncWord = DEFAULT_SYNCWORD;
    VOID osal_start_timerEx(PhyRf_TaskID, PPP_PERIODIC_RX_EVT, 2500);

初始化接收间隔,s_phy.rxIntv = 10;
初始化接收长度,s_pktCfg.pduLen = 31 + 6;
VOID osal_start_timerEx(PhyRf_TaskID, PPP_PERIODIC_RX_EVT, 2500);开始接收数据

    1. 接收中断,消息传递
static void phy_rx_data_reportCB(void)
{
    if (s_taskIdRxCb == NULL)
        return;

    ppp_rxPktReport_t *pkt;
    uint8_t pduLen = phyBufRx[1] + 2;
    pkt = (ppp_rxPktReport_t *)osal_msg_allocate(
        sizeof(ppp_rxPktReport_t) + pduLen);
    uint8_t *p = osal_mem_alloc(pduLen);

    if (pkt != NULL && p != NULL)
    {
        pkt->hdr.event = PPP_MSG_DATA_REPORT;
        pkt->hdr.status = 0xff;
        pkt->dlen = pduLen;
        osal_memcpy(p, phyBufRx, pduLen);
        pkt->pData = p;
        pkt->rfChn = s_phy.rfChn;
        pkt->rssi = phyRssi;
        pkt->carrSens = phyCarrSens;
        pkt->foff = phyFoff;
        (void)osal_msg_send(s_taskIdRxCb, (uint8 *)pkt);
    }
}

static void appProcessOSALMsg(osal_event_hdr_t *pMsg)
{
    switch (pMsg->event)
    {
    case PPP_MSG_DATA_REPORT:

        appProcessRxData(((ppp_rxPktReport_t *)pMsg));

        break;

    default:
        // Unknown message - drop it.
        break;
    }
}

以上将接收到的数据传递到应用层进行处理。

    1. 应用处理
static void appProcessRxData(ppp_rxPktReport_t *pMsg)
{
    uint8_t pduLen = pMsg->dlen;

    if (SmartRF_Device.device_mode == UN_PAIRING_MODE)
    {

    }
    else if (SmartRF_Device.device_mode == EN_PAIRED_MODE)
    {

    }

    osal_mem_free(pMsg->pData);
}

在应用层将设备分为绑定和未绑定两种状态:设备上电为未绑定状态,将设备靠近发射端,信号强度RSSI值满足筛选条件将设备设置为绑定状态。
接收的数据将会按格式打印。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WHMTBYY

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值