91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

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

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

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

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

冬至子 ? 來(lái)源:paradox ? 作者:paradox ? 2023-09-25 17:08 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

項(xiàng)目的代碼測(cè)試完成之后,準(zhǔn)備收尾時(shí),出現(xiàn)了問(wèn)題。清除掉開(kāi)發(fā)過(guò)程中用來(lái)調(diào)試的print打印之后,zephyr_polling 的 HCI 突然不能正常工作了,之前測(cè)試可用的 zephyr_polling 中的各個(gè)例程都不再能運(yùn)行。

這個(gè)時(shí)候是去掉了 print 打印的,不能從日志找問(wèn)題。經(jīng)過(guò)一個(gè)一個(gè)嘗試之后定位到了 SPI 接收操作完成之后的一個(gè) print。將其去掉之后,芯片運(yùn)行會(huì)宕機(jī),但若是替換為一個(gè) 2 ticks (即2ms)的時(shí)延,例程都能正常運(yùn)行。

但是顯然不能這樣處理這個(gè)問(wèn)題,這樣一是治標(biāo)不治本 (只是在這個(gè)環(huán)境下避免了時(shí)序問(wèn)題的發(fā)生,當(dāng)條件改變,問(wèn)題還可能出現(xiàn)),二是影響性能。

于是使用這個(gè)(不太好用的)邏輯分析儀開(kāi)始尋找問(wèn)題。

1.是否接收header發(fā)送的太頻繁

先考慮問(wèn)題是否出在輪詢接收,發(fā)送 header 過(guò)于頻繁,導(dǎo)致芯片down。

根據(jù)邏輯時(shí)序圖,很多地方都是發(fā)起接收之后直接讀取芯片的待發(fā)數(shù)據(jù)大小。而此時(shí)芯片并不一定準(zhǔn)備好了做接收,讀到的數(shù)據(jù)大小很大,導(dǎo)致重復(fù)多次地讀取無(wú)用 byte。

1.jpg

官方例程里沒(méi)有這個(gè)問(wèn)題是因?yàn)榻邮諘r(shí)中斷調(diào)用的,芯片那邊主動(dòng)要求接收數(shù)據(jù),一定準(zhǔn)備好發(fā)送了。輪詢的話則應(yīng)該等待芯片做好準(zhǔn)備,拉高irq線再發(fā)送recv_header

處理:

在接收操作發(fā)送 header 前加入 !IsDataAvailable() 校驗(yàn),確認(rèn)芯片準(zhǔn)備好了再發(fā) header 確定要接收的數(shù)據(jù)量。

加入判斷機(jī)制后大大減少了啟動(dòng)用時(shí),提高了效率。

但是去掉print芯片還是down了。

2.是否是拉高cs_pin后irq_pin響應(yīng)太慢

考慮是否是拉高cs后irq_pin響應(yīng)太慢

觀察時(shí)序圖發(fā)現(xiàn),MCU 拉高 cs 希望發(fā)送數(shù)據(jù)之后,過(guò)了較長(zhǎng)一段等待時(shí)間后 irq 才拉高進(jìn)行 header 傳輸。

1.jpg

測(cè)試這種情況:cs 拉高再拉低,等待較長(zhǎng)一段時(shí)間才 irq 拉高,此時(shí)傳輸數(shù)據(jù),芯片并沒(méi)有 down:

1.jpg

3.是否不能在發(fā)送header之后同時(shí)收發(fā)

在接收處加入校驗(yàn)后的代碼,去掉 print 芯片還是 down 了。觀察其最后的時(shí)序,發(fā)現(xiàn)其發(fā)送了發(fā)送 header 之后,同時(shí)進(jìn)行了收發(fā),然后 down 了。

沒(méi)有delay 發(fā)送接收碰撞 后續(xù)芯片 down 了, spi 通信失敗:

1.jpg

并且,反復(fù)測(cè)試之后,芯片都是在這一次傳輸之后宕機(jī)。這里發(fā)送的命令010cfc032c0101是關(guān)閉芯片自帶 host。同時(shí)傳輸?shù)氖?04ff03:01:000106 廠商事件包,應(yīng)該是一個(gè) 6 字節(jié)的心跳包。

最后的那一個(gè) 06 是因?yàn)?host 要傳輸?shù)拿钍?7 個(gè)字節(jié),最后有個(gè)隨機(jī)的電平。協(xié)議棧不會(huì)對(duì)芯片的特殊廠商事件包進(jìn)行處理,即使被塞入接收隊(duì)列,最后協(xié)議棧處理的時(shí)候也會(huì)將其丟棄。

考慮是否不能同時(shí)收發(fā)。對(duì)比觀察正常的收發(fā)的時(shí)序。

帶 2 ticks delay 的接收

1.jpg

對(duì)比發(fā)現(xiàn),正常的工作的傳輸并不會(huì)出現(xiàn)收發(fā)同時(shí)的情況。

拋開(kāi)這個(gè)宕機(jī)問(wèn)題不談,在發(fā)送的事務(wù)流程中,對(duì)于傳輸數(shù)據(jù)過(guò)程中芯片發(fā)過(guò)來(lái)的數(shù)據(jù)是直接丟棄的,而這將導(dǎo)致丟包。雖然這里丟失的是廠商事件包,本來(lái)就不會(huì)對(duì)其處理,但是處于普適性應(yīng)該將其糾正。

解決同時(shí)收發(fā)的問(wèn)題

觀察時(shí)序圖發(fā)現(xiàn),發(fā)送 header 之后不進(jìn)行數(shù)據(jù)傳輸時(shí)被芯片允許的。嘗試在實(shí)際發(fā)送之前檢查 send_header 響應(yīng)中接收緩沖區(qū)數(shù)據(jù)量,如果不為 0,結(jié)束當(dāng)此發(fā)送流程,先做一次完整接收,并將接收到的數(shù)據(jù)塞到接收隊(duì)列里,再重新發(fā)送 send_header (使用while循環(huán),直到待接收數(shù)據(jù)為0),繼續(xù)當(dāng)前數(shù)據(jù)的發(fā)送。

直接在 send_header 傳輸完成之后加入判斷,進(jìn)行一次接收:

/* Read header */
rt_spi_transfer(ble_spi, &header_master, &header_slave, HEADER_SIZE);
rx_bytes = (((uint16_t)header_slave[2])< 8) | ((uint16_t)header_slave[1]);
uint16_t byte_count = (header_slave[4] < < 8)| header_slave[3];
if (byte_count > 0) 
{
    hci_driver_init_loop();
    result = -2;
}
else
{
  if(rx_bytes >= size)
  {
    /* Buffer is big enough */
    rt_spi_transfer(ble_spi, buffer, &read_char_buf, size);
  }
  else
  {
    /* Buffer is too small */
    result = -2;
  }
  /* Release CS line */
  rt_pin_write(hci_config.cs_pin_num, PIN_HIGH);
}

測(cè)試發(fā)現(xiàn)并不行,這時(shí)想起我沒(méi)拉高 CS 結(jié)束這一次發(fā)送傳輸事務(wù)就直接啟動(dòng)了一次接收,肯定會(huì)出錯(cuò)。加入這一句:rt_pin_write(HCI_TL_SPI_CS_PIN, PIN_HIGH);。

但加入后仍然不能正常使用。發(fā)送超時(shí)了,也就是在發(fā)起接收的時(shí)候, cs 拉低之后,irq 一直沒(méi)有拉高

| /

RT - Thread Operating System
/ | 5.0.1 build Sep 9 2023 21:50:28
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 >SPI Send timeout 101
E: (bt_hci_core)hci_send_cmd():2928: Unable to send to driver (err -1)

查看時(shí)序圖:

1.jpg

發(fā)現(xiàn)后續(xù)irq_pin直到超時(shí)了都沒(méi)動(dòng)一下,懷疑是前一次的發(fā)送流程沒(méi)有被芯片認(rèn)定結(jié)束。

經(jīng)過(guò)一系列嘗試和測(cè)試之后,發(fā)現(xiàn)要想結(jié)束當(dāng)次發(fā)送流程,需要將 cs 拉高一定的時(shí)間,才能讓 chipset 覺(jué)得這次發(fā)送完了:

if (byte_count > 0) {
    /* Release CS line */
    rt_pin_write(HCI_TL_SPI_CS_PIN, PIN_HIGH);
    /* to end the send, we need a delay */
    rt_thread_delay(1);
    hci_driver_init_loop();
    result = -2;
}

雖然這里引入了時(shí)延,但是收發(fā)撞到一起的情況屬于特殊情況,對(duì)于整體的性能影響不大。

修改后芯片down掉的問(wèn)題得到解決:

| /

RT - Thread Operating System
/ | 5.0.1 build Sep 9 2023 21:50:28
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
HRS notifications enabled
HRS notifications disabled
Disconnected (reason 0x13)

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

    關(guān)注

    10

    文章

    3819

    瀏覽量

    111190
  • 緩沖器
    +關(guān)注

    關(guān)注

    6

    文章

    2227

    瀏覽量

    48881
  • 邏輯分析儀
    +關(guān)注

    關(guān)注

    3

    文章

    220

    瀏覽量

    24449
  • MCU控制
    +關(guān)注

    關(guān)注

    0

    文章

    49

    瀏覽量

    7081
  • RTThread
    +關(guān)注

    關(guān)注

    8

    文章

    132

    瀏覽量

    42720
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    RTT_Zephyr_Polling BlueNRG2 SPI使用說(shuō)明

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

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

    在用標(biāo)準(zhǔn)的 HCI 指令控制設(shè)備進(jìn)行藍(lán)牙操作之前,需要提前通過(guò) VS Command 對(duì)設(shè)備進(jìn)行配置,只有正確配置好的設(shè)備才能正常使用。
    的頭像 發(fā)表于 09-27 11:19 ?2415次閱讀
    <b class='flag-5'>RTT</b> <b class='flag-5'>zephyr_polling</b><b class='flag-5'>軟件包</b> <b class='flag-5'>Bluenrg2</b>藍(lán)牙<b class='flag-5'>芯片</b>啟動(dòng)流程

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

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

    如何使用RTT Studio配置at軟件包來(lái)連接wifi模塊?

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

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

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

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

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

    rtt有支持多個(gè)文件壓縮的軟件包

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

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

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

    WK2124 SPI轉(zhuǎn)串口芯片驅(qū)動(dòng)軟件包

      WK2124 軟件包  1 介紹  WK2124 軟件包是為WK2124 SPI轉(zhuǎn)四串口擴(kuò)展芯片而開(kāi)發(fā)的RT-Thread驅(qū)動(dòng)。通過(guò)R
    發(fā)表于 03-06 11:01

    I2C模塊arduinoio Simulink軟件包

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

    RT-Thread軟件包定義和使用

    RT-Thread軟件包是運(yùn)行于RT-Thread物聯(lián)網(wǎng)操作系統(tǒng)平臺(tái)上,面向不同應(yīng)用領(lǐng)域的通用軟件組件 。RT-Thread 同時(shí)提供了開(kāi)放的軟件包
    的頭像 發(fā)表于 05-21 11:29 ?1.2w次閱讀
    RT-Thread<b class='flag-5'>軟件包</b>定義和使用

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

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

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

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

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

    RTT zephyr_polling軟件包 Bluenrg2 藍(lán)牙芯片啟動(dòng)流程 “開(kāi)源之夏”“藍(lán)牙HOST協(xié)議棧
    的頭像 發(fā)表于 09-27 18:40 ?1957次閱讀
    RT-Thread<b class='flag-5'>平臺(tái)</b> <b class='flag-5'>zephyr_polling</b><b class='flag-5'>軟件包</b> <b class='flag-5'>Bluenrg2</b> 藍(lán)牙<b class='flag-5'>芯片</b>啟動(dòng)流程

    RTT平臺(tái)zephyr_polling軟件包SPI Bluenrg2問(wèn)題排查

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