MN316 OpenCPU 模式下的SPI主要功能函数包含SPI开启指定通道、关闭SPI、SPI写数据、SPI读数据。本文从使用流程、SPI模式介绍、Demo使用方法和注意事项四个方面介绍如何实现MN316 OpenCPU模组的SPI使用。
一、SPI使用流程解析
图1为MN316 OpenCPU SPI功能使用的常见流程介绍。
图1 SPI使用流程
SPI使用流程可结合MN316_OpenCPU(R14)_Standard_X.X.X.XXXXXX_release\examples\spi cm_demo_spi.c中的demo示例程序加深理解。
SPI功能包含的全部函数接口详细定义可在include\cmiot\cm_spi.h中查看。
二、SPI模式介绍
SPI工作模式一共四种,由时钟极性CPOL(Clock Polarity)和时钟相位CPHA(Clock Phase)决定。CPOL表示SPI空闲时时钟信号的电平,0表示低电平,1表示高电平;CPHA表示SPI在时钟的第几个边沿采样,0表示第一个边沿开始采样,1表示第二个边沿开始采样。
下面对SPI的4种工作模式做简单介绍,一般模式0和模式3使用的情况最多。
2.1 模式0
图2 任务模式0时序图
CPOL = 0:空闲时是低电平,第1个跳变沿是上升沿,第2个跳变沿是下降沿;
CPHA = 0:数据在第1个跳变沿(上升沿)采样。
2.2 模式1
图3 模式1时序图
CPOL = 0:空闲时是低电平,第1个跳变沿是上升沿,第2个跳变沿是下降沿;
CPHA = 1:数据在第2个跳变沿(下降沿)采样。
2.3 模式2
图4 模式2时序图
CPOL = 1:空闲时是高电平,第1个跳变沿是下降沿,第2个跳变沿是上升沿。
CPHA = 0:数据在第1个跳变沿(下降沿)采样。
2.4 模式3
图5 模式3时序图
CPOL = 1:空闲时是高电平,第1个跳变沿是下降沿,第2个跳变沿是上升沿;
CPHA = 1:数据在第2个跳变沿(上升沿)采样。
2.5 SPI使用说明
引脚说明:
使用说明:
目前MN316 仅支持1路SPI接口,且暂只能作为SPI主设备,SDK提供SPI初始化、读、写、写后读、去初始化等接口。具体的使用流程如下:
(1)SPI初始化:cm_spi_open,可设置SPI工作模式,通信数据位,NSS模式,时钟频率;
(2)SPI读写:cm_spi_read/cm_spi_write/cm_spi_write_then_read,读/写/写后后,使用过程中cm_spi_read基本不会用到,因为SPI基本是先写入参数后才能读到数据;
(3)SPI去初始化,关闭SPI:cm_spi_close,关闭SPI。
三、SPI Demo说明
Demo中使用flash作为从设备与模组通信。
3.1 初始化SPI:模式0,数据位8位,NNS软件模式,时钟频率设置为2.448MHz
图6 初始化SPI
3.2 读取Flash ID:读取从设备的ID,一般用于测试SPI通信是否正常
图7 读取Flash ID
3.3 向Flash里写入数据
(1)封装flash写函数,可任意地址读写,内部执行擦除,且保存flash非操作地址的数据:先计算写入的起始地址和结束地址分别所在的页ID,然后挨个页先读出所在页的数据放在缓冲中,然后将需要写入的数据写入缓冲中,使用擦除接口擦除本页的数据,等待擦除完成后,最后使用页写入接口将缓冲区的数据写入;
(2)封装擦除接口:使能flash写操作,然后写入擦除命令和擦除地址;
(3)页写入:使能flash写操作后,使用spi写接口写入数据,注意数据前4个字节为命令和地址,后跟数据,即最终写入的数据长度实际为数据长度加4;
(4)使用封装的写函数写入“Hello world”数据返回。
图8 向Flash里写入数据
3.4 从Flash中读出数据
(1)封装flash读接口:先写入命令和地址,然后读数据;
(2)使用flash读接口读出上一步中写入的数据。
图8 从Flash中读出数据
3.5 关闭SPI接口
图9 关闭SPI接口
3.6 测试结果
(1)烧录demo程序,配合开发板通过串口助手测试;
(2)模组串口打印please input cmds:时,输入CM:SPI,运行结果如图10。
图10 测试结果
四、使用注意事项
1、硬件上模组的MOSI引脚与设备的MOSI引脚连接,而不是交叉连接;
2、使用软件NSS时,SPI读写接口内部已经将NSS片选引脚会自动拉低,即使能SPI片选。