BGM240 стартануть...
BGM240 стартануть...
Ппомогите. Не могу запустить сей модуль. Модуль пустой из коробки. Загрузил свою программу, загрузил bootloader:bootloader-storage-internal-single-1536k но управление моей программе похоже, что не передаётся. Если пустить дебаг оно где-то шарится и ничего не показывает. Если нажать suspend, появляется сообщение: Break at address "0x8000604" with no debug information available, or outside of program code.
Что еще этому чуду не хватает? Даже пытался bt_soc_blinky поставить - эффект нулевой.
Что еще этому чуду не хватает? Даже пытался bt_soc_blinky поставить - эффект нулевой.
- Реклама
Re: BGM240 стартануть...
С таким бутлоадером следует из Bluetooth профиля убрать OTA сервис (если Bluetooth задействован), который в тестовом приложении bluetooth_soc_empty присутствует по умолчанию. Делайте в Software Components поиск по ota и удалите эту компоненту. Потом следует заново перезалить приложение. Ещё неясно какая у Вас версия Secure FW в чипе, и совместима-ли она с используемой приложением версией SDK. Если это не поможет, сообщите подробности что и как делаете, какие версии и пр. У меня всё работает на УРА.
Re: BGM240 стартануть... Solved
Новая проблема. "Проапгрейдился", называется. Теперь проект не запускается. Проблема решена - рецепт в конце.
Компилятор GNU ARM 12.2.1
SDK Simplicity SDK Suite v2024.6.1
Сборка идёт без ошибок. Но при старте "повисает". Прошелся дебагером: (стрелка показывает на какой подпрограмме ухожу вглубь)
А там после err = sli_bt_system_start_bluetooth(); оно вываливается в
При этом пытался делать по-новой "Bluetooth - SoC Empty", копировать файлы, компилировать - и всё время один и тот же результат. Может с этим новым SDK надо как-то по-новому действовать?
В гугле нашел, что для Simplicity SDK, в отличии от Gecko SDK надо конфигурировать Clock Manager - указал там внешний HFXO - 39MHz. Не помогло...
А!!! Еше надо Default Clock Source Selection for HF clock branches указать HFXO - теперь заработало!
Компилятор GNU ARM 12.2.1
SDK Simplicity SDK Suite v2024.6.1
Сборка идёт без ошибок. Но при старте "повисает". Прошелся дебагером: (стрелка показывает на какой подпрограмме ухожу вглубь)
Код: Выделить всё
main() ->
sl_system_init(); -->
void sl_system_init(void)
{
sl_platform_init();
sl_driver_init();
sl_service_init();
sl_stack_init(); -->
sl_internal_app_init();
}
void sl_stack_init(void)
{
sl_fem_util_init();
sl_rail_util_pa_init();
sl_rail_util_power_manager_init();
sl_rail_util_pti_init();
sl_bt_init(); -->
}
Код: Выделить всё
RAILCb_AssertFailed:
080264b4: ldr r3, [pc, #8] ; (0x80264c0 <RAILCb_AssertFailed+12>)
080264b6: str r1, [r3, #0]
080264b8: ldr r3, [pc, #8] ; (0x80264c4 <RAILCb_AssertFailed+16>)
080264ba: str r0, [r3, #0]
080264bc: b.n 0x80264bc <RAILCb_AssertFailed+8>В гугле нашел, что для Simplicity SDK, в отличии от Gecko SDK надо конфигурировать Clock Manager - указал там внешний HFXO - 39MHz. Не помогло...
А!!! Еше надо Default Clock Source Selection for HF clock branches указать HFXO - теперь заработало!
Re: BGM240 стартануть...
Новая засада. Захотел запустить часики реального времени. Выбрал BURTC. Зашел в софтверные компоненты и поставил галочку у Platform->Peripheral->EMLIB->BURTC. В старте написал:
Но оно падает в HardFault.
Прошелся отладчиком, оно умирает в этой функции: На строчке if (BURTC->EN != 0U) , т.е. первая же попытка прочитать.
В заголовке написано, что перед этой функцией надо сбросить бит в RMU
Но эти магические слова недоступны (#ifdef не активизирует строки про rmuResetBU).
Что я упускаю?
Код: Выделить всё
BURTC_Init_TypeDef burtcInit = BURTC_INIT_DEFAULT;
...
BURTC_Init(&burtcInit);Прошелся отладчиком, оно умирает в этой функции:
Код: Выделить всё
void BURTC_Init(const BURTC_Init_TypeDef *burtcInit)
uint32_t presc;
presc = divToLog2(burtcInit->clkDiv);
if (BURTC->EN != 0U) {
BURTC_SyncWait();
}
BURTC->EN_CLR = BURTC_EN_EN;
...В заголовке написано, что перед этой функцией надо сбросить бит в RMU
Код: Выделить всё
* Before initialization, BURTC module must first be enabled by clearing the
* reset bit in the RMU, i.e.,
* @verbatim
* RMU_ResetControl(rmuResetBU, rmuResetModeClear);
* @endverbatim
Код: Выделить всё
/** RMU controlled peripheral reset control and reset source control. */
typedef enum {
#if defined(RMU_CTRL_BURSTEN)
rmuResetBU = _RMU_CTRL_BURSTEN_MASK, /**< Reset control over Backup Power domain select. */
#endif
Re: BGM240 стартануть...
[uquote="uldemir",url="/forum/viewtopic.php?p=4750592#p4750592"]Прошелся отладчиком, оно умирает в этой функции:
На строчке if (BURTC->EN != 0U) , т.е. первая же попытка прочитать.[/uquote]Вообще-то это место лучше прошагать по окну дизасма. Чтобы точно знать на какой команде виснет. Если виснет именно на команде чтения из регистра BURTC, то это более всего похоже на то, что не включено тактирование периферийного блока (к которому относится данный регистр). Я с EFR-ами не работал, но в других МК такое может происходить обычно при отключенном тактировании соответствующей периферии.
[uquote="uldemir",url="/forum/viewtopic.php?p=4750592#p4750592"]Что я упускаю?[/uquote]Скачать "Reference Manual"; найти в нём параграф про тактирование регистров IO периферии (Clocking какой-нить); найти что там написано про BURTC.
Вот скачал "EFR32xG24 Wireless SoC Reference Manual" и вижу (стр.173): "CMU_CLKEN0 - Clock Enable Register 0". Биты 28 и 29 - BURAM, BURTC. В каком они положении в точке выполнения того кода?
На строчке if (BURTC->EN != 0U) , т.е. первая же попытка прочитать.[/uquote]Вообще-то это место лучше прошагать по окну дизасма. Чтобы точно знать на какой команде виснет. Если виснет именно на команде чтения из регистра BURTC, то это более всего похоже на то, что не включено тактирование периферийного блока (к которому относится данный регистр). Я с EFR-ами не работал, но в других МК такое может происходить обычно при отключенном тактировании соответствующей периферии.
[uquote="uldemir",url="/forum/viewtopic.php?p=4750592#p4750592"]Что я упускаю?[/uquote]Скачать "Reference Manual"; найти в нём параграф про тактирование регистров IO периферии (Clocking какой-нить); найти что там написано про BURTC.
Вот скачал "EFR32xG24 Wireless SoC Reference Manual" и вижу (стр.173): "CMU_CLKEN0 - Clock Enable Register 0". Биты 28 и 29 - BURAM, BURTC. В каком они положении в точке выполнения того кода?
- Реклама
Re: BGM240 стартануть...
Совершенно верно, скорее всего не разрешено тактирование для BURTC. Вот пример мигания светодиодом с периодом 1 сек для демо-платы Ezurio LYRA 24p и simplicity_sdk_2025.6.1:
Код: Выделить всё
#include "em_burtc.h"
#include "em_cmu.h"
#include "em_gpio.h"
void app_init(void)
{
GPIO_PinModeSet(gpioPortA, 8, gpioModePushPull, 0); // configure LED pin
CMU_ClockSelectSet(cmuClock_BURTC, cmuSelect_LFXO); // select BURTC clock
CMU_ClockEnable(cmuClock_BURTC, true); // get access to BURTC registers
BURTC_Init_TypeDef init = BURTC_INIT_DEFAULT;
init.compare0Top = true;
BURTC->COMP = 32768; // set BURTC perior
BURTC_Init(&init);
BURTC_IntEnable(BURTC_IEN_COMP); // set up BURTC interrupt
NVIC_EnableIRQ(BURTC_IRQn);
}
void app_process_action(void)
{
}
void BURTC_IRQHandler(void)
{
BURTC_IntClear(BURTC_IF_COMP); // clear BURTC interrupt
GPIO_PinOutToggle(gpioPortA, 8); // toggle LED
}Re: BGM240 стартануть...
У меня возник новый бздык! Хочу несколько таймеров и USART тактировать от частоты 25.175 МГц. Да, те кто в курсе, что это за частота, догадались правильно - хочу попробовать сделать VGA видеоконтроллер. Правда, тогда у меня и системная частота упадёт до этой частоты. А сможет ли в этом случае работать Bluetooth?
Поначалу, собирался купить осциллятор на эту частоту и подать на вход CLKIN0. Но тут подумал, что есть модуль DPLL. Можно ли его использовать не для повышения частоты, а для понижения? В референс мануале, вроде ограничения такого не видел. F = Fref*(N+1)/(M+1). Тогда если я выберу N и M 1006 и 1559 соответственно, то из 39МГц набортного кварца получу вожделёную частоту 25.175МГц. Или лучше повышать до 50.350Мгц, а затем включить прескалер на 2 для PCLK?
p.s. Попробовал сделать 25.175 (N=2013, M=3119) - получил RAILCb_AssertFailed() at 0x801bc7c...
Такая же ошибка и при 50.35МГц (N=4027, M=3119). Т.е. bluetooth с такими частотами не может завестись?
Как быть?
Поначалу, собирался купить осциллятор на эту частоту и подать на вход CLKIN0. Но тут подумал, что есть модуль DPLL. Можно ли его использовать не для повышения частоты, а для понижения? В референс мануале, вроде ограничения такого не видел. F = Fref*(N+1)/(M+1). Тогда если я выберу N и M 1006 и 1559 соответственно, то из 39МГц набортного кварца получу вожделёную частоту 25.175МГц. Или лучше повышать до 50.350Мгц, а затем включить прескалер на 2 для PCLK?
p.s. Попробовал сделать 25.175 (N=2013, M=3119) - получил RAILCb_AssertFailed() at 0x801bc7c...
Такая же ошибка и при 50.35МГц (N=4027, M=3119). Т.е. bluetooth с такими частотами не может завестись?
Как быть?
Re: BGM240 стартануть...
uldemir, если вы собрались делать двухцветный VGA адаптер который данные цвета через USART в режиме SPI выводит, то частота у него должна быть 50MHz, потому что на вывод одного бита нужно 2 такта.
Re: BGM240 стартануть...
Мне хватит и одного цвета. Мне надо туда выводить "секундомер" и "лучший результат". Цвет чисел я могу менять коммутируя резистивную матрицу сигналом от кадровой развёртки, но это потом. Пока мне хватит белых цифр на синем фоне. Фон активирую сигналом CS SPI, а цифры MOSI SPI. Хотел посмотреть насколько стабильная картинка получится и как быстро будут обновляться цифры... Но пока упёрся в проблему запуска Bluetooth. А без этого вся затея не имеет смысла.
Re: BGM240 стартануть...
[uquote="uldemir",url="/forum/viewtopic.php?p=4787314#p4787314"]Пока мне хватит белых цифр на синем фоне. Фон активирую сигналом CS SPI, а цифры MOSI SPI.[/uquote]
При чем тут CS SPI? Данные цвета выводятся через MOSI, если цифры должны быть белыми, то при единичке на MOSI она пойдет на R и G, а B жестко привязан к 1. Тогда при нуле на MOSI единица будет только на B.
При чем тут CS SPI? Данные цвета выводятся через MOSI, если цифры должны быть белыми, то при единичке на MOSI она пойдет на R и G, а B жестко привязан к 1. Тогда при нуле на MOSI единица будет только на B.
Re: BGM240 стартануть...
Когда закончится левый бланкирующий строчный импульс, даётся команда на запуск SPI. SPI активизирует CS что включит 1 на Blue. Там где рисуется цифра - MOSI активизирует Red, Green - они вместе с фоном дадут белый цвет. Когда строка завершится, CS снимается, фон пропадает и начинается правый бланкирующий импульс. Я как-то так представлял вывод. Правда есть зазор между активизацией CS и началом выдачи потока данных (и так же в конце), так что будет не 640 пикселей, а, может 632 - не принципиально. На худой конец сбавлю частоту пикселей в 2 раза - будет 320х480 - мне надо рисовать крупные цифры.
Re: BGM240 стартануть...
Так, я снова в игре. Забыл, что тактовые импульсы можно в счетчик скармливать через CC1. Правда вопрос, а можно ли если я через вход закачиваю тактовые импульсы, использовать этот же канал как регистр сравнения и выводить результат в PRS? Жаль, если нет. Придётся второй счетчик параллелить.
Но, в данный момент самый большой облом у меня с EUSART. В референс мануале написано:
В общем, ничего не понимаю. EUSART vs USART выбрал потому что там есть FIFO на 16 уровней. Хотел сделать так, чтобы EUSART работал в синхронном режиме как slave. Тактовые импульсы теже 25.175 МГц, а CS подавать через PRS.
Но, в данный момент самый большой облом у меня с EUSART. В референс мануале написано:
Так вот рассматривая регистр TRIGCTRL, не вижу никакого поля TSEL. И вообще не вижу возможности выбрать канал PRS. Выбор есть только если RX назначается на PRS. Думал опечатка в мануле, но в хедерах тоже нет:If a transmission must be started on an event with very little delay, the PRS system can be used to trigger the transmission. The PRS
channel to use as a trigger can be selected using TSEL in EUSARTn_TRIGCTRL. When a positive edge is detected on this signal, the
receiver is enabled if RXTEN in EUSARTn_TRIGCTRL is set, and the transmitter is enabled if TXTEN in EUSARTn_TRIGCTRL is set.
Only one signal input is supported by the EUSART.
Спойлер
Код: Выделить всё
/* Bit fields for EUSART TRIGCTRL */
#define _EUSART_TRIGCTRL_RESETVALUE 0x00000000UL
#define _EUSART_TRIGCTRL_MASK 0x00000007UL
#define EUSART_TRIGCTRL_RXTEN (0x1UL << 0)
#define _EUSART_TRIGCTRL_RXTEN_SHIFT 0
#define _EUSART_TRIGCTRL_RXTEN_MASK 0x1UL
#define _EUSART_TRIGCTRL_RXTEN_DEFAULT 0x00000000UL
#define EUSART_TRIGCTRL_RXTEN_DEFAULT (_EUSART_TRIGCTRL_RXTEN_DEFAULT << 0)
#define EUSART_TRIGCTRL_TXTEN (0x1UL << 1)
#define _EUSART_TRIGCTRL_TXTEN_SHIFT 1
#define _EUSART_TRIGCTRL_TXTEN_MASK 0x2UL
#define _EUSART_TRIGCTRL_TXTEN_DEFAULT 0x00000000UL
#define EUSART_TRIGCTRL_TXTEN_DEFAULT (_EUSART_TRIGCTRL_TXTEN_DEFAULT << 1)
#define EUSART_TRIGCTRL_AUTOTXTEN (0x1UL << 2)
#define _EUSART_TRIGCTRL_AUTOTXTEN_SHIFT 2
#define _EUSART_TRIGCTRL_AUTOTXTEN_MASK 0x4UL
#define _EUSART_TRIGCTRL_AUTOTXTEN_DEFAULT 0x00000000UL
#define EUSART_TRIGCTRL_AUTOTXTEN_DEFAULT (_EUSART_TRIGCTRL_AUTOTXTEN_DEFAULT << 2)
Re: BGM240 стартануть...
Новая старая проблема. Есть одно устройство на сием модуле, понадобилось второе. Собрал, хочу спарить со смартфоном и не могу. При попытке спариться, на "дисплей" устройства выдаётся пасскей, но я его не могу ввести на смартфоне, как соединение рвётся. Т.е. я только его прочитал, собираюсь ввести, а соединение уже отвалилось. И, что самое странное, несмотря на перезапуск адвертисмента, больше я это устройство сканером не вижу, пока не перезапущу. Функция запуска адвертисмента ошибку не возвращает. А сам контроллер продолжает нормально работать.
Первое устройство, которое давно спарено, после разрыва соединения нормально запускает адвертисмент (код одинаковый). Распаривать боюсь. Мне оно нужно пока в рабочем состоянии.
Вот что я вижу на терминале устройства:
Кстати, если просто соединиться, чтобы прочитать характеристику не требующую бондинг - после отсоединения - нормально адвертисмент перезапускается
p.s. Попытался взять чистый BT Soc Blinky и добавил строчки:Поведение точно такое же...
p.p.s. Если сделать бондинг без аутентификации - всё работает. но...
Первое устройство, которое давно спарено, после разрыва соединения нормально запускает адвертисмент (код одинаковый). Распаривать боюсь. Мне оно нужно пока в рабочем состоянии.
Спойлер
Код: Выделить всё
switch (SL_BT_MSG_ID(evt->header)) {
// -------------------------------
// This event indicates the device has started and the radio is ready.
// Do not call any stack command before receiving this boot event!
case sl_bt_evt_system_boot_id:
sc = sl_bt_sm_configure(
SL_BT_SM_CONFIGURATION_MITM_REQUIRED |
SL_BT_SM_CONFIGURATION_SC_ONLY |
SL_BT_SM_CONFIGURATION_BONDING_REQUIRED,
sl_bt_sm_io_capability_displayonly);
assert_status(sc);
sl_bt_sm_set_bondable_mode(1); // enable new bondings
sl_bt_sm_set_passkey(111111); // set passkey
setup_advertising_or_scanning(evt);
// Start advertising and enable connections.
sc = sl_bt_legacy_advertiser_start(advertising_set_handle,
sl_bt_advertiser_connectable_scannable);
assert_status(sc);
break;
case sl_bt_evt_connection_opened_id:
_conn_handle = evt->data.evt_connection_opened.connection;
sc = sl_bt_advertiser_stop(advertising_set_handle);
assert_status(sc);
/* Request connection parameter update.
* conn.interval min 20ms, max 40ms, slave latency 4 intervals,
* supervision timeout 2 seconds
* (These should be compliant with Apple Bluetooth Accessory Design
* Guidelines, both R7 and R8) */
sc = sl_bt_connection_set_parameters(_conn_handle,
24,
40,
0,
200,
0,
0xFFFF);
assert_status(sc);
UART0_OutString("BT Connected\r\n");
break;
case sl_bt_evt_sm_passkey_display_id:
{
uint32_t passkey = evt->data.evt_sm_passkey_display.passkey;
UART0_OutString("Show passkey: ");
UART0_OutUDec(passkey);
UART0_OutString("\r\n");
}
break;
// -------------------------------
// This event indicates that a connection was closed.
case sl_bt_evt_connection_closed_id:
// Restart advertising after client has disconnected.
sc = sl_bt_legacy_advertiser_start(advertising_set_handle,
sl_bt_advertiser_connectable_scannable);
if (sc) {
UART0_OutString("error start advertiser. sc=");
UART0_OutDec(sc);
}
UART0_OutString("BT DisConnected\r\n");
break;
....
static void setup_advertising_or_scanning(sl_bt_msg_t *evt) {
(void) *evt;
sl_status_t sc;
bd_addr address;
uint8_t address_type;
uint8_t system_id[8];
uint8_t robot_name[] =
#if VARIANT == RED
"Zumo Red";
#elif VARIANT == YELLOW
"Zumo Yellow";
#else
"Zumo Green";
#endif
// Extract unique ID from BT Address.
sc = sl_bt_system_get_identity_address(&address, &address_type);
assert_status(sc);
system_id[0] = address.addr[5];
system_id[1] = address.addr[4];
system_id[2] = address.addr[3];
system_id[3] = 0xFF;
system_id[4] = 0xFE;
system_id[5] = address.addr[2];
system_id[6] = address.addr[1];
system_id[7] = address.addr[0];
sc = sl_bt_gatt_server_write_attribute_value(gattdb_system_id,
0,
sizeof(system_id),
system_id);
assert_status(sc);
sc = sl_bt_gatt_server_write_attribute_value(gattdb_device_name, 0, sizeof(robot_name)-1, robot_name);
if (sc) {
UART0_OutString("error set Device Name. sc=");
UART0_OutDec(sc);
}
// Create an advertising set.
sc = sl_bt_advertiser_create_set(&advertising_set_handle);
assert_status(sc);
// Generate data for advertising
sc = sl_bt_legacy_advertiser_generate_data(advertising_set_handle,
sl_bt_advertiser_general_discoverable);
assert_status(sc);
// Set advertising interval to 100ms.
sc = sl_bt_advertiser_set_timing(
advertising_set_handle,
160, // min. adv. interval (milliseconds * 1.6)
160, // max. adv. interval (milliseconds * 1.6)
0, // adv. duration
0); // max. num. adv. events
assert_status(sc);
}
Код: Выделить всё
BT Connected
Show passkey: 111111
BT DisConnected
p.s. Попытался взять чистый BT Soc Blinky и добавил строчки:
Код: Выделить всё
case sl_bt_evt_system_boot_id:
sc = sl_bt_sm_configure(
SL_BT_SM_CONFIGURATION_MITM_REQUIRED |
SL_BT_SM_CONFIGURATION_SC_ONLY |
SL_BT_SM_CONFIGURATION_BONDING_REQUIRED,
sl_bt_sm_io_capability_displayonly);
sl_bt_sm_delete_bondings();
sl_bt_sm_set_bondable_mode(1); // enable new bondings
sl_bt_sm_set_passkey(111111); // set passkey
p.p.s. Если сделать бондинг без аутентификации - всё работает. но...
Код: Выделить всё
BT Connected
No Security
Unauthenticated pairing with encryption (Just Works)
MTU exchanged:247
Unauthenticated pairing with encryption (Just Works)
BT DisConnected
Re: BGM240 стартануть...
Вот мой тестовый код для работы с SM для демо-платы BRD2601B под х24 чип. Спаривание и чтение характеристики с R/W bonded access работает как часы. После установки спаривания доступ к характеристике сразу разрешён. После разрыва соединения плату видно сканером.
Спойлер
Код: Выделить всё
#include "sl_bt_api.h"
#include "sl_main_init.h"
#include "app_assert.h"
#include "app.h"
#include "sl_sleeptimer.h"
#include "gatt_db.h"
#include "em_gpio.h"
#include "printf.h"
#include "stdio.h"
#define LED_PORT gpioPortB
#define LED_PIN 0
static uint32_t makeRandomPasskey(void);
static uint32_t readPasskey(void);
static void listBondings(void);
static uint8_t adv_set_handle = 0xff;
static uint32_t passkey;
static uint8_t conn_handle;
static char c;
static uint32_t num_bondings;
static size_t bondings_len;
static uint32_t bondings;
static bd_addr address;
static uint8_t address_type, sec_mode, key_size;
// Application Init.
void app_init(void)
{
GPIO_PinModeSet(LED_PORT, LED_PIN, gpioModePushPull, 0);
}
// Application Process Action.
void app_process_action(void)
{
if (app_is_process_required()) {}
}
void sl_bt_on_event(sl_bt_msg_t *evt)
{
switch (SL_BT_MSG_ID(evt->header)) {
case sl_bt_evt_system_boot_id: // Bluetooth stack is ready
sl_bt_advertiser_create_set(&adv_set_handle);
sl_bt_legacy_advertiser_generate_data(adv_set_handle, sl_bt_advertiser_general_discoverable);
printf("Enable new bonds (y/n)? ");
do {c = getchar();} while (c == 255); // wait for key pressed
printf("%c\n", c); // echo key to the screen
if (c == 'y' || c == 'Y') { // new bondings are enabled
printf("All connections are enabled\n");
sl_bt_sm_configure(0x07, sl_bt_sm_io_capability_displayonly); // passkey displayed by this app (responder)
// sl_bt_sm_configure(0x07, sl_bt_sm_io_capability_keyboardonly); // passkey displayed by phone (initiator)
// sl_bt_sm_configure(0x07, sl_bt_sm_io_capability_keyboarddisplay); // numeric comparison mode
sl_bt_sm_set_bondable_mode(1); // enable new bondings
passkey = makeRandomPasskey(); // set passkey to be displayed
sl_bt_sm_set_passkey(passkey); // with displayonly I/O capability
printf("Erase existing bonds (y/n)? ");
do {c = getchar();} while (c == 255); // wait for key pressed
printf("%c\n", c); // echo key to the screen
if (c == 'y' || c == 'Y') {
sl_bt_sm_delete_bondings(); // erase all existing bondings
printf("All bonds are erased\n");
}
}
printf("Existing bonds:\n");
listBondings(); // list all existing bondings
printf("starting advertisements\n"); // just start advertisements
sl_bt_legacy_advertiser_start(adv_set_handle, sl_bt_legacy_advertiser_connectable);
break;
case sl_bt_evt_connection_opened_id:
conn_handle = evt->data.evt_connection_opened.connection;
GPIO_PinOutSet(LED_PORT, LED_PIN);
break;
case sl_bt_evt_connection_closed_id:
GPIO_PinOutClear(LED_PORT, LED_PIN);
sl_bt_legacy_advertiser_start(adv_set_handle, sl_bt_legacy_advertiser_connectable);
printf("connection closed, reason: 0x%2.2x\n\n", evt->data.evt_connection_closed.reason);
break;
/***************** Security related events ******************/
case sl_bt_evt_sm_passkey_display_id: // passkey for establishing new bonding
printf("Type in this passkey on phone: %d\n", (int)evt->data.evt_sm_passkey_display.passkey);
break;
case sl_bt_evt_sm_passkey_request_id: // enter passkey displayed on phone
printf("Enter the passkey displayed on phone: ");
passkey = readPasskey(); // get user input (passkey)
printf("\nEntered passkey: %d\n", (int)passkey);
sl_bt_sm_enter_passkey(conn_handle, passkey); // set entered passkey
break;
case sl_bt_evt_sm_confirm_bonding_id: // new bonding request is received
sl_bt_sm_bonding_confirm(conn_handle, 1); // accept bonding request
printf("bonding request accepted\n");
break;
case sl_bt_evt_sm_bonded_id: // new bonding outcome (success)
printf("bond success\n");
break;
case sl_bt_evt_sm_bonding_failed_id: // new bonding outcome (failure)
printf("bonding failed, reason 0x%2X\n", evt->data.evt_sm_bonding_failed.reason);
sl_bt_connection_close(evt->data.evt_sm_bonding_failed.connection);
break;
case sl_bt_evt_sm_confirm_passkey_id: // used in numeric comparison mode
printf("Do you see this passkey on the other device: %06u? (y/n) ",
(int)evt->data.evt_sm_confirm_passkey.passkey);
do {c = getchar();} while (c == 255); // wait for key pressed
printf("%c\n", c); // echo the user input
if (c == 'y' || c == 'Y') {
sl_bt_sm_passkey_confirm(conn_handle, 1); // confirm passkey match
printf("Waiting for other device to confirm...\n");
}
else {
sl_bt_sm_passkey_confirm(conn_handle, 0); // do not confirm passkey match
}
break;
default:
break;
}
}
uint32_t makeRandomPasskey(void)
{
uint32_t n; // get 6-digit TRN
sl_bt_system_get_random_data(4, 4, NULL, (uint8_t*)&n);
n = (n % 900000) + 100000;
return(n);
}
uint32_t readPasskey(void) // read 6-digit passkey
{
uint32_t n = 0;
for (uint8_t i=0; i<6; i++) {
do {c = getchar();} while (c == 255); // wait for key pressed
putchar(c); // echo char to terminal
n = n*10 + (c - '0');
}
return(n);
}
static void listBondings(void)
{
uint8_t i;
uint32_t mask = 1;
sl_bt_sm_get_bonding_handles(0, &num_bondings, 4, &bondings_len, (uint8_t*)&bondings);
printf("Bondings: num_bondings=%d bondings_len=%d bondings_map=%04x \n", (int)num_bondings, (int)bondings_len, (int)bondings);
for (i=0; i<32; i++) {
if (bondings & mask) {
sl_bt_sm_get_bonding_details(i, &address, &address_type, &sec_mode, &key_size);
printf("%d: %02x:%02x:%02x:%02x:%02x:%02x type=%d security_mode=%d key_size=%d\n", i,
address.addr[5], address.addr[4], address.addr[3], address.addr[2], address.addr[1], address.addr[0],
(int)address_type, (int)sec_mode, (int)key_size);
}
mask = mask << 1;
}
}
Re: BGM240 стартануть...
Секюрные параметры такие же: у меня то 0х07 только словами. Сделал вывод причины рассоединения:
BT Connected
No Security
MTU exchanged:247
No Security
No Security
Show passkey: 55730
BT DisConnected
connection closed, reason:4104
4104 - десятичное, в хексе 0x1008:
#define SL_STATUS_BT_CTRL_CONNECTION_TIMEOUT ((sl_status_t)0x1008)
BT Connected
No Security
MTU exchanged:247
No Security
No Security
Show passkey: 55730
BT DisConnected
connection closed, reason:4104
4104 - десятичное, в хексе 0x1008:
#define SL_STATUS_BT_CTRL_CONNECTION_TIMEOUT ((sl_status_t)0x1008)
Re: BGM240 стартануть...
У Вас конструкция на фирменной демо плате или на отдельном модуле? Какая версия SDK? Eсли на отдельном, часовой кварц используется?
Re: BGM240 стартануть...
Плата своя. В конце этого сообщения. И проблема с i2c никуда не делась. Кварца нет. Проблема с бондингом возникла сразу как собрал новые платы. Сначала думал из-за того что при старте каждому прописываю своё имя устройства. Но убрал тот код - ничего не поменялось. На этих выходных проапгрейдился до свежих SDK 2025.6.3. И после долгого стуканья головой об стену написал сюда. Может, будет какая идея. Завтра возьму демо-плату попробую с ней поиграться.
Странно, почему рассоединение по таймауту?
Странно, почему рассоединение по таймауту?
Re: BGM240 стартануть...
У меня рассоединение по таймауту на кастомных платах было потому что в свойствах Clock Manager (Services -> Clock Manager) в конфигурации LFRCO стояло Default precision. После замены на High precision проблемы исчезли. Я сюда редко захожу и что за проблема с I2C пока не понял.
Re: BGM240 стартануть...
Буду писать "в процессе". В настройках LFRCO стоит High precision. Попробовал рыть на тему таймаута. Изменил этот параметр в настройках соединения:
Вот в функции sl_bt_connection_set_parameters поменял 200 (2 секунды) на 2000 (20 секунд). Ок, времени хватает прочитать и ввести пин-код. Но затем оно висит с надписью "Bonding" и отваливается, как и раньше, с тем же кодом 0x1008 и исчезнувшим адвертисментом. Т.е. ощущение, что радио заглохло.
А i2c - оно повисает в статусе TransferInProgress и так висит. Причем проблема выскакивает когда захочет. Может часы отработать и не повиснуть, а может в ближайшие пять минут засохнуть. В те разы, когда я оставлял под отладчиком и видел, что перестал реагировать на команды, нажимал паузу и видел, что висит в цикле ожидающем завершения транзакции. Глубоко еще не копал. Просто стараюсь в критических задачах избегать обращения к i2c. Хотя сейчас готовится задача, где этот интерфейс будет нужен... думаю, буду делать как STM в своём HAL: вводить параметр таймаута и если обмен не произойдёт в заданное время - перезапускать.
p.s. Совсем ничего не понимаю. Взял играться xG24-DK2601B. Компилирую Blinky - работает. Добавляю хоть одну из функций:После соединения жду появления характеристик в программе Si Connect - они не появляются: Всё время надпись Loading..., а через некоторое время происходит рассоединение. Про бондинг даже речи не идёт.
p.p.s. false alarm. Посмотрел на код возврата этих функций 0x000f - feature not дальше не помню. В компонентах поставил Security Manager и Builtin bonding database - всё заработало. Жаль, что что при сборке не было никаких предупреждений. Но в моём проекте эти компоненты стоят... вот что еще ему не хватает для полного счастья?
Спойлер
Код: Выделить всё
case sl_bt_evt_connection_opened_id:
_conn_handle = evt->data.evt_connection_opened.connection;
sc = sl_bt_advertiser_stop(advertising_set_handle);
assert_status(sc);
/* Request connection parameter update.
* conn.interval min 20ms, max 40ms, slave latency 4 intervals,
* supervision timeout 2 seconds
* (These should be compliant with Apple Bluetooth Accessory Design
* Guidelines, both R7 and R8) */
sc = sl_bt_connection_set_parameters(_conn_handle,
24,
40,
0,
200,
0,
0xFFFF);
assert_status(sc);
UART0_OutString("BT Connected\r\n");
А i2c - оно повисает в статусе TransferInProgress и так висит. Причем проблема выскакивает когда захочет. Может часы отработать и не повиснуть, а может в ближайшие пять минут засохнуть. В те разы, когда я оставлял под отладчиком и видел, что перестал реагировать на команды, нажимал паузу и видел, что висит в цикле ожидающем завершения транзакции. Глубоко еще не копал. Просто стараюсь в критических задачах избегать обращения к i2c. Хотя сейчас готовится задача, где этот интерфейс будет нужен... думаю, буду делать как STM в своём HAL: вводить параметр таймаута и если обмен не произойдёт в заданное время - перезапускать.
p.s. Совсем ничего не понимаю. Взял играться xG24-DK2601B. Компилирую Blinky - работает. Добавляю хоть одну из функций:
Код: Выделить всё
sc = sl_bt_sm_configure(0x07, sl_bt_sm_io_capability_displayonly);
sl_bt_sm_delete_bondings();
sl_bt_sm_set_bondable_mode(1); // enable new bondings
sl_bt_sm_set_passkey(111111); // set passkeyp.p.s. false alarm. Посмотрел на код возврата этих функций 0x000f - feature not дальше не помню. В компонентах поставил Security Manager и Builtin bonding database - всё заработало. Жаль, что что при сборке не было никаких предупреждений. Но в моём проекте эти компоненты стоят... вот что еще ему не хватает для полного счастья?
Re: BGM240 стартануть...
Если выложите сюда sls файл проблемного проекта, посмотрю вечером.


