feature(spi_ram_fifo): add timetick

This commit is contained in:
xiongyu
2019-06-03 16:51:47 +08:00
parent 1e40a85cec
commit 42c06647ba
2 changed files with 16 additions and 6 deletions

View File

@ -41,13 +41,15 @@ typedef struct {
* @param handle spi ram fifo handle * @param handle spi ram fifo handle
* @param data Pointer to the write data buffer * @param data Pointer to the write data buffer
* @param len Length of write data, range: len > 0 * @param len Length of write data, range: len > 0
* @param timeout_ticks freertos timeout ticks
* *
* @return * @return
* - ESP_OK Success * - ESP_OK Success
* - ESP_ERR_INVALID_ARG Parameter error * - ESP_ERR_INVALID_ARG Parameter error
* - ESP_ERR_TIMEOUT spi ram fifo write timeout
* - ESP_FAIL spi ram fifo not created yet * - ESP_FAIL spi ram fifo not created yet
*/ */
esp_err_t spi_ram_fifo_write(spi_ram_fifo_handle_t handle, uint8_t *data, int len); esp_err_t spi_ram_fifo_write(spi_ram_fifo_handle_t handle, uint8_t *data, int len, uint32_t timeout_ticks);
/** /**
* @brief spi ram fifo read function * @brief spi ram fifo read function
@ -57,13 +59,15 @@ esp_err_t spi_ram_fifo_write(spi_ram_fifo_handle_t handle, uint8_t *data, int le
* @param handle spi ram fifo handle * @param handle spi ram fifo handle
* @param data Pointer to the read data buffer * @param data Pointer to the read data buffer
* @param len Length of read data, range: len > 0 * @param len Length of read data, range: len > 0
* @param timeout_ticks freertos timeout ticks
* *
* @return * @return
* - ESP_OK Success * - ESP_OK Success
* - ESP_ERR_INVALID_ARG Parameter error * - ESP_ERR_INVALID_ARG Parameter error
* - ESP_ERR_TIMEOUT spi ram fifo read timeout
* - ESP_FAIL spi ram fifo not created yet * - ESP_FAIL spi ram fifo not created yet
*/ */
esp_err_t spi_ram_fifo_read(spi_ram_fifo_handle_t handle, uint8_t *data, int len); esp_err_t spi_ram_fifo_read(spi_ram_fifo_handle_t handle, uint8_t *data, int len, uint32_t timeout_ticks);
/** /**
* @brief Get spi ram fifo filled length * @brief Get spi ram fifo filled length

View File

@ -45,7 +45,7 @@ typedef struct {
return (ret_val); \ return (ret_val); \
} }
esp_err_t spi_ram_fifo_write(spi_ram_fifo_handle_t handle, uint8_t *data, int len) esp_err_t spi_ram_fifo_write(spi_ram_fifo_handle_t handle, uint8_t *data, int len, uint32_t timeout_ticks)
{ {
spi_ram_fifo_obj_t *obj = (spi_ram_fifo_obj_t *)handle; spi_ram_fifo_obj_t *obj = (spi_ram_fifo_obj_t *)handle;
int n; int n;
@ -69,7 +69,10 @@ esp_err_t spi_ram_fifo_write(spi_ram_fifo_handle_t handle, uint8_t *data, int le
// Not enough free room in FIFO. Wait till there's some read and try again. // Not enough free room in FIFO. Wait till there's some read and try again.
obj->overflow_num++; obj->overflow_num++;
xSemaphoreGive(obj->mux); xSemaphoreGive(obj->mux);
xSemaphoreTake(obj->write_sem, portMAX_DELAY); if (pdFALSE == xSemaphoreTake(obj->write_sem, timeout_ticks)) {
xSemaphoreGive(obj->mux);
return ESP_ERR_TIMEOUT;
}
} else { } else {
//Write the data. //Write the data.
spi_ram_write(obj->ram_num, obj->start_addr + obj->write_pos, data, n); spi_ram_write(obj->ram_num, obj->start_addr + obj->write_pos, data, n);
@ -90,7 +93,7 @@ esp_err_t spi_ram_fifo_write(spi_ram_fifo_handle_t handle, uint8_t *data, int le
return ESP_OK; return ESP_OK;
} }
esp_err_t spi_ram_fifo_read(spi_ram_fifo_handle_t handle, uint8_t *data, int len) esp_err_t spi_ram_fifo_read(spi_ram_fifo_handle_t handle, uint8_t *data, int len, uint32_t timeout_ticks)
{ {
spi_ram_fifo_obj_t *obj = (spi_ram_fifo_obj_t *)handle; spi_ram_fifo_obj_t *obj = (spi_ram_fifo_obj_t *)handle;
int n; int n;
@ -114,7 +117,10 @@ esp_err_t spi_ram_fifo_read(spi_ram_fifo_handle_t handle, uint8_t *data, int len
// Not enough data in FIFO. Wait till there's some written and try again. // Not enough data in FIFO. Wait till there's some written and try again.
obj->underrun_num++; obj->underrun_num++;
xSemaphoreGive(obj->mux); xSemaphoreGive(obj->mux);
xSemaphoreTake(obj->read_sem, portMAX_DELAY); if (pdFALSE == xSemaphoreTake(obj->read_sem, timeout_ticks)) {
xSemaphoreGive(obj->mux);
return ESP_ERR_TIMEOUT;
}
} else { } else {
// Read the data. // Read the data.
spi_ram_read(obj->ram_num, obj->start_addr + obj->read_pos, data, n); spi_ram_read(obj->ram_num, obj->start_addr + obj->read_pos, data, n);