Arduino для RTL8710.

Юрий Ботов

Moderator
Команда форума
Кто нибудь знает как работать с "мультиплексором ног" напрямую (через регистры, а не через С-API)?
Пробую юзать
Код:
#define REG_GPIO_SHTDN_CTRL 0x0320
#define REG_GPIO_DRIVING_CTRL 0x0324
#define REG_GPIO_PULL_CTRL0 0x0330
#define REG_GPIO_PULL_CTRL1 0x0334
#define REG_GPIO_PULL_CTRL2 0x0338
#define REG_GPIO_PULL_CTRL3 0x033C
#define REG_GPIO_PULL_CTRL4 0x0340
#define REG_GPIO_PULL_CTRL5 0x0344
#define REG_GPIO_PULL_CTRL6 0x0348
С базой SYSON - никакой реакции...
 

pvvx

Активный участник сообщества
Кто нибудь знает как работать с "мультиплексором ног" напрямую (через регистры, а не через С-API)?
Пробую юзать
Код:
#define REG_GPIO_SHTDN_CTRL 0x0320
#define REG_GPIO_DRIVING_CTRL 0x0324
#define REG_GPIO_PULL_CTRL0 0x0330
#define REG_GPIO_PULL_CTRL1 0x0334
#define REG_GPIO_PULL_CTRL2 0x0338
#define REG_GPIO_PULL_CTRL3 0x033C
#define REG_GPIO_PULL_CTRL4 0x0340
#define REG_GPIO_PULL_CTRL5 0x0344
#define REG_GPIO_PULL_CTRL6 0x0348
С базой SYSON - никакой реакции...
А конкретнее можно? :) Что и куда и на каком RTL надо переключить?
Как-бы все переключения через API описаны IOports и pinmap RTL8710AF
Не такая она ресурсоемкая задача: HalPinCtrlRtl8195A(Название_устройства, номер_конфигурации, On/Off). Коду выходит явно меньше, а исполнение кода в ROM идет без задержек тактов CPU.
Можно и напрямую для каждого устройства:
Код:
extern _LONG_CALL_ int HalUart0PinCtrlRtl8195A(IN u32  PinLocation, IN BOOL   Operation);
extern _LONG_CALL_ int HalUart1PinCtrlRtl8195A(IN u32  PinLocation, IN BOOL   Operation);
extern _LONG_CALL_ int HalUart2PinCtrlRtl8195A(IN u32  PinLocation, IN BOOL   Operation);
extern _LONG_CALL_ int HalSPI0PinCtrlRtl8195A(IN u32  PinLocation, IN BOOL   Operation);
extern _LONG_CALL_ int HalSPI1PinCtrlRtl8195A(IN u32  PinLocation, IN BOOL   Operation);
extern _LONG_CALL_ int HalSPI2PinCtrlRtl8195A(IN u32  PinLocation, IN BOOL   Operation);
extern _LONG_CALL_ int HalSPI0MCSPinCtrlRtl8195A(IN u32  PinLocation, IN BOOL   Operation);
extern _LONG_CALL_ int HalI2C0PinCtrlRtl8195A(IN u32  PinLocation, IN BOOL   Operation);
extern _LONG_CALL_ int HalI2C1PinCtrlRtl8195A(IN u32  PinLocation, IN BOOL   Operation);
extern _LONG_CALL_ int HalI2C2PinCtrlRtl8195A(IN u32  PinLocation, IN BOOL   Operation);
extern _LONG_CALL_ int HalI2C3PinCtrlRtl8195A(IN u32  PinLocation, IN BOOL   Operation);
extern _LONG_CALL_ int HalI2S0PinCtrlRtl8195A(IN u32  PinLocation, IN BOOL   Operation);
extern _LONG_CALL_ int HalI2S1PinCtrlRtl8195A(IN u32  PinLocation, IN BOOL   Operation);
extern _LONG_CALL_ int HalPCM0PinCtrlRtl8195A(IN u32  PinLocation, IN BOOL   Operation);
extern _LONG_CALL_ int HalPCM1PinCtrlRtl8195A(IN u32  PinLocation, IN BOOL   Operation);
extern _LONG_CALL_ int HalSDIODPinCtrlRtl8195A(IN u32  PinLocation, IN BOOL   Operation);
extern _LONG_CALL_ int HalSDIOHPinCtrlRtl8195A(IN u32  PinLocation, IN BOOL   Operation);
extern _LONG_CALL_ int HalMIIPinCtrlRtl8195A(IN u32  PinLocation, IN BOOL   Operation);
extern _LONG_CALL_ int HalWLLEDPinCtrlRtl8195A(IN u32  PinLocation, IN BOOL   Operation);
extern _LONG_CALL_ int HalWLANT0PinCtrlRtl8195A(IN u32  PinLocation, IN BOOL   Operation);
extern _LONG_CALL_ int HalWLANT1PinCtrlRtl8195A(IN u32  PinLocation, IN BOOL   Operation);
extern _LONG_CALL_ int HalWLBTCOEXPinCtrlRtl8195A(IN u32  PinLocation, IN BOOL   Operation);
extern _LONG_CALL_ int HalWLBTCMDPinCtrlRtl8195A(IN u32  PinLocation, IN BOOL   Operation);
extern _LONG_CALL_ int HalNFCPinCtrlRtl8195A(IN u32  PinLocation, IN BOOL   Operation);
extern _LONG_CALL_ int HalPWM0PinCtrlRtl8195A(IN u32  PinLocation, IN BOOL   Operation);
extern _LONG_CALL_ int HalPWM1PinCtrlRtl8195A(IN u32  PinLocation, IN BOOL   Operation);
extern _LONG_CALL_ int HalPWM2PinCtrlRtl8195A(IN u32  PinLocation, IN BOOL   Operation);
extern _LONG_CALL_ int HalPWM3PinCtrlRtl8195A(IN u32  PinLocation, IN BOOL   Operation);
extern _LONG_CALL_ int HalETE0PinCtrlRtl8195A(IN u32  PinLocation, IN BOOL   Operation);
extern _LONG_CALL_ int HalETE1PinCtrlRtl8195A(IN u32  PinLocation, IN BOOL   Operation);
extern _LONG_CALL_ int HalETE2PinCtrlRtl8195A(IN u32  PinLocation, IN BOOL   Operation);
extern _LONG_CALL_ int HalETE3PinCtrlRtl8195A(IN u32  PinLocation, IN BOOL   Operation);
extern _LONG_CALL_ int HalEGTIMPinCtrlRtl8195A(IN u32  PinLocation, IN BOOL   Operation);
extern _LONG_CALL_ int HalSPIFlashPinCtrlRtl8195A(IN u32  PinLocation, IN BOOL   Operation);
extern _LONG_CALL_ int HalSDRPinCtrlRtl8195A(IN u32  PinLocation, IN BOOL   Operation);
extern _LONG_CALL_ int HalJTAGPinCtrlRtl8195A(IN u32  PinLocation, IN BOOL   Operation);
extern _LONG_CALL_ int HalTRACEPinCtrlRtl8195A(IN u32  PinLocation, IN BOOL   Operation);
extern _LONG_CALL_ int HalLOGUartPinCtrlRtl8195A(IN u32  PinLocation, IN BOOL   Operation);
extern _LONG_CALL_ int HalLOGUartIRPinCtrlRtl8195A(IN u32  PinLocation, IN BOOL   Operation);
extern _LONG_CALL_ int HalSICPinCtrlRtl8195A(IN u32  PinLocation, IN BOOL   Operation);
extern _LONG_CALL_ int HalEEPROMPinCtrlRtl8195A(IN u32  PinLocation, IN BOOL   Operation);
extern _LONG_CALL_ int HalDEBUGPinCtrlRtl8195A(IN u32  PinLocation, IN BOOL   Operation);
 
Последнее редактирование:

Юрий Ботов

Moderator
Команда форума
А конкретнее можно
RAK477,8711af, wifi убиваю оптом вместе с ос. Хочу просто cortex-m3 с большой памятью.
Для начала нужно через мультиплексор настроить gpioa (пару ног) и uart данных.
Или можно как то обратиться в этой ситуации к функциям в пзу?
 

Creep

Member
Именно - 5% от аппаратных возможностей.
А решающее значение в SoC имеет встроенные контроллеры
собственно именно обилие встроенных контроллеров и приводит к 5%.
с другой стороны - МК (набор элементов) под задачу_А использующий 50-90% аппаратных ресурсов по стоимости сравнимы с МК(модулем) у которого будет использовано 5% ресурсов. И зачем стесняться в таком случае?
 

pvvx

Активный участник сообщества
Или можно как то обратиться в этой ситуации к функциям в пзу?
Да. Там есть практически все функции по установке GPIO и подтяжек и переписывать их нет особого смысла. Работают по таблицам переименования GPIO к виду в несколько портов, указанных в PDF на чип... Нет только CS для SPI и прочих более специфичных установок, но они уже используются во внешнем HAL...
 

pvvx

Активный участник сообщества
собственно именно обилие встроенных контроллеров и приводит к 5%.
с другой стороны - МК (набор элементов) под задачу_А использующий 50-90% аппаратных ресурсов по стоимости сравнимы с МК(модулем) у которого будет использовано 5% ресурсов. И зачем стесняться в таком случае?
Там всё хорошо, со встроенным. Это только в Arduino с этим проблема. Так показывает практика, когда SoC подбирается под нужды, а не наоборот.
Тот-же аппаратный I2C пашет изумительно, но в Arduino ограниченная реализация и все либы предпочитают ногодрыг, что никогда не ставят в серийку. Ну и т.д. с UART, SPI, SDIOH... Особенно всё, что связано с DMA. А без него и 50% нормальных задач не решить. Тут можно сказать Ардуинщикам только что "убогим и убогая жизнь", ограниченная предоставленными либами, написанными не на Arduino ...
 
Последнее редактирование:

pvvx

Активный участник сообщества
Weather informer в спичечный коробок :)
Читает файлы (банеры 120x156) PNG из https://info.weather.yandex.net/??/3_white.ru.png
Выбрать города и ссылки на png тут: Информер погоды для вашего сайта — Яндекс.Погода
RtlDuino/development/rtl87xx/libraries/ysPNG/HttpsPngWeatherInformer at master · pvvx/RtlDuino · GitHub
Проблемы только в том, что развертка PNG и SSL требует много RAM и на ESP это невозможно...
 
Последнее редактирование:

pvvx

Активный участник сообщества
RAK477,8711af, wifi убиваю оптом вместе с ос. Хочу просто cortex-m3 с большой памятью.
Для начала нужно через мультиплексор настроить gpioa (пару ног) и uart данных.
Или можно как то обратиться в этой ситуации к функциям в пзу?
Я там дописал в SDK bitbang с I/O (получение адресов и простое включение Pin) RTL00MP3/bitband_io.c at master · pvvx/RTL00MP3 · GitHub
Но не знаю как вы это будете прикручивать к Arduino...
Чтобы заработал хоть какой встроенный контроллер на него надо подключить клоки и питание (типа СS). Даже на GPIO контроллер (GPIO_FuncOn_8195a()).
 

barakuda62

New member
Weather informer в спичечный коробок :)
PVVX не могли бы вы переписать (дописать) библиотеку "Raw_ST7735.cpp", для 9 бит SPI, у меня такой же экранчик только с 3 проводным 9 бит интерфейсом, или подскажите как завести линию DC на mosi !?
Мучаю модуль RAK_475 RTL8711AM
 

ru-sh

New member
У кого-то получилось запустить WebSocket сервер на RTL8710?
Это должно быть идеальным решением для активной двухсторонней коммуникации с WiFi-IoT устройствами.
 

pvvx

Активный участник сообщества
PVVX не могли бы вы переписать (дописать) библиотеку "Raw_ST7735.cpp", для 9 бит SPI, у меня такой же экранчик только с 3 проводным 9 бит интерфейсом, или подскажите как завести линию DC на mosi !?
Мучаю модуль RAK_475 RTL8711AM
Номера выводов я рисовал для RTL00 модуля.
https://github.com/pvvx/RtlDuino/raw/master/ArduinoRTL00.gif
У вашего модуля можно посмотреть по соответствию с файлом RtlDuino/variant.cpp at master · pvvx/RtlDuino · GitHub
Номера для rtlDuino там помечены как D0...D18.
В примере с PNG вывод DC задан в скетче #define TFT_DC 4

У кого-то получилось запустить WebSocket сервер на RTL8710?
Это должно быть идеальным решением для активной двухсторонней коммуникации с WiFi-IoT устройствами.
В rtlDuino есть только WebSocketClient. WebSocket сервера нет, но есть множество сторонних либ для Arduino к этому делу. Сложности могут быть если вы захотите поддержку SSL в WebSocket Server...
 

barakuda62

New member
После перезаписи hal_i2c.c, hal_pinmux.c, i2c_api.c, rtl8195a_i2c.c + hal_efuse.c из моей модифицированной SDK в папку cores/arduino заработал аппаратный I2C (выводы PC4/PC5).
А где раздобыть эти модифицированные файлы ?, у меня в папке cores/arduino их нет, I2C у меня не работает.
 

pvvx

Активный участник сообщества
NFC и подключение к Web на RTL00. NFC катушка припаяна к пинам чипа RTL8710AF. (Подробнее там -> NFC и RTL00)
Начальный источник "скетча":【IoT實作】將Ameba NFC功能整合入TFT/ WiFi/ PWM系統
Код:
#include <WiFi.h>
#include <NfcTag.h>
#include <netbios.h>
#include "myAP.h"

#define LED_pin 4

#ifndef _MYAPCFG_H_
char ssid[] = "yourNetwork";      // your network SSID (name)
char pass[] = "Password";   // your network password
#endif
char myIpString[24];

WiFiServer server(80);
IPAddress ip;

void setup() {
  pinMode(LED_pin, OUTPUT);
  //Initialize serial and wait for port to open:
  Serial.begin(38400);
  while (!Serial); // wait for serial port to connect. Needed for native USB port only
  // attempt to connect to Wifi network:
  while (WiFi.begin(ssid, pass) != WL_CONNECTED) delay(100);
  printf("\nStart server\n");
  server.begin();
  ip = WiFi.localIP();
  sprintf(myIpString, "%d.%d.%d.%d", ip[0], ip[1], ip[2], ip[3]);
  NfcTag.appendRtdUri(myIpString, RTD_URI_HTTP);
  NfcTag.begin();
  Serial.println("\nNFC is OK!");
}

void loop() {
  WiFiClient client = server.available();

  Serial.println(client);
  if (client) {
    Serial.println("Start client");
    String currentLine = "";
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        Serial.write(c);
        if (c == '\n') {
          if (currentLine.length() == 0) {

            client.println("HTTP/1.1 200 OK");
            client.println("Content-type:text/html");
            client.println();
            client.println("<html>");
            client.print("<table align='center' border='5'>");
            client.print("<tr>");
            client.print("<td colspan='2' align='center'>Control Led</td>");
            client.print("</tr>");
            client.print("<td><input type='button' value='ON' onclick=self.location.href=\"/on\" style='width:90px;height:30px;font-size:20px;'></td>");
            client.print("<td><input type='button' value='OFF' onclick=self.location.href=\"/off\" style='width:90px;height:30px;font-size:20px;'></td>");
            client.print("</table>");
            client.println();
            client.println("</html>");
            break;
          } else {
            currentLine = "";
          }
        } else if (c != '\r') {
          currentLine += c;
        }
        if (currentLine.endsWith("GET /on")) {
          digitalWrite(LED_pin, LOW);
        } else  if (currentLine.endsWith("GET /off")) {
          digitalWrite(LED_pin, HIGH);
        }
      }
    }
    // close the connection:
    client.stop();
    Serial.println("client disonnected");
  }
}
Лог в UART:
Код:
Initializing WIFI ...
WIFI initialized

RTL8195A[Driver]: set ssid [*******]
RTL8195A[Driver]: start auth to **:**:**:**:**:**
RTL8195A[Driver]: auth success, start assoc
RTL8195A[Driver]: association success(res=2)
RTL8195A[Driver]: set pairwise key to hw: alg:4(WEP40-1 WEP104-5 TKIP-2 AES-4)
RTL8195A[Driver]: set group key to hw: alg:4(WEP40-1 WEP104-5 TKIP-2 AES-4) keyid:2
Interface 0 IP address : 192.168.1.122
Start server
NFC is OK!
A client connected to this server :
[PORT]: 51279
[IP]:192.168.1.60

1
Start client
GET / HTTP/1.1
Host: 192.168.1.122
Connection: keep-alive
Upgrade-Insecure-Requests: 1
Save-Data: on
User-Agent: Mozilla/5.0 (Linux; Android 6.0.1; SM-N910C Build/MMB29K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.125 Mobile Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate
Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4

client disonnected
Итог на телефоне, после приближения к катушке NFC у модуля:
Screenshot_2017-07-11-03-50-31.gif
On/Off переключает красный светодиод на модуле RTL00.
 
Последнее редактирование:

pvvx

Активный участник сообщества
RAK477,8711af, wifi убиваю оптом вместе с ос. Хочу просто cortex-m3 с большой памятью.
Встроил bitband_io в rtlDuino. В качестве примера к датчику SHTxx -> RtlDuino/SHTxx.cpp at master · pvvx/RtlDuino · GitHub
Код:
===== Enter Image 2 ====
Init Heap Region: 0x10003000[12288]
Init Heap Region: 0x1000e420[400352]
Status reg = 0x0
Status reg = 0x1
Temperature = 26.94 C, Humidity = 47.22 %, Dewpoint = 14.74 C
Temperature = 26.94 C, Humidity = 47.22 %, Dewpoint = 14.74 C
Temperature = 26.94 C, Humidity = 47.22 %, Dewpoint = 14.74 C
Temperature = 26.94 C, Humidity = 47.22 %, Dewpoint = 14.74 C
Temperature = 26.94 C, Humidity = 47.22 %, Dewpoint = 14.74 C
Temperature = 26.94 C, Humidity = 47.22 %, Dewpoint = 14.74 C
Temperature = 26.94 C, Humidity = 47.22 %, Dewpoint = 14.74 C
Temperature = 26.94 C, Humidity = 47.22 %, Dewpoint = 14.74 C
....
Снимок1541.gif
 
Последнее редактирование:

koreshx

New member
pvvx, Добрый день. Знатная у вас амбразура получилась. Огромное спасибо Вам за обнородование результатов совершенно безвозмездных титанических трудов.
Пока в процессе баловства возник один вопрос только. В коде SPI.cpp закомментирована функция
Код:
void SPIClass::transfer(byte _pin, void *_buf, size_t _count, SPITransferMode _mode)
{
    if (_pin != pinSS) {
        pinMode(_pin, OUTPUT);
        digitalWrite(_pin, 0);
    }
    spi_master_write_stream( (spi_t *)pSpiMaster , (char *)_buf, (uint32_t)_count );
    while(spi_busy((spi_t *)pSpiMaster));
    if (_pin != pinSS && _mode == SPI_LAST) {
        digitalWrite(_pin, 1);
    }
}
и раскомментирована
Код:
void SPIClass::transfer(byte _pin, void *_buf, size_t _count, SPITransferMode _mode)
{
if (_pin != pinSS) {
pinMode(_pin, OUTPUT);
digitalWrite(_pin, 0);
}
spi_master_write_read_stream( (spi_t *)pSpiMaster , (char *)_buf, (char *)_buf, (uint32_t)_count );
while(spi_busy((spi_t *)pSpiMaster));
if (_pin != pinSS && _mode == SPI_LAST) {
digitalWrite(_pin, 1);
}
}
Этот файл случайно на гитхаб попал или чего-то не понимаю?
С таким вариантом файла примеры использующие передачу буфера не работают (с spi_master_write_stream всё гуд). И поясните пожалуйста конструкцию, если это не ошибка
Код:
spi_master_write_read_stream( (spi_t *)pSpiMaster , (char *)_buf, (char *)_buf, (uint32_t)_count );
где на вход и на выход используется один и тот же буфер.

И ещё есть небольшой вопрос по железу. Может в каком-то из доков попадались рекомендации от рилтека по правильному согласованию NFC антенны с приёмопередатчиком чипа?

Спасибо.
 

pvvx

Активный участник сообщества
С таким вариантом файла примеры использующие передачу буфера не работают (с spi_master_write_stream всё гуд). И поясните пожалуйста конструкцию, если это не ошибка
Код:
spi_master_write_read_stream( (spi_t *)pSpiMaster , (char *)_buf, (char *)_buf, (uint32_t)_count );
где на вход и на выход используется один и тот же буфер.
При тесте у меня вышло наоборот и передача работает.
Без данной функции не организовать передачу и прием значений по SPI. SPI аппаратно имеет дуплекс - отдельные пины передачи и приема данных.
Нестыковки с использованием одного буфера не происходит. Сколько байт передается, столько и принимается.
Условие только одно - если вы указываете какой const массив, то при передаче он его испортит принятыми значениями :).
Arduino это кошмар и не имеет строгого описания функционирования и списка названий функций с параметрами. От этого не знаю как ему задать разные методы.
Для некоторых контроллеров и соответственно для некоторых примеров данная функция так и работает. По этому и поправлял, но оставил "другой вариант".
И ещё есть небольшой вопрос по железу. Может в каком-то из доков попадались рекомендации от рилтека по правильному согласованию NFC антенны с приёмопередатчиком чипа?
Не находил. Вообще про NFC там полный "молчок", наверно для тех кто без NDA. Даже не указан тип MCU, для которого загружается код.
И там не "антенна", а просто обмотка трансформатора. :) Согласование, типичное для антенн там не требуется. Просто катушка - диаметр и кол-во витков выбираете сами, иcходя из габаритов... Наверно есть какой-то лучший вариант значения индуктивности, но пока не встречал даже таких описаний к NFC...

"Для работы с RF-хостами к микросхемам EEPROM подключается индуктивная антенна. Индуктивность антенны, подключаемой к выводам AC0, AC1 микросхем EEPROM серий M24 рассчитывается таким образом, чтобы резонансная частота параллельного колебательного контура, образованного индуктивностью антенны и встроенной емкостью (параметр Ctunning) была равна 13.65 МГц. " Связь ближнего действия: NFC EEPROM для расходомеров и систем «умный дом»

Там указывается, что расчет антенны есть в RF-Design
Снимок1596.gif
eDesignSuite - STMicroelectronics
но требуется регистрация и не пашет в Chrome...
Есть ещё http://www.st.com/content/ccc/resou...df/jcr:content/translations/en.CD00221490.pdf
 
Последнее редактирование:

koreshx

New member
pvvx, Спасибо. По SPI суть понял. Не совсем понял почему не работает на примерах ILI9341, но это не важно.

По NFC видимо придётся немного методом тыка... есть уже готовый девайс куда и планировал rtl приспособить, в котором антенну свою я согласовывал с mifare приёмником. Хотел его антенну без изменений глобальных использовать. Попробую подключить наверно как в доках на NRF52 (напрямую, только по кондёру порядка 120pf с каждой стороны), индуктивность у меня почти 1 в 1 как у них в примерах.
nrf_nfc.png
 
Сверху Снизу