先楫SDK组件系列-SPI组件,轻松使用SPI点亮WS2812灯

一、概述

SPI这个说起来很容易,但是由于先楫的SPI外设的功能多样性,导致与普遍使用的SPI不太一样,短时间也比较难以消化。在这个外设上,本公众号也蹭了不少SPI的文章流量-《玩转先楫SPI外设系列》,但其实讲的越多,感觉又把外设讲复杂化了。刚好HPM_SDK中有个组件-spi component,在SDK根目录下的components/spi。

该组件提供了通用又简单的接口即可快速使用先楫的SPI。本文通过简单驱动WS2812来进行讲解该组件使用。

二、SPI驱动WS2812

本文不阐述WS2812的原理,更多关注SPI的使用。

对于先楫驱动WS2812的,先前已经有开发者用定时器gptmr进行驱动,仓库地址如下:

https://github.com/HalfSweet/HPM_WS2812

本文以该仓库为参考,加入SPI的支持,后续也会合并到该仓库当中。

移植步骤:

(一)初始化SPI的相关引脚

这里只使用SPI的MOSI脚,故只初始化该脚即可,功能选择ALT5,具体可看相关用户手册。

image.png

不过官方SDK中也做了相关的宏定义,在已确认的SOC上建议使用下面的宏定义

image.png

(二)初始化SPI时钟源

时钟源的开启也很简单,使用以下接口即可开启。

image.png

(三)初始化SPI相关参数

使用hpm_spi_initialize API进行初始化即可,只需要设置传输方向,主从机模式,传输模式等即可。

image.png

需要注意的是:该SPI组件如果使用非阻塞接口,需要到DMA管理器组件,需要在CMakelist开启DMA管理器,并在使用SPI组件之前初始化DMA管理器。对于DMA管理器组件可以参考本篇-《先楫SDK组件系列-DMA管理器dma_mgr

image.png

(四)设置SPI频率

使用hpm_spi_set_sclk_frequency API设置SPI频率,这里WS2812使用8M频率。

image.png

(五)SPI DMA回调注册(如果使用非阻塞接口可以不需要此步骤)

使用hpm_spi_dma_install_callback设置收发DMA传输完成回调,如果不使用回调可以填入NULL,该步骤是必须的,需要初始化SPI DMA。

image.png

(六)发送数据

WS2812的显示数据经过转换后需要通过SPI进行发送,这里使用非阻塞接口hpm_spi_transmit_nonblocking进行发送,用户自行决定判断是否需要等待传输完成。

image.png

经过以上步骤即可快速使用SPI驱动WS2812,点亮RGB效果如下:

image.png

image.png

三、SPI组件API简单介绍

在hpm_spi头文件中,每个API都有对应的注释说明,这里分为阻塞和非阻塞接口讲解。

(一)介绍API

1、SPI初始化

image.png

2、SPI设置频率

image.png

3、SPI全双工同时接收和发送,这里需要注意,SPI作为从机不支持该API

阻塞API:

image.png

非阻塞API:

image.png

4、SPI半双工只发送API

阻塞API:

image.png

非阻塞API:

image.png

5、SPI半双工只接收API

阻塞API:

image.png

非阻塞API:

image.png

(二)例子

官方在SDK的sample中也提供了对应的使用例子,

分为全双工和半双工,每个模式下还分为DMA和polling方式,每个传输下还分为主机和从机模式

路径在samples/spi_components

image.png

四、总结

先楫的SPI外设比较丰富,给开发者也带来一定的操作难度;另外IP 外设的复杂度和丰富化,对于SDK的编写也有一定的挑战。

但官方SDK也一直在进行复杂外设简单化的过程,比如本文的SPI组件。如果只是使用普通收发的SPI,可以使用SDK中的SPI组件,快速上手项目。

2
0
发表回复 0

Your email address will not be published. Required fields are marked *