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

Arduino для RTL8710.

Makc1806

New member
Спасибо! А что там внутри, в смысле как его освоить для програмирования, там тоже 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$ и без металл. экранчика.
 
Последнее редактирование:

GoblinHero

New member
Пытаюсь заставить работать экран 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
 
Последнее редактирование:

A_D

Active member
GoblinHero, попробуйте снизить скорость SPI. помню на STM32 заводил этот тач и там не доглядел в даташите, что тач этот довольно медленный.. а я пытался его на той же скорости, что и LCD завести.
 

nkly

New member
@GoblinHero
Надо смотреть настройки spi. Скорее всего cs дергается через 8 бит, а не так как задумано в библиотеке к тач контроллеру.
 

Ers

New member
@GoblinHero A_D скорее всего прав и дело в скорости SPI. На esp8266 экран рисует на максимальной скорости, а для чтения тача приходится понижать до 2МГц.
 

nkly

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

pvvx

Активный участник сообщества
На плате arduino mini у меня все с этой библиотекой работает нормально, а на RTL8710 - ничего не выходит. Для эксперимента подключил только тач к SPI (порты С0-С3). Запускаю простой пример из библиотеки без прерываний и т.п. - с тача считывается какая-то ерунда, причем все время одинаковая. Есть нажатие или нет - пофиг. Может на реалтеке есть какие-то хитрости с SPI? которые эта библиотека не учитывает??? Не знаю даже куда дальше копать.
В либе 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 - уже не до высоких материй, типа Дурины...
 
Последнее редактирование:

GoblinHero

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

pvvx

Активный участник сообщества
Достал из ящика 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 Меня очень интересуют средства синхронизации.
В разных режимах (SPI mode) аппаратный CS работает по разному - мс. тему SPI и подобное. Стандартов на CS нет - в ARM доках значиться, должен дергаться каждые 16 бит, а у нас в 2-режимах дергается на блок (хоть во всю память), а в двух других - на 8 и 16 бит - как задать...
SPI Mode:

2. ОTA переписывается, там все адреса записи в классе описаны и можно исправить как угодно. Код у RTL871xAx работает только из RAM, после инициализации, старта SDK, Flash не используется. Можете почти всю стереть и переписать (оставьте только 9-й и 10-й сектора - там данные калибровок, но и их можно стереть..
3. Смотря для чего, в Arduino есть пару примеров... По RTOS много инфо-сайтов и глядеть лень...
 
Последнее редактирование:

GoblinHero

New member
Спасибо всем за помощь, XPT2046 мне завести удалось. Поделюсь, чтобы сведения не пропали и возможно кому-то пригодились. Нужно абсолютно точно соблюдать все, что написано в даташите на тач и проверять это осциллографом. Во первых, частота SPI должна быть строго 2,5МГц. Если например поставить 1МГц - ничего не работает совсем. В библиотеке для дурыны прописано 2МГц - на RTL при этом тач координаты выдает, но неправильные. Во вторых, CS нужно держать в течении всего запроса. Это достигается установкой режима =3. В режиме =1 CS тоже держится, но тач так не работает. Прилагаю рабочий пример кода, который считывает координаты нажатия с тача.
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 можно использовать для внешних прерываний?
 

GoblinHero

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

pvvx

Активный участник сообщества
Ну а теперь очередные вопросы. Мне нужно повесить на один SPI два устройства - тач и экран. На форуме я нашел, что для SPI0 на RTL-00 доступны три вывода для MULTI CS: C0, C4, C5.
Это не все, а в трех портах. Что выведено на ноги чипа - зависит от чего купили за модуль... Общая таблица дана: IOports и pinmap RTL8710AF
Что нужно передать в spi_slave_select вторым параметром для выбора этих выводов???
Число:
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:
Как ведет себя HAL при активации MULTI CS?
Никак - он не воодушевлённый.
Делает ли он что-то с неактивными в данный момент CS?
Пины - плохо - все активируются в "1" на вывод.

Есть ли ограничения, какие пины RTL можно использовать для внешних прерываний?
Туда-же -> IOports и pinmap RTL8710AF
Почти во всем разобрался, хотя и пришлось лазить в исходники RTLDuino\SDK. Остался вопрос: почему не работают прерывания на E2-E4? На A1 все нормально, а там - нет, хотя по исходникам вроде эти пины тоже поддерживают прерывания. HalPinCtrlRtl8195A(JTAG, 0, 0) сделал.
Туда-же -> IOports и pinmap RTL8710AF
+ Открываете PDF от RTL8195 и там тоже смотрите таблицу пинов, распечатываете и раскрашиваете для наглядного сравнения какие выведены у вашего чипа и модуля...

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

Вложения

Последнее редактирование:

GoblinHero

New member
+ Открываете PDF от RTL8195 и там тоже смотрите таблицу пинов, распечатываете и раскрашиваете для наглядного сравнения какие выведены у вашего чипа и модуля...
Большое спасибо за ценные комментарии. Модуль у меня 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);
}
 

pvvx

Активный участник сообщества
Большое спасибо за ценные комментарии. Модуль у меня RTL-00 с аликспресса. Выводы E2-E3 на нем выведены. И по таблицам на них можно вешать прерывания. Однако простой код на эти выводы не работает. С A1 все нормально.
Там может сидеть UART0. Если модуль перегружали из AT не через физический RESET, то оборудование может остаться беспорядочно включенным.
Если вы используете Ameba Arduino, то там вообще работает только несколько i/o пинов.
Код:
#include "gpio_api.h"   // mbed
#include "gpio_irq_api.h"   // mbed
#include "gpio_irq_ex_api.h"
extern "C" {
#include "hal_pinmux.h"
}
extern "C" void HalPinCtrlRtl8195A(int,int,int);
gpio_irq_t gpio_btn1;
gpio_irq_t gpio_btn2;

int counts[2] = {0,0};

void inte_handler(uint32_t id, gpio_irq_event event)
{
  counts[id]++;
}

void setup()
{
    HalPinCtrlRtl8195A(216,0,0); // JTAG Off
  gpio_irq_init(&gpio_btn1, PE_2, inte_handler, 0 );
  gpio_irq_set(&gpio_btn1, IRQ_FALL, 1);   // Falling Edge Trigger
  gpio_irq_enable(&gpio_btn1);
  gpio_irq_init(&gpio_btn2, PE_3, inte_handler, 1);
  gpio_irq_set(&gpio_btn2, IRQ_FALL, 1);
  gpio_irq_enable(&gpio_btn2);
}

void loop() {
  printf("%d, %d\n", counts[0], counts[1]);
  delay(500);
}
Код:
==== Enter Image 2 ====
Init Heap Region: 0x10003000[12288]
Init Heap Region: 0x1000bb58[410792]
0, 0
0, 0
0, 0
0, 0
0, 0
0, 0
0, 0
0, 0
0, 0
0, 0
0, 0
0, 224
0, 291
0, 414
0, 427
0, 427
0, 427
0, 427
0, 427
0, 427
0, 427
0, 427
0, 427
0, 427
0, 427
0, 427
0, 427
0, 427
0, 427
211, 427
299, 427
299, 427
299, 427
299, 427
299, 427
299, 427
299, 427
745, 427
745, 427
В общем всё работает, а писать в амбразуре Arduino я не умею - скопировал из своего же примера в SDK :).
Про то, что "пинмоде" и прочие "дижитал", доставшиеся по наследству от Ameba, не работает я уже писал и кто-то должен это исправить....
Во вторых, нумерация и названия пинов в RtlДурине другие и нарисованы на картинке в первом соо...
Код PA_0...PA_5 совпадает с D0...D5, но не более :p
Так-же в прерываниях Printf не пользуют...
 
Последнее редактирование:

pvvx

Активный участник сообщества
Поковырял пример Sleep WiFi Idle
Выходит, что просыпается из sleep на прием beacon каждые 400 мс (поставил LPS DTIM(4)), иногда переговаривается с AP на 1..2 сек (частота таких переговоров зависит от роутера и обстановки в местной WiFi сети).
Потребление в sleep у всех измеренных модулей около 2.5 мА (средние).
При просыпании на обработку каких-либо действий (активное состояние) около 62 мА (средние).
Лог показывает соотношение проведенного модулем времени в sleep и активном режиме:
Пример лога, выдаваемого каждые 10 сек (см. скетч):
Код:
SSID: HOME_AP
BSSID: 90:9:EB:C5:12:34
signal strength (RSSI):-27
Encryption Type:4

wakelock_id     holdtime
0               43883662
1               7364455
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-ки побеждают все другие обсуждаемые модули на форуме.

Без команды активации засыпаний системы при неактивности [inline]PowerManagement.sleep(5)[/inline] (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, а всё равно выходит меньше.)
 
Последнее редактирование:
Добрый всем вечер! Извините, если не по теме. Для работы срочно требуется модуль на RTL8710. Заказал на Али больше месяца назад, пока не получил, тянут китайсы, теперь обещают только к середине июля. Помогите, плиз :(:(:(. Подскажите где можно приобрести в России хотя бы одну штуку для начала работы, или может быть кто-нибудь продаст, или с возвратом, или подарит :(. Спасибо всем заранее.
 
Сверху Снизу