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

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

pvvx

Активный участник сообщества
Про счетчик не очень понял. Как увеличение счетчика определит нужные данные? Вот было 0, стало 1. Через какое-то время стало 255. Как?
По счетчику меняете данные пакета и передаете их на отправку в bls_ll_setAdvData(adv_buf.data, adv_buf.data_size);
Разбиваете передаваемые данные на группы и с четным номером передаете первую группу, а с нечетным номером - вторую группу и т.д..
 

Slacky

Member
По счетчику меняете данные пакета и передаете их на отправку в bls_ll_setAdvData(adv_buf.data, adv_buf.data_size);
Разбиваете передаваемые данные на группы и с четным номером передаете первую группу, а с нечетным номером - вторую группу и т.д..
Спасибо, я в общем так и сделал.
 

pvvx

Активный участник сообщества
Да вроде запустил. Но опять же, 4.2 такой пакет не видит.
И не увидит. Даже если адаптер у вас BT5.2, то не увидит ext_adv с CodedPHY на основном канале, что ставит крест на LongRange в BLE.
Это какая-то специальная диверсия от производителей, т.к. не поддерживают ещё стандарт 5.0 - т.е. заговор, чтобы BLE не использовали на дальние расстояния.
 

pvvx

Активный участник сообщества
Спасибо, я в общем так и сделал.
BTHome требует в сообщении и номер счетчика. В дальнейшем в BTHome может быть реализована дополнительная защита - если счетчик не меняется и вдруг стал меньше - сообщение будет откинуто и активирована тревога.
 

Slacky

Member
BTHome требует в сообщении и номер счетчика. В дальнейшем в BTHome может быть реализована дополнительная защита - если счетчик не меняется и вдруг стал меньше - сообщение будет откинуто и активирована тревога.
Ну я пока не заморачиваюсь. При сбросе модуля счетчик тоже обнуляется. Но ничего не мешает его сохранять в конфиге ...
 

Slacky

Member
А вот еще глупый вопрос.

Вот у этой платки выведены RXD и TXD на внешние пины.



Они же еще там и на CH430 идут. Я могу их использовать именно как rx-tx для связи с другим устройством?
 

pvvx

Активный участник сообщества
Они же еще там и на CH430 идут. Я могу их использовать именно как rx-tx для связи с другим устройством?
Без USB CH340 посадит вам все сигналы RX-TX.
И там ещё светодиодов напихали - все выводы заняли всякой ерундой.
 

Slacky

Member
Без USB CH340 посадит вам все сигналы RX-TX.
И там ещё светодиодов напихали - все выводы заняли всякой ерундой.
А есть где-нибудь пример простой, как работать с UART? Нашел что-то у Ai-Thinker в SDK, но с ходу не зашло. К тому же мне не очень понятно, там функция uart_dma_send() и для приема и для передачи (хотя возвращает 1, значит отработала номально)?

Но возможно, модуль DevKit глючит, нужно просто модуль без обвесок попробовать.
 

pvvx

Активный участник сообщества
"у Ai-Thinker в SDK" вообще путаница с UART по поводу DMA. На самом деле там всё просто, и не составляет труда написать своё (значительно проще чем в других чипах). А UART специфичная на прием, как и вся периферия CPU в TLSR чипах. Требуют нестандартного подхода. От этого наверно у вас и путаница.
Именно по этим причинам TLSR чипы и интересны. Классические варианты давно задолбали и скучны.
 

Slacky

Member
Я проверил их пример. Работает на выход. Стабильно присылает хелловорд. Останется проверить на приём. Может сегодня вечером успею. Интересно, это когда понимаешь, что делаешь. А когда просто повторяешь с минимальными изменениями под себя, а оно не работает, одна головная боль :))
 

pvvx

Активный участник сообщества
На этих фичах данный чип и выигрывает у одноклассников, имея совсем тупенький по скорости CPU. Все внутренние контроллеры адаптированы и заточены под тупой CPU и минимум его обращений к регистрам.
Простого примера "как работать с UART" и нет - т.к. напрямую с регистрами самое простое. Вместо всяких вызовов call проще написать опрос какого флага в регистре...
 

pvvx

Активный участник сообщества
Назначенный блок в памяти для DMA там имеет заголовок в виде uint32 с кол-вом принятых или отсылаемых байт.
Закончена передача или нет можно узнать по if((reg_dma_tx_rdy0 & FLD_DMA_CHN_UART_TX) == 0), а конец приема по if(reg_dma_irq_src & FLD_DMA_IRQ_UART_RX).
В буфере, назначенном как RX DMA будет первый uint32 указывать кол-во принятых байт до паузы.
И подтвердить прием и передачу reg_dma_irq_src = FLD_DMA_IRQ_UART_RX | FLD_DMA_IRQ_UART_TX;
Запуск передачи - reg_dma_tx_rdy0 |= FLD_DMA_CHN_UART_TX; // start tx , записав кол-во байт отсылки в uint32 TX DMA
Надо только слепить начальную инициализацию....
Тупее и проще не бывает.
 

Slacky

Member
Назначенный блок в памяти для DMA там имеет заголовок в виде uint32 с кол-вом принятых или отсылаемых байт.
...
Тупее и проще не бывает.
Ну в примере от Ai-Thinker примерно все тоже самое, что Вы рассказали. Я его запустил. Нормально работает. Есть нюанс. Мониторить RX не получится, при засыпании чипа там что-то ломается и буфер обнуляется. Но у меня логика работы немного другая - в основном цикле послали запрос, проверили ответ. В таком варианте все прекрасно работает. Я только переназначил tx и rx на PD7 и PB7. И теперь у меня и uart работает и отладку в COM порт шлет.





Код:
send bytes: 15
resp bytes: 20
response first start: 0x73550400ffff8d4e010a048d4e0655
send bytes: 15
resp bytes: 42
response current: 0x73551a00ffff8d4e05bbd62300aa2030010000ea260b00598d0a0078220e00000000002e55
tariff1: 7308,58
tariff2: 6915,45
tariff3: 9263,28
send bytes: 16
resp bytes: 20
response amps: 0x73550400ffff8d4e2c01be00002255
amps: 0,190
send bytes: 16
resp bytes: 19
response volts: 0x73550300ffff8d4e2901445c8055
volts: 236,20
send bytes: 15
resp bytes: 21
response power: 0x73550500ffff8d4e2d000000aa202955
power: 0,00
 

pvvx

Активный участник сообщества
Незя использовать deep-sleep (DEEPSLEEP_RETENTION_ADV | DEEPSLEEP_RETENTION_CONN) - вся периферия CPU и сам CPU отключается, остается работать только заказанный кусок [RAM [, RTC [, GPIO-INT]]].
Вроде только в этом режиме работает bls_pm_setSuspendMask (SUSPEND_ADV | SUSPEND_CONN);
 

pvvx

Активный участник сообщества
Можно накалякать типа - пока RX принимает if(reg_dma_irq_src & FLD_DMA_IRQ_UART_RX) не выходить на deep-sleep
 

Slacky

Member
Еще нюанс обнаружил. Инициализацию uart нужно делать и в user_init_normal(), и в user_init_deepRetn(). Иначе не работает.
 

pvvx

Активный участник сообщества
Еще нюанс обнаружил. Инициализацию uart нужно делать и в user_init_normal(), и в user_init_deepRetn(). Иначе не работает.
Уже сказано - deep-sleep отключает всё. И при каждом просыпании необходимо инициализировать нужную часть и деинициализировать после отработки для уменьшения потребления. Некоторые внутренности не отключаются полностью - остаются утечки. Да и во время активного цикла лишняя работающая часть увеличивает потребление. Некоторые сильно. Это не только для TLSR825x, а для всех чипов BLE и т.д. для работы с малым потреблением.
Даже для ESP, ну кроме Arduno - там всё пофигу.
 

nikolz

Well-known member
дайте ссылку на описание интерфейса обмена данными по оптическому каналу счетчика КАСКАД.
 

Slacky

Member
дайте ссылку на описание интерфейса обмена данными по оптическому каналу счетчика КАСКАД.
А нет никакой ссылки. Протокола в открытом доступе нет. И у меня его нет. Wireshark немного помог ...

Можете посмотреть, что я накалякал :) - https://slacky1965.github.io/electricity_meter_ble/

Вот тут еще обсуждение - https://www.radiokot.ru/forum/viewtopic.php?f=25&t=171991&sid=039243297acb0ce1b677287ae40e41c2

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

Код:
735520008d4effff0500000000ae55 - запрос 15
73551a00ffffxxxx0530067500  |3af51400|a2203001|0000|44050600|91240600|65cb0800|00000000|bc55 - ответ 41
73551a00ffff8d4e053006731100|bad62300|a2203001|0000|ea260b00|598d0a00|77220e00|00000000|6d55 - ответ 42
              head          | sum    |    ?   | ?  | tariff1| tariff2| tariff3| tariff4|
В приходящем ответе мы точно знаем несколько вещей.
1 байт всегда 73
2 байт всегда 55
3 байт содержит длину полезной нагрузки.
4 байт всегда 00
5-6 байты тип соединения (для оптопорта это всегда FFFF)
7-8 адрес устройства
9 команда
предпоследний байт - crc
последний байт всегда 55

Считываем сразу весь буфер. Проверяем. Зная размер считанного, размер неменяющегося (первые 9 байт) и размер полезной нагрузки (3-й байт) просто вырезаем всю меняющуюся середину. И получаем всегда вот такой пакет
Код:
73551a00ffff8d4e05|bad62300|a2203001|0000|ea260b00|598d0a00|77220e00|00000000|6d55
Команды

C:
typedef enum _cmd_t {
    cmd_open_channel        = 0x01,
    cmd_current_data        = 0x05,
    cmd_volts_data          = 0x29,
    cmd_amps_data           = 0x2c,
    cmd_power_data          = 0x2d,
} cmd_t;
 
Сверху Снизу