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

Обсуждение TLSR8269

nikolz

Well-known member
Начните с первого несоответствия:
  1. Сектор Flash с ID: 544013 имеет размер 4096 байт.
  2. Передача по swire 1024 байт при скорости 2 mbps составляет (10 * (1024 + 5))/2000000 = 0.005145 сек. Это и есть ваши 5 mc. Но никто не запрещает увеличить скорость swire более 2 mbps путем установки делителя до '2'. По умолчанию там '5'.
Я работаю с внутренним FLoader. Он читает сразу до 8192 байта из Flash и записывает пачкой до 4096 байт (сектор) за раз. Это по тому, что пока сделал буфер в RAM в 8 килобайт. Пока swire передает следующий сектор процессор работает - например стирает сектор по прошлой команде или может записывать другой, готовый участок буфера.
В таком случае как объяснить различную скорость чтения из флеш и sram.
 

nikolz

Well-known member
@nikolz - Для наглядности привожу вам вырезанные куски из исходников моего FLoader:
Код:
typedef struct {
    volatile u32 faddr;
    volatile u32 pbuf;
    volatile u16 count;
    volatile u16 cmd;
    volatile u16 iack;
    volatile u16 oack;
} sext;
sext ext;
u8    buff[8192];
//.... Основная  Процедура
    ext.faddr = 0;
    ext.pbuf = (u32) buff;
    ext.count = sizeof(buff);
    ext.cmd = FLASH_GET_JEDEC_ID;
    ext.iack = 1;
    ext.oack = 0;
    u16 ack = 0xffff;
    while(1) {
        while(ack == ext.iack);
        ack = ext.iack;
        switch(ext.cmd) {
            case FLASH_READ_CMD:
                flash_read_page(ext.faddr, ext.count, (u8 *)ext.pbuf);
                break;
            case FLASH_WRITE_CMD:
                flash_write_sector(ext.faddr, ext.count, (u8 *)ext.pbuf);
                break;
            case FLASH_SECT_ERASE_CMD:
                flash_erase_sector(ext.faddr);
                break;
            case FLASH_GET_JEDEC_ID:
                ext.faddr = flash_get_jedec_id();
                break;
            case 0xF3:
                analog_write_blk((u8)ext.faddr, (u8 *)ext.pbuf, ext.count);
                break;
            case 0xF4:
                analog_read_blk((u8)ext.faddr, (u8 *)ext.pbuf, ext.count);
                break;
        }
        ext.oack++;
    }

    REG_ADDR8(0x6f) = 0x20;   //mcu reboot
    while (1);
Вот через [inline]struct sext[/inline] CPU и 'общается' по внешнему управлению по swire.
Посмотреть вложение 8036
В программе выводится:
Buffer: 808А90:2000
Что означает, что адрес гарантированного* буфера = 0x808А90 и его размер 0x2000.
*гарантированного - можно задать любой (см. код.)
PS: Полные исходники для сборки проекта FLoader выдаются в личке 'постучавшимся'.
благодарю за объяснения.
исходники не требуются.
 

nikolz

Well-known member
pvvx,
интересно ваше мнение по следующей информации из документации
------------------
у чипов TLSR есть три режима
потребления до 30 ма в первом до 20 мка (8266) 10мка(8269) -втором и менее 1 мка - в третьем
в документации сказано что переход из второго в первый занимает 0.4мс а из третьего в первый 1 мс
Вы получили 25 мс и токи существенно больше 20 мка
Можете объяснить почему не сходятся параметры в документации и Ваши тесты?
 

pvvx

Активный участник сообщества
pvvx,
интересно ваше мнение по следующей информации из документации
------------------
у чипов TLSR есть три режима
потребления до 30 ма в первом до 20 мка (8266) 10мка(8269) -втором и менее 1 мка - в третьем
в документации сказано что переход из второго в первый занимает 0.4мс а из третьего в первый 1 мс
Вы получили 25 мс и токи существенно больше 20 мка
Можете объяснить почему не сходятся параметры в документации и Ваши тесты?
Я пока не ставил тестов на мка в режиме sleep, т.к. подключенный измеритель на INA219 и в мка не шарит.
Поверенные примеры, где средний ток более 2 мА, собраны из исходников даваемыми Telink ble_sdk_lt_app и ble_lt_mesh без какой либо коррекции.
Там ещё всё хуже. Пока модуль не зарегистрировался он просыпается на сотни мс. Потом, после регистрации (или нахождения свича или ...) картина меняется - начинает просыпаться и передавать короткий диалог (наверно один пакет), потом спит несколько мс и просыпается для приема ответа, потом спит дольше. Таков цикл.
Замеренные 2 мА - это когда всё ему хорошо.
 

nikolz

Well-known member
pvvx,
собственно с протоколами и режимами EVK я разобрался
я реализовал протокол на ESP8266 без SPI исключительно на одном GPIО
Если вы не восстанавливали прошивку EVK то вы не все знаете о нем так как его режимы не описаны в доступной документации
и есть то что никак не следует из известной документации по SWIRE
---------------------
В итоге я понял все что хотел по данному протоколу и даже то что нет в документации
Написал вариант на HSPI могу достичь указанные Вами скорости без проблем,
но надо городить интерфейс, а оно мне нужно? - увы нет.
------------------
Что вы скажите относительно скорости чтения из SRAM по сравнению с флеш?
 

pvvx

Активный участник сообщества
Если вы не восстанавливали прошивку EVK то вы не все знаете о нем так как его режимы не описаны в доступной документации
и есть то что никак не следует из известной документации по SWIRE
А зачем для этого ковырять EVK?
Вся необходимая аппаратура чипа уже известна. Во всяком случае мне.
Почему я должен копировать глюки EVK?
В итоге я понял все что хотел по данному протоколу и даже то что нет в документации
Написал вариант на HSPI могу достичь указанные Вами скорости без проблем,
но надо городить интерфейс, а оно мне нужно? - увы нет.
А зачем тогда пристаете со скоростями?
Видимо ещё не освоили. :(
Что вы скажите относительно скорости чтения из SRAM по сравнению с флеш?
По swire EVK не читает Flash. Он это делает через 'гланды', т.е. путем управления по swire SPI контроллером подключенным к внутренней SPI-Flash. Ковыряется в его регистрах.
Такой вариант реализован и в TlsrTool. Он нужен для отладки, чтобы не трогать память программы...
 

pvvx

Активный участник сообщества
Если вы не восстанавливали прошивку EVK то вы не все знаете о нем так как его режимы не описаны в доступной документации
и есть то что никак не следует из известной документации по SWIRE
Вот программа для EVK "чтение Flash" на его скрипте:
Код:
l = p_get_size (0, 4)
a = p_get_adr  (0, 4)
m = 1024
off = 0

v = wr_reg (0x602, 0x05, 1)    // reset mcu
v = wr_reg (0x0d, 0x01, 1)    // set csn high
v = wr_reg (0x0d, 0x00, 1)    // set csn low
v = wr_reg (0x0c, 0x03, 1)    // send read command

v = p_get_adr(2, 1)        // get address byte2
v = wr_reg (0x0c, v, 1)    // send a2
v = p_get_adr(1, 1)        // get address byte1
v = wr_reg (0x0c, v, 1)    // send a1
v = p_get_adr(0, 1)        // get address byte0
v = wr_reg (0x0c, v, 1)    // send a0

v = wr_reg (0x0c, 0x00, 1)    // launch first read
v = wr_reg (0x0d, 0x0a, 1)    // set auto read mode

while (l>0)
    if (l>m) then
        n = m
    else
        n = l
    endif
    t = rd_fifo (0x0c, off, n)    // read n byte from address 0x0c
    v = p_dis_buf(off, n)       
    l = l - n
    a = a + n
wend

a = wr_reg (0x0d, 0x01, 1)    // set csn high
Использованные процедуры описаны в файле lib.evk.
 

pvvx

Активный участник сообщества
Например, для шины swire используется lib.swb.
Процедура wr_reg (a, d, size):
Код:
sub wr_reg (a, d, size)
    sss_ah = a >> 8
    sss_al = and (a, 0xff)
    sss_d3 = d >> 24
    sss_d2 = and (d >> 16, 0xff)
    sss_d1 = and (d >> 8, 0xff)
    sss_d0 = and (d, 0xff)

    //print sss_ah, sss_al, d
    sss_v = p_wr_reg (0xb0, 0x05ff,2) // установить биты cmd=1 и передачи (bit0) в SWM контроллере и передать байт 0xFF (это типа дублирования STOP)
    sss_v = p_wr_reg (0xb0, 0x055a,2) // установить биты cmd=1 и передачи (bit0) в SWM контроллере и передать байт START = 0x5A
    sss_v = p_wr_reg (0xb0, sss_ah + 0x100, 2) // установить биты cmd=0 и передачи (bit0) в SWM контроллере и передать старший байт адреса sss_ah 
    sss_v = p_wr_reg (0xb0, sss_al + 0x100, 2) // установить биты cmd=0 и передачи (bit0) в SWM контроллере и передать младший байт адреса sss_al
    sss_v = p_wr_reg (0xb0, 0x0100, 2) // установить биты cmd=0 и передачи (bit0) в SWM контроллере и передать байт WR_ID = 0 (запись)
    sss_v = p_wr_reg (0xb0, sss_d0 + 0x100, 2) // установить биты cmd=0 и передачи (bit0) в SWM контроллере и передать байт данных sss_d0 
    if (size > 1) then
        sss_v = p_wr_reg (0xb0, sss_d1 + 0x100, 2) // установить биты cmd=0 и передачи (bit0) в SWM контроллере и передать байт данных sss_d1 
    endif
    if (size > 2) then
        sss_v = p_wr_reg (0xb0, sss_d2 + 0x100, 2) // установить биты cmd=0 и передачи (bit0) в SWM контроллере и передать байт данных sss_d2 
    endif
    if (size > 3) then
        sss_v = p_wr_reg (0xb0, sss_d3 + 0x100, 2) // установить биты cmd=0 и передачи (bit0) в SWM контроллере и передать байт данных sss_d3 
    endif
    sss_v = p_wr_reg (0xb0, 0x05ff, 2)        // end of access: установить биты cmd=1 и передачи (bit0) в SWM контроллере и передать байт STOP =0xFF
end sub
Т.е. каждое обращение к wr_reg() есть полная транзакция по swire и для чтения из Flash одного байта требуется множество таких передач.
 

pvvx

Активный участник сообщества
Поверенные примеры, где средний ток более 2 мА, собраны из исходников даваемыми Telink ble_sdk_lt_app и ble_lt_mesh без какой либо коррекции.
Там ещё всё хуже. Пока модуль не зарегистрировался он просыпается на сотни мс. Потом, после регистрации (или нахождения свича или ...) картина меняется - начинает просыпаться и передавать короткий диалог (наверно один пакет), потом спит несколько мс и просыпается для приема ответа, потом спит дольше. Таков цикл.
Замеренные 2 мА - это когда всё ему хорошо.
upload_2019-10-8_0-27-32.png
В начале удержание Reset сразу после прошивки 8269_mesh_LPN.bin.
Отпускание Reset и старт прошивки. Она там покопается в Flash и понапишет всякой ерунды в шахматном порядке...
Потом, за отметкой в 7 сек, включение приемника и передатчика.
На 20-ой секунде включил регистрацию на смартфоне.
За отметку в 40 сек с плюсом модуль зарегался, прописал ключики и решил перезагрузится.
Далее ищет где-же свитч... и так будет жрать пока не найдет swith (или куда ему там скидывать послания). Когда найдет - будут по две палки по несколько мс и назначенный промежуток. По умолчанию, если ничего не менять в настройках, то средний ток после регистрации, наличии swith-а и т.д. за 2.4 мА.
 

pvvx

Активный участник сообщества
А так со свичем:
upload_2019-10-8_4-42-46.png
Т.е. среднее в такой конфиге за 7 мА.
При этом старт модуля TLSR8269, пока он там процессор раскочегарит не менее 2 мс:
upload_2019-10-8_4-44-32.png
Типичная и повторяющаяся картинка (увеличено из верхнего графика).
Какие там (при этом) микроамперы мерить?
 

nikolz

Well-known member
Вот программа для EVK "чтение Flash" на его скрипте:
Код:
l = p_get_size (0, 4)
a = p_get_adr  (0, 4)
m = 1024
off = 0

v = wr_reg (0x602, 0x05, 1)    // reset mcu
v = wr_reg (0x0d, 0x01, 1)    // set csn high
v = wr_reg (0x0d, 0x00, 1)    // set csn low
v = wr_reg (0x0c, 0x03, 1)    // send read command

v = p_get_adr(2, 1)        // get address byte2
v = wr_reg (0x0c, v, 1)    // send a2
v = p_get_adr(1, 1)        // get address byte1
v = wr_reg (0x0c, v, 1)    // send a1
v = p_get_adr(0, 1)        // get address byte0
v = wr_reg (0x0c, v, 1)    // send a0

v = wr_reg (0x0c, 0x00, 1)    // launch first read
v = wr_reg (0x0d, 0x0a, 1)    // set auto read mode

while (l>0)
    if (l>m) then
        n = m
    else
        n = l
    endif
    t = rd_fifo (0x0c, off, n)    // read n byte from address 0x0c
    v = p_dis_buf(off, n)      
    l = l - n
    a = a + n
wend

a = wr_reg (0x0d, 0x01, 1)    // set csn high
Использованные процедуры описаны в файле lib.evk.
---------------------
В доке написано что можно поднять частоту обмена до 2 Мбит,
но как это сделать со стороны SWS, не загружая в нее софта?
 

nikolz

Well-known member
сделал на HSPI в ESP8266.
скорость со стороны SWM можно задать любую, но скорость со стороны SWS не изменяется.
получается, что нельзя ускорить выше чем установлено по умолчанию в прошиваемом чипе.
 

pvvx

Активный участник сообщества
---------------------
В доке написано что можно поднять частоту обмена до 2 Мбит,
При проверке, а это уже было давно, до порядка 5 Mbps, если не более...
1.2..1.6 mbps при делителе в 5.
но как это сделать со стороны SWS, не загружая в нее софта?
Изменить регистр делителя swire путем передачи по swire записи числа по его адресу.
На страницах данной темы описано где-то его название и адрес...
Пишите цикл, с числа 2
Передаете в регистр, читаете. Если не читается, то увеличиваете число делителя и повторяете цикл.
Так и подбираете скорость.
В TlsrToool и такая кнопка есть - для прикола :)
 

pvvx

Активный участник сообщества
В TlsrToool и такая кнопка есть ASpeed (авто speed)- для прикола :)
Т.к. прием у меня с диапазоном в +- полтора раза синхронизируется сам. А кварцы отличаются на менее %.
 

nikolz

Well-known member
Не совсем понятно из документации необходимо ли для работы по USB загружать какой-либо софт
или достаточно включить соответствующие биты в двух регистрах.
интересно бы сделать начальный загрузчик с UART или USB и записать его в фиксированную область флеш которую не стирать.
тогда бы не было бы надобности каждый раз при неудачной прошивке использовать Swire.
 

nikolz

Well-known member
В TlsrToool и такая кнопка есть ASpeed (авто speed)- для прикола :)
Т.к. прием у меня с диапазоном в +- полтора раза синхронизируется сам. А кварцы отличаются на менее %.
Для приема использую алгоритм, в котором нет надобности знать частоту ответа.
 

Сергей_Ф

Moderator
Команда форума
[off]Немного почистил тему от флуда и взаимных перепалок. Еще раз напоминаю о необходимости взаимоуважения на форуме.[/off]
 

pvvx

Активный участник сообщества
Не совсем понятно из документации необходимо ли для работы по USB загружать какой-либо софт
или достаточно включить соответствующие биты в двух регистрах.
Драйвер USB необходим. Если не прошит или не загружен, то пустой контролер USB ничего не сделает сам.
интересно бы сделать начальный загрузчик с UART или USB и записать его в фиксированную область флеш которую не стирать.
тогда бы не было бы надобности каждый раз при неудачной прошивке использовать Swire.
Не имеет никакого смысла.
Для приема использую алгоритм, в котором нет надобности знать частоту ответа.
Это в реальности не требуется и невозможно по причине, что сам метод кодирования основан на временных отсчетах.
Для понятия - ставим делитель swire в максимум. Получим ответ 1 бит в минуту. Вы будете ждать следующие биты? :)
 

pvvx

Активный участник сообщества
Другой вариант - вы передаете по swire на 1 mbps, а он отвечает вам на 1 kbps. Зачем тормозить шину время работы, если уже рассчитано и реализовано соединение на 1 mbps? Не проще ли плюнуть пару лишних байт в чип и включить его вывод на 1 mbps?
 

nikolz

Well-known member
Другой вариант - вы передаете по swire на 1 mbps, а он отвечает вам на 1 kbps. Зачем тормозить шину время работы, если уже рассчитано и реализовано соединение на 1 mbps? Не проще ли плюнуть пару лишних байт в чип и включить его вывод на 1 mbps?
Возможно 8266 отличаются 8269
Но вот что я наблюдаю. Все настроено по умолчанию прошивка JDY-10.
как бы я не изменял скорость SWM при чтении,
чип 8266 отвечает всегда на одной и той же скорости. бит=1.25 мкс.
И понимает меня правильно так как отдает то что прошу (проверяю по BDT)
 
Сверху Снизу