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

BLE модуль JDY-10 на чипе TLSR8266

aloika

Active member
Тоже пытаюсь разобраться. Поставил себе пока такую "учебную" задачу: что-нибудь записать в характеристику и вызвать bls_att_pushNotifyData. Чтобы на "приемнике" сработало событие нотификации (или индикации). Делать это периодически.

Значит, нужен таймер. С таймерами непонятно - в SDK есть софтварные таймеры, которые "крутятся", как я понимаю, внутри mainloop и примерно в назначенное время отрабатывают свою процедуру.

Но у @pvvx есть какие-то другие таймеры! В документации их нет. И они вызывают прерывание, а не крутятся в петле. Ну ок, попробуем.

В user_init() пишем:
Timer_Init(100000);

Функцию копируем у pvvx:
Код:
/* Timer Init (IRQ)*/
void Timer_Init(u32 period_us) {
    reg_tmr1_capt = period_us * CLOCK_SYS_CLOCK_1US;
    reg_tmr_ctrl8 |= FLD_TMR1_EN; //     FLD_TMR1_MODE = 0
    reg_irq_mask1 |= FLD_IRQ_TMR1_EN;
    reg_tmr_sta = FLD_TMR_STA_TMR1; // clear irq status
}
В прерывание добавляем

TimerIrq();

И в этой функции-части прерывания пишем, что хотели:

Код:
_attribute_ram_code_ void TimerIrq(void) {
       if(reg_irq_src & FLD_IRQ_TMR1_EN) {
        reg_tmr_sta = FLD_TMR_STA_TMR1; // clear irq status
           reg_irq_src =  FLD_IRQ_TMR1_EN;


           DATA_LED_TOGGLE; // переключаем светодиод
           extern u8  SppDataServer2ClientData[ATT_MTU_SIZE - 3];
           SppDataServer2ClientData[0]=SppDataServer2ClientData[0]+1;

           ble_sts_t status;
           status=bls_att_pushNotifyData(SPP_Server2Client_INPUT_DP_H, (u8 *) &SppDataServer2ClientData, 3);

           printf("status: %x \n\r", status);

       }
}
Светодиод мигает. Но, судя по миганию, вызов прерываний зависит от RF-части - в зависимости от режима работы и параметров соединения. Так что о точности такого таймера говорить не приходится. Ну и самое главное - bls_att_pushNotifyData срабатывает 1-2 раза, а потом всё падает - соединение прерывается, а status становится каким-то странным вообще, не описанным в документации - 0x88, 0x89, 0x5B...

В общем, так, похоже, делать нельзя.

Прокомментируйте, пожалуйста.
 
Значит, нужен таймер.
Если я правильно понял сказанное на прошлое странице, "таймер" у нас уже есть, и он дергает main_loop. Внутри main_loop можно выяснить сколько прошло времени с прошлого тика и предпринять(или нет) какие-либо свои действия.
ps: Дело похоже обстоит как с известным анекдотом "Солнце всходит и заходит. не надо ломать работающую систему...". Делаем свои дела с "рассветом", ложимся спать с "закатом". :)

OTA в SDK есть и включается опцией в *.h проекта...
А заливать чем? То есть имеется обновление прошивки, нужно залить его в девайс.
Предполагаю что это делается через WebBluetooth, но как я понял перед этим первоначально собирается и заливается по адресу 72000 ota_boot.bin из папки vendor sdk?

Вопрос не праздный. Просто после пары изготовленных прототипов девайса я понял что большая часть распаиваемых проводов относится к интерфейсу программатора :) ... разъем опять таки герметичность нарушает и места дофига занимает....
 

aloika

Active member
Если я правильно понял сказанное на прошлое странице, "таймер" у нас уже есть, и он дергает main_loop. Внутри main_loop можно выяснить сколько прошло времени с прошлого тика и предпринять(или нет) какие-либо свои действия.
ps: Дело похоже обстоит как с известным анекдотом "Солнце всходит и заходит. не надо ломать работающую систему...". Делаем свои дела с "рассветом", ложимся спать с "закатом". :)
Ну да, если делать, как по инструкции - то всё работает:

Код:
u32 a_trig_tick;
int a_trig_flg = 0;


void user_loop(void)
{
    if (a_trig_flg==0){
        a_trig_tick = clock_time();
        a_trig_flg=1;
    }

    if(a_trig_flg&&clock_time_exceed (a_trig_tick, 10 *100 * 1000)){
        YELLOW_LED_TOGGLE;

        extern u8  SppDataServer2ClientData[ATT_MTU_SIZE - 3];
        SppDataServer2ClientData[0]=SppDataServer2ClientData[0]+1; // формируем, что надо передать (например, добавим 1)
        ble_sts_t status;
        status=bls_att_pushNotifyData(SPP_Server2Client_INPUT_DP_H, (u8 *) &SppDataServer2ClientData, 3); // передаем
        printf("status: %x \n\r", status);

        a_trig_tick = clock_time();
    }
}
user_loop() должна вызываться в main_loop.
 

pvvx

Активный участник сообщества
Если я правильно понял сказанное на прошлое странице, "таймер" у нас уже есть, и он дергает main_loop. Внутри main_loop можно выяснить сколько прошло времени с прошлого тика и предпринять(или нет) какие-либо свои действия.
ps: Дело похоже обстоит как с известным анекдотом "Солнце всходит и заходит. не надо ломать работающую систему...". Делаем свои дела с "рассветом", ложимся спать с "закатом". :)
Можно и свой таймер запустить. Счас не помню как для 8266 - надо глядеть описание к SDK.
А заливать чем? То есть имеется обновление прошивки, нужно залить его в девайс.
Предполагаю что это делается через WebBluetooth, но как я понял перед этим первоначально собирается и заливается по адресу 72000 ota_boot.bin из папки vendor sdk?
Для UBIA на TLSR8266 уже всё собрано:
UBIA Firmware files
  • 8266_jdy_10.bin - the main project file.
  • floader.bin - file of project TlsrComProg-Usbfloader. Used to download firmware via USB-COM. It is activated if, at module startup, the SWS pin is shorted to GND.
  • jdy_10_ota_72000.bin - part for firmware on BLE OTA
Binary files for Firmware:
filenameflash addr
8266_jdy_10.bin0x000000
floader.bin0x071000
jdy_10_ota_72000.bin0x072000

Два варианта - по USB и OTA.
OTA правда не проверялась - не было нужды.
 

pvvx

Активный участник сообщества
А с OTA у TLSR8266 нет аппаратной поддержки и обновление не надежно. Он не умеет переключать адрес кэширования Flash и программа должна быть всегда с начала Flash. По этому ему нужен дополнительный блок кода, перемещающий прошивку в начало Flash. Если вырубить питание в этот момент, тогда опять проводки...
По этому и другим причинам на сегодня для BLE/MESH/ZigBee лучше доплатить 30 руб и взять TB-03F/04 модуль c TLSR8251...
 
Для UBIA на TLSR8266 уже всё собрано:
Можно использовать этот лоадер не с UBIA?
И по прежнему непонятно а как собственно заливать саму прошивку? с помошью javascript? Примера нет случаем готового?
Если вырубить питание в этот момент,
В теории питание будет батарейное, так что обрывов быть не должно. Опять таки это прототип, а не серийное изделие.
 

pvvx

Активный участник сообщества
Можно использовать этот лоадер не с UBIA?
Он стандартный, от SDK.
И по прежнему непонятно а как собственно заливать саму прошивку? с помошью javascript? Примера нет случаем готового?
Вот прототип:

В теории питание будет батарейное, так что обрывов быть не должно. Опять таки это прототип, а не серийное изделие.
Тогда вам придется это всё доделать, т.е. проверить. Мне это не требовалось и сейчас не нужно, т.к. с появлением в доступе серии TLSR825x перешел на них.
 

pvvx

Активный участник сообщества
Какие проблемы встретились при использовании OTA для разных SDK от Telink:
  • Заголовок в бинарнике иногда отличается. Должны быть нули в 4..7 байте или что другое…
  • Разные методы подсчета CRC и –> подписи CRC в конце бинарного файла. Зависит от утилиты типа tl_check_fw2.exe в SDK. Некоторые варианты OTA в SDK вообще не проверяют CRC. Другие проверяют и размер в заголовке бинарника и сам размер бинарника на 0x????4.
Формирование бинарника для OTA с помощью "tl_check_fw2.exe" из последних SDK подходит чаще, т.к. другие SDK вообще ничего кроме "KNLT" (по смещению 8) в заголовке не проверяют.
 

aloika

Active member
только сейчас обратил внимание, а это куда выведется?
В app_config.h включаете:

Код:
/////////////////// DEBUG  /////////////////////////////////
//826x module's pin simulate as a uart tx, Just for debugging
#define PRINT_DEBUG_INFO                       1    //open/close myprintf
там же правите, на какую ногу выводить tx:

Код:
#if PRINT_DEBUG_INFO
//defination debug printf pin
#define PRINT_BAUD_RATE                     256000 //1M baud rate,should Not bigger than 1M, when system clock is 16M.
#if    (__PROJECT_8261_MODULE__ || __PROJECT_8267_MODULE__ || __PROJECT_8269_MODULE__)
#define DEBUG_INFO_TX_PIN                   GPIO_PC6//G0 for 8267/8269 EVK board(C1T80A30_V1.0)
//#define PC6_OUTPUT_ENABLE                    1       //mini_printf function contain this
#define PULL_WAKEUP_SRC_PC6                 PM_PIN_PULLUP_1M
#else//__PROJECT_8266_MODULE__
#define DEBUG_INFO_TX_PIN                   GPIO_PD5//G9 for 8266 EVK board(C1T53A20_V2.0)
//#define PD3_OUTPUT_ENABLE                    1       //mini_printf function contain this
#define PULL_WAKEUP_SRC_PD5                 PM_PIN_PULLUP_1M
#endif
#endif
Это всё в примере 8266_module.
 
да, любым. Я смотрю putty.
А к компу как подключен? я попытался считать данные Putty через тот же USB-COM программатор которым шью прошивку, так как только терминал подключается к ком-порту так сразу модуль ble виснет (перестает выдавать notify)

в app_config вписал те строчки что вы указали, app.c выглядит так:

C:
include "ble.h"
u32 cnt=0;
void user_init()
{
    printf("init");
}
void main_loop() {
    u32 tt = clock_time();
    if (tt - time_tisk >= CLOCK_SYS_CLOCK_1MS) {
        time_tisk = tt;
        printf("...");
        if (SppDataCCC  && (blc_ll_getCurrentState() & BLS_LINK_STATE_CONN)  ){ // // Notify on and Connect?
             bls_att_pushNotifyData(SPP_Server2Client_INPUT_DP_H, (u8 *) &cnt, sizeof(&cnt));
             if(cnt>100000) cnt=0;
             cnt++;
             printf("hi");
        }
    }
}
 

aloika

Active member
А к компу как подключен? я попытался считать данные Putty через тот же USB-COM программатор которым шью прошивку, так как только терминал подключается к ком-порту так сразу модуль ble виснет (перестает выдавать notify)
Тут сложно сказать, в принципе-то да, через USB-COM и у меня подключено. Это надо смотреть вашу схему - почему виснет.

Про код. Я не пишу всё с нуля, я взял пример 8266_module и его модифицирую. Строчки, что я указал, и так были в app_config, я просто включил эту опцию и указал, через какую ногу выводить (там было изначально написано выводить через ногу, которой в моем модуле нет).

Если у вас это весь main_loop, то где тогда там blt_sdk_main_loop() ? И опять же должны же быть где-то вские иниты рекламы и прочее.
 

pvvx

Активный участник сообщества
OTA c UBIA.
Надо сменить в SDK в "tl_check_fw.sh" на "tl_check_fw2.exe".
Записать "jdy_10_ota_72000.bin" в чип.
Вписать в проект удержание таймеров разрыва соединения при OTA...
Git уже всем обновлен.
1619201053389.png
 

pvvx

Активный участник сообщества
Если у вас это весь main_loop, то где тогда там blt_sdk_main_loop() ? И опять же должны же быть где-то вские иниты рекламы и прочее.
У него проект заточенный под Arduino, я где-то кидал... Некоторые уже не могут жить без
Код:
void setup() {
  // put your setup code here, to run once:

}

void loop() {
  // put your main code here, to run repeatedly:

}
:)
 
У него проект заточенный под Arduino,
Ну не совсем под ардуино, в sdk структура проекта примерно такая-же :)
Все верно, я пляшу от минимального примера для модуля ds3231 который в свое время выцыганил у pvvx

Большое спасибо, а ..

Вписать в проект удержание таймеров разрыва соединения при OTA...
Примером не поделитесь?
 

pvvx

Активный участник сообщества
Примером не поделитесь?
В UBIA, при соединении, если нет внешних запросов то соединение закрывается. Этот таймер мешал OTA и это исправлено в исходниках UBIA...
Написал же - всё уже поправлено на github проекте UBIA.
К вашей Arduino это отношения не имеет - там вопросов об экономии питания и прочих не стоит и не обрабатывается.
 

pvvx

Активный участник сообщества
Так-же, по отзывам от использующих всякие Apple и устаревшие устройства связи выяснено, что таймера, запускаемого по старту OTA в Telink SDK, недостаточно. На Apple и прочем дерьме указанного в SDK времени на прошивку не хватает - эти дохлые устройства не умеют работать с BLE быстро и время передачи всей прошивки с них превышает несколько минут, что не впихнуть в 32-х битный счетчик 1/16 us у таймера OTA в Telink SDK.
Приходится городить добавку кода к OTA SDK. Всё уже вписано в проект на git.... для счастливых обладателей Apple устройств :)
А на Android всё ok, даже если интервалы соединения установлены в несколько десятков мс.
 
Сверху Снизу