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