Nordic的52832芯片中有很多可以使用的协议,在其的官方文档中可以查看到(地址 在第一篇SDK的网址是一样的),其中使用最多的为spi,twi等,而twi中又完全兼容I2C协议,今天的目的主要是说明一下spi的配置过程(twi的配置过程在第三篇会提及到)。
首先介绍一下什么是spi,先上图:
可以很清楚的看到spi的实现过程。spi使用4根线,sck,mosi,miso,cs,而其中的MOSI的含义是Master Input Slave Output,MISO的含义是Master Output Slave Input ,这样看的好处是能够方便的分清楚是怎么传输数据的。在52832中又有个新的东西叫做EasyDMA,这个是可以自动读写RAM,让CPU可以一次性配置完一整个数据包的传输,然后在整包数据传输完成之后再处理剩下的TASKS了,所以对于低功耗开发而言是很不错的。
这里我把spi处理过程分成了以下几个方面
(1)spi的配置;
spi的配置其实有点意思,在实际的项目中根据你所需要的模块,在sdk_config.h中去配置,有两个方法可以进行相应的配置,第一个是通过找到对应的spi的Macro,即宏,去配置相应的信息;
第二是通过Configuration Wizard来配置,这个方法是我现在选择的,比较方便也比较直接,不容易出现差错。
在所需的模块上进行选择和配置。
(2)spi的初始化;
spi的初始化过程也很有意思,也是需要去配置spi的四个引脚值及其他的一些基本信息。其目的在于初始化spi模块并使能其引脚及初始化读写操作,并且外设库SPI初始化函数nrf_drv_spis_init()可以提供一个函数句柄,用做传输完成的回调函数。。
(3)spi的启动;
spi的初始化过程中就会去启动spi,我提出来说的目的在于我最开始没有去启动,犯了一个傻瓜式的错误。启动的过程就是调用52832的底层函数nrf_drv_spis_init();没有启动的spi是不能够进行后面的操作的。
(4)spi的读写;
spi的读写操作在应用层看来是比较简单的,因为官方的SDK中已经提供给你了底层函数接口,直接配置好调用就行。在读写操作中需要调用的函数是nrf_drv_spis_buffers_set(),spi读写是同步的故直接封装成一个函数。在第一张图中可以看到是需要用到缓冲区的,目的在于更准确的发送和接收数据。
(5)spi的关闭;
当你不再发送数据,及你的发送缓冲区和接收缓冲区都没有数据的时候,spi选择关闭,这样做的目的在于降低功耗。spi关闭也会调用底层的接口函数nrf_drv_spis_uninit()。
最后,spi通过初始化过程时提供了一个回调函数,即spis_event_handler(),这是spi发送完成的回调函数,将会在发送完成中断中调用。到这里基本的spi就完成了,当然如果需要修改默认的spi的参数内容,可以在初始化配置过程中进行。
高山远水,漫步悠扬。