乐鑫技术交流
直播中

刘慧

7年用户 1649经验值
私信 关注
[问答]

ESP-IDF的SPI两次传输之间CS信号线会自动拉高,如恶化解决这个问题?


spi_device_transmit(myspi_handle, &t);spi_device_transmit(myspi_handle, &t);
如上所示,连续两次使用这个函数,会导致在两次数据传输之间自动出现CS信号线拉高的情况。

假如使用软件CS,虽然CS信号没有拉高了,但是传输数据时还会多传输原来CS拉高的那段时间。
代码修改如下:Code: Select all
.spics_io_num=-1//将.spics_io_num=HSPI_SS变为此代码
请问如何解决这个问题呢?
                                                                                                                                                            

回帖(1)

晴兮晴兮

2024-6-11 17:07:02
要解决这个问题,我们可以尝试以下方法:

1. 使用软件控制CS信号:通过设置`spics_io_num`为-1,我们已经实现了这一点。这意味着CS信号将由软件控制,而不是硬件。

2. 在两次传输之间手动控制CS信号:在两次`spi_device_transmit`调用之间,我们可以使用GPIO控制函数手动设置和清除CS信号。以下是修改后的代码示例:

```c
#include "driver/gpio.h"
#include "esp_log.h"
#include "esp_spi.h"

// 定义CS引脚
#define CS_PIN GPIO_NUM_5

// 初始化SPI设备
void spi_device_init() {
    spi_device_handle_t myspi_handle;
    spi_device_interface_config_t devcfg = {
        .command_bits = 0,
        .address_bits = 0,
        .dummy_bits = 0,
        .clock_speed_hz = 10 * 1000 * 1000, // 10MHz
        .duty_cycle_pos = 128,               // 50% duty cycle
        .cs_ena_posttrans = 3,               // CS信号保持3个时钟周期
        .mode = 0,
        .spics_io_num = -1,                  // 使用软件CS
        .queue_size = 20,
        .pre_cb = NULL,
        .post_cb = NULL,
    };
    esp_err_t ret = spi_bus_add_device(HSPI_HOST, &devcfg, &myspi_handle);
    if (ret != ESP_OK) {
        ESP_LOGE("SPI", "Failed to add SPI device");
    }
}

// 手动控制CS信号
void spi_device_transmit_with_manual_cs(spi_device_handle_t spi, spi_transaction_t *trans) {
    // 设置CS为低电平,开始传输
    gpio_set_level(CS_PIN, 0);

    // 发送数据
    spi_device_transmit(spi, trans);

    // 等待传输完成
    while (trans->status != SPI_TRANS_DONE) {
        vTaskDelay(1);
    }

    // 清除CS信号,结束传输
    gpio_set_level(CS_PIN, 1);
}

void app_main() {
    spi_device_init();

    spi_transaction_t t = {
        .flags = SPI_TRANS_USE_TXDATA,
        .length = 8 * 4, // 32位数据长度
        .tx_buffer = NULL, // 这里可以设置要发送的数据
    };

    // 使用手动CS控制进行两次传输
    spi_device_transmit_with_manual_cs(myspi_handle, &t);
    spi_device_transmit_with_manual_cs(myspi_handle, &t);
}
```

这样,我们就可以在两次传输之间手动控制CS信号,避免自动拉高的情况。同时,由于我们手动控制CS信号,传输数据时不会多传输原来CS拉高的那段时间。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分