From 5cf7d3768d7f8756d231add0b0560aaaf9aa7127 Mon Sep 17 00:00:00 2001 From: michael Date: Thu, 28 Sep 2017 20:19:18 +0800 Subject: [PATCH] feat(spi_master): fine tune the timing of SPI --- components/driver/include/driver/spi_master.h | 76 +++++-- components/driver/spi_master.c | 178 +++++++++------ .../soc/esp32/include/driver/spi_pins.h | 28 +++ .../spi_master/miso_timing_waveform.rst | 17 ++ .../spi_master/miso_timing_waveform_async.rst | 19 ++ .../spi_master/spi_master_freq_tv.plt | 33 +++ .../diagrams/spi_master/spi_timing.pptx | Bin 0 -> 39038 bytes docs/_static/diagrams/spi_master/tv.csv | 29 +++ docs/_static/miso_timing_waveform.png | Bin 0 -> 14658 bytes docs/_static/miso_timing_waveform_async.png | Bin 0 -> 22020 bytes docs/_static/spi_master_freq_tv.png | Bin 0 -> 6559 bytes docs/_static/spi_miso.png | Bin 0 -> 29273 bytes .../api-reference/peripherals/spi_master.rst | 214 +++++++++++++----- 13 files changed, 448 insertions(+), 146 deletions(-) create mode 100644 components/soc/esp32/include/driver/spi_pins.h create mode 100644 docs/_static/diagrams/spi_master/miso_timing_waveform.rst create mode 100644 docs/_static/diagrams/spi_master/miso_timing_waveform_async.rst create mode 100644 docs/_static/diagrams/spi_master/spi_master_freq_tv.plt create mode 100644 docs/_static/diagrams/spi_master/spi_timing.pptx create mode 100644 docs/_static/diagrams/spi_master/tv.csv create mode 100644 docs/_static/miso_timing_waveform.png create mode 100644 docs/_static/miso_timing_waveform_async.png create mode 100644 docs/_static/spi_master_freq_tv.png create mode 100644 docs/_static/spi_miso.png diff --git a/components/driver/include/driver/spi_master.h b/components/driver/include/driver/spi_master.h index 232ad36eb7..a882336941 100644 --- a/components/driver/include/driver/spi_master.h +++ b/components/driver/include/driver/spi_master.h @@ -1,4 +1,4 @@ -// Copyright 2010-2016 Espressif Systems (Shanghai) PTE LTD +// Copyright 2010-2018 Espressif Systems (Shanghai) PTE LTD // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -22,6 +22,19 @@ #include "driver/spi_common.h" +/** SPI master clock is divided by 80MHz apb clock. Below defines are example frequencies, and are accurate. Be free to specify a random frequency, it will be rounded to closest frequency (to macros below if above 8MHz). + * 8MHz + */ +#define SPI_MASTER_FREQ_8M (APB_CLK_FREQ/10) +#define SPI_MASTER_FREQ_9M (APB_CLK_FREQ/9) ///< 8.89MHz +#define SPI_MASTER_FREQ_10M (APB_CLK_FREQ/8) ///< 10MHz +#define SPI_MASTER_FREQ_11M (APB_CLK_FREQ/7) ///< 11.43MHz +#define SPI_MASTER_FREQ_13M (APB_CLK_FREQ/6) ///< 13.33MHz +#define SPI_MASTER_FREQ_16M (APB_CLK_FREQ/5) ///< 16MHz +#define SPI_MASTER_FREQ_20M (APB_CLK_FREQ/4) ///< 20MHz +#define SPI_MASTER_FREQ_26M (APB_CLK_FREQ/3) ///< 26.67MHz +#define SPI_MASTER_FREQ_40M (APB_CLK_FREQ/2) ///< 40MHz +#define SPI_MASTER_FREQ_80M (APB_CLK_FREQ/1) ///< 80MHz #ifdef __cplusplus extern "C" @@ -40,7 +53,7 @@ extern "C" * - In full-duplex mode, however, the hardware cannot use dummy bits, so there is no way to prevent data being read from getting corrupted. * Set this flag to confirm that you're going to work with output only, or read without dummy bits at your own risk. */ -#define SPI_DEVICE_NO_DUMMY (1<<6) +#define SPI_DEVICE_NO_DUMMY (1<<6) typedef struct spi_transaction_t spi_transaction_t; @@ -57,7 +70,12 @@ typedef struct { uint8_t duty_cycle_pos; ///< Duty cycle of positive clock, in 1/256th increments (128 = 50%/50% duty). Setting this to 0 (=not setting it) is equivalent to setting this to 128. uint8_t cs_ena_pretrans; ///< Amount of SPI bit-cycles the cs should be activated before the transmission (0-16). This only works on half-duplex transactions. uint8_t cs_ena_posttrans; ///< Amount of SPI bit-cycles the cs should stay active after the transmission (0-16) - int clock_speed_hz; ///< Clock speed, in Hz + int clock_speed_hz; ///< Clock speed, divisors of 80MHz, in Hz. See ``SPI_MASTER_FREQ_*``. + int input_delay_ns; /**< Maximum data valid time of slave. The time required between SCLK and MISO + valid, including the possible clock delay from slave to master. The driver uses this value to give an extra + delay before the MISO is ready on the line. Leave at 0 unless you know you need a delay. For better timing + performance at high frequency (over 8MHz), it's suggest to have the right value. + */ int spics_io_num; ///< CS GPIO pin for this device, or -1 if not used uint32_t flags; ///< Bitwise OR of SPI_DEVICE_* flags int queue_size; ///< Transaction queue size. This sets how many transactions can be 'in the air' (queued using spi_device_queue_trans but not yet finished using spi_device_get_trans_result) at the same time @@ -87,9 +105,9 @@ struct spi_transaction_t { */ uint64_t addr; /**< Address data, of which the length is set in the ``address_bits`` of spi_device_interface_config_t. * - * NOTE: this field, used to be "address" in ESP-IDF 2.1 and before, is re-written to be used in a new way in ESP-IDF3.0. + * NOTE: this field, used to be "address" in ESP-IDF 2.1 and before, is re-written to be used in a new way in ESP-IDF3.0. * - * Example: write 0x123400 and address_bits=24 to send address of 0x12, 0x34, 0x00 (in previous version, you may have to write 0x12340000). + * Example: write 0x123400 and address_bits=24 to send address of 0x12, 0x34, 0x00 (in previous version, you may have to write 0x12340000). */ size_t length; ///< Total data length, in bits size_t rxlength; ///< Total data length received, should be not greater than ``length`` in full-duplex mode (0 defaults this to the value of ``length``). @@ -125,14 +143,14 @@ typedef struct spi_device_t* spi_device_handle_t; ///< Handle for a device on a * @param host SPI peripheral that controls this bus * @param bus_config Pointer to a spi_bus_config_t struct specifying how the host should be initialized * @param dma_chan Either channel 1 or 2, or 0 in the case when no DMA is required. Selecting a DMA channel - * for a SPI bus allows transfers on the bus to have sizes only limited by the amount of + * for a SPI bus allows transfers on the bus to have sizes only limited by the amount of * internal memory. Selecting no DMA channel (by passing the value 0) limits the amount of * bytes transfered to a maximum of 32. * - * @warning If a DMA channel is selected, any transmit and receive buffer used should be allocated in + * @warning If a DMA channel is selected, any transmit and receive buffer used should be allocated in * DMA-capable memory. * - * @return + * @return * - ESP_ERR_INVALID_ARG if configuration is invalid * - ESP_ERR_INVALID_STATE if host already is in use * - ESP_ERR_NO_MEM if out of memory @@ -146,7 +164,7 @@ esp_err_t spi_bus_initialize(spi_host_device_t host, const spi_bus_config_t *bus * @warning In order for this to succeed, all devices have to be removed first. * * @param host SPI peripheral to free - * @return + * @return * - ESP_ERR_INVALID_ARG if parameter is invalid * - ESP_ERR_INVALID_STATE if not all devices on the bus are freed * - ESP_OK on success @@ -166,12 +184,12 @@ esp_err_t spi_bus_free(spi_host_device_t host); * @param host SPI peripheral to allocate device on * @param dev_config SPI interface protocol config for the device * @param handle Pointer to variable to hold the device handle - * @return + * @return * - ESP_ERR_INVALID_ARG if parameter is invalid * - ESP_ERR_NOT_FOUND if host doesn't have any free CS slots * - ESP_ERR_NO_MEM if out of memory * - ESP_OK on success - */ + */ esp_err_t spi_bus_add_device(spi_host_device_t host, const spi_device_interface_config_t *dev_config, spi_device_handle_t *handle); @@ -179,7 +197,7 @@ esp_err_t spi_bus_add_device(spi_host_device_t host, const spi_device_interface_ * @brief Remove a device from the SPI bus * * @param handle Device handle to free - * @return + * @return * - ESP_ERR_INVALID_ARG if parameter is invalid * - ESP_ERR_INVALID_STATE if device already is freed * - ESP_OK on success @@ -206,18 +224,18 @@ esp_err_t spi_device_queue_trans(spi_device_handle_t handle, spi_transaction_t * /** * @brief Get the result of a SPI transaction queued earlier * - * This routine will wait until a transaction to the given device (queued earlier with + * This routine will wait until a transaction to the given device (queued earlier with * spi_device_queue_trans) has succesfully completed. It will then return the description of the - * completed transaction so software can inspect the result and e.g. free the memory or + * completed transaction so software can inspect the result and e.g. free the memory or * re-use the buffers. * * @param handle Device handle obtained using spi_host_add_dev - * @param trans_desc Pointer to variable able to contain a pointer to the description of the transaction - that is executed. The descriptor should not be modified until the descriptor is returned by + * @param trans_desc Pointer to variable able to contain a pointer to the description of the transaction + that is executed. The descriptor should not be modified until the descriptor is returned by spi_device_get_trans_result. * @param ticks_to_wait Ticks to wait until there's a returned item; use portMAX_DELAY to never time out. - * @return + * @return * - ESP_ERR_INVALID_ARG if parameter is invalid * - ESP_ERR_TIMEOUT if there was no completed transaction before ticks_to_wait expired * - ESP_OK on success @@ -253,6 +271,30 @@ esp_err_t spi_device_transmit(spi_device_handle_t handle, spi_transaction_t *tra */ int spi_cal_clock(int fapb, int hz, int duty_cycle, uint32_t* reg_o); +/** + * @brief Calculate the timing settings of specified frequency and settings. + * + * @param gpio_is_used True if using GPIO matrix, or False if native pins are used. + * @param input_delay_ns Input delay from SCLK launch edge to MISO data valid. + * @param eff_clk Effective clock frequency (in Hz) from spi_cal_clock. + * @param dummy_o Address of dummy bits used output. Set to NULL if not needed. + * @param cycles_remain_o Address of cycles remaining (after dummy bits are used) output. + * - -1 If too many cycles remaining, suggest to compensate half a clock. + * - 0 If no remaining cycles or dummy bits are not used. + * - positive value: cycles suggest to compensate. + * @note If **dummy_o* is not zero, it means dummy bits should be applied in half duplex mode, and full duplex mode may not work. + */ +void spi_get_timing(bool gpio_is_used, int input_delay_ns, int eff_clk, int* dummy_o, int* cycles_remain_o); + +/** + * @brief Get the frequency limit of current configurations. + * SPI master working at this limit is OK, while above the limit, full duplex mode and DMA will not work, + * and dummy bits will be aplied in the half duplex mode. + * @param gpio_is_used True if using GPIO matrix, or False if native pins are used. + * @param input_delay_ns Input delay from SCLK launch edge to MISO data valid. + * @return Frequency limit of current configurations. + */ +int spi_get_freq_limit(bool gpio_is_used, int input_delay_ns); #ifdef __cplusplus } diff --git a/components/driver/spi_master.c b/components/driver/spi_master.c index 4e6a51a5e5..e070ba9c66 100644 --- a/components/driver/spi_master.c +++ b/components/driver/spi_master.c @@ -21,13 +21,13 @@ is a combination of SPI port and CS pin, plus some information about the specifi The essence of the interface to a device is a set of queues; one per device. The idea is that to send something to a SPI device, you allocate a transaction descriptor. It contains some information about the transfer like the lenghth, address, -command etc, plus pointers to transmit and receive buffer. The address of this block gets pushed into the transmit queue. -The SPI driver does its magic, and sends and retrieves the data eventually. The data gets written to the receive buffers, +command etc, plus pointers to transmit and receive buffer. The address of this block gets pushed into the transmit queue. +The SPI driver does its magic, and sends and retrieves the data eventually. The data gets written to the receive buffers, if needed the transaction descriptor is modified to indicate returned parameters and the entire thing goes into the return queue, where whatever software initiated the transaction can retrieve it. -The entire thing is run from the SPI interrupt handler. If SPI is done transmitting/receiving but nothing is in the queue, -it will not clear the SPI interrupt but just disable it. This way, when a new thing is sent, pushing the packet into the send +The entire thing is run from the SPI interrupt handler. If SPI is done transmitting/receiving but nothing is in the queue, +it will not clear the SPI interrupt but just disable it. This way, when a new thing is sent, pushing the packet into the send queue and re-enabling the interrupt will trigger the interrupt again, which can then take care of the sending. */ @@ -68,8 +68,8 @@ typedef typeof(SPI1.clock) spi_clock_reg_t; /// struct to hold private transaction data (like tx and rx buffer for DMA). -typedef struct { - spi_transaction_t *trans; +typedef struct { + spi_transaction_t *trans; uint32_t *buffer_to_send; //equals to tx_data, if SPI_TRANS_USE_RXDATA is applied; otherwise if original buffer wasn't in DMA-capable memory, this gets the address of a temporary buffer that is; //otherwise sets to the original buffer or NULL if no buffer is assigned. uint32_t *buffer_to_rcv; // similar to buffer_to_send @@ -96,6 +96,7 @@ typedef struct { spi_clock_reg_t reg; int eff_clk; int dummy_num; + int miso_delay; } clock_config_t; struct spi_device_t { @@ -110,9 +111,9 @@ static spi_host_t *spihost[3]; static const char *SPI_TAG = "spi_master"; -#define SPI_CHECK(a, str, ret_val) \ +#define SPI_CHECK(a, str, ret_val, ...) \ if (!(a)) { \ - ESP_LOGE(SPI_TAG,"%s(%d): %s", __FUNCTION__, __LINE__, str); \ + ESP_LOGE(SPI_TAG,"%s(%d): "str, __FUNCTION__, __LINE__, ##__VA_ARGS__); \ return (ret_val); \ } @@ -177,7 +178,7 @@ esp_err_t spi_bus_initialize(spi_host_device_t host, const spi_bus_config_t *bus goto cleanup; } } - + err = esp_intr_alloc(spicommon_irqsource_for_host(host), ESP_INTR_FLAG_INTRDISABLED, spi_intr, (void*)spihost[host], &spihost[host]->intr); if (err != ESP_OK) { ret = err; @@ -207,7 +208,7 @@ esp_err_t spi_bus_initialize(spi_host_device_t host, const spi_bus_config_t *bus spihost[host]->hw->slave.wr_sta_inten=0; //Force a transaction done interrupt. This interrupt won't fire yet because we initialized the SPI interrupt as - //disabled. This way, we can just enable the SPI interrupt and the interrupt handler will kick in, handling + //disabled. This way, we can just enable the SPI interrupt and the interrupt handler will kick in, handling //any transactions that are queued. spihost[host]->hw->slave.trans_inten=1; spihost[host]->hw->slave.trans_done=1; @@ -256,14 +257,38 @@ esp_err_t spi_bus_free(spi_host_device_t host) return ESP_OK; } -static inline uint32_t spi_dummy_limit(bool gpio_is_used) +void spi_get_timing(bool gpio_is_used, int input_delay_ns, int eff_clk, int* dummy_o, int* cycles_remain_o) { - const int apbclk=APB_CLK_FREQ; - if (!gpio_is_used) { - return apbclk; //dummy bit workaround is not used when native pins are used + const int apbclk_kHz = APB_CLK_FREQ/1000; + const int apbclk_n = APB_CLK_FREQ/eff_clk; + const int gpio_delay_ns=(gpio_is_used?25:0); + + //calculate how many apb clocks a period has, the 1 is to compensate in case ``input_delay_ns`` is rounded off. + int apb_period_n = (1 + input_delay_ns + gpio_delay_ns)*apbclk_kHz/1000/1000; + int dummy_required = apb_period_n/apbclk_n; + + int miso_delay = 0; + if (dummy_required > 0) { + //due to the clock delay between master and slave, there's a range in which data is random + //give MISO a delay if needed to make sure we sample at the time MISO is stable + miso_delay = (dummy_required+1)*apbclk_n-apb_period_n-1; } else { - return apbclk/2; //the dummy bit workaround is used when freq is 40MHz and GPIO matrix is used. + //if the dummy is not required, maybe we should also delay half a SPI clock if the data comes too early + if (apb_period_n*4 <= apbclk_n) miso_delay = -1; } + if (dummy_o!=NULL) *dummy_o = dummy_required; + if (cycles_remain_o!=NULL) *cycles_remain_o = miso_delay; + ESP_LOGD(SPI_TAG,"eff: %d, limit: %dk(/%d), %d dummy, %d delay", eff_clk/1000, apbclk_kHz/(apb_period_n+1), apb_period_n, dummy_required, miso_delay); +} + +int spi_get_freq_limit(bool gpio_is_used, int input_delay_ns) +{ + const int apbclk_kHz = APB_CLK_FREQ/1000; + const int gpio_delay_ns=(gpio_is_used?25:0); + + //calculate how many apb clocks a period has, the 1 is to compensate in case ``input_delay_ns`` is rounded off. + int apb_period_n = (1 + input_delay_ns + gpio_delay_ns)*apbclk_kHz/1000/1000; + return APB_CLK_FREQ/(apb_period_n+1); } /* @@ -276,6 +301,9 @@ esp_err_t spi_bus_add_device(spi_host_device_t host, const spi_device_interface_ int apbclk=APB_CLK_FREQ; int eff_clk; int duty_cycle; + int dummy_required; + int miso_delay; + spi_clock_reg_t clk_reg; SPI_CHECK(host>=SPI_HOST && host<=VSPI_HOST, "invalid host", ESP_ERR_INVALID_ARG); SPI_CHECK(spihost[host]!=NULL, "host not initialized", ESP_ERR_INVALID_STATE); @@ -288,18 +316,23 @@ esp_err_t spi_bus_add_device(spi_host_device_t host, const spi_device_interface_ SPI_CHECK(freecs!=NO_CS, "no free cs pins for host", ESP_ERR_NOT_FOUND); //The hardware looks like it would support this, but actually setting cs_ena_pretrans when transferring in full //duplex mode does absolutely nothing on the ESP32. - SPI_CHECK(dev_config->cs_ena_pretrans==0 || (dev_config->flags & SPI_DEVICE_HALFDUPLEX), "cs pretrans delay incompatible with full-duplex", ESP_ERR_INVALID_ARG); - - //Speeds >=40MHz over GPIO matrix needs a dummy cycle, but these don't work for full-duplex connections. + SPI_CHECK(dev_config->cs_ena_pretrans <= 1 || (dev_config->flags & SPI_DEVICE_HALFDUPLEX), "cs pretrans delay > 1 incompatible with full-duplex", ESP_ERR_INVALID_ARG); + SPI_CHECK( dev_config->cs_ena_pretrans != 1 || (dev_config->address_bits == 0 && dev_config->command_bits == 0) || + (dev_config->flags & SPI_DEVICE_HALFDUPLEX), "In full-duplex mode, only support cs pretrans delay = 1 and without address_bits and command_bits", ESP_ERR_INVALID_ARG); + duty_cycle = (dev_config->duty_cycle_pos==0? 128: dev_config->duty_cycle_pos); - eff_clk = spi_cal_clock(apbclk, dev_config->clock_speed_hz, duty_cycle, (uint32_t*)&clk_reg); - uint32_t dummy_limit = spi_dummy_limit(!(spihost[host]->flags&SPICOMMON_BUSFLAG_NATIVE_PINS)); - SPI_CHECK( dev_config->flags & SPI_DEVICE_HALFDUPLEX || (eff_clk/1000/1000) < (dummy_limit/1000/1000) || + eff_clk = spi_cal_clock(apbclk, dev_config->clock_speed_hz, duty_cycle, (uint32_t*)&clk_reg); + int freq_limit = spi_get_freq_limit(!(spihost[host]->flags&SPICOMMON_BUSFLAG_NATIVE_PINS), dev_config->input_delay_ns); + //GPIO matrix can only change data at 80Mhz rate, which only allows 40MHz SPI clock. + SPI_CHECK(eff_clk <= 40*1000*1000 || spihost[host]->flags&SPICOMMON_BUSFLAG_NATIVE_PINS, "80MHz only supported on native pins", ESP_ERR_INVALID_ARG); + //Speed >=40MHz over GPIO matrix needs a dummy cycle, but these don't work for full-duplex connections. + spi_get_timing(!(spihost[host]->flags&SPICOMMON_BUSFLAG_NATIVE_PINS), dev_config->input_delay_ns, eff_clk, &dummy_required, &miso_delay); + SPI_CHECK( dev_config->flags & SPI_DEVICE_HALFDUPLEX || dummy_required == 0 || dev_config->flags & SPI_DEVICE_NO_DUMMY, -"When GPIO matrix is used in full-duplex mode at frequency > 26MHz, device cannot read correct data.\n\ +"When GPIO matrix is used in full-duplex mode at frequency > %.1fMHz, device cannot read correct data.\n\ Please note the SPI can only work at divisors of 80MHz, and the driver always tries to find the closest frequency to your configuration.\n\ -Specify ``SPI_DEVICE_NO_DUMMY`` to ignore this checking. Then you can output data at higher speed, or read data at your own risk.", - ESP_ERR_INVALID_ARG ); +Specify ``SPI_DEVICE_NO_DUMMY`` to ignore this checking. Then you can output data at higher speed, or read data at your own risk.", + ESP_ERR_INVALID_ARG, freq_limit/1000./1000 ); //Allocate memory for device spi_device_t *dev=malloc(sizeof(spi_device_t)); @@ -310,17 +343,18 @@ Specify ``SPI_DEVICE_NO_DUMMY`` to ignore this checking. Then you can output dat //Allocate queues, set defaults dev->trans_queue=xQueueCreate(dev_config->queue_size, sizeof(spi_trans_priv)); dev->ret_queue=xQueueCreate(dev_config->queue_size, sizeof(spi_trans_priv)); - if (!dev->trans_queue || !dev->ret_queue) goto nomem; + if (!dev->trans_queue || !dev->ret_queue) goto nomem; dev->host=spihost[host]; //We want to save a copy of the dev config in the dev struct. memcpy(&dev->cfg, dev_config, sizeof(spi_device_interface_config_t)); dev->cfg.duty_cycle_pos = duty_cycle; - // TODO: if we have to change the apb clock among transactions, re-calculate this each time the apb clock lock is acquired. + // TODO: if we have to change the apb clock among transactions, re-calculate this each time the apb clock lock is acquired. dev->clk_cfg= (clock_config_t) { .eff_clk = eff_clk, - .dummy_num = (dev->clk_cfg.eff_clk >= dummy_limit? 1: 0), + .dummy_num = dummy_required, .reg = clk_reg, + .miso_delay = miso_delay, }; //Set CS pin, CS options @@ -338,6 +372,8 @@ Specify ``SPI_DEVICE_NO_DUMMY`` to ignore this checking. Then you can output dat } else { spihost[host]->hw->pin.master_cs_pol &= (1<hw->ctrl2.mosi_delay_mode = 0; + spihost[host]->hw->ctrl2.mosi_delay_num = 0; *handle=dev; ESP_LOGD(SPI_TAG, "SPI%d: New device added to CS%d, effective clock: %dkHz", host, freecs, dev->clk_cfg.eff_clk/1000); return ESP_OK; @@ -460,7 +496,7 @@ static void IRAM_ATTR spi_intr(void *arg) /*------------ deal with the in-flight transaction -----------------*/ if (host->cur_cs != NO_CS) { spi_transaction_t *cur_trans = host->cur_trans_buf.trans; - //Okay, transaction is done. + //Okay, transaction is done. if (host->cur_trans_buf.buffer_to_rcv && host->dma_chan == 0 ) { //Need to copy from SPI regs to result buffer. for (int x=0; x < cur_trans->rxlength; x+=32) { @@ -474,7 +510,7 @@ static void IRAM_ATTR spi_intr(void *arg) //Call post-transaction callback, if any if (host->device[host->cur_cs]->cfg.post_cb) host->device[host->cur_cs]->cfg.post_cb(cur_trans); //Return transaction descriptor. - xQueueSendFromISR(host->device[host->cur_cs]->ret_queue, &host->cur_trans_buf, &do_yield); + xQueueSendFromISR(host->device[host->cur_cs]->ret_queue, &host->cur_trans_buf, &do_yield); host->cur_cs = NO_CS; } //Tell common code DMA workaround that our DMA channel is idle. If needed, the code will do a DMA reset. @@ -505,46 +541,27 @@ static void IRAM_ATTR spi_intr(void *arg) host->cur_cs=i; //We should be done with the transmission. assert(host->hw->cmd.usr == 0); - + //Reconfigure according to device settings, but only if we change CSses. if (i!=host->prev_cs) { - const int apbclk=APB_CLK_FREQ; - int effclk=dev->clk_cfg.eff_clk; spi_set_clock(host->hw, dev->clk_cfg.reg); //Configure bit order host->hw->ctrl.rd_bit_order=(dev->cfg.flags & SPI_DEVICE_RXBIT_LSBFIRST)?1:0; host->hw->ctrl.wr_bit_order=(dev->cfg.flags & SPI_DEVICE_TXBIT_LSBFIRST)?1:0; - - //Configure polarity - //SPI iface needs to be configured for a delay in some cases. - int nodelay=0; - if ((host->flags&SPICOMMON_BUSFLAG_NATIVE_PINS)!=0) { - if (effclk >= apbclk/2) { - nodelay=1; - } - } else { - uint32_t delay_limit = apbclk/4; - if (effclk >= delay_limit) { - nodelay=1; - } - } + //Configure polarity if (dev->cfg.mode==0) { host->hw->pin.ck_idle_edge=0; host->hw->user.ck_out_edge=0; - host->hw->ctrl2.miso_delay_mode=nodelay?0:2; } else if (dev->cfg.mode==1) { host->hw->pin.ck_idle_edge=0; host->hw->user.ck_out_edge=1; - host->hw->ctrl2.miso_delay_mode=nodelay?0:1; } else if (dev->cfg.mode==2) { host->hw->pin.ck_idle_edge=1; host->hw->user.ck_out_edge=1; - host->hw->ctrl2.miso_delay_mode=nodelay?0:1; } else if (dev->cfg.mode==3) { host->hw->pin.ck_idle_edge=1; host->hw->user.ck_out_edge=0; - host->hw->ctrl2.miso_delay_mode=nodelay?0:2; } //Configure misc stuff host->hw->user.doutdin=(dev->cfg.flags & SPI_DEVICE_HALFDUPLEX)?0:1; @@ -552,8 +569,11 @@ static void IRAM_ATTR spi_intr(void *arg) host->hw->ctrl2.setup_time=dev->cfg.cs_ena_pretrans-1; host->hw->user.cs_setup=dev->cfg.cs_ena_pretrans?1:0; - host->hw->ctrl2.hold_time=dev->cfg.cs_ena_posttrans-1; - host->hw->user.cs_hold=(dev->cfg.cs_ena_posttrans)?1:0; + //set hold_time to 0 will not actually append delay to CS + //set it to 1 since we do need at least one clock of hold time in most cases + host->hw->ctrl2.hold_time=dev->cfg.cs_ena_posttrans; + if ( host->hw->ctrl2.hold_time == 0 ) host->hw->ctrl2.hold_time = 1; + host->hw->user.cs_hold=1; //Configure CS pin host->hw->pin.cs0_dis=(i==0)?0:1; @@ -607,13 +627,14 @@ static void IRAM_ATTR spi_intr(void *arg) extra_dummy=dev->clk_cfg.dummy_num; } } else { - //DMA temporary workaround: let RX DMA work somehow to avoid the issue in ESP32 v0/v1 silicon + //DMA temporary workaround: let RX DMA work somehow to avoid the issue in ESP32 v0/v1 silicon if (host->dma_chan != 0 ) { host->hw->dma_in_link.addr=0; host->hw->dma_in_link.start=1; } } + if (trans_buf->buffer_to_send) { if (host->dma_chan == 0) { //Need to copy data to registers manually @@ -634,10 +655,31 @@ static void IRAM_ATTR spi_intr(void *arg) } } + //SPI iface needs to be configured for a delay in some cases. //configure dummy bits host->hw->user.usr_dummy=(dev->cfg.dummy_bits+extra_dummy)?1:0; host->hw->user1.usr_dummy_cyclelen=dev->cfg.dummy_bits+extra_dummy-1; + int miso_long_delay = 0; + if (dev->clk_cfg.miso_delay<0) { + //if the data comes too late, delay half a SPI clock to improve reading + miso_long_delay = 1; + host->hw->ctrl2.miso_delay_num = 0; + } else { + //if the data is so fast that dummy_bit is used, delay some apb clocks to meet the timing + host->hw->ctrl2.miso_delay_num = (extra_dummy? dev->clk_cfg.miso_delay: 0); + } + + if (dev->cfg.mode==0) { + host->hw->ctrl2.miso_delay_mode=miso_long_delay?2:0; + } else if (dev->cfg.mode==1) { + host->hw->ctrl2.miso_delay_mode=miso_long_delay?1:0; + } else if (dev->cfg.mode==2) { + host->hw->ctrl2.miso_delay_mode=miso_long_delay?1:0; + } else if (dev->cfg.mode==3) { + host->hw->ctrl2.miso_delay_mode=miso_long_delay?2:0; + } + host->hw->mosi_dlen.usr_mosi_dbitlen=trans->length-1; if ( dev->cfg.flags & SPI_DEVICE_HALFDUPLEX ) { host->hw->miso_dlen.usr_miso_dbitlen=trans->rxlength-1; @@ -667,8 +709,8 @@ static void IRAM_ATTR spi_intr(void *arg) // output command will be sent from bit 7 to 0 of command_value, and then bit 15 to 8 of the same register field. uint16_t command = trans->cmd << (16-cmdlen); //shift to MSB host->hw->user2.usr_command_value = (command>>8)|(command<<8); //swap the first and second byte - // shift the address to MSB of addr (and maybe slv_wr_status) register. - // output address will be sent from MSB to LSB of addr register, then comes the MSB to LSB of slv_wr_status register. + // shift the address to MSB of addr (and maybe slv_wr_status) register. + // output address will be sent from MSB to LSB of addr register, then comes the MSB to LSB of slv_wr_status register. if (addrlen>32) { host->hw->addr = trans->addr >> (addrlen- 32); host->hw->slv_wr_status = trans->addr << (64 - addrlen); @@ -693,13 +735,13 @@ esp_err_t spi_device_queue_trans(spi_device_handle_t handle, spi_transaction_t * esp_err_t ret = ESP_OK; BaseType_t r; SPI_CHECK(handle!=NULL, "invalid dev handle", ESP_ERR_INVALID_ARG); - //check transmission length + //check transmission length SPI_CHECK((trans_desc->flags & SPI_TRANS_USE_RXDATA)==0 ||trans_desc->rxlength <= 32, "rxdata transfer > 32 bits without configured DMA", ESP_ERR_INVALID_ARG); SPI_CHECK((trans_desc->flags & SPI_TRANS_USE_TXDATA)==0 ||trans_desc->length <= 32, "txdata transfer > 32 bits without configured DMA", ESP_ERR_INVALID_ARG); SPI_CHECK(trans_desc->length <= handle->host->max_transfer_sz*8, "txdata transfer > host maximum", ESP_ERR_INVALID_ARG); SPI_CHECK(trans_desc->rxlength <= handle->host->max_transfer_sz*8, "rxdata transfer > host maximum", ESP_ERR_INVALID_ARG); SPI_CHECK((handle->cfg.flags & SPI_DEVICE_HALFDUPLEX) || trans_desc->rxlength <= trans_desc->length, "rx length > tx length in full duplex mode", ESP_ERR_INVALID_ARG); - //check working mode + //check working mode SPI_CHECK(!((trans_desc->flags & (SPI_TRANS_MODE_DIO|SPI_TRANS_MODE_QIO)) && (handle->cfg.flags & SPI_DEVICE_3WIRE)), "incompatible iface params", ESP_ERR_INVALID_ARG); SPI_CHECK(!((trans_desc->flags & (SPI_TRANS_MODE_DIO|SPI_TRANS_MODE_QIO)) && (!(handle->cfg.flags & SPI_DEVICE_HALFDUPLEX))), "incompatible iface params", ESP_ERR_INVALID_ARG); SPI_CHECK( !(handle->cfg.flags & SPI_DEVICE_HALFDUPLEX) || handle->host->dma_chan == 0 || !(trans_desc->flags & SPI_TRANS_USE_RXDATA || trans_desc->rx_buffer != NULL) @@ -717,7 +759,7 @@ esp_err_t spi_device_queue_trans(spi_device_handle_t handle, spi_transaction_t * // rx memory assign if ( trans_desc->flags & SPI_TRANS_USE_RXDATA ) { trans_buf.buffer_to_rcv = (uint32_t*)&trans_desc->rx_data[0]; - } else { + } else { //if not use RXDATA neither rx_buffer, buffer_to_rcv assigned to NULL trans_buf.buffer_to_rcv = trans_desc->rx_buffer; } @@ -730,12 +772,12 @@ esp_err_t spi_device_queue_trans(spi_device_handle_t handle, spi_transaction_t * goto clean_up; } } - + const uint32_t *txdata; // tx memory assign if ( trans_desc->flags & SPI_TRANS_USE_TXDATA ) { txdata = (uint32_t*)&trans_desc->tx_data[0]; - } else { + } else { //if not use TXDATA neither tx_buffer, tx data assigned to NULL txdata = trans_desc->tx_buffer ; } @@ -748,11 +790,11 @@ esp_err_t spi_device_queue_trans(spi_device_handle_t handle, spi_transaction_t * goto clean_up; } memcpy( trans_buf.buffer_to_send, txdata, (trans_desc->length+7)/8 ); - } else { + } else { // else use the original buffer (forced-conversion) or assign to NULL trans_buf.buffer_to_send = (uint32_t*)txdata; } - + #ifdef CONFIG_PM_ENABLE esp_pm_lock_acquire(handle->host->pm_lock); #endif @@ -772,10 +814,10 @@ clean_up: // free malloc-ed buffer (if needed) before return. if ( (void*)trans_buf.buffer_to_rcv != trans_desc->rx_buffer && (void*)trans_buf.buffer_to_rcv != &trans_desc->rx_data[0] ) { free( trans_buf.buffer_to_rcv ); - } + } if ( (void*)trans_buf.buffer_to_send!= trans_desc->tx_buffer && (void*)trans_buf.buffer_to_send != &trans_desc->tx_data[0] ) { free( trans_buf.buffer_to_send ); - } + } assert( ret != ESP_OK ); return ret; } @@ -784,12 +826,12 @@ esp_err_t spi_device_get_trans_result(spi_device_handle_t handle, spi_transactio { BaseType_t r; spi_trans_priv trans_buf; - + SPI_CHECK(handle!=NULL, "invalid dev handle", ESP_ERR_INVALID_ARG); r=xQueueReceive(handle->ret_queue, (void*)&trans_buf, ticks_to_wait); if (!r) { // The memory occupied by rx and tx DMA buffer destroyed only when receiving from the queue (transaction finished). - // If timeout, wait and retry. + // If timeout, wait and retry. // Every on-flight transaction request occupies internal memory as DMA buffer if needed. return ESP_ERR_TIMEOUT; } @@ -798,12 +840,12 @@ esp_err_t spi_device_get_trans_result(spi_device_handle_t handle, spi_transactio if ( (void*)trans_buf.buffer_to_send != &(*trans_desc)->tx_data[0] && trans_buf.buffer_to_send != (*trans_desc)->tx_buffer ) { free( trans_buf.buffer_to_send ); - } + } //copy data from temporary DMA-capable buffer back to IRAM buffer and free the temporary one. if ( (void*)trans_buf.buffer_to_rcv != &(*trans_desc)->rx_data[0] && trans_buf.buffer_to_rcv != (*trans_desc)->rx_buffer ) { if ( (*trans_desc)->flags & SPI_TRANS_USE_RXDATA ) { - memcpy( (uint8_t*)&(*trans_desc)->rx_data[0], trans_buf.buffer_to_rcv, ((*trans_desc)->rxlength+7)/8 ); + memcpy( (uint8_t*)&(*trans_desc)->rx_data[0], trans_buf.buffer_to_rcv, ((*trans_desc)->rxlength+7)/8 ); } else { memcpy( (*trans_desc)->rx_buffer, trans_buf.buffer_to_rcv, ((*trans_desc)->rxlength+7)/8 ); } diff --git a/components/soc/esp32/include/driver/spi_pins.h b/components/soc/esp32/include/driver/spi_pins.h new file mode 100644 index 0000000000..0073dbacd6 --- /dev/null +++ b/components/soc/esp32/include/driver/spi_pins.h @@ -0,0 +1,28 @@ +// Copyright 2015-2018 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef _DRIVER_SPI_PINS_H_ +#define _DRIVER_SPI_PINS_H_ + +#define HSPI_NATIVE_PIN_NUM_MISO 12 +#define HSPI_NATIVE_PIN_NUM_MOSI 13 +#define HSPI_NATIVE_PIN_NUM_CLK 14 +#define HSPI_NATIVE_PIN_NUM_CS 15 + +#define VSPI_NATIVE_PIN_NUM_MISO 19 +#define VSPI_NATIVE_PIN_NUM_MOSI 23 +#define VSPI_NATIVE_PIN_NUM_CLK 18 +#define VSPI_NATIVE_PIN_NUM_CS 5 + +#endif \ No newline at end of file diff --git a/docs/_static/diagrams/spi_master/miso_timing_waveform.rst b/docs/_static/diagrams/spi_master/miso_timing_waveform.rst new file mode 100644 index 0000000000..ec11ea1ff8 --- /dev/null +++ b/docs/_static/diagrams/spi_master/miso_timing_waveform.rst @@ -0,0 +1,17 @@ +.. this picture is generated by https://wavedrom.com/, using the sphinx plugin sphinxcontrib-wavedrom +.. due to plugin issue, we cannot place only the picture information in a standalone file, but have to take .. wavedrom:: inside + +.. wavedrom:: + + { signal: [ + { name: 'SCLK', wave: 'p...', node: '.ad...' }, + { name: 'MISO', wave: 'x3x.', node: '.b...', phase:-1.8 }, + { name: 'MISO delayed', wave: 'x3x.', node: '.c.', phase:-2.4 }, + ], + edge: [ + 'a|->b input delay', + 'b|->c gpio delay', + 'c-|>d setup slack' + ], + config: { hscale: 3 } + } diff --git a/docs/_static/diagrams/spi_master/miso_timing_waveform_async.rst b/docs/_static/diagrams/spi_master/miso_timing_waveform_async.rst new file mode 100644 index 0000000000..dd3ae8b1ef --- /dev/null +++ b/docs/_static/diagrams/spi_master/miso_timing_waveform_async.rst @@ -0,0 +1,19 @@ +.. this picture is generated by https://wavedrom.com/, using the sphinx plugin sphinxcontrib-wavedrom +.. due to plugin issue, we cannot place only the picture information in a standalone file, but have to take .. wavedrom:: inside + +.. wavedrom:: + + { signal: [ + { name: 'SCLK', wave: '0.1....0....1...', node: '..a.........e'}, + { name: 'SLV_CLK',wave: 'p..............', node: '..b..', phase: -0.5 }, + { name: 'MISO', wave: 'x...3.....x....', node: '....c', phase:-0.5}, + { name: 'MISO delayed', wave: 'x.......3.....x.', node: '........d'}, + ], + edge: [ + 'a|->b sample delay', + 'b|->c slave output delay', + 'c|->d gpio delay', + 'd-|>e setup slack', + 'a-|>c input delay' + ], + } diff --git a/docs/_static/diagrams/spi_master/spi_master_freq_tv.plt b/docs/_static/diagrams/spi_master/spi_master_freq_tv.plt new file mode 100644 index 0000000000..b96d3d4e8d --- /dev/null +++ b/docs/_static/diagrams/spi_master/spi_master_freq_tv.plt @@ -0,0 +1,33 @@ +# this is a GNUPLOT script generating the figure of spi_master_freq_tv.png + +set xlabel "Input delay (ns)" +set xrange [0: 125] +set ylabel "Fmax (MHz)" +set yrange [0: 81] +set xtics 12.5 textcolor rgb "black" +set ytics 10 textcolor rgb "black" +set border 3 lc rgb "gray" lw 2 +set grid lt -1 lc rgb "gray" lw 2 +set samples 10000 +set terminal png size 700,500 +set output "plot.png" + +apb = 12.5 + +#each line is broken into 10 pieces by the range determined by i +f1(i,x) = (x>= i*apb) && (x < (i+1)*apb) ? 80./(i+1) : 1/0 + +set style circle radius graph 0.008 + +#solid and empty circles are draw by the coordinates given in the csv +plot [0:125]\ + f1(-1, x) lw 3lc rgb "blue" title "IOMUX",\ + for [i=0:9] f1(i, x) with lines lw 3 lc rgb "blue" notitle,\ + f1(0, x+25) lw 3 lc rgb "red" title "GPIO",\ + for [i=2:11] f1(i, x+25) with lines lw 3 lc rgb "red" notitle, \ + "tv.csv" using 1:2 with circles notitle fill solid fc rgb "blue", \ + "tv.csv" using 1:4 with circles notitle fc rgb "blue",\ + "tv.csv" using 1:3 with circles notitle fill solid fc rgb "red" ,\ + "tv.csv" using 1:5 with circles notitle fc rgb "red" + + diff --git a/docs/_static/diagrams/spi_master/spi_timing.pptx b/docs/_static/diagrams/spi_master/spi_timing.pptx new file mode 100644 index 0000000000000000000000000000000000000000..2f6666cfa58cafa91e7eda73fc585cf3c4fd1d57 GIT binary patch literal 39038 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 VZ&o&t8dU~W248Ll2I*c94*-Z2C%FIs literal 0 HcmV?d00001 diff --git a/docs/_static/diagrams/spi_master/tv.csv b/docs/_static/diagrams/spi_master/tv.csv new file mode 100644 index 0000000000..c17ad61203 --- /dev/null +++ b/docs/_static/diagrams/spi_master/tv.csv @@ -0,0 +1,29 @@ +0 80 26.66666667 #DIV/0! #DIV/0! +12.5 40 20 80 26.66666667 +25 26.66666667 16 40 20 +37.5 20 13.33333333 26.66666667 16 +50 16 11.42857143 20 13.33333333 +62.5 13.33333333 10 16 11.42857143 +75 11.42857143 8.888888889 13.33333333 10 +87.5 10 8 11.42857143 8.888888889 +100 8.888888889 7.272727273 10 8 +112.5 8 6.666666667 8.888888889 7.272727273 +125 7.272727273 6.153846154 8 6.666666667 +137.5 6.666666667 5.714285714 7.272727273 6.153846154 +150 6.153846154 5.333333333 6.666666667 5.714285714 +162.5 5.714285714 5 6.153846154 5.333333333 +175 5.333333333 4.705882353 5.714285714 5 +187.5 5 4.444444444 5.333333333 4.705882353 +200 4.705882353 4.210526316 5 4.444444444 +212.5 4.444444444 4 4.705882353 4.210526316 +225 4.210526316 3.80952381 4.444444444 4 +237.5 4 3.636363636 4.210526316 3.80952381 +250 3.80952381 3.47826087 4 3.636363636 +262.5 3.636363636 3.333333333 3.80952381 3.47826087 +275 3.47826087 3.2 3.636363636 3.333333333 +287.5 3.333333333 3.076923077 3.47826087 3.2 +300 3.2 2.962962963 3.333333333 3.076923077 +312.5 3.076923077 2.857142857 3.2 2.962962963 +325 2.962962963 2.75862069 3.076923077 2.857142857 +337.5 2.857142857 2.666666667 2.962962963 2.75862069 +350 2.75862069 2.580645161 2.857142857 2.666666667 diff --git a/docs/_static/miso_timing_waveform.png b/docs/_static/miso_timing_waveform.png new file mode 100644 index 0000000000000000000000000000000000000000..19cc223bc0b19255dd6b1e2695ad766dbd9ba8d6 GIT binary patch literal 14658 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 literal 0 HcmV?d00001 diff --git a/docs/_static/spi_miso.png b/docs/_static/spi_miso.png new file mode 100644 index 0000000000000000000000000000000000000000..4580938ff1bec99eca72bb0b3f2bbcc27fc6b726 GIT binary patch literal 29273 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∾^ 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 O!r