【ESP32入门学习】SPI主机
ESP32有四个SPI外设,包含SPI0、SPI1、HSPI和VSPI。SPI0完全专用于Flash高速缓存,ESP32用于将SPI闪存设备映射到内存中。SPI1是与SPI0连接到相同的硬件线路上,用于写入闪存芯片。HSPI和VSPI是用户自由使用的。SPI1、HSPI和VSPI都有三个芯片选择线(CS),允许它们作为主机驱动多达三个SPI设备。
SPI主机驱动
SPI主机驱动允许用户与SPI从机自由通信,包含多线程编程环境也是一样。它完全透明地处理DMA传输来读取和写入数据,并使用自动处理同一SPI主机与总线上不同SPI从机进行通信。
注:暂时驱动中只实现了HSPI和VSPI。
全双工模式下,SPI同时发送和接收,总长度 = command_bits + address_bits + trans_conf.length 。 trans_conf.rx_length指示的是接收到buff中的数据长度。
半双工模式下,SPI单独发送和接收。发送长度为 trans_conf.length ,接收长度为 trans_conf.rx_length 。
因为不是每个SPI设备都有命令和地址位,所以在配置中,command_bits为0时,没有命令位;address_bits为0时,没有地址位。
当 rx_buffer = NULL时(或者SPI_USE_RXDATA 没有设置时),不执行接收操作;当 tx_buffer = NULL时(或者SPI_USE_TXDATA 没有设置时),跳过发送操作。
GPIO矩阵和 IO复用
SPI接口有两种IO方式,一种是IO复用功能,另外一种是GPIO矩阵,因为GPIO的输入延迟比较高,IO复用引脚可以实现80MHz速率,而GPIO矩阵只能达到40MHz。
引脚名称 | HSPI | VSPI |
---|---|---|
引脚号 | 引脚号 | |
CS0 | 15 | 5 |
SCLK | 14 | 18 |
MISO | 12 | 19 |
MOSI | 13 | 23 |
QUADWP | 2 | 22 |
QUADHD | 4 | 21 |
我们该如何使用spi_master 驱动呢?
1、定义 bus_config 和 dev_config 结构体,指定使用的SPI和IO口,不用的信号引脚设置为-1,以及设置时钟速率等
例:
/* 定义spi设备句柄 */
spi_device_handle_t spi;
/* 设置spi总线引脚配置 */
spi_bus_config_t buscfg={
.miso_io_num = 25,
.mosi_io_num = 23,
.sclk_io_num = 19,
.quadwp_io_num=-1,
.quadhd_io_num=-1,
.max_transfer_sz=PARALLEL_LINES*320*2+8
};
/* 设置spi总线软件配置 */
spi_device_interface_config_t devcfg={
.clock_speed_hz=10*1000*1000, //时钟为10MHz
.mode=0, //SPI 模式0
.flags=
.spics_io_num=22, //CS 引脚
.queue_size=7, //We want to be able to queue 7 transactions at a time
.pre_cb=lcd_spi_pre_transfer_callback, //传输开始之前调用的函数
.post_cb = NULL, //传输完成之后调用的函数
};
/* 初始化SPI */
ret=spi_bus_initialize(HSPI_HOST, &buscfg, 1);
ESP_ERROR_CHECK(ret);
/* 实例化SPI设备句柄 */
ret=spi_bus_add_device(HSPI_HOST, &devcfg, &spi);
ESP_ERROR_CHECK(ret);