Например TDA7294

Форум РадиоКот • Просмотр темы - BGM240 стартануть...
Форум РадиоКот
Здесь можно немножко помяукать :)

Текущее время: Чт мар 19, 2026 23:22:37

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 23 ]  1,  
Автор Сообщение
 Заголовок сообщения: BGM240 стартануть...
СообщениеДобавлено: Пн окт 23, 2023 19:17:29 
Друг Кота
Аватар пользователя

Карма: 50
Рейтинг сообщений: 1400
Зарегистрирован: Пт авг 28, 2009 21:34:30
Сообщений: 7353
Откуда: 845-й км.
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
Ппомогите. Не могу запустить сей модуль. Модуль пустой из коробки. Загрузил свою программу, загрузил bootloader:bootloader-storage-internal-single-1536k но управление моей программе похоже, что не передаётся. Если пустить дебаг оно где-то шарится и ничего не показывает. Если нажать suspend, появляется сообщение: Break at address "0x8000604" with no debug information available, or outside of program code.

Что еще этому чуду не хватает? Даже пытался bt_soc_blinky поставить - эффект нулевой.


Вернуться наверх
 
 Заголовок сообщения: Re: BGM240 стартануть...
СообщениеДобавлено: Пн окт 23, 2023 22:32:50 
Друг Кота
Аватар пользователя

Карма: 75
Рейтинг сообщений: 623
Зарегистрирован: Ср дек 24, 2008 09:58:58
Сообщений: 3780
Рейтинг сообщения: 4
Медали: 3
Мявтор 1-й степени (1) Мявтор 2-й степени (1) Мявтор 3-й степени (1)
С таким бутлоадером следует из Bluetooth профиля убрать OTA сервис (если Bluetooth задействован), который в тестовом приложении bluetooth_soc_empty присутствует по умолчанию. Делайте в Software Components поиск по ota и удалите эту компоненту. Потом следует заново перезалить приложение. Ещё неясно какая у Вас версия Secure FW в чипе, и совместима-ли она с используемой приложением версией SDK. Если это не поможет, сообщите подробности что и как делаете, какие версии и пр. У меня всё работает на УРА.


Вернуться наверх
 
 Заголовок сообщения: Re: BGM240 стартануть... Solved
СообщениеДобавлено: Вс сен 15, 2024 15:26:36 
Друг Кота
Аватар пользователя

Карма: 50
Рейтинг сообщений: 1400
Зарегистрирован: Пт авг 28, 2009 21:34:30
Сообщений: 7353
Откуда: 845-й км.
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
Новая проблема. "Проапгрейдился", называется. Теперь проект не запускается. Проблема решена - рецепт в конце.

Компилятор 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(); -->
    }


А там после err = sli_bt_system_start_bluetooth(); оно вываливается в
Код:
          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>


При этом пытался делать по-новой "Bluetooth - SoC Empty", копировать файлы, компилировать - и всё время один и тот же результат. Может с этим новым SDK надо как-то по-новому действовать?

В гугле нашел, что для Simplicity SDK, в отличии от Gecko SDK надо конфигурировать Clock Manager - указал там внешний HFXO - 39MHz. Не помогло...

А!!! Еше надо Default Clock Source Selection for HF clock branches указать HFXO - теперь заработало!


Вернуться наверх
 
 Заголовок сообщения: Re: BGM240 стартануть...
СообщениеДобавлено: Пт окт 03, 2025 07:15:56 
Друг Кота
Аватар пользователя

Карма: 50
Рейтинг сообщений: 1400
Зарегистрирован: Пт авг 28, 2009 21:34:30
Сообщений: 7353
Откуда: 845-й км.
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
Новая засада. Захотел запустить часики реального времени. Выбрал BURTC. Зашел в софтверные компоненты и поставил галочку у Platform->Peripheral->EMLIB->BURTC. В старте написал:
Код:
BURTC_Init_TypeDef burtcInit =  BURTC_INIT_DEFAULT;
...
  BURTC_Init(&burtcInit);
Но оно падает в HardFault.

Прошелся отладчиком, оно умирает в этой функции:
Код:
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;
...
На строчке if (BURTC->EN != 0U) , т.е. первая же попытка прочитать.

В заголовке написано, что перед этой функцией надо сбросить бит в 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

Но эти магические слова недоступны (#ifdef не активизирует строки про rmuResetBU).
Код:
/** 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 стартануть...
СообщениеДобавлено: Пт окт 03, 2025 18:59:55 
Мудрый кот

Карма: -8
Рейтинг сообщений: 196
Зарегистрирован: Вт авг 15, 2017 10:51:13
Сообщений: 1717
Рейтинг сообщения: 4
Прошелся отладчиком, оно умирает в этой функции:
На строчке if (BURTC->EN != 0U) , т.е. первая же попытка прочитать.
Вообще-то это место лучше прошагать по окну дизасма. Чтобы точно знать на какой команде виснет. Если виснет именно на команде чтения из регистра BURTC, то это более всего похоже на то, что не включено тактирование периферийного блока (к которому относится данный регистр). Я с EFR-ами не работал, но в других МК такое может происходить обычно при отключенном тактировании соответствующей периферии.

Что я упускаю?
Скачать "Reference Manual"; найти в нём параграф про тактирование регистров IO периферии (Clocking какой-нить); найти что там написано про BURTC.

Вот скачал "EFR32xG24 Wireless SoC Reference Manual" и вижу (стр.173): "CMU_CLKEN0 - Clock Enable Register 0". Биты 28 и 29 - BURAM, BURTC. В каком они положении в точке выполнения того кода?


Вернуться наверх
 
 Заголовок сообщения: Re: BGM240 стартануть...
СообщениеДобавлено: Сб окт 04, 2025 19:21:52 
Друг Кота
Аватар пользователя

Карма: 75
Рейтинг сообщений: 623
Зарегистрирован: Ср дек 24, 2008 09:58:58
Сообщений: 3780
Рейтинг сообщения: 4
Медали: 3
Мявтор 1-й степени (1) Мявтор 2-й степени (1) Мявтор 3-й степени (1)
Совершенно верно, скорее всего не разрешено тактирование для 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 стартануть...
СообщениеДобавлено: Пн фев 09, 2026 09:38:39 
Друг Кота
Аватар пользователя

Карма: 50
Рейтинг сообщений: 1400
Зарегистрирован: Пт авг 28, 2009 21:34:30
Сообщений: 7353
Откуда: 845-й км.
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
У меня возник новый бздык! Хочу несколько таймеров и 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 с такими частотами не может завестись?
Как быть?


Вернуться наверх
 
 Заголовок сообщения: Re: BGM240 стартануть...
СообщениеДобавлено: Пн фев 09, 2026 10:59:06 
Вымогатель припоя

Карма: 1
Рейтинг сообщений: 60
Зарегистрирован: Вт окт 01, 2024 15:22:33
Сообщений: 525
Рейтинг сообщения: 0
uldemir, если вы собрались делать двухцветный VGA адаптер который данные цвета через USART в режиме SPI выводит, то частота у него должна быть 50MHz, потому что на вывод одного бита нужно 2 такта.


Вернуться наверх
 
 Заголовок сообщения: Re: BGM240 стартануть...
СообщениеДобавлено: Пн фев 09, 2026 11:28:34 
Друг Кота
Аватар пользователя

Карма: 50
Рейтинг сообщений: 1400
Зарегистрирован: Пт авг 28, 2009 21:34:30
Сообщений: 7353
Откуда: 845-й км.
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
Мне хватит и одного цвета. Мне надо туда выводить "секундомер" и "лучший результат". Цвет чисел я могу менять коммутируя резистивную матрицу сигналом от кадровой развёртки, но это потом. Пока мне хватит белых цифр на синем фоне. Фон активирую сигналом CS SPI, а цифры MOSI SPI. Хотел посмотреть насколько стабильная картинка получится и как быстро будут обновляться цифры... Но пока упёрся в проблему запуска Bluetooth. А без этого вся затея не имеет смысла.


Вернуться наверх
 
 Заголовок сообщения: Re: BGM240 стартануть...
СообщениеДобавлено: Пн фев 09, 2026 11:57:38 
Вымогатель припоя

Карма: 1
Рейтинг сообщений: 60
Зарегистрирован: Вт окт 01, 2024 15:22:33
Сообщений: 525
Рейтинг сообщения: 0
Пока мне хватит белых цифр на синем фоне. Фон активирую сигналом CS SPI, а цифры MOSI SPI.

При чем тут CS SPI? Данные цвета выводятся через MOSI, если цифры должны быть белыми, то при единичке на MOSI она пойдет на R и G, а B жестко привязан к 1. Тогда при нуле на MOSI единица будет только на B.


Вернуться наверх
 
 Заголовок сообщения: Re: BGM240 стартануть...
СообщениеДобавлено: Пн фев 09, 2026 12:12:21 
Друг Кота
Аватар пользователя

Карма: 50
Рейтинг сообщений: 1400
Зарегистрирован: Пт авг 28, 2009 21:34:30
Сообщений: 7353
Откуда: 845-й км.
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
Когда закончится левый бланкирующий строчный импульс, даётся команда на запуск SPI. SPI активизирует CS что включит 1 на Blue. Там где рисуется цифра - MOSI активизирует Red, Green - они вместе с фоном дадут белый цвет. Когда строка завершится, CS снимается, фон пропадает и начинается правый бланкирующий импульс. Я как-то так представлял вывод. Правда есть зазор между активизацией CS и началом выдачи потока данных (и так же в конце), так что будет не 640 пикселей, а, может 632 - не принципиально. На худой конец сбавлю частоту пикселей в 2 раза - будет 320х480 - мне надо рисовать крупные цифры.


Вернуться наверх
 
 Заголовок сообщения: Re: BGM240 стартануть...
СообщениеДобавлено: Чт фев 19, 2026 08:27:57 
Друг Кота
Аватар пользователя

Карма: 50
Рейтинг сообщений: 1400
Зарегистрирован: Пт авг 28, 2009 21:34:30
Сообщений: 7353
Откуда: 845-й км.
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
Так, я снова в игре. Забыл, что тактовые импульсы можно в счетчик скармливать через CC1. Правда вопрос, а можно ли если я через вход закачиваю тактовые импульсы, использовать этот же канал как регистр сравнения и выводить результат в PRS? Жаль, если нет. Придётся второй счетчик параллелить.

Но, в данный момент самый большой облом у меня с EUSART. В референс мануале написано:
Цитата:
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.

Так вот рассматривая регистр TRIGCTRL, не вижу никакого поля TSEL. И вообще не вижу возможности выбрать канал PRS. Выбор есть только если RX назначается на PRS. Думал опечатка в мануле, но в хедерах тоже нет:
Спойлер
Код:
/* 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)

В общем, ничего не понимаю. EUSART vs USART выбрал потому что там есть FIFO на 16 уровней. Хотел сделать так, чтобы EUSART работал в синхронном режиме как slave. Тактовые импульсы теже 25.175 МГц, а CS подавать через PRS.


Вернуться наверх
 
 Заголовок сообщения: Re: BGM240 стартануть...
СообщениеДобавлено: Вт мар 17, 2026 11:51:16 
Друг Кота
Аватар пользователя

Карма: 50
Рейтинг сообщений: 1400
Зарегистрирован: Пт авг 28, 2009 21:34:30
Сообщений: 7353
Откуда: 845-й км.
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
Новая старая проблема. Есть одно устройство на сием модуле, понадобилось второе. Собрал, хочу спарить со смартфоном и не могу. При попытке спариться, на "дисплей" устройства выдаётся пасскей, но я его не могу ввести на смартфоне, как соединение рвётся. Т.е. я только его прочитал, собираюсь ввести, а соединение уже отвалилось. И, что самое странное, несмотря на перезапуск адвертисмента, больше я это устройство сканером не вижу, пока не перезапущу. Функция запуска адвертисмента ошибку не возвращает. А сам контроллер продолжает нормально работать.

Первое устройство, которое давно спарено, после разрыва соединения нормально запускает адвертисмент (код одинаковый). Распаривать боюсь. Мне оно нужно пока в рабочем состоянии.

Спойлер
Код:
  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 стартануть...
СообщениеДобавлено: Вт мар 17, 2026 17:29:31 
Друг Кота
Аватар пользователя

Карма: 75
Рейтинг сообщений: 623
Зарегистрирован: Ср дек 24, 2008 09:58:58
Сообщений: 3780
Рейтинг сообщения: 0
Медали: 3
Мявтор 1-й степени (1) Мявтор 2-й степени (1) Мявтор 3-й степени (1)
Вот мой тестовый код для работы с 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 стартануть...
СообщениеДобавлено: Вт мар 17, 2026 20:31:58 
Друг Кота
Аватар пользователя

Карма: 50
Рейтинг сообщений: 1400
Зарегистрирован: Пт авг 28, 2009 21:34:30
Сообщений: 7353
Откуда: 845-й км.
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
Секюрные параметры такие же: у меня то 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)


Вернуться наверх
 
 Заголовок сообщения: Re: BGM240 стартануть...
СообщениеДобавлено: Вт мар 17, 2026 21:22:38 
Друг Кота
Аватар пользователя

Карма: 75
Рейтинг сообщений: 623
Зарегистрирован: Ср дек 24, 2008 09:58:58
Сообщений: 3780
Рейтинг сообщения: 0
Медали: 3
Мявтор 1-й степени (1) Мявтор 2-й степени (1) Мявтор 3-й степени (1)
У Вас конструкция на фирменной демо плате или на отдельном модуле? Какая версия SDK? Eсли на отдельном, часовой кварц используется?


Вернуться наверх
 
 Заголовок сообщения: Re: BGM240 стартануть...
СообщениеДобавлено: Вт мар 17, 2026 22:01:10 
Друг Кота
Аватар пользователя

Карма: 50
Рейтинг сообщений: 1400
Зарегистрирован: Пт авг 28, 2009 21:34:30
Сообщений: 7353
Откуда: 845-й км.
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
Плата своя. В конце этого сообщения. И проблема с i2c никуда не делась. Кварца нет. Проблема с бондингом возникла сразу как собрал новые платы. Сначала думал из-за того что при старте каждому прописываю своё имя устройства. Но убрал тот код - ничего не поменялось. На этих выходных проапгрейдился до свежих SDK 2025.6.3. И после долгого стуканья головой об стену написал сюда. Может, будет какая идея. Завтра возьму демо-плату попробую с ней поиграться.

Странно, почему рассоединение по таймауту?


Вернуться наверх
 
 Заголовок сообщения: Re: BGM240 стартануть...
СообщениеДобавлено: Вт мар 17, 2026 23:59:30 
Друг Кота
Аватар пользователя

Карма: 75
Рейтинг сообщений: 623
Зарегистрирован: Ср дек 24, 2008 09:58:58
Сообщений: 3780
Рейтинг сообщения: 0
Медали: 3
Мявтор 1-й степени (1) Мявтор 2-й степени (1) Мявтор 3-й степени (1)
У меня рассоединение по таймауту на кастомных платах было потому что в свойствах Clock Manager (Services -> Clock Manager) в конфигурации LFRCO стояло Default precision. После замены на High precision проблемы исчезли. Я сюда редко захожу и что за проблема с I2C пока не понял.


Вернуться наверх
 
 Заголовок сообщения: Re: BGM240 стартануть...
СообщениеДобавлено: Ср мар 18, 2026 10:24:09 
Друг Кота
Аватар пользователя

Карма: 50
Рейтинг сообщений: 1400
Зарегистрирован: Пт авг 28, 2009 21:34:30
Сообщений: 7353
Откуда: 845-й км.
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
Буду писать "в процессе". В настройках LFRCO стоит High precision. Попробовал рыть на тему таймаута. Изменил этот параметр в настройках соединения:
Спойлер
Код:
   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");
Вот в функции sl_bt_connection_set_parameters поменял 200 (2 секунды) на 2000 (20 секунд). Ок, времени хватает прочитать и ввести пин-код. Но затем оно висит с надписью "Bonding" и отваливается, как и раньше, с тем же кодом 0x1008 и исчезнувшим адвертисментом. Т.е. ощущение, что радио заглохло.


А 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 passkey
После соединения жду появления характеристик в программе Si Connect - они не появляются: Всё время надпись Loading..., а через некоторое время происходит рассоединение. Про бондинг даже речи не идёт.

p.p.s. false alarm. Посмотрел на код возврата этих функций 0x000f - feature not дальше не помню. В компонентах поставил Security Manager и Builtin bonding database - всё заработало. Жаль, что что при сборке не было никаких предупреждений. Но в моём проекте эти компоненты стоят... вот что еще ему не хватает для полного счастья?


Вернуться наверх
 
 Заголовок сообщения: Re: BGM240 стартануть...
СообщениеДобавлено: Ср мар 18, 2026 16:26:39 
Друг Кота
Аватар пользователя

Карма: 75
Рейтинг сообщений: 623
Зарегистрирован: Ср дек 24, 2008 09:58:58
Сообщений: 3780
Рейтинг сообщения: 0
Медали: 3
Мявтор 1-й степени (1) Мявтор 2-й степени (1) Мявтор 3-й степени (1)
Если выложите сюда sls файл проблемного проекта, посмотрю вечером.


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 23 ]  1,  

Часовой пояс: UTC + 3 часа


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y