Скрыть объявление
На нашем форуме недоступен просмотр изображений для неавторизованных пользователей. Если Вы уже зарегистрированы на нашем форуме, то можете войти. Если у Вас еще нет аккаунта, мы будем рады, если Вы к нам присоединитесь. Зарегистрироваться Вы можете здесь.

Arduino для RTL8710.

Тема в разделе "Realtek - описание, документация и обсуждение", создана пользователем pvvx, 5 ноя 2016.

  1. Makc1806

    Makc1806 Новичок

    Сообщения:
    13
    Симпатии:
    1
    Спасибо! А что там внутри, в смысле как его освоить для програмирования, там тоже realtek? И вот что смешно: US $43.02 в Ukraine службой TNT, так доставка ~10 раз дороже товара. :eek:
    Вот, что лучше взять 10-ку или 11-ку? Так понимаю с новыми SDK с 10-кой все сложнее работать, т.е. потихоньку "отпадают" возможности.
    Нашел 10-ку 3 3.6 В RTL8710 Wi Fi Беспроводной Модуль Приемопередатчика Передатчик Приемник Высокая Производительность Беспроводной SOC 1 МБ Flash Для Arduino купить на AliExpress по 3,2$ симпатичненькую, с антенкой на борту.
    И вот такую 11-ку 1 ШТ. НОВЫЙ RTl8711AF IOT Wifi беспроводной Модуль Развития новых купить на AliExpress но уже по 6,3$ и без металл. экранчика.
     
    Последнее редактирование: 20 апр 2017
  2. Pilnikov

    Pilnikov Активный участник сообщества

    Сообщения:
    300
    Симпатии:
    26
  3. GoblinHero

    GoblinHero Новичок

    Сообщения:
    11
    Симпатии:
    1
    Пытаюсь заставить работать экран ILI9341 с тачскрином на XPT2046. Экран заработал, а вот с тачем бился сегодня полдня - и никаких результатов.
    Под тач взял готовую библиотеку:
    GitHub - PaulStoffregen/XPT2046_Touchscreen: Touchscreen Arduino Library for XPT2046 Touch Controller Chip
    На плате arduino mini у меня все с этой библиотекой работает нормально, а на RTL8710 - ничего не выходит. Для эксперимента подключил только тач к SPI (порты С0-С3). Запускаю простой пример из библиотеки без прерываний и т.п. - с тача считывается какая-то ерунда, причем все время одинаковая. Есть нажатие или нет - пофиг. Может на реалтеке есть какие-то хитрости с SPI? которые эта библиотека не учитывает??? Не знаю даже куда дальше копать.
    Написал минимальный проект без библиотеки все равно не помогло- [C++] #include <SPI.h> void setup() { Serial.begin(38400); SPI.begin(); pinMode( - Pastebin.com
     
    Последнее редактирование: 22 апр 2017
  4. A_D

    A_D Авторитетный участник сообщества

    Сообщения:
    352
    Симпатии:
    56
    GoblinHero, попробуйте снизить скорость SPI. помню на STM32 заводил этот тач и там не доглядел в даташите, что тач этот довольно медленный.. а я пытался его на той же скорости, что и LCD завести.
     
  5. nkly

    nkly Новичок

    Сообщения:
    24
    Симпатии:
    1
    @GoblinHero
    Надо смотреть настройки spi. Скорее всего cs дергается через 8 бит, а не так как задумано в библиотеке к тач контроллеру.
     
  6. Ers

    Ers Новичок

    Сообщения:
    12
    Симпатии:
    3
    @GoblinHero A_D скорее всего прав и дело в скорости SPI. На esp8266 экран рисует на максимальной скорости, а для чтения тача приходится понижать до 2МГц.
     
  7. GoblinHero

    GoblinHero Новичок

    Сообщения:
    11
    Симпатии:
    1
  8. nkly

    nkly Новичок

    Сообщения:
    24
    Симпатии:
    1
    @GoblinHero
    Скорее всего cs дергается при каждом вызове SPI.transfer. У меня так было, SPI_CONTINUE не помогал. Надо осцилом смотреть.
     
  9. pvvx

    pvvx Активный участник сообщества

    Сообщения:
    9.441
    Симпатии:
    1.320
    В либе RTL были ошибки с CS. SPI там работает по DMA и вызов функции пересылки - это только заголовок, назначение действия. Необходимо дождаться самой обработки DMA и только после этого менять состояние CS, если он используется... Об этом уже где-то писал и в RtlDuino что-то, где-то менял в классе SPI, но не везде.
    Но пока не ясна ваша схема подключения и другие мелкие вопросы, по этому точно ничего не посоветовать, а можно только гадать...
    Так-же не всегда работают повторные переключения направлений ввода-вывода на I/O. Не чинил. Проще написать без либы digitalwire или как-там её.. самому код.
    ----------

    Да - глянул и немого вспомнил:
    Вот тут я воткнул ожидание, иначе у меня не работало с TFT при блоках в десятки килобайт (CS уже выставлялся, вызывались новые функции SPI, а трансфер так и шел, пока всё полностью не глючило :)): RtlDuino/SPI.cpp at master · pvvx/RtlDuino · GitHub
    А в других местах (вызовах с другим параметрами) не лез. Так пишут в Ameba Arduino - у них все примеры с дикими задержками между командами и прокатывало, не сказывалось... :)
    Вот у них:
    #define CONFIG_GDMA_EN 1
    Это значит, что SPI (HAL SSI) работает по DMA и функции только назначают будущую транзакцию, не дожидаясь исполнения.
    А дальше вставлять затычки не стал, т.к. удобнее работать дальше процессором, пока идет транзакция и надо менять саму либу SPI и делать поддержку RTOS, но концепция Arduino рассчитана на 8-ми битные AVR с одним потоком...
    С пинами вообще у Ameba сплошная беда - совершенно не атомарные переключения портов, а аппартаный bitbanding, специально сделанный для данного случая в ARM у них не задействуется. Халтурщики - лиш-бы продать...
    По этому и копаю SDK - уже не до высоких материй, типа Дурины...
     
    Последнее редактирование: 23 апр 2017
    GoblinHero нравится это.
  10. GoblinHero

    GoblinHero Новичок

    Сообщения:
    11
    Симпатии:
    1
    Достал из ящика USB-шный осциллограф. Обнаружил, что CS дергается после каждого байта. А по даташиту тача cs нужно держать. Кто вот только это делает - код в RtlDuino/SPI.cpp или низлежащий код из HAL?
    Я понял. RtlDuino/SPI.cpp доверия нет. В целом я ничего сложного в нем не вижу. Попробую переписать нужные части с нуля. Есть ряд вопросов:
    1. А где-нибудь есть описание HAL функций применительно к нашему контроллеру?
    2. OTA_nonblock - прикольная штука. Если я возьму код оттуда и добавлю к своему проекту и зашью по адресу OTA оно будет перешивать саму себя? Так можно делать? А то мне уже надоело замыкать CS1 и ресетить контроллер чтобы загрузить область IMG с прошивальщиком ota_nonblock.
    3. Кстати после ардуины RTOS выглядит обалденно. Потоки это круто. Буду использовать. Вот эта документация по RTOS для нас актуальна? CMSIS RTOS - Handbook | mbed Меня очень интересуют средства синхронизации.
     
  11. pvvx

    pvvx Активный участник сообщества

    Сообщения:
    9.441
    Симпатии:
    1.320
    В разных режимах (SPI mode) аппаратный CS работает по разному - мс. тему SPI и подобное. Стандартов на CS нет - в ARM доках значиться, должен дергаться каждые 16 бит, а у нас в 2-режимах дергается на блок (хоть во всю память), а в двух других - на 8 и 16 бит - как задать...
    SPI Mode:
    [​IMG]
    2. ОTA переписывается, там все адреса записи в классе описаны и можно исправить как угодно. Код у RTL871xAx работает только из RAM, после инициализации, старта SDK, Flash не используется. Можете почти всю стереть и переписать (оставьте только 9-й и 10-й сектора - там данные калибровок, но и их можно стереть..
    3. Смотря для чего, в Arduino есть пару примеров... По RTOS много инфо-сайтов и глядеть лень...
     
    Последнее редактирование: 24 апр 2017
  12. GoblinHero

    GoblinHero Новичок

    Сообщения:
    11
    Симпатии:
    1
    Спасибо всем за помощь, XPT2046 мне завести удалось. Поделюсь, чтобы сведения не пропали и возможно кому-то пригодились. Нужно абсолютно точно соблюдать все, что написано в даташите на тач и проверять это осциллографом. Во первых, частота SPI должна быть строго 2,5МГц. Если например поставить 1МГц - ничего не работает совсем. В библиотеке для дурыны прописано 2МГц - на RTL при этом тач координаты выдает, но неправильные. Во вторых, CS нужно держать в течении всего запроса. Это достигается установкой режима =3. В режиме =1 CS тоже держится, но тач так не работает. Прилагаю рабочий пример кода, который считывает координаты нажатия с тача.
    Код для XPT2046 (раскрыть)

    void loop()
    {
    spi_t spi_obj;
    spi_init(&spi_obj, (PinName)g_APinDescription[10].pinname,
    (PinName)g_APinDescription[11].pinname,
    (PinName)g_APinDescription[9].pinname,
    (PinName)g_APinDescription[8].pinname);
    spi_format(&spi_obj, 8, 3, 0);
    spi_frequency(&spi_obj, 2500000);

    char oob[3] = {0, 0, 0};
    char inb[3];

    while (1)
    {
    oob[0] = B10110001;
    spi_master_write_read_stream(&spi_obj, oob, inb, 3);
    int z1 = (((int)inb[1]) << 5 )| (((int)inb[2]) >> 3 );
    oob[0] = B11000001;
    spi_master_write_read_stream(&spi_obj, oob, inb, 3);
    int z2 = (((int)inb[1]) << 5 )| (((int)inb[2]) >> 3 );
    if((z2 - z1) < 3500)
    {
    oob[0] = B11010001;
    spi_master_write_read_stream(&spi_obj, oob, inb, 3);
    int x = (((int)inb[1]) << 5 )| (((int)inb[2]) >> 3 );
    oob[0] = B10010001;
    spi_master_write_read_stream(&spi_obj, oob, inb, 3);
    int y = (((int)inb[1]) << 5 )| (((int)inb[2]) >> 3 );
    printf("x=%i y=%i\r\n", x, y);
    }
    delay(500);
    }
    }

    Ну а теперь очередные вопросы. Мне нужно повесить на один SPI два устройства - тач и экран. На форуме я нашел, что для SPI0 на RTL-00 доступны три вывода для MULTI CS: C0, C4, C5.
    Что нужно передать в spi_slave_select вторым параметром для выбора этих выводов???
    Как ведет себя HAL при активации MULTI CS? Делает ли он что-то с неактивными в данный момент CS? Если не трогает - то это хорошо, тогда можно будет один из этих трех выводов использовать для своих нужд (сигнал DATA/COMMAND для экранчика). С4 и С5 попадают на I2C1, который мне кстати нужен. Правильно ли я понимаю, что тогда мне нужно через HalPinCtrlRtl8195A отключить JTAG, отключить i2C1, включить i2c2 в режиме 1, чтобы он попадал на освободившиеся пины E0-E1 и использовать потом уже i2c2?
    Есть ли ограничения, какие пины RTL можно использовать для внешних прерываний?
     
    Simon нравится это.
  13. GoblinHero

    GoblinHero Новичок

    Сообщения:
    11
    Симпатии:
    1
    Почти во всем разобрался, хотя и пришлось лазить в исходники RTLDuino\SDK. Остался вопрос: почему не работают прерывания на E2-E4? На A1 все нормально, а там - нет, хотя по исходникам вроде эти пины тоже поддерживают прерывания. HalPinCtrlRtl8195A(JTAG, 0, 0) сделал.
     
  14. pvvx

    pvvx Активный участник сообщества

    Сообщения:
    9.441
    Симпатии:
    1.320
    Это не все, а в трех портах. Что выведено на ноги чипа - зависит от чего купили за модуль... Общая таблица дана: IOports и pinmap RTL8710AF
    Число:
    typedef enum {
    CS_0 = 0,
    CS_1 = 1,
    CS_2 = 2,
    CS_3 = 3,
    CS_4 = 4,
    CS_5 = 5,
    CS_6 = 6,
    CS_7 = 7
    }ChipSelect;
    switch (pinname){
    case PE_0:
    slaveindex = CS_0;
    break;
    case PE_4:
    slaveindex = CS_1;
    break;
    case PE_5:
    slaveindex = CS_2;
    break;
    case PE_6:
    slaveindex = CS_3;
    break;
    case PE_7:
    slaveindex = CS_4;
    break;
    case PE_8:
    slaveindex = CS_5;
    break;
    case PE_9:
    slaveindex = CS_6;
    break;
    case PE_A:
    slaveindex = CS_7;
    break;
    default:
    Никак - он не воодушевлённый.
    Пины - плохо - все активируются в "1" на вывод.

    Туда-же -> IOports и pinmap RTL8710AF
    Туда-же -> IOports и pinmap RTL8710AF
    + Открываете PDF от RTL8195 и там тоже смотрите таблицу пинов, распечатываете и раскрашиваете для наглядного сравнения какие выведены у вашего чипа и модуля...

    SC иногда проще переключать bitbang-ом RTL00MP3/bitband_io.h at master · pvvx/RTL00MP3 · GitHub
     

    Вложения:

    Последнее редактирование: 28 апр 2017
    GoblinHero нравится это.
  15. GoblinHero

    GoblinHero Новичок

    Сообщения:
    11
    Симпатии:
    1
    Большое спасибо за ценные комментарии. Модуль у меня RTL-00 с аликспресса. Выводы E2-E3 на нем выведены. И по таблицам на них можно вешать прерывания. Однако простой код на эти выводы не работает. С A1 все нормально.
    Код (раскрыть)

    void inta_handler(uint32_t id, uint32_t event)
    {
    printf("int_a!\r\n");
    }

    void inte_handler(uint32_t id, uint32_t event)
    {
    printf("int_e!\r\n");
    }

    void setup()
    {
    HalPinCtrlRtl8195A(JTAG, 0, 0);
    pinMode(PA_1, INPUT_IRQ_RISE);
    pinMode(PE_2, INPUT_IRQ_RISE);
    pinMode(PE_3, INPUT_IRQ_RISE);
    digitalSetIrqHandler(PA_1, inta_handler);
    digitalSetIrqHandler(PE_2, inte_handler);
    digitalSetIrqHandler(PE_3, inte_handler);
    }
     
  16. pvvx

    pvvx Активный участник сообщества

    Сообщения:
    9.441
    Симпатии:
    1.320
    Там может сидеть UART0. Если модуль перегружали из AT не через физический RESET, то оборудование может остаться беспорядочно включенным.
    Если вы используете Ameba Arduino, то там вообще работает только несколько i/o пинов.
    Code (раскрыть)
    Код (C):
    1.  
    2. #include "gpio_api.h"   // mbed
    3. #include "gpio_irq_api.h"   // mbed
    4. #include "gpio_irq_ex_api.h"
    5. extern "C" {
    6. #include "hal_pinmux.h"
    7. }
    8. extern "C" void HalPinCtrlRtl8195A(int,int,int);
    9. gpio_irq_t gpio_btn1;
    10. gpio_irq_t gpio_btn2;
    11.  
    12. int counts[2] = {0,0};
    13.  
    14. void inte_handler(uint32_t id, gpio_irq_event event)
    15. {
    16.   counts[id]++;
    17. }
    18.  
    19. void setup()
    20. {
    21.     HalPinCtrlRtl8195A(216,0,0); // JTAG Off
    22.   gpio_irq_init(&gpio_btn1, PE_2, inte_handler, 0 );
    23.   gpio_irq_set(&gpio_btn1, IRQ_FALL, 1);   // Falling Edge Trigger
    24.   gpio_irq_enable(&gpio_btn1);
    25.   gpio_irq_init(&gpio_btn2, PE_3, inte_handler, 1);
    26.   gpio_irq_set(&gpio_btn2, IRQ_FALL, 1);
    27.   gpio_irq_enable(&gpio_btn2);
    28. }
    29.  
    30. void loop() {
    31.   printf("%d, %d\n", counts[0], counts[1]);
    32.   delay(500);
    33. }
    Код (Text):
    1. ==== Enter Image 2 ====
    2. Init Heap Region: 0x10003000[12288]
    3. Init Heap Region: 0x1000bb58[410792]
    4. 0, 0
    5. 0, 0
    6. 0, 0
    7. 0, 0
    8. 0, 0
    9. 0, 0
    10. 0, 0
    11. 0, 0
    12. 0, 0
    13. 0, 0
    14. 0, 0
    15. 0, 224
    16. 0, 291
    17. 0, 414
    18. 0, 427
    19. 0, 427
    20. 0, 427
    21. 0, 427
    22. 0, 427
    23. 0, 427
    24. 0, 427
    25. 0, 427
    26. 0, 427
    27. 0, 427
    28. 0, 427
    29. 0, 427
    30. 0, 427
    31. 0, 427
    32. 0, 427
    33. 211, 427
    34. 299, 427
    35. 299, 427
    36. 299, 427
    37. 299, 427
    38. 299, 427
    39. 299, 427
    40. 299, 427
    41. 745, 427
    42. 745, 427

    В общем всё работает, а писать в амбразуре Arduino я не умею - скопировал из своего же примера в SDK :).
    Про то, что "пинмоде" и прочие "дижитал", доставшиеся по наследству от Ameba, не работает я уже писал и кто-то должен это исправить....
    Во вторых, нумерация и названия пинов в RtlДурине другие и нарисованы на картинке в первом соо...
    Код PA_0...PA_5 совпадает с D0...D5, но не более :p
    Так-же в прерываниях Printf не пользуют...
     
    Последнее редактирование: 28 апр 2017
    GoblinHero нравится это.
  17. GoblinHero

    GoblinHero Новичок

    Сообщения:
    11
    Симпатии:
    1
    Блин, из-за printf и не работало :(((( Не ожидал такого.
     
  18. pvvx

    pvvx Активный участник сообщества

    Сообщения:
    9.441
    Симпатии:
    1.320
    Поковырял пример Sleep WiFi Idle
    Выходит, что просыпается из sleep на прием beacon каждые 400 мс (поставил LPS DTIM(4)), иногда переговаривается с AP на 1..2 сек (частота таких переговоров зависит от роутера и обстановки в местной WiFi сети).
    Потребление в sleep у всех измеренных модулей около 2.5 мА (средние).
    При просыпании на обработку каких-либо действий (активное состояние) около 62 мА (средние).
    Лог показывает соотношение проведенного модулем времени в sleep и активном режиме:
    Пример лога, выдаваемого каждые 10 сек (см. скетч):
    Код (Text):
    1. SSID: HOME_AP
    2. BSSID: 90:9:EB:C5:12:34
    3. signal strength (RSSI):-27
    4. Encryption Type:4
    5.  
    6. wakelock_id     holdtime
    7. 0               43883662
    8. 1               7364455
    9. time passed: 43883662 ms, system sleep 35930238 ms
    Итого, со старта, после 12+ часов работы:
    35930238 ms потребление составляло 2.5 мА, 43883662-35930238 = 7953424 ms потребление составляло 62 мА.
    Т.е. среднее должно выйти (7953424*62+35930238*2.5)/43883662 = 13.283711 мА
    7953424/43883662=0.181239 = 18% в активном режиме с ~60 мА.
    Почти согласуется с замерами...
    (за время 12 часового замера у измерителя на ESP8266 2 раза отвалилась Station и измерить реальное потребление не вышло)
    Выглядит график потребления примерно так:
    Снимок1444.gif
    (клетка 2000 мс, минимальное 1.73мА, максимум выскакивал до 100 мА, нижняя полка 1.83 мА - прямая, если растянуть график, средняя полка 61.5)
    Среднее потребление зависит от погоды в WiFi, сколько сидит устройств на данном канале AP и т.д. (но средние 14..15 мА выходят):
    Снимок1445.gif
    (клетка 10 сек)

    В BLE стандарт влезает (там норма до 15 мА), но у нас WiFi (если надо, то скорости за 1 мегабайт в сек)
    Это активный режим - всё работает и все сервисы активны, но можно ещё сделать типа deep_sleep, но с периодическими просыпаниями для поддержки связи без перезагрузки (полностью неактивным в периоды c DTIM(1..10) = 100..1000 мс), тогда потребление будет совсем малое... Но пока не знаю, насколько сложно и затратно это вписать в Arduino.
    Пока и так по эффективности и гибкости режимов энерго-экономии RTL-ки побеждают все другие обсуждаемые модули на форуме.

    Без команды активации засыпаний системы при неактивности PowerManagement.sleep(5) (BIT(PMU_OS)|BIT(PMU_LOGUART_DEVICE))
    потребление между приемами beacon от роутера выходит 21.8 мА:
    Снимок1450.gif

    Система с выключенным WiFi в режиме экономии (sleep5) - 1.63..2 мА:
    Sleep5.gif
    При sleep5, во время активации для вывода сообщения в LogUART (на графике это через delay(10000)) - 16.32 мА:
    Снимок1455.gif
    Т.е. процессор на 83 МГц жрет где-то вокруг 17 мА.
    (Опыты с картинками поставлены на модуле RTL00 с 83 МГц, RTL8711AM имеет меньшее потребления в активном режиме при том-же CLK. C чем это связано - не знаю, т.к. у его ещё надо регенерировать SDRAM, а всё равно выходит меньше.)
     
    Последнее редактирование: 2 май 2017
    Simon нравится это.
  19. Alexey_new

    Alexey_new Новичок

    Сообщения:
    34
    Симпатии:
    0
    Добрый всем вечер! Извините, если не по теме. Для работы срочно требуется модуль на RTL8710. Заказал на Али больше месяца назад, пока не получил, тянут китайсы, теперь обещают только к середине июля. Помогите, плиз :(:(:(. Подскажите где можно приобрести в России хотя бы одну штуку для начала работы, или может быть кто-нибудь продаст, или с возвратом, или подарит :(. Спасибо всем заранее.
     
  20. Юрий Ботов

    Юрий Ботов Moderator Команда форума

    Сообщения:
    1.055
    Симпатии:
    177
    Alexey_new, а где именно? Город хоть какой.
     

Поделиться этой страницей