From 35de438c2374c90b1ab9f801d6446b9e0a191a00 Mon Sep 17 00:00:00 2001 From: Sergey Date: Fri, 15 May 2020 15:49:06 +0300 Subject: [PATCH] =?UTF-8?q?Readme=20=D0=9F=D0=B0=D1=80=D0=B0=D0=BC=D0=B5?= =?UTF-8?q?=D1=82=D1=80=D1=8B=20=D0=B2=20=D0=BA=D0=BE=D0=BD=D1=84=D0=B8?= =?UTF-8?q?=D0=B3=D1=83=D1=80=D0=B0=D1=86=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/Configuration.h | 1 - Marlin/Configuration_adv.h | 2 +- README.md | 126 ++++++++++++++++++++++++++++++++++++- 3 files changed, 126 insertions(+), 3 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 5dd3a99a5a..0f2e9d7711 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -1464,7 +1464,6 @@ #undef USE_REAL_EEPROM #undef FLASH_EEPROM_EMULATION #undef SRAM_EEPROM_EMULATION -//#define EEPROM_AT24C16 //#define USE_WIRED_EEPROM 1 //#define I2C_EEPROM_AT24C16 //#define E2END (2*1024 - 1) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 92ce3fae0e..eb4f184690 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -1740,7 +1740,7 @@ // Without XON/XOFF flow control (see SERIAL_XON_XOFF below) 32 bytes should be enough. // To use flow control, set this buffer size to at least 1024 bytes. // :[0, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048] -#define RX_BUFFER_SIZE 1024 +#define RX_BUFFER_SIZE 2048 #if RX_BUFFER_SIZE >= 1024 // Enable to have the controller send XON/XOFF control characters to diff --git a/README.md b/README.md index 0154686fcc..2c788a9191 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ ## Версия с тестовой поддержкой WIFI модуля -Это конфигурация [официального Marlin](https://github.com/MarlinFirmware/Marlin) для принтера Flying Bear 4S. +Это конфигурация [официального Marlin](https://github.com/MarlinFirmware/Marlin) для принтера Flying Bear Ghost 4S. Эта ветка содержит код для работы с WIFI модулем, установленным в FB4S. Загрузка файлов через стандартный plugin в Cura. ## Что работает, что не работает @@ -74,3 +74,127 @@ IP адрес так же будет на экране. Если файл успешно принят отобразится "Upload done" и **прозвучит один звуковой сигнал** Если во время приема файла были ошибки, отобразится надпись "Upload Failed" и **прозвучит три звуковых сигнала** + +### EEPROM + +На FB4S установлена плата [MKS Robin Nano v.1.1](https://fbghost.info/bin/view/Main/%D0%AD%D0%BB%D0%B5%D0%BA%D1%82%D1%80%D0%B8%D0%BA%D0%B0%20%2F%20%D0%AD%D0%BB%D0%B5%D0%BA%D1%82%D1%80%D0%BE%D0%BD%D0%B8%D0%BA%D0%B0/%D0%A3%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D1%8F%D1%8E%D1%89%D0%B0%D1%8F%20%D0%BF%D0%BB%D0%B0%D1%82%D0%B0/MKS%20Robin%20Nano%20V1.1/). На плате установленно 2 микросхемы флеш памяти: AT24C16 (2кб) подключена по I2C и W25Q64 подключена по SPI. + +Размер данных, которые сохраняются в EEPROM зависит от включенных опций. При сохранении настроек командой M500, в ответе есть размер сохраняемых данных. + +В качестве места хренения EEPROM в Marlin доступны несколько вариантов: + +* SD карта. Этот вариант наиболее предпочтительный, если нет осознанного желания хранить EEPROM где-то еще. + +Для включения в [Configuration.h](./Marlin/Configuration.h) в разделе EEPROM должно быть включено SDCARD_EEPROM_EMULATION и отключены другие опции хранения. Пример: + +```C +#define EEPROM_SETTINGS // Persistent storage with M500 and M501 +#define EEPROM_CHITCHAT // Give feedback on EEPROM commands. Disable to save PROGMEM. +#if ENABLED(EEPROM_SETTINGS) +#define SDCARD_EEPROM_EMULATION +#undef USE_REAL_EEPROM +#undef FLASH_EEPROM_EMULATION +#undef SRAM_EEPROM_EMULATION +//#define USE_WIRED_EEPROM 1 +//#define I2C_EEPROM_AT24C16 +//#define E2END (2*1024 - 1) +#define EEPROM_AUTO_INIT // Init EEPROM automatically on any errors. +#endif +``` + +* I2C EEPROM Для включения нужно включить I2C_EEPROM_AT24C16 и установить USE_WIRED_EEPROM и задать размер EEPROM в E2END, а остальные опции отключить. Пример: + +```C +#define EEPROM_SETTINGS // Persistent storage with M500 and M501 +#define EEPROM_CHITCHAT // Give feedback on EEPROM commands. Disable to save PROGMEM. +#if ENABLED(EEPROM_SETTINGS) +#undef SDCARD_EEPROM_EMULATION +#undef USE_REAL_EEPROM +#undef FLASH_EEPROM_EMULATION +#undef SRAM_EEPROM_EMULATION +#define USE_WIRED_EEPROM 1 +#define I2C_EEPROM_AT24C16 +#define E2END (2*1024 - 1) +#define EEPROM_AUTO_INIT // Init EEPROM automatically on any errors. +#endif +``` + +При первом включении все содержимое AT24C16 будет переписано. Память не быстрая, поэтому процесс занимает до 10 секунд. В дальнейшем в память пишутся только измененные значения, поэтому работает быстрее. + +* SPI_EEPROM Хранение в памяти подключенной по SPI. Этот вариант пока не работает. +* FLASH_EEPROM_EMULATION Это хранение EEPROM в flash памяти STM32. Этот вариант не работает. +* SRAM_EEPROM_EMULATION Этот вариант не работает. + +### Работа с Octoprint + +При работе с Octoprint через Uart возможны проблемы при печати. Рекомендуется, увеличить буферы команд в настройках Marlin [Configuration_adv.h](./Marlin/Configuration_adv.h): + +```C +#define MAX_CMD_SIZE 96 //Максимальный размер команды +#define BUFSIZE 32 //Количество команд, которые стоят в плане. +#define TX_BUFFER_SIZE 256 //Размер буфера для отправки +#define RX_BUFFER_SIZE 2048 //Размер буфера для приема +``` + +Процесс получения данных и UART организован следующим образом: + +* используется аппаратный UART STM32 +* включено прерывание по приему каждого байта, используется библиотека libmaple, файл .platformio/packages/framework-arduinoststm32-maple/STM32F1/system/libmaple/usart_private.h: + +```C +__weak void __irq_usart1(void) { + usart_irq(&usart1_rb, &usart1_wb, USART1_BASE); +} +``` + +В обработчике usart_irq (в файле .platformio/packages/framework-arduinoststm32-maple/STM32F1/system/libmaple/usart_private.h) пришедший байт помещается в буфер функцией + +```C +rb_push_insert(rb, (uint8)regs->DR); +``` + +rb имеет тип структуры ring_buffer: + +```C +typedef struct ring_buffer { + volatile uint8 *buf; /**< Buffer items are stored into */ + volatile uint16 head; /**< Index of the next item to remove */ + volatile uint16 tail; /**< Index where the next item will get inserted */ + volatile uint16 size; /**< Buffer capacity minus one */ +} ring_buffer; +``` + +Сам приемный буфер и его размер задается в .platformio/packages/framework-arduinoststm32-maple/STM32F1/system/libmaple/include/libmaple/usart.h: + +```C +typedef struct usart_dev { + usart_reg_map *regs; /**< Register map */ + ring_buffer *rb; /**< RX ring buffer */ + ring_buffer *wb; /**< TX ring buffer */ + uint32 max_baud; /**< @brief Deprecated. + * Maximum baud rate. */ + uint8 rx_buf[USART_RX_BUF_SIZE]; /**< @brief Deprecated. + * Actual RX buffer used by rb. + * This field will be removed in + * a future release. */ + uint8 tx_buf[USART_TX_BUF_SIZE]; /**< Actual TX buffer used by wb */ + rcc_clk_id clk_id; /**< RCC clock information */ + nvic_irq_num irq_num; /**< USART NVIC interrupt */ +} usart_dev; +``` + +Размер массива задан при помощи USART_RX_BUF_SIZE и USART_TX_BUF_SIZE: + +```C +#ifndef USART_RX_BUF_SIZE +#define USART_RX_BUF_SIZE 64 +#endif + +#ifndef USART_TX_BUF_SIZE +#define USART_TX_BUF_SIZE 64 +#endif +``` + +Для успешной работы Octoprint возможно имеет смысл увеличить эти значения. Например до 1024. Это предположение не тестировалось на практике. Возможно, одновременно с увеличением размера буферов в драйвере поможет и увеличение скорости UART до 250000. + +* Marlin периодически проверяет, есть ли у драйвера в буфере данные, забирает их оттуда и складывает в свой буфер, который задан RX_BUFFER_SIZE.