本文档是移植SPI总线驱动到NUC970平台过程的总结,提供一些SylixOS SPI驱动相关的框架理解和移植心得。框架
NUC970平台上SPI总线驱动框架如图 21所示,SPI总线框架可分为两个部分,函数
总线相关初始化和数据传输流程。测试
图21 SPI驱动流程图ui
SPI总线驱动可分为两个部分:总线相关初始化和数据传输,下面对这两个部分的流程和代码编写作详细介绍。spa
SPI总线初始化主要有:SPI管脚复用、SPI控制器初始化、建立SPI操做函数集和建立SPI总线适配器。开发
SPI管脚复用是将SPI总线相关的管脚使能,如:SPI片选引脚CS、SPI时钟引脚SCLK、SPI数据输出引脚MOSI和数据输入引脚MISO。如图 31所示,经过通道号uiChannel判断是初始化SPI0总线仍是初始化SPI1总线的管脚复用。文档
图 31 SPI管脚复用配置
SPI控制器初始化主要工做是对SPI数据传输的方式和频率的设置,如图 32所示。循环
图 32 SPI控制器初始化函数im
建立包含SPI操做函数集的结构体,如图 33所示。
图 33 SPI总线函数集
如图 34所示,建立SPI总线适配器是将SPI总线加入系统的总线层。pSpiFuncs是LW_SPI_FUNCS(SPI操做函数结构体)类型,每一个SPI设备经过挂载在一个SPI总线适配器上,得到SPI总线操做函数。
图 34 建立SPI总线适配器
如图 35所示,数据传输时,先将数据写到SPI_Tx寄存器中,经过调用__spiStartTx函数开始数据传输,等待传输完成后调用__spiStartRx函数将接收到的数据从SPI_Rx寄存器中读取出来。循环这一过程直到数据发送完成。
图 35 数据传输流程
NUC970开发板的SPI总线,能够经过配置SPI_CNTRL寄存器,设置单次传输的数据的字节数。这里以单个字节传输为例。如图 36所示。
图 36 __trySpiTransfer函数实现
如图 37所示,将SPI_CNTRL寄存器的"Go_Busy位"置1,数据传输开始,等到传输完成,"Go_Busy位"会被清零。因此每次数据传输,都要将"Go_Busy位"置1,等到"Go_Busy位"被清零后,再进行下一步操做。
图 37 __spiStartTx函数实现
如图 38所示,当调用__spiStartTx函数数据传输完成后,会调用__spiStartRx函数将接收到的数据从SPI_Rx寄存器中读取出来,到这一步SPI的一次数据传输就完成了。
图 38 __spiStartRx函数实现
SPI驱动正常启动和加载的状况下,调用SPI传输函数,用示波器测量时钟和数据管脚的波形,若是传输的数据和时钟能正确匹配,说明基本完成移植。