精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

RTT zephyr_polling軟件包 Bluenrg2藍(lán)牙芯片啟動流程

冬至子 ? 來源:paradox ? 作者:paradox ? 2023-09-27 11:19 ? 次閱讀

藍(lán)牙芯片啟動流程
在用標(biāo)準(zhǔn)的 HCI 指令控制設(shè)備進(jìn)行藍(lán)牙操作之前,需要提前通過 VS Command 對設(shè)備進(jìn)行配置,只有正確配置好的設(shè)備才能正常使用。

芯片產(chǎn)商只出售芯片,并不關(guān)注外圍電路和具體的產(chǎn)品形態(tài),這些是具體的ODM廠商來實現(xiàn)的。也就是芯片產(chǎn)商提供帶HCI藍(lán)牙功能的芯片,ODM設(shè)計電路并設(shè)計產(chǎn)品,之后通過HCI和芯片進(jìn)行交互。實際各家ODM產(chǎn)商的需求各不相同,芯片產(chǎn)商為了滿足不同客戶的需要,并且為了減少和客戶的對接,就必然在同一套代碼的基礎(chǔ)上,需要提供一系列的配置參數(shù)來滿足不同 ODM 廠商的需要。

配置可以包括:固件燒錄(部分沒有帶 FLASH 的藍(lán)牙芯片每次上電都需要重新燒錄最新的固件)、藍(lán)牙地址配置、硬件接口配置(如RF接口,晶振類型等,部分藍(lán)牙芯片需要)、波特率配置(HCI 一般是UART接口,默認(rèn)是115200)以及芯片需要的由廠商要求的其他參數(shù)配置。
此外,對于一些有Flash的芯片,完全可以將配置參數(shù)等預(yù)燒錄到了 Flash 中,使用時完全不需要配置任何參數(shù),直接通過HCI接口操作使用即可。

zephyr_polling 協(xié)議棧提供了 Boot 流程接口和 Prepare 流程接口,可以根據(jù)實際芯片的需求實現(xiàn)啟動配置。

1.jpg

Boot流程:

完成廠商的初始化流程,如固件下載,藍(lán)牙地址配置等。在 chipset 注冊好接口后,協(xié)議棧啟動時會通過boot_start()回調(diào)啟動 chipset(指協(xié)議棧 chipset 目錄下的啟動流程代碼,下同) 的 Boot 流程,由于操作接口是 HCI,所以一般都是下發(fā)一個VS Command,然后根據(jù) VS Event 來進(jìn)行后續(xù)動作,協(xié)議棧會通過event_process()回調(diào)接口將收到的 event 上報給 chipset,當(dāng) chipset 認(rèn)為操作結(jié)束時,通過調(diào)用bt_hci_set_boot_ready()接口通知協(xié)議棧boot流程結(jié)束。

Prepare流程:

部分廠商的參數(shù)要求在 HCI_Reset Command 之后進(jìn)行(意思是它們的 HCI_Reset Command 會清空配置的參數(shù))。為了兼容這類參數(shù)形態(tài),HCI_Reset Command 之后還加入了 Prepare 流程。協(xié)議棧收到 HCI_Reset 的 Command Complete Event 后會通過prepare_start()回調(diào)啟動 chipset 的 Prepare 流程,和 Boot 流程一樣,協(xié)議棧會通過event_process()回調(diào)接口將收到的 event 上報給 chipset ,當(dāng)chipset 認(rèn)為操作結(jié)束時,通過調(diào)用 bt_hci_set_prepare_ready()接口通知協(xié)議棧prepare流程結(jié)束。

BlueNRG-2 啟動流程
查閱 ST 官方提供的手冊和例程資料,可以了解到 BlueNRG-2 的啟動配置需求。

對于 BlueNRG-2:
Boot 流程:無事務(wù)。
Prepare 流程:關(guān)閉Host功能;藍(lán)牙地址配置;設(shè)置 TX power;GATT配置;GAP配置。

BlueNRG-2 啟動流程實現(xiàn)
Boot 流程
BlueNRG-2 的 HCI_Reset Command 會清空配置的參數(shù),所以實際的配置放在協(xié)議棧的 Prepare 流程中。Boot 流程的回調(diào)函數(shù)直接調(diào)用bt_hci_set_boot_ready()結(jié)束流程。

void boot_start(void) {
state = STATE_POLLING_BOOTING;
// nothing to do
bt_hci_set_boot_ready(); //finish boot
}

Prepare 流程 - 關(guān)閉 Host 功能
開發(fā)使用的藍(lán)牙模塊 X-NUCLEO-BNRG2A1 中的 BLE 本身是一個 SOC,里面集成了 host 的協(xié)議棧。廠商 ST 提供了一套 ACI 指令來控制芯片行為,包括 host 的接口。也就是說默認(rèn)的情況下,這個芯片的 ACL 交互都被接管了,所以需要通過 ACI 命令,關(guān)閉 host 行為。需要通過aci_hal_write_config_data里的CONFIG_DATA_LL_WITHOUT_HOST關(guān)閉 host。

Prepare 流程第一步,關(guān)閉 host:

void prepare_start(void) {
state = STATE_POLLING_PREPARING;
step = 1;
// step 1 close host
bluenrg2_config_without_host(); // It can be written only if aci_hal_write_config_data() is the first command after reset.
}
關(guān)閉 host 的指令的 ogf 為0x3f,ocf 為0x00c,參數(shù)為2c11。其中,0x2C是關(guān)閉 Host 在 CONFIG_DATA 中的 offset。

#define CONFIG_DATA_LL_WITHOUT_HOST (0x2C) /**< Switch on/off Link Layer only mode. Set to 1 to disable Host. */
#define CONFIG_DATA_LL_WITHOUT_HOST_LEN (1)
static int bluenrg2_config_without_host()
{
uint8_t cmd_buffer[CONFIG_DATA_LL_WITHOUT_HOST_LEN + 2];
struct net_buf *buf;
cmd_buffer[0] = CONFIG_DATA_LL_WITHOUT_HOST; //offset
cmd_buffer[1] = CONFIG_DATA_LL_WITHOUT_HOST_LEN; //config len
cmd_buffer[2] = 1; //Set to 1 to disable Host
uint16_t ogf = 0x3f, ocf = 0x00c;
uint16_t opcode = (uint16_t)((ocf & 0x03ff)|(ogf << 10));
buf = bt_hci_cmd_create(opcode, sizeof(cmd_buffer));
if (!buf)
{
return -ENOBUFS;
}
net_buf_add_mem(buf, cmd_buffer, sizeof(cmd_buffer));
return bt_hci_cmd_send(opcode, buf);
}

Prepare 流程 - 藍(lán)牙地址設(shè)置
需要通過aci_hal_write_config_data里的CONFIG_DATA_PUBADDR_OFFSET配置藍(lán)牙地址。

配置藍(lán)牙地址的指令的 ogf 為0x3f,ocf 為0x00c。配置藍(lán)牙地址指令在 CONFIG_DATA 中的 offset 為 0x00,后面跟上地址長度和設(shè)置的藍(lán)牙地址。

#define BLE_MAC_ADDR
{
{
0xf5, 0x00, 0x00, 0xE1, 0x80, 0x02
}
}
#define CONFIG_DATA_PUBADDR_OFFSET (0x00) /**< Bluetooth public address */
#define CONFIG_DATA_PUBADDR_LEN (6)
static int bluenrg2_config_set_public_addr()
{
uint8_t cmd_buffer[CONFIG_DATA_PUBADDR_LEN + 2];
struct net_buf *buf;
bt_addr_t addr = BLE_MAC_ADDR;
cmd_buffer[0] = CONFIG_DATA_PUBADDR_OFFSET; //offset
cmd_buffer[1] = CONFIG_DATA_PUBADDR_LEN; //config len
memcpy(cmd_buffer + 2, addr.val, CONFIG_DATA_PUBADDR_LEN); // addr
uint16_t ogf = 0x3f, ocf = 0x00c;
uint16_t opcode = (uint16_t)((ocf & 0x03ff)|(ogf << 10));
buf = bt_hci_cmd_create(opcode, sizeof(cmd_buffer));
if (!buf)
{
return -ENOBUFS;
}
net_buf_add_mem(buf, cmd_buffer, sizeof(cmd_buffer));
return bt_hci_cmd_send(opcode, buf);
}
Prepare 流程 - 設(shè)置發(fā)射功率
配置發(fā)射功率的指令的 ogf 為0x3f,ocf 為0x00f。命令參數(shù)為是否啟用高功率模式(0x00啟用普通功率,0x01啟用高功率)和功率放大器輸出電平(允許的PA電平取決于設(shè)備)。

PA_Level 值對應(yīng)功率
0: -14 dBm (High Power)
1: -11 dBm (High Power)
2: -8 dBm (High Power)
3: -5 dBm (High Power)
4: -2 dBm (High Power)
5: 2 dBm (High Power)
6: 4 dBm (High Power)
7: 8 dBm (High Power)

static int bluenrg2_set_tx_power_level(uint8_t En_High_Power, uint8_t PA_Level)
{
uint8_t cmd_buffer[2];
struct net_buf *buf;
cmd_buffer[0] = En_High_Power; //En_High_Power
cmd_buffer[1] = PA_Level; //config PA_Level
uint16_t ogf = 0x3f, ocf = 0x00f;
uint16_t opcode = (uint16_t)((ocf & 0x03ff)|(ogf << 10));
buf = bt_hci_cmd_create(opcode, sizeof(cmd_buffer));
if (!buf)
{
return -ENOBUFS;
}
net_buf_add_mem(buf, cmd_buffer, sizeof(cmd_buffer));
return bt_hci_cmd_send(opcode, buf);
}
Prepare 流程 - GATT 配置
GATT 初始化的指令的 ogf 為0x3f,ocf 為0x101,沒有其它參數(shù)。

static int bluenrg2_gatt_init(void)
{
uint16_t ogf = 0x3f, ocf = 0x101;
uint16_t opcode = (uint16_t)((ocf & 0x03ff)|(ogf << 10));
return bt_hci_cmd_send(opcode, NULL);
}

Prepare 流程 - GAP 配置
初始化 GAP 層。注冊GAP服務(wù),并設(shè)置標(biāo)準(zhǔn) GAP 服務(wù)特性:設(shè)備名稱、Appearance、外圍設(shè)備首選連接參數(shù)(僅限外圍設(shè)備)。

GAP 配置的指令的 ogf 為0x3f,ocf 為0x08a。配置為外圍設(shè)備,如果需要用做其他角色,需要修改此處;不啟用隱私策略(為保護(hù)地址不被竊取,進(jìn)行地址加密/解密,并周期更新);設(shè)置設(shè)備名字長度。

privacy:
0x00: Privacy disabled
0x01: Privacy host enabled
0x02: Privacy controller enabled

#define GAP_PERIPHERAL_ROLE (0x01)
#define GAP_BROADCASTER_ROLE (0x02)
#define GAP_CENTRAL_ROLE (0x04)
#define GAP_OBSERVER_ROLE (0x08)
#define privacy_enabled (0x00)
#define device_name_char_len (0x08)
static int bluenrg2_gap_init()
{
uint8_t cmd_buffer[3];
struct net_buf *buf;
cmd_buffer[0] = GAP_PERIPHERAL_ROLE; //role
cmd_buffer[1] = privacy_enabled; //privacy
cmd_buffer[2] = device_name_char_len; //device_name_char_len
uint16_t ogf = 0x3f, ocf = 0x08a;
uint16_t opcode = (uint16_t)((ocf & 0x03ff)|(ogf << 10));
buf = bt_hci_cmd_create(opcode, sizeof(cmd_buffer));
if (!buf)
{
return -ENOBUFS;
}
net_buf_add_mem(buf, cmd_buffer, sizeof(cmd_buffer));
return bt_hci_cmd_send(opcode, buf);
}

啟動事件處理
對于啟動流程的返回響應(yīng),需要由event_process()回調(diào)進(jìn)行判斷和推進(jìn)。這里為了方便,只對CMD_COMPLETE事件進(jìn)行判斷處理,推進(jìn) Prepare 流程進(jìn)行。
GAP 設(shè)置完成后調(diào)用bt_hci_set_prepare_ready()結(jié)束流程。

void event_process(uint8_t event, struct net_buf *buf)
{
if(state == STATE_POLLING_PREPARING) // boot do nothing
{
if (event == BT_HCI_EVT_CMD_COMPLETE) //only complete
{
printk("prepare_event_process, step: %dn", step);
switch (step)
{
case 1: //close host just now
bluenrg2_config_set_public_addr(); //step2 set_public_addr
step = 2;
break;
case 2:
bluenrg2_set_tx_power_level(1, 4); //step3 set_public_addr
step = 3;
break;
case 3:
bluenrg2_gatt_init(); //step4 gatt_ini
step = 4;
break;
case 4:
bluenrg2_gap_init(); //step5 gap_ini
step = 5;
break;
case 5:
bt_hci_set_prepare_ready(); //finish prepare
step = 0;
break;
}
}
}
}

啟動流程注冊
將上述實現(xiàn)的啟動流程的函數(shù)指針打包到bt_hci_chipset_driver結(jié)構(gòu)體中,供協(xié)議棧調(diào)用注冊。

static const struct bt_hci_chipset_driver chipset_drv = {
init_work, boot_start, prepare_start, event_process,
};
// public drv API
const struct bt_hci_chipset_driver *bt_hci_chipset_impl_local_instance(void)
{
return &chipset_drv;
}

驗證
完成 HCI 接口的時候雖然成功運行了 Beacon 例程,但 Beacon 例程是不需要進(jìn)行 chipset 啟動配置流程的(運行時啟用的是common空白回調(diào))。運行外設(shè)的心率例程驗證 Bluenrg2 藍(lán)牙芯片啟動流程。

| /

RT - Thread Operating System
/ | 5.0.1 build Sep 20 2023 22:16:27
2006 - 2022 Copyright by RT-Thread team
do components initialization.
initialize rti_board_end:0 done
initialize stm32l4_hw_lptim_init:0 done
initialize finsh_system_init:0 done
msh >zephyr
zephyr_polling_init
bt_init_hci_driver
SPI_init_process device_name: spi10, spi_name: spi1, rate: 1000000, databits: 8, LSB_MSB: 1, Master_Slave: 0, CPOL: 0, CPHA: 1
SPI_init_process cs_pin_num: 1, irq_pin_num: 0
hci_driver_open, SPI_config_finish
I: (bt_hci_core)hci_init():3230: work start.
msh >prepare_event_process, step: 1
prepare_event_process, step: 2
prepare_event_process, step: 3
prepare_event_process, step: 4
prepare_event_process, step: 5
I: (bt_hci_core)hci_init_end():3205: work end.
E: (bt_smp)smp_self_test():5695: smp_self_test start
I: (bt_hci_core)bt_dev_show_info():3008: Identity: 02:80:e1:00:00:f5 (public)
I: (bt_hci_core)bt_dev_show_info():3042: HCI: version 5.2 (0x0b) revision 0x1222, manufacturer 0x0030
I: (bt_hci_core)bt_dev_show_info():3044: LMP: version 5.2 (0x0b) subver 0x0015
Bluetooth initialized
Advertising successfully started
Connected
BAS Notifications enabled
HRS notifications enabled
prepare_event_process 步驟的日志輸出正常,設(shè)備連接、電池服務(wù)、心率服務(wù)正常。

1.jpg

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 藍(lán)牙芯片
    +關(guān)注

    關(guān)注

    17

    文章

    374

    瀏覽量

    45986
  • UART接口
    +關(guān)注

    關(guān)注

    0

    文章

    124

    瀏覽量

    15268
  • ACL
    ACL
    +關(guān)注

    關(guān)注

    0

    文章

    61

    瀏覽量

    11964
  • Flash存儲
    +關(guān)注

    關(guān)注

    0

    文章

    38

    瀏覽量

    8277
  • RTThread
    +關(guān)注

    關(guān)注

    8

    文章

    132

    瀏覽量

    40811
收藏 人收藏

    評論

    相關(guān)推薦

    RTT_Zephyr_Polling BlueNRG2 SPI使用說明

    在RT-Thread平臺下,利用 BlueNRG2 藍(lán)牙芯片運行 RTT_Zephyr_Polling 協(xié)議棧。使用 SPI 作為 HCI 傳輸方式。
    的頭像 發(fā)表于 09-21 14:54 ?1218次閱讀
    <b class='flag-5'>RTT_Zephyr_Polling</b> <b class='flag-5'>BlueNRG2</b> SPI使用說明

    RTT平臺zephyr_polling軟件包SPI Bluenrg2芯片宕機(jī)問題與修復(fù)

    項目的代碼測試完成之后,準(zhǔn)備收尾時,出現(xiàn)了問題。清除掉開發(fā)過程中用來調(diào)試的print打印之后,zephyr_polling 的 HCI 突然不能正常工作了,之前測試可用的 zephyr_polling 中的各個例程都不再能運行。
    的頭像 發(fā)表于 09-25 17:08 ?1066次閱讀
    <b class='flag-5'>RTT</b>平臺<b class='flag-5'>zephyr_polling</b><b class='flag-5'>軟件包</b>SPI <b class='flag-5'>Bluenrg2</b><b class='flag-5'>芯片</b>宕機(jī)問題與修復(fù)

    如何用Ubuntu qemu跑zephyr_polling藍(lán)牙

    進(jìn)入 RT-Thread online packages → IoT - internet of things 目錄即可看到 zephyr_polling軟件包,勾選軟件包
    的頭像 發(fā)表于 09-28 11:24 ?1875次閱讀
    如何用Ubuntu qemu跑<b class='flag-5'>zephyr_polling</b>的<b class='flag-5'>藍(lán)牙</b>?

    如何使用RTT Studio配置at軟件包來連接wifi模塊?

    如何使用RTT Studio配置at軟件包來連接wifi模塊?
    發(fā)表于 02-16 07:47

    分享一種基于littlevgl2rtt軟件包的RGB屏幕接口優(yōu)化方案

    StudioOS版本:4.0.3開發(fā)板:Art-Pi + 正點原子4.3寸RGB屏軟件包:Littlevgl2rtt(latest)溫馨提示:下面的優(yōu)化方案是基于該軟件包的優(yōu)化,如果是自己一直lvgl的不再此
    發(fā)表于 06-07 14:57

    SPI驅(qū)動屏幕移植LVGL軟件包具體流程

    , send_data, RT_NULL,2);}二、移植lvgl(一)、添加lvgl軟件包首先打開rtthread setting,點擊右側(cè)的縮進(jìn),打開后,選擇軟件包,再將多媒體
    發(fā)表于 07-08 15:09

    rtt有支持多個文件壓縮的軟件包

    rtt有支持多個文件壓縮的軟件包么,比如tar指令,或者有那個大佬實現(xiàn)了多文件壓縮的源碼可以分享一下么?
    發(fā)表于 11-15 10:53

    怎樣使用SDK中的Beacon示例對BLUENRG2進(jìn)行重新編程呢?

    我希望使用 BLUENRG-M2 模塊構(gòu)建一個帶有 BLUENRG2 的項目。我購買了一塊 X-NUCLEO-BNRG2A1 板開始使用,并將該板上的 SWDIO、SWDCLK、NRESET、VDD
    發(fā)表于 01-03 10:00

    I2C模塊arduinoio Simulink軟件包

    I2C模塊arduinoio Simulink軟件包
    發(fā)表于 01-22 14:06 ?0次下載

    淺析Zephyr在ESP32上的啟動流程

    理解Zephyr在一款soc上的啟動流程,有利于分析和調(diào)試開機(jī)過程卡死,驅(qū)動異常等的問題。因此在上手一款新的soc時掌握Zephyr在其上面的啟動
    的頭像 發(fā)表于 06-07 17:04 ?5198次閱讀

    STM32F103C8 使用RT-Thread軟件包系統(tǒng)讀取MPU6050

    常見的元件自然有相應(yīng)的軟件包啦,在工程根目錄打開ENV工具1.在這個目錄下可以發(fā)現(xiàn)很多軟件包,我們將MPU6xxx打開2.在打開RTT的iic支持
    發(fā)表于 12-06 14:36 ?12次下載
    STM32F103C8 使用RT-Thread<b class='flag-5'>軟件包</b>系統(tǒng)讀取MPU6050

    RTT zephyr_polling SPI Bluenrg2數(shù)據(jù)傳輸測試

    RTT 那邊的 Kconfig 配置完成,項目的基本開發(fā)內(nèi)容就完成了。然后再對協(xié)議棧在 Bluenrg2 芯片上采用 SPI 作為 HCI 的數(shù)據(jù)傳輸進(jìn)行測試。
    的頭像 發(fā)表于 09-25 16:25 ?849次閱讀
    <b class='flag-5'>RTT</b> <b class='flag-5'>zephyr_polling</b> SPI <b class='flag-5'>Bluenrg2</b>數(shù)據(jù)傳輸測試

    RT-Thread平臺 zephyr_polling軟件包 Bluenrg2 藍(lán)牙芯片啟動流程

    RTT zephyr_polling軟件包 Bluenrg2 藍(lán)牙芯片
    的頭像 發(fā)表于 09-27 18:40 ?844次閱讀
    RT-Thread平臺 <b class='flag-5'>zephyr_polling</b><b class='flag-5'>軟件包</b> <b class='flag-5'>Bluenrg2</b> <b class='flag-5'>藍(lán)牙</b><b class='flag-5'>芯片</b><b class='flag-5'>啟動</b><b class='flag-5'>流程</b>

    軟件包0 error計劃流程介紹

    可以在這一百個軟件包中認(rèn)領(lǐng)自己感興趣的軟件包,不限于一個
    的頭像 發(fā)表于 10-12 10:13 ?580次閱讀
    <b class='flag-5'>軟件包</b>0 error計劃<b class='flag-5'>流程</b>介紹

    RTT平臺zephyr_polling軟件包SPI Bluenrg2問題排查

    在對協(xié)議棧在 Bluenrg2 芯片上采用 SPI 作為 HCI 的數(shù)據(jù)傳輸進(jìn)行測試的時候,發(fā)現(xiàn)存在丟問題。
    的頭像 發(fā)表于 10-23 15:41 ?574次閱讀
    <b class='flag-5'>RTT</b>平臺<b class='flag-5'>zephyr_polling</b><b class='flag-5'>軟件包</b>SPI <b class='flag-5'>Bluenrg2</b>丟<b class='flag-5'>包</b>問題排查