FTP Client for esp-idf.
ESP-IDF V5.0 or later.
ESP-IDF V4.4 release branch reached EOL in July 2024.
git clone https://github.com/nopnop2002/esp-idf-ftpClient
cd esp-idf-ftpClient/
idf.py menuconfig
idf.py flash
This project supports the following file systems.
You can select any one using menuconfig.
Note:
The connection when using SDSPI, SDMMC, and External SPI flash Memory will be described later.
Note:
LITTLEFS requires ESP-IDF V5.2 or later.
Use partitions_example_spiffs.csv
when you select SPIFFS file system on Builtin SPI Flash Menory.
Use partitions_example_fatfs.csv
when you select FAT file system on Builtin SPI Flash Menory.
Use partitions_example_littlefs.csv
when you select LITTLEFS file system on Builtin SPI Flash Menory.
If you need more storage space in the Builtin SPI Flash Menory, you will need to modify these files.
ESP32 | ESP32S2/S3 | ESP32C2/C3/C6 | SD card pin | Notes |
---|---|---|---|---|
GPIO23 | GPIO35 | GPIO01 | MOSI | 10k pull up if can't mount |
GPIO19 | GPIO37 | GPIO03 | MISO | |
GPIO18 | GPIO36 | GPIO02 | SCK | |
GPIO5 | GPIO34 | GPIO04 | CS | |
3.3V | 3.3V | 3.3V | VCC | Don't use 5V supply |
GND | GND | GND | GND |
You can change it to any pin using menuconfig.
Note:
This project doesn't utilize card detect (CD) and write protect (WP) signals from SD card slot.
On ESP32, SDMMC peripheral is connected to specific GPIO pins using the IO MUX.
GPIO pins cannot be customized.
GPIO2 and GPIO12 cannot be changed.
So using 4-line SD mode with ESP32 is very tricky.
Please see the table below for the pin connections.
ESP32 pin | SD card pin | Notes |
---|---|---|
GPIO14 | CLK | 10k pullup |
GPIO15 | CMD | 10k pullup |
GPIO2 | D0 | 10k pullup or connect to GPIO00 |
GPIO4 | D1 | not used in 1-line SD mode; 10k pullup in 4-line SD mode |
GPIO12 | D2 | not used in 1-line SD mode; 10k pullup in 4-line SD mode |
GPIO13 | D3 | not used in 1-line SD mode, but card's D3 pin must have a 10k pullup |
N/C | CD | not used in this project |
N/C | WP | not used in this project |
3.3V | VCC | Don't use 5V supply |
GND | GND |
On ESP32-S3, SDMMC peripheral is connected to GPIO pins using GPIO matrix.
This allows arbitrary GPIOs to be used to connect an SD card.
ESP32-S3 pin | SD card pin | Notes |
---|---|---|
GPIO36 | CLK | 10k pullup |
GPIO35 | CMD | 10k pullup |
GPIO37 | D0 | 10k pullup |
GPIO38 | D1 | not used in 1-line SD mode; 10k pullup in 4-line SD mode |
GPIO33 | D2 | not used in 1-line SD mode; 10k pullup in 4-line SD mode |
GPIO34 | D3 | not used in 1-line SD mode, but card's D3 pin must have a 10k pullup |
N/C | CD | not used in this project |
N/C | WP | not used in this project |
3.3V | VCC | Don't use 5V supply |
GND | GND |
GPIO2 pin is used as a bootstrapping pin, and should be low to enter UART download mode. One way to do this is to connect GPIO0 and GPIO2 using a jumper, and then the auto-reset circuit on most development boards will pull GPIO2 low along with GPIO0, when entering download mode.
GPIO12 is used as a bootstrapping pin to select output voltage of an internal regulator which powers the flash chip (VDD_SDIO).
This pin has an internal pulldown so if left unconnected it will read low at reset (selecting default 3.3V operation).
When adding a pullup to this pin for SD card operation, consider the following:
gpio_pullup_en(GPIO_NUM_12);
call. Most SD cards work fine when an internal pullup on GPIO12 line is enabled. Note that if ESP32 experiences a power-on reset while the SD card is sending data, high level on GPIO12 can be latched into the bootstrapping register, and ESP32 will enter a boot loop until external reset with correct GPIO12 level is applied.I tested these SPI Flash Memory.
https://github.com/nopnop2002/esp-idf-w25q64
# | W25Q64 | ESP32 | ESP32-S2/S3 | ESP32-C2/C3/C6 | |
---|---|---|---|---|---|
1 | /CS | -- | GPIO5 | GPIO10 | GPIO4 |
2 | MISO | -- | GPIO19 | GPIO13 | GPIO3 |
3 | /WP | -- | 3.3V | 3.3V | 3.3V |
4 | GND | -- | GND | GND | GND |
5 | MOSI | -- | GPIO23 | GPIO11 | GPIO1 |
6 | SCK | -- | GPIO18 | GPIO12 | GPIO2 |
7 | /HOLD | -- | 3.3V | 3.3V | 3.3V |
8 | VCC | -- | 3.3V | 3.3V | 3.3V |
Note: You will get an error. It works fine after a few resets. At the moment, it is not stable.
I (2121) FTP: Initializing external SPI Flash
I (2121) FTP: Pin assignments:
I (2121) FTP: MOSI: 23 MISO: 19 SCLK: 18 CS: 5
E (2131) memspi: no response
E (2131) FTP: Failed to initialize external Flash: ESP_ERR_INVALID_RESPONSE (0x108)
After reset
I (1621) FTP: Initializing external SPI Flash
I (1621) FTP: Pin assignments:
I (1631) FTP: MOSI: 23 MISO: 19 SCLK: 18 CS: 5
I (1631) spi_flash: detected chip: winbond
I (1641) spi_flash: flash io: dio
I (1641) FTP: Initialized external Flash, size=8192 KB, ID=0xef4017
I (1651) FTP: Adding external Flash as a partition, label="storage", size=8192 KB
I (1661) FTP: Initializing FAT file system
I (1661) FTP: Mount FAT filesystem on /root
The ESP32-CAM development board has a micro SD card slot on the board.
It is connected to the ESP32 by SDMMC with 4-line Mode.
No equipment other than the development board is required.
It works very stably.
The LilyGo ESP32-S2 development board has a micro SD card slot on the board.
It is connected to the ESP32 by SPI, and the peripheral power is supplied from GPIO14.
No equipment other than the development board is required.
It works very stably.
ESP32 pin | SPI bus signal |
---|---|
GPIO11 | MOSI |
GPIO13 | MISO |
GPIO12 | SCK |
GPIO10 | CS |
GPIO14 | POWER |
Based on ftplib V4.0-1.
These routines allow programs access to the data streams connected to remote files and directories.
By default, FATFS file names can be up to 8 characters long.
If you use filenames longer than 8 characters, you need to change the values below.
By changing this, you can see the response from the server:
#define FTP_CLIENT_DEBUG 2
https://github.com/nopnop2002/esp-idf-ftpClient/tree/master/python-ftp-server
FTP Server using FAT File system.
Since it uses the FAT file system instead of SPIFFS, directory operations are possible.
https://github.com/nopnop2002/esp-idf-ftpServer
File copy using scp.
https://github.com/nopnop2002/esp-idf-scp-client
File copy using smb.
https://github.com/nopnop2002/esp-idf-smb-client