ST17H66 Proprietary_Rf 工程说明
A. Smart_Master 发送端
-
- 数据包结构解析
类型 | Adv_Type | PDU_LEN | MAC_Host | Adv_Segment0 | Adv_Segment1 | Net_WorkID | Segment_Num | Payload |
---|---|---|---|---|---|---|---|---|
长度(Byte) | 1 | 1 | 6 | 3 | 2 | 4 | 2 | 自定义长度 |
说明:
-
- PDU_LEN 为 MAC_Host 到 Payload 的长度;
-
- pack_len = PDU_LEN + 2;
-
- 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);开始发送数据;
-
- 数据发送
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 接收端
-
- 初始化接收
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);开始接收数据
-
- 接收中断,消息传递
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;
}
}
以上将接收到的数据传递到应用层进行处理。
-
- 应用处理
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值满足筛选条件将设备设置为绑定状态。
接收的数据将会按格式打印。