• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

BLE модули TB-04/TB-03F (TLSR8253F512)

pvvx

Активный участник сообщества
Добрый день.

А кто-нибудь пытался на TB-04 программить zigbee? Есть реальные примеры (не те, что в SDK)?
А что за "реальные примеры"?
В SDK есть все заголовки и Telink по Zigbee сертифицирован у Zigbee.
В SDK одна проблема - наворочен новейший вариант Zigbee. А примеров для "новых" версий по Zigbee нет вообще на git ни для чего.
Это старые версии описываются пару заголовками в пару таблицах, а тут надо долго ковыряться...
А типовой пример из SDK работает и с HA...
 

pvvx

Активный участник сообщества
У меня руки-ноги не дошли урезать версию для подмены к Zigbee термометру Агара от Xiaomi. Налепил до того, что он определяется и регистрируется Gateway3 и на этом бросил..
BLE LongRange лучше по дальности связи...
 

pvvx

Активный участник сообщества
Ну кто-то что-то написал и выложил :)) Например, как по BLE, у Вас и у 1441. Можно посмотреть реальный пример для реальной железки ...
Для Telink не встречал. С ZigBee были только nRF и старые...
В SDK от Telink пример работает, а что надо?
 

Slacky

Member
Я попробовал собрать пример, не-а, не собирается.
Код:
C:/TelinkSDK/SDK/tl_zigbee_sdk/zigbee/zcl/zll_commissioning/zcl_zll_commissioning.c:62:21: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'g_nwkTouchlinkCb'
62 строчка
C:
nwkForTouchlinkCb_t g_nwkTouchlinkCb = {
    .scanConfCb = tl_zbNwkZllCommissionScanConfirm,
    .attrClrCb = ll_zllAttrClr,
};
Вот этого типа нет нигде в SDK - nwkForTouchlinkCb_t
 

pvvx

Активный участник сообщества
В последних версиях Zigbee_SDK какой-то бардак.

Прошлые версии

nwkForTouchlinkCb_t есть в предыдущей верcии в nwk.h.
 

Slacky

Member
В общем собрал я sampleSwitch из sdk_v3.6.5.0. Правда сделал, чтобы можно было собрать не только telink-ide, но и обычным make. Залил. И модуль даже в z2m определился, правда как лампочка :))
sampleSwitch.jpg

В принципе, можно дальше развлекаться ...
 

pvvx

Активный участник сообщества
Лампочка в SDK Zigbee от Telink давно работала, ещё года два назад. Куча модулей с примерно такой прошивкой прода(валось/ется) на али...
А вот прикрутить что-то другое... Эт надо проприетращину Zigbee разгребать, а популярных описаний = ноль. Всё под NDA...
 

Slacky

Member
Пока у меня пара вопросов.
1. Куда сохранять пользовательские данные?
2. Как определить переменную retention?

flash_map_8258_ble.jpg

flash_map_8258_zb.jpg
 

pvvx

Активный участник сообщества
Пока у меня пара вопросов.
1. Куда сохранять пользовательские данные?
2. Как определить переменную retention?
1. Для ZigBee места под сохранение данных, кроме как вместо OTA, до следующего OTA - нет.
Объем прошивки там к 256 килобайтам, а вся Flash - 512 кб.
1684352740053.png
> 2. Как определить переменную retention?
Это кто такая?
Для TLSR825x есть область RAM от старта в 16/32 килобайта, питание у неё и сохраняется, если объявить.
А для переменных в СИ используют указание сегмента расположения...
 

Slacky

Member
Для TLSR825x есть область RAM от старта в 16/32 килобайта, питание у неё и сохраняется, если объявить.
А для переменных в СИ используют указание сегмента расположения...
Вот смотрите.
C:
#define _attribute_packed_                __attribute__((packed))
#define _attribute_aligned_(s)            __attribute__((aligned(s)))
#define _attribute_session_(s)            __attribute__((section(s)))
#define _attribute_ram_code_              _attribute_session_(".ram_code")
#define _attribute_ram_code_noinline_    __attribute__((section(".ram_code"))) __attribute__((noinline))
#define _attribute_custom_code_          _attribute_session_(".custom") volatile
#define _attribute_no_inline_           __attribute__((noinline))
#define _inline_                         inline

#define _attribute_ram_code_sec_              __attribute__((section(".ram_code")))
#define _attribute_ram_code_sec_noinline_    __attribute__((section(".ram_code"))) __attribute__((noinline))

#ifndef    BLC_PM_DEEP_RETENTION_MODE_EN
#define    BLC_PM_DEEP_RETENTION_MODE_EN        1
#endif

#if (BLC_PM_DEEP_RETENTION_MODE_EN)
    #define _attribute_data_retention_       _attribute_session_(".retention_data")
    #define _attribute_data_no_init_           _attribute_session_(".data_no_init")    //save retention ram size
#else
    #define _attribute_data_retention_
    #define _attribute_data_no_init_
#endif
C:
#define _attribute_packed_                        __attribute__((packed))
#define _attribute_aligned_(s)                    __attribute__((aligned(s)))
#define _attribute_session_(s)                    __attribute__((section(s)))

#define _attribute_no_inline_                   __attribute__((noinline))

#define _attribute_data_retention_
#define _attribute_data_retention_sec_

#define _attribute_ram_code_                    __attribute__((section(".ram_code")))
#define _attribute_ram_code_sec_                  __attribute__((section(".ram_code")))
#define _attribute_ram_code_sec_noinline_        __attribute__((section(".ram_code"))) __attribute__((noinline))
#define _attribute_custom_data_                  __attribute__((section(".custom_data")))
#define _attribute_custom_bss_                  __attribute__((section(".custom_bss")))
#define _attribute_text_sec_                       __attribute__((section(".text")))
#define _attribute_aes_data_sec_                  __attribute__((section(".aes_data")))

В варианте zigbee _attribute_data_retention_ - пустышка ...
 

pvvx

Активный участник сообщества
В варианте zigbee _attribute_data_retention_ - пустышка ...
В линковщике описано:
ASSERT((_end_bss_ < 0x848000), "BUFFER OVERFOLWN!!!!!")
Т.е. если данных и RAM кода больше 32к.
Оно и есть retention (сегменты data, sbss, bss)
А для стека и временных данных назначены custom_data и custom_bss
```
#define _attribute_custom_data_ __attribute__((section(".custom_data")))
#define _attribute_custom_bss_ __attribute__((section(".custom_bss")))
```
 

pvvx

Активный участник сообщества
Telink Zigbee SDK Developer Manual AN_19052900-E5
3.2.11 Sleep and wake-up
Telink Zigbee SDK provides related low-power management functions. The sample Switch_826x uses suspend mode; sample Switch_8258, sample Switch_8278 and sample Switch_B91 use deep with retention mode, i.e. RAM data can be retained while sleeping (8258 and 8278 support 32k RAM retention, B91 supports 64k RAM retention, please refer to the datasheet for details).
3.2.11 Сон и пробуждение
Telink Zigbee SDK предоставляет соответствующие функции управления с низким энергопотреблением. Образец Switch_826x использует режим ожидания; образец Switch_8258, образец Switch_8278 и образец Switch_B91 используют глубокий режим хранения, т. е. данные ОЗУ могут сохраняться во время сна (8258 и 8278 поддерживают сохранение 32 КБ ОЗУ, B91 поддерживает сохранение 64 КБ ОЗУ, см. техническое описание).
...
 

Slacky

Member
Немного поэкспериментировал. Просто объявленная глобальная переменная uint32_t count - является retention
 

Slacky

Member
Для ZigBee места под сохранение данных, кроме как вместо OTA, до следующего OTA - нет.
Проверил, что там в U_Cfg_Info. С 0x78000 до 0x7A000 все забито 0xFF. Вывод - в процессе работы модуля туда ничего не пишется, если мы сами об этом не позаботились. Как промежуточный пункт хранения конфига (при смене прошивки через ОТА) пойдет ...
 

Slacky

Member
Не могу понять, почему из user_app_init, если оттуда вызвать функцию, где будет происходить считывание флеш с адреса 0x78000, то не читает. Но записывает. А вот если эту функцию вставить в app_task, то раза в третьего начинает читать и потом уже читает всегда.

C адреса 0x40000 читает сразу.

А есть какая-нибудь функция в SDK, чтобы определить с какого адреса стартовала программа (с 0x00000 или с 0x40000)?
 

Slacky

Member
Немного полазил по SDK. В общем нельзя ничего писать по адресу 0x78000 - там 16 байт pre_install_code. И по адресу 0x79000, там 1 байт factory_reset.

В общем никто не запрещает отступить от этих адресов на пару страниц и записать промежуточный конфиг туда. Осталось разобраться, почему сразу не читает ...
 
Сверху Снизу