• Система автоматизации с открытым исходным кодом на базе 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;
 
Сверху Снизу