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

Вопрос I2C & UART1

Discriminator

New member
Всем добрый день.

Пытаюсь разбираться с SDK (IoT) от Espressif и модулем ESP-12. Правильно ли я понимаю, что не ковыряя модуль до UART1 не доберешься. Либо, похоже брать что-то типа ESP-12-e.
А I2C, по сути, не полноценный и можно самому назначить пины на которых он работает.

Кстати, может существует такая же библиотечка эмулирующая UART на произвольных пинах ?

Спасибо.
 

nikolz

Well-known member
это я не понял,
так как в DEVKIT (он сделан на ESD-12) нет UART1 ,
есть 0 и 2.
 

nikolz

Well-known member
Судя по этому:
1) UART0 используется для данных TX / RX, размер буфера RX является 0x100, c сигналом прерывания
* UART1 используется только для отладки
----------------------------------------
2) UART0 и uart1 по прерыванию объединеныr, когда прерывание происходит, см рег 0x3ff20020,
Бит 2, бит 0 представляет Uart1 и Uart0 соответственно
-----------------------------------
Вам придется написать самому драйвер для UART1
 

pvvx

Активный участник сообщества
UART2 это GPI013 и GPI015 они выведены в ESP-12
Это CTS и RTS от UART0.
UART1 имеет возможность вывести всего TX на GPIO2 - остальные выводы UART1 заняты Flash.
UART2 на чипе нету. Хватить баламутить народ. :)
 

Discriminator

New member
Это CTS и RTS от UART0.
UART2 на чипе нету. Хватить баламутить народ. :)
Хех...

UART1 имеет возможность вывести всего TX на GPIO2 - остальные выводы UART1 заняты Flash.
да - с этим я разобрался... И как я понимаю на него os_printf выводит информацию...
 

Discriminator

New member
Читайте документацию, там все написано. Все ошибки шлите китайцам.
можно ссылочку ? об UART2 я находил только одно упоминание на NodeMCU http://bbs.nodemcu.com/t/uart2-exists-in-nodemcu-esp8266/162
Причем там сказанно, что придется разделять во времени работу UART0 и UART2.
В пинмапах я не вижу упоминаний об UART2, так же как и в IoT SDK

UPD: И да - реализация разделения не входит в мои интересы... Собственно я надеялся оставить UART0 для себя - для отладочки... А для подключаемого модулька использовать еще один...
 
Последнее редактирование:

nikolz

Well-known member
Discriminator,
ссылки не работают.
Могу либо выложить их схему либо ждемс когда у них заработает сайт.
То что я привел выше написано в софте.
Так как прерывание общее то придется самому делать обработчик прерываний
В софте для UART1 есть лишь вывод байта.
Буфер реализован лишь для UART0
Но там и сказано что uart1 используется для вывода отладочной информации .
Другой информации у меня нет.
Я обычно такие вопросы (т е о конкретной проблеме или реализации) задаю китайцам, они отвечают вполне конкретно и вежливо.
Рекомендую спросить у них.
 

nikolz

Well-known member
и еще
"UartDev is defined and initialized in rom code."
полагаю, что настройка конкретики для уарт делается в заводских настройках.
Возможно что в nodeMCU сделано как указано на их схеме.
 

nikolz

Well-known member
и вот еще
PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO2_U, FUNC_U1TXD_BK);
т е UART1 настроен для вывода
а для ввода надо делать самому
 

nikolz

Well-known member

Предупреждение: последний раз прячу за вас картинки и простыни кода под спойлер! (модератор)
 
Последнее редактирование модератором:

pvvx

Активный участник сообщества
nikolz - И где UART2? :confused:
Тут "железные вопросы", а не NodeMCU :)
Разработчики чипа ничего не знают о UART2 :):):)
 

Discriminator

New member
pvvx, просто на схеме выводы контроллера подписаны как TXD2 и RXD2
я имею ввиду сам чип esp8266
 

pvvx

Активный участник сообщества
pvvx, просто на схеме выводы контроллера подписаны как TXD2 и RXD2
я имею ввиду сам чип esp8266
У UART0 и UART1 можно менять только их личные пины RTS<->TX CTS<->RX местами. Где-то на форуме есть тема, где разбирались с битами управления UART (там и не только это можно слепить с выходами UARTx, к примеру в моей свалке WEB ещё инверсия сигналов RX/TX/CTS/RTS). Но счас что-то не найти, т.к. по названию темы не найти, да и тут написано I2C :)...
В Espressif SDK есть только смена выводов UART0 TX/RX на GPIO13 и GPIO15:
system_uart_swap() : UART0 swap. Use MTCK as UART0 RX, MTDO as UART0 TX, so ROM log will not output from this new UART0. We also need to use MTDO (U0CTS) and MTCK (U0RTS) as UART0 in hardware.
Код:
// "реверс" SDK 1.0.1 b2
#include "c_types.h"
#include "eagle_soc.h"
void system_uart_swap(void)
{
    user_uart_wait_tx_fifo_empty(0, 500000);
    user_uart_wait_tx_fifo_empty(1, 500000);
    PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTCK_U, 4);    // 0x60000808 &= 0xECF;  0x60000808 |= 0x100;
    PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDO_U, 4);    // 0x60000810 &= 0xECF;  0x60000810 |= 0x100;
    SET_PERI_REG_MASK((PERIPHS_DPORT_BASEADDR+0x28), 4); //0x3FF00028 |= 4;
}
А любимые у nikolz его обманщики китайцы написали TXD2 и RXD2 вместо TXD0' и RXD0'.
Ведь жаждущим NodeLua всё равно. :)
 
Последнее редактирование:

nikolz

Well-known member
pvvx,
Хоть и нет удовольствия с Вами беседовать,
но все же попробую помочь заблудшей душе и уберечь от блужданий в потемках лжи ищущих правду.
---------------------------------------------------
Начну с того, что данный рассказ основываю исключительно на своем опыте разработки
и использовании различных разработок не только китайских.
Во-первых, микропроцессорный(микроконтроллерный) DEVKIT никогда не делается голым железом.
Так как в этом случае - это мертвый выкидыш.
-------------------------------------------------
Вот и в данном случае, если Вы внимательно посмотрите на схему ,
которую я привел выше, то внезапно для себя увидите надпись в нижнем углу NODEMCU (и зачем это китайцы обманывают Вас?) .
---------------------------------------------------
Более того, данная схема , вместе со слоями печатной платы (т е вот обманщики даже документацию на печатную плату дают)
содержится в пакете nodeMCU devkit-master.
(совсем китайцы обнаглели думаю мы халяве рады(но Вы то бдительны?))
---------------------------------------------------------
Далее, так как я верю разработчикам, ( ну такой уж я доверчивый)
то я НЕ ЛЕЗУ в софт под названием SDK
(ну обманули они меня, подсунули зачем-то nodemcu-firmware и не сказали, что надо лезть в SDK)
Так вот, так как я не гуру,
то я беру nodemcu-firmware и смотрю в софт,
который сделан специально под NODEMCU DEVKIT.
---------------------------------------
и тут опять китайцы обманывают,
пишут в программе драйвера UART буквально следующее:
-------------------------------
* Copyright 2013-2014 Espressif Systems (Wuxi)
* FileName: uart.c
* Description: Two UART mode configration and interrupt handler.
* Check your hardware connection while use this mode.
* Modification history:
* 2014/3/12, v1.0 create this file.
*******************************************************************************/
[HASHTAG]#define[/HASHTAG] UART0 0
[HASHTAG]#define[/HASHTAG] UART1 1
// UartDev is defined and initialized in rom code.
extern UartDevice UartDev;

LOCAL void ICACHE_RAM_ATTR
uart0_rx_intr_handler(void *para);
/******************************************************************************
* FunctionName : uart_config
* Description : Internal used function
* UART0 used for data TX/RX, RX buffer size is 0x100, interrupt enabled
* UART1 just used for debug output
* Parameters : uart_no, use UART0 or UART1 defined ahead
* Returns : NONE
*******************************************************************************/
LOCAL void ICACHE_FLASH_ATTR
uart_config(uint8 uart_no)
{
if (uart_no == UART1) {
PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO2_U, FUNC_U1TXD_BK);
} else {
/* rcv_buff size if 0x100 */
ETS_UART_INTR_ATTACH(uart0_rx_intr_handler, &(UartDev.rcv_buff));
PIN_PULLUP_DIS(PERIPHS_IO_MUX_U0TXD_U);
PIN_FUNC_SELECT(PERIPHS_IO_MUX_U0TXD_U, FUNC_U0TXD);
PIN_PULLUP_EN(PERIPHS_IO_MUX_U0RXD_U);
PIN_FUNC_SELECT(PERIPHS_IO_MUX_U0RXD_U, FUNC_U0RXD);
}

uart_div_modify(uart_no, UART_CLK_FREQ / (UartDev.baut_rate));

WRITE_PERI_REG(UART_CONF0(uart_no), UartDev.exist_parity
| UartDev.parity
| (UartDev.stop_bits << UART_STOP_BIT_NUM_S)
| (UartDev.data_bits << UART_BIT_NUM_S));


//clear rx and tx fifo,not ready
SET_PERI_REG_MASK(UART_CONF0(uart_no), UART_RXFIFO_RST | UART_TXFIFO_RST);
CLEAR_PERI_REG_MASK(UART_CONF0(uart_no), UART_RXFIFO_RST | UART_TXFIFO_RST);

//set rx fifo trigger
WRITE_PERI_REG(UART_CONF1(uart_no), (UartDev.rcv_buff.TrigLvl & UART_RXFIFO_FULL_THRHD) << UART_RXFIFO_FULL_THRHD_S);

//clear all interrupt
WRITE_PERI_REG(UART_INT_CLR(uart_no), 0xffff);
//enable rx_interrupt
SET_PERI_REG_MASK(UART_INT_ENA(uart_no), UART_RXFIFO_FULL_INT_ENA);
}
/******************************************************************************
* FunctionName : uart_tx_one_char
* Description : Internal used function
* Use uart interface to transfer one char
* Parameters : uint8 TxChar - character to tx
* Returns : OK
*******************************************************************************/
STATUS ICACHE_FLASH_ATTR
uart_tx_one_char(uint8 uart, uint8 TxChar)
{
while (true)
{
uint32 fifo_cnt = READ_PERI_REG(UART_STATUS(uart)) & (UART_TXFIFO_CNT<<UART_TXFIFO_CNT_S);
if ((fifo_cnt >> UART_TXFIFO_CNT_S & UART_TXFIFO_CNT) < 126) {
break;
}
}

WRITE_PERI_REG(UART_FIFO(uart) , TxChar);
return OK;
}

/******************************************************************************
* FunctionName : uart1_write_char
* Description : Internal used function
* Do some special deal while tx char is '\r' or '\n'
* Parameters : char c - character to tx
* Returns : NONE
*******************************************************************************/
LOCAL void ICACHE_FLASH_ATTR
uart1_write_char(char c)
{
if (c == '\n')
{
uart_tx_one_char(UART1, '\r');
uart_tx_one_char(UART1, '\n');
}
else if (c == '\r')
{
}
else
{
uart_tx_one_char(UART1, c);
}
}
--------------------------------------
Но Вы, конечно,разработчикам не верьте. Тоже Вам указ!!!
-------------------------------------------
Могу еще привести подобные примеры разработок.
И знаете, что удивительно, все делают именно так (даже немцы и американцы)
Очевидно китайцы учились в штатах,
А вы очевидно - нет.

Предупреждение: последний раз прячу за вас картинки и простыни кода под спойлер! (модератор)
 
Последнее редактирование модератором:

Discriminator

New member
Эк как тема повернула... :D
Вобщем буду делать примерно так:
Вар1: Вешаю девайс на "штатный" UART0, а "логи" кидаю по WiFi на "сервер".
Вар2: Вешаю девайс на GPIO13/15 GPIO1/3 использую для "логирования" и передачу данных на девайс... Соответственно в момент передачи данных на девайс или для получения с него переключаюсь свопом... Благо на девайсе есть выход, который вроде как срабатывает синхронно готовности очередной порции данных...
 
Сверху Снизу