• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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, даже если интервалы соединения установлены в несколько десятков мс.
 
Сверху Снизу