• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

BLE SoC PHY6202

pvvx

Активный участник сообщества
У меня всего один THB2. Остальные в пути по почте. Через пару дней, судя по трекам, похоже будут...
 

pvvx

Активный участник сообщества
Проблему с таймером нашел - кому-то нужно помнить стек во время сна (или не включают питание всей памяти при пробуждении). Буду искать как обойти.
 

pvvx

Активный участник сообщества
wakeupProcess0/wakeupProcess1 используют __set_MSP(pGlobal_config[INITIAL_STACK_PTR]);
Наверно во время этих команд питание на всю RAM ещё не включено?
 

pvvx

Активный участник сообщества
Пока ограничил память Retention RAM. Режим соединение стал стабильным.
До этого оптимизировал код - выкинулось около 1 килобайта часто исполняемого ненужного кода.
Не работает переключение соединения на Coded PHY - нет реализации в данной версии SDK.
При близком расстоянии (хорошем уровне сигнала) текущая программа соединяется и переключается c 1M на 2M PHY.
Т.е. в принципе с SDK для GCC всё - объем итогового кода меньше чем в Keil.
 

cool2000

Member
Я попытался проследить как используется и переключается стек.
  • ResetHandler sp <= 0x1FFF1830
    • rom_boot() sp <= 0x1FFF1830
    • wakeupProcess0() sp <= [0x1fff0814] + 0x80 - какой-то мелкий стек для нужд ll_*?
    • wakeupProcess1() sp <= pGlobal_config[INITIAL_STACK_PTR] в версии keil, в версии gcc адрес конца ram
В rom прослеживаются чтения из адреса 0x1fff0814 и работа со смещениями к нему. Но не видно, когда туда что-то записывается.
При этом, судя по всему изменение RAM retention в SDK не предусмотрено.
в wakeupProcess0() функция hal_pwrmgr_RAM_retention_clr() или её аналог не вызывается, а в wakeupProcess1() в какой-то момент была закомментирована.
C:
    //=======fix sram_rent issue 20180323
    //hal_pwrmgr_RAM_retention_clr();
    //subWriteReg(0x4000f01c,21,17,0);
Нет этого вызова и нигде в примерах, при этом во всех примерах hal_pwrmgr_RAM_retention_set() исправно вызывается перед переходом в сон. Скорее всего, если раскомментировать hal_pwrmgr_RAM_retention_clr() после переключения стека, то в wakeupProcess1(), то это должно помочь.
 

pvvx

Активный участник сообщества
Включение питания на куски RAM требует времени - пока там стабилизируется - наверно по этому и вырезали.
Это уже частная задача для того кому нужно всю RAM во время активности. И думаю она решается.
Есть другие задачи - ещё не известно что будет при стирании Flash на ходу соединения. Т.е. какие функции должны быть в RAM, а какие в XIP, чтобы не нарушать тайминг соединения...
 

pvvx

Активный участник сообщества
А пока выходит, что получившийся SDK будет первым полностью имеющим открытые исходники BLE для мелких SoC (без блобов либ).
 

cool2000

Member
Включение питания на куски RAM требует времени - пока там стабилизируется
Несколько мкс? Можно после вызова hal_pwrmgr_RAM_retention_clr() тупо поставить memset 0xFF (0x00) на верхний блок включенной памяти для ускорения.
pvvx написал(а):
Не работает переключение соединения на Coded PHY
Вроде в текстах мелькает
C:
        case GAP_LINK_ESTABLISHED_EVENT:
            gapRole_state = GAPROLE_CONNECTED;
            g_rfPhyPktFmt = PKT_FMT_BLR125K;
            notify = TRUE;
            break;
И есть проверки g_rfPhyPktFmt == PKT_FMT_BLR125K в других местах.
А если нагло присвоить g_rfPhyPktFmt = PKT_FMT_BLR125K
 

cool2000

Member
ещё не известно что будет при стирании Flash на ходу соединения.
Возможно имеет смысл использовать промежуточный загрузчик, который будет проверять, что в верхней flash записан правильный образ обновления, переписывать его на своё место, после чего стирать обновление. Тогда можно при передаче OTA писать flash мелкими блоками.
 

cool2000

Member
PS TH05 у меня есть. Как раз собираюсь снять прошивку и вызвонить куда подключен сенсор.
 

pvvx

Активный участник сообщества
Смысла при соединении использовать Long Range в практике нет.
Зачем вам соединение c устройством на расстоянии в 1 км? Тогда любой получит доступ к нему. И тут без всяких пин-кодов не обойтись.
Проще ограничить дальность для соединения по RSSI и использовать 2M PHY.
Соединение обычно нужно для начальных настроек устройства и OTA. Остальное пусть работает по BLE рекламе, тем более в BT5.4 стандарте уже есть PAwR (реклама с подтверждением и ответом = упрощенный Zigbee или MESH).
 

pvvx

Активный участник сообщества
PS TH05 у меня есть. Как раз собираюсь снять прошивку и вызвонить куда подключен сенсор.
По нему уже есть и логи шин... И уже есть с убитым сенсором :) - накрылся от проводка и статики (эти датчики постоянно летят - это из производственной практики). Но есть ещё несколько энтих TH-05.
 

pvvx

Активный участник сообщества
С TH-05 по току sleep всё плохо.
Драйвер LCD + SoC(3 мкА) + датчик - уже получаем 10 мкА. (Xiaomi LYWSD03MMC - 6 мкА)
А CR2032 это в среднем 100 мАч, т.к. не любит импульсную нагрузку - просаживает напряжение при импульсе передачи, а кондеров в питании нет - внутреннее сопротивление полуразряженного CR2032 уже к 100 Ом.
В итоге получим всего в среднем 100/0.02 = 5000 часов работы, т.е. пол года.
 

pvvx

Активный участник сообщества
И есть проверки g_rfPhyPktFmt == PKT_FMT_BLR125K в других местах.
Но nRFConnect не переключает на Coded PHY во время соединения. На 1M и 2M переключает.
Может надо что-то задать в инициализации.
Обычно поддерживаемые PHY и желаемые, т.е. предлагаемые по приоритету при соединении задаются в инициализации масок всяких LL и т.д.
Но начало соединения, по стандарту Bluetooth, "снюхивание" всегда на 1M или Coded S8 PHY, как и реклама на основных каналах.
Китайщины с рекламой на 2M PHY или других мне не надо. Это несовместимо ни с чем.
 

cool2000

Member
В малопотребляющий (при правильной прошивке :p) THB1 поставили 2 батарейки ААА, а в жрущий TH05 дохлую CR2032.

Посмотрел ещё раз: wakeupProcess0() стек устанавливается аналогично wakeupProcess1()
  • wakeupProcess0() sp <= pGlobal_config[INITIAL_STACK_PTR]
функция hal_pwrmgr_RAM_retention_clr() или её аналог не вызывается.

А рекламу можно слать в режиме Coded S8 PHY?
 

pvvx

Активный участник сообщества
Тем более Web Bluetooth API не может включить сканирование на Coded S8 PHY из-за игнора BLE в Linux с 2014 года.
Android, MAC и Windows уже имеют переключения и поддержку стандартов BT5+, но в низкоуровневой реализации. И то благодаря Google, который перепатчил своё ядро Linux под Android. От Linux там осталось только название...
 

pvvx

Активный участник сообщества
А рекламу можно слать в режиме Coded S8 PHY?
По стандарту BT на основных каналах только в Coded S8 PHY и 1M РНY. Есть понятие первичный и вторичный РНY. Coded S8 PHY применяется только в "расширенной рекламе" (BT5.0 и необязательные для реализации дополнения BT4.2) в заголовке на основных каналах. Вторичный PHY может быть любым - на нем транслируются сами данные рекламы на дополнительных каналах в "расширенной рекламе", а указание где и какой PHY в заголовке на основных каналах.
 
Сверху Снизу