Ппомогите. Не могу запустить сей модуль. Модуль пустой из коробки. Загрузил свою программу, загрузил bootloader:bootloader-storage-internal-single-1536k но управление моей программе похоже, что не передаётся. Если пустить дебаг оно где-то шарится и ничего не показывает. Если нажать suspend, появляется сообщение: Break at address "0x8000604" with no debug information available, or outside of program code.
Что еще этому чуду не хватает? Даже пытался bt_soc_blinky поставить - эффект нулевой.
С таким бутлоадером следует из Bluetooth профиля убрать OTA сервис (если Bluetooth задействован), который в тестовом приложении bluetooth_soc_empty присутствует по умолчанию. Делайте в Software Components поиск по ota и удалите эту компоненту. Потом следует заново перезалить приложение. Ещё неясно какая у Вас версия Secure FW в чипе, и совместима-ли она с используемой приложением версией SDK. Если это не поможет, сообщите подробности что и как делаете, какие версии и пр. У меня всё работает на УРА.
При этом пытался делать по-новой "Bluetooth - SoC Empty", копировать файлы, компилировать - и всё время один и тот же результат. Может с этим новым SDK надо как-то по-новому действовать?
В гугле нашел, что для Simplicity SDK, в отличии от Gecko SDK надо конфигурировать Clock Manager - указал там внешний HFXO - 39MHz. Не помогло...
А!!! Еше надо Default Clock Source Selection for HF clock branches указать HFXO - теперь заработало!
Новая засада. Захотел запустить часики реального времени. Выбрал BURTC. Зашел в софтверные компоненты и поставил галочку у Platform->Peripheral->EMLIB->BURTC. В старте написал:
На строчке 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
Прошелся отладчиком, оно умирает в этой функции: На строчке 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. В каком они положении в точке выполнения того кода?
Совершенно верно, скорее всего не разрешено тактирование для BURTC. Вот пример мигания светодиодом с периодом 1 сек для демо-платы Ezurio LYRA 24p и simplicity_sdk_2025.6.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 с такими частотами не может завестись? Как быть?
uldemir, если вы собрались делать двухцветный VGA адаптер который данные цвета через USART в режиме SPI выводит, то частота у него должна быть 50MHz, потому что на вывод одного бита нужно 2 такта.
Мне хватит и одного цвета. Мне надо туда выводить "секундомер" и "лучший результат". Цвет чисел я могу менять коммутируя резистивную матрицу сигналом от кадровой развёртки, но это потом. Пока мне хватит белых цифр на синем фоне. Фон активирую сигналом CS SPI, а цифры MOSI SPI. Хотел посмотреть насколько стабильная картинка получится и как быстро будут обновляться цифры... Но пока упёрся в проблему запуска Bluetooth. А без этого вся затея не имеет смысла.
Пока мне хватит белых цифр на синем фоне. Фон активирую сигналом CS SPI, а цифры MOSI SPI.
При чем тут CS SPI? Данные цвета выводятся через MOSI, если цифры должны быть белыми, то при единичке на MOSI она пойдет на R и G, а B жестко привязан к 1. Тогда при нуле на MOSI единица будет только на B.
Когда закончится левый бланкирующий строчный импульс, даётся команда на запуск SPI. SPI активизирует CS что включит 1 на Blue. Там где рисуется цифра - MOSI активизирует Red, Green - они вместе с фоном дадут белый цвет. Когда строка завершится, CS снимается, фон пропадает и начинается правый бланкирующий импульс. Я как-то так представлял вывод. Правда есть зазор между активизацией CS и началом выдачи потока данных (и так же в конце), так что будет не 640 пикселей, а, может 632 - не принципиально. На худой конец сбавлю частоту пикселей в 2 раза - будет 320х480 - мне надо рисовать крупные цифры.
Так, я снова в игре. Забыл, что тактовые импульсы можно в счетчик скармливать через 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. Думал опечатка в мануле, но в хедерах тоже нет: Спойлер
В общем, ничего не понимаю. EUSART vs USART выбрал потому что там есть FIFO на 16 уровней. Хотел сделать так, чтобы EUSART работал в синхронном режиме как slave. Тактовые импульсы теже 25.175 МГц, а CS подавать через PRS.
Новая старая проблема. Есть одно устройство на сием модуле, понадобилось второе. Собрал, хочу спарить со смартфоном и не могу. При попытке спариться, на "дисплей" устройства выдаётся пасскей, но я его не могу ввести на смартфоне, как соединение рвётся. Т.е. я только его прочитал, собираюсь ввести, а соединение уже отвалилось. И, что самое странное, несмотря на перезапуск адвертисмента, больше я это устройство сканером не вижу, пока не перезапущу. Функция запуска адвертисмента ошибку не возвращает. А сам контроллер продолжает нормально работать.
Первое устройство, которое давно спарено, после разрыва соединения нормально запускает адвертисмент (код одинаковый). Распаривать боюсь. Мне оно нужно пока в рабочем состоянии.
Спойлер
Код:
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:
// ---------- // 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; ....
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);
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
Вот мой тестовый код для работы с SM для демо-платы BRD2601B под х24 чип. Спаривание и чтение характеристики с R/W bonded access работает как часы. После установки спаривания доступ к характеристике сразу разрешён. После разрыва соединения плату видно сканером. Спойлер
// 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);
/***************** 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;
Секюрные параметры такие же: у меня то 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)
Плата своя. В конце этого сообщения. И проблема с i2c никуда не делась. Кварца нет. Проблема с бондингом возникла сразу как собрал новые платы. Сначала думал из-за того что при старте каждому прописываю своё имя устройства. Но убрал тот код - ничего не поменялось. На этих выходных проапгрейдился до свежих SDK 2025.6.3. И после долгого стуканья головой об стену написал сюда. Может, будет какая идея. Завтра возьму демо-плату попробую с ней поиграться.
У меня рассоединение по таймауту на кастомных платах было потому что в свойствах Clock Manager (Services -> Clock Manager) в конфигурации LFRCO стояло Default precision. После замены на High precision проблемы исчезли. Я сюда редко захожу и что за проблема с I2C пока не понял.
Буду писать "в процессе". В настройках 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 - всё заработало. Жаль, что что при сборке не было никаких предупреждений. Но в моём проекте эти компоненты стоят... вот что еще ему не хватает для полного счастья?
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения