【ESP32入门学习】SPI主机

【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。

SPI的复用IO口
引脚名称 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);

 

你可能感兴趣的:(ESP32)