OVMS3-idf/examples/peripherals/spi_master/hd_eeprom/main/spi_eeprom_main.c
michael fdf983e0c4 spi: fix config break and reduce overhead of the bus lock on SPI1
The SPI bus lock on SPI1 introduces two side effects:

1. The device lock for the main flash requires the
`CONFIG_FREERTOS_SUPPORT_STATIC_ALLOCATION` to be selected, however this
option is disabled by default in earlier IDF versions. Some developers
may find their project cannot be built by their old sdkconfig files.

2. Usually we don't need the lock on the SPI1 bus, due to it's
restrictions. However the overhead still exists in this case, the IRAM
cost for static version of semaphore functions, and the time cost when
getting and releasing the lock.

This commit:

1. Add a CONFIG_SPI_FLASH_BYPASS_MAIN_LOCK option, which will forbid the
space cost, as well as the initialization of the main bus lock.

2. When the option is not selected, the bus lock is used, the
`CONFIG_FREERTOS_SUPPORT_STATIC_ALLOCATION` will be selected explicitly.

3. Revert default value of `CONFIG_FREERTOS_SUPPORT_STATIC_ALLOCATION`
to `n`.

introduced in 49a48644e4.

Closes https://github.com/espressif/esp-idf/issues/5046
2020-04-22 16:06:13 +08:00

116 lines
3 KiB
C

/* SPI Master Half Duplex EEPROM example.
This example code is in the Public Domain (or CC0 licensed, at your option.)
Unless required by applicable law or agreed to in writing, this
software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
CONDITIONS OF ANY KIND, either express or implied.
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/spi_master.h"
#include "driver/gpio.h"
#include "sdkconfig.h"
#include "esp_log.h"
#include "spi_eeprom.h"
/*
This code demonstrates how to use the SPI master half duplex mode to read/write a AT932C46D EEPROM (8-bit mode).
*/
#ifdef CONFIG_IDF_TARGET_ESP32
# ifdef CONFIG_EXAMPLE_USE_SPI1_PINS
# define EEPROM_HOST SPI1_HOST
# define DMA_CHAN 0
// Use default pins, same as the flash chip.
# define PIN_NUM_MISO 7
# define PIN_NUM_MOSI 8
# define PIN_NUM_CLK 6
# else
# define EEPROM_HOST HSPI_HOST
# define DMA_CHAN 2
# define PIN_NUM_MISO 18
# define PIN_NUM_MOSI 23
# define PIN_NUM_CLK 19
# endif
# define PIN_NUM_CS 13
#elif defined CONFIG_IDF_TARGET_ESP32S2
# define EEPROM_HOST SPI2_HOST
# define DMA_CHAN EEPROM_HOST
# define PIN_NUM_MISO 37
# define PIN_NUM_MOSI 35
# define PIN_NUM_CLK 36
# define PIN_NUM_CS 34
#endif
static const char TAG[] = "main";
void app_main(void)
{
esp_err_t ret;
#ifndef CONFIG_EXAMPLE_USE_SPI1_PINS
ESP_LOGI(TAG, "Initializing bus SPI%d...", EEPROM_HOST+1);
spi_bus_config_t buscfg={
.miso_io_num = PIN_NUM_MISO,
.mosi_io_num = PIN_NUM_MOSI,
.sclk_io_num = PIN_NUM_CLK,
.quadwp_io_num = -1,
.quadhd_io_num = -1,
.max_transfer_sz = 32,
};
//Initialize the SPI bus
ret = spi_bus_initialize(EEPROM_HOST, &buscfg, DMA_CHAN);
ESP_ERROR_CHECK(ret);
#else
ESP_LOGI(TAG, "Attach to main flash bus...");
#endif
eeprom_config_t eeprom_config = {
.cs_io = PIN_NUM_CS,
.host = EEPROM_HOST,
.miso_io = PIN_NUM_MISO,
};
#ifdef CONFIG_EXAMPLE_INTR_USED
eeprom_config.intr_used = true;
gpio_install_isr_service(0);
#endif
eeprom_handle_t eeprom_handle;
ESP_LOGI(TAG, "Initializing device...");
ret = spi_eeprom_init(&eeprom_config, &eeprom_handle);
ESP_ERROR_CHECK(ret);
ret = spi_eeprom_write_enable(eeprom_handle);
ESP_ERROR_CHECK(ret);
const char test_str[] = "Hello World!";
ESP_LOGI(TAG, "Write: %s", test_str);
for (int i = 0; i < sizeof(test_str); i++) {
// No need for this EEPROM to erase before write.
ret = spi_eeprom_write(eeprom_handle, i, test_str[i]);
ESP_ERROR_CHECK(ret);
}
uint8_t test_buf[32] = "";
for (int i = 0; i < sizeof(test_str); i++) {
ret = spi_eeprom_read(eeprom_handle, i, &test_buf[i]);
ESP_ERROR_CHECK(ret);
}
ESP_LOGI(TAG, "Read: %s", test_buf);
ESP_LOGI(TAG, "Example finished.");
while (1) {
// Add your main loop handling code here.
vTaskDelay(1);
}
}