esp32c3,esp-idf 4.3.5,用spi2_host与ch623刷卡芯片用spi通信不用dma,给个例程
时间: 2024-03-10 08:50:27 浏览: 178
好的,以下是一个简单的例程:
```c
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/spi_master.h"
#define PIN_NUM_MISO 19
#define PIN_NUM_MOSI 23
#define PIN_NUM_CLK 18
#define PIN_NUM_CS 5
spi_device_handle_t spi;
void spi_master_init(void)
{
esp_err_t ret;
// 配置主机
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 = 4096
};
ret = spi_bus_initialize(HSPI_HOST, &buscfg, 1);
ESP_ERROR_CHECK(ret);
// 配置从机
spi_device_interface_config_t devcfg = {
.mode = 0,
.clock_speed_hz = 100000,
.spics_io_num = PIN_NUM_CS,
.queue_size = 1,
};
ret = spi_bus_add_device(HSPI_HOST, &devcfg, &spi);
ESP_ERROR_CHECK(ret);
}
void spi_master_send_recv(uint8_t *data, uint8_t *recv_buf, uint32_t len)
{
spi_transaction_t t;
memset(&t, 0, sizeof(t)); // 清零
t.length = len * 8; // 数据长度
t.rx_buffer = recv_buf; // 接收缓冲区
t.tx_buffer = data; // 发送缓冲区
esp_err_t ret = spi_device_polling_transmit(spi, &t);
ESP_ERROR_CHECK(ret);
}
void app_main(void)
{
spi_master_init();
uint8_t tx_data[] = {0x00, 0x01, 0x02, 0x03, 0x04};
uint8_t rx_data[sizeof(tx_data)];
spi_master_send_recv(tx_data, rx_data, sizeof(tx_data));
for(int i=0; i<sizeof(tx_data); i++) {
printf("%02X ", rx_data[i]);
}
printf("\n");
}
```
以上代码中,我们使用 `spi_master_init()` 函数来初始化 SPI 主机和从机。然后使用 `spi_master_send_recv()` 函数来发送和接收数据。在主函数中,我们定义了一个发送数据数组 `tx_data`,并且定义了一个接收数据数组 `rx_data`。我们使用 `spi_master_send_recv()` 函数来发送数据和接收数据。最后,我们打印接收到的数据。
请注意,这只是一个简单的例程,你需要根据实际情况进行更改。
阅读全文