瀏覽代碼

spi_slave_hd: add polling api to read/write buf to essl_spi

Armando 4 年之前
父節點
當前提交
a87f5c6c02

+ 31 - 0
components/esp_serial_slave_link/essl_spi.c

@@ -76,6 +76,22 @@ esp_err_t essl_spi_rdbuf(spi_device_handle_t spi, uint8_t *out_data, int addr, i
     return spi_device_transmit(spi, (spi_transaction_t*)&t);
 }
 
+esp_err_t essl_spi_rdbuf_polling(spi_device_handle_t spi, uint8_t *out_data, int addr, int len, uint32_t flags)
+{
+    spi_transaction_ext_t t = {
+        .base = {
+            .cmd = get_hd_command(CMD_HD_RDBUF_REG, flags),
+            .addr = addr % 72,
+            .rxlength = len * 8,
+            .rx_buffer = out_data,
+            .flags = flags | SPI_TRANS_VARIABLE_DUMMY,
+        },
+        .dummy_bits = get_hd_dummy_bits(flags),
+    };
+
+    return spi_device_polling_transmit(spi, (spi_transaction_t*)&t);
+}
+
 esp_err_t essl_spi_wrbuf(spi_device_handle_t spi, const uint8_t *data, int addr, int len, uint32_t flags)
 {
     spi_transaction_ext_t t = {
@@ -91,6 +107,21 @@ esp_err_t essl_spi_wrbuf(spi_device_handle_t spi, const uint8_t *data, int addr,
     return spi_device_transmit(spi, (spi_transaction_t*)&t);
 }
 
+esp_err_t essl_spi_wrbuf_polling(spi_device_handle_t spi, const uint8_t *data, int addr, int len, uint32_t flags)
+{
+    spi_transaction_ext_t t = {
+        .base = {
+            .cmd = get_hd_command(CMD_HD_WRBUF_REG, flags),
+            .addr = addr % 72,
+            .length = len * 8,
+            .tx_buffer = data,
+            .flags = flags | SPI_TRANS_VARIABLE_DUMMY,
+        },
+        .dummy_bits = get_hd_dummy_bits(flags),
+    };
+    return spi_device_polling_transmit(spi, (spi_transaction_t*)&t);
+}
+
 esp_err_t essl_spi_rddma_seg(spi_device_handle_t spi, uint8_t *out_data, int seg_len, uint32_t flags)
 {
     spi_transaction_ext_t t = {

+ 38 - 2
components/esp_serial_slave_link/include/esp_serial_slave_link/essl_spi.h

@@ -28,7 +28,7 @@ extern "C"
 ////////////////////////////////////////////////////////////////////////////////
 
 /**
- * @brief Read the shared buffer from the slave.
+ * @brief Read the shared buffer from the slave in ISR way
  *
  * @note ``out_data`` should be prepared in words and in the DRAM. The buffer may be written in words
  *       by the DMA. When a byte is written, the remaining bytes in the same word will also be
@@ -46,7 +46,25 @@ extern "C"
 esp_err_t essl_spi_rdbuf(spi_device_handle_t spi, uint8_t *out_data, int addr, int len, uint32_t flags);
 
 /**
- * @brief Write the shared buffer of the slave.
+ * @brief Read the shared buffer from the slave in polling way
+ *
+ * @note ``out_data`` should be prepared in words and in the DRAM. The buffer may be written in words
+ *       by the DMA. When a byte is written, the remaining bytes in the same word will also be
+ *       overwritten, even the ``len`` is shorter than a word.
+ *
+ * @param spi       SPI device handle representing the slave
+ * @param out_data  Buffer for read data, strongly suggested to be in the DRAM and align to 4
+ * @param addr      Address of the slave shared buffer
+ * @param len       Length to read
+ * @param flags     `SPI_TRANS_*` flags to control the transaction mode of the transaction to send.
+ * @return
+ *      - ESP_OK: on success
+ *      - or other return value from :cpp:func:`spi_device_transmit`.
+ */
+esp_err_t essl_spi_rdbuf_polling(spi_device_handle_t spi, uint8_t *out_data, int addr, int len, uint32_t flags);
+
+/**
+ * @brief Write the shared buffer of the slave in ISR way
  *
  * @note ``out_data`` should be prepared in words and in the DRAM. The buffer may be written in words
  *       by the DMA. When a byte is written, the remaining bytes in the same word will also be
@@ -63,6 +81,24 @@ esp_err_t essl_spi_rdbuf(spi_device_handle_t spi, uint8_t *out_data, int addr, i
  */
 esp_err_t essl_spi_wrbuf(spi_device_handle_t spi, const uint8_t *data, int addr, int len, uint32_t flags);
 
+/**
+ * @brief Write the shared buffer of the slave in polling way
+ *
+ * @note ``out_data`` should be prepared in words and in the DRAM. The buffer may be written in words
+ *       by the DMA. When a byte is written, the remaining bytes in the same word will also be
+ *       overwritten, even the ``len`` is shorter than a word.
+ *
+ * @param spi       SPI device handle representing the slave
+ * @param data      Buffer for data to send, strongly suggested to be in the DRAM and align to 4
+ * @param addr      Address of the slave shared buffer,
+ * @param len       Length to write
+ * @param flags     `SPI_TRANS_*` flags to control the transaction mode of the transaction to send.
+ * @return
+ *      - ESP_OK: success
+ *      - or other return value from :cpp:func:`spi_device_polling_transmit`.
+ */
+esp_err_t essl_spi_wrbuf_polling(spi_device_handle_t spi, const uint8_t *data, int addr, int len, uint32_t flags);
+
 /**
  * @brief Receive long buffer in segments from the slave through its DMA.
  *