(1)串行外设接口(SPI:Serial Peripheral interface)是一种串行同步通讯协议(同时读入和写出),由SDI(串行数据输入,MISO),SDO(串行数据输出,MOSI),SCK(串行移位时钟),CS(从使能信号)四种信号构成。CS 决定了唯一的与主设备通信的从设备,如没有CS 信号,则只能存在一个从设备,主设备通过产生移位时钟来发起通讯。
       主要影响SPI通讯的两个参数是时钟极性(CPOL)和时钟相位(CPHA)两个参数,SPI传输串行数据时首先传输最高位(MSB或者LSB可设置)。

时钟极性(CPOL)对传输协议没有重大的影响,如果CPOL=0,串行同步时钟的空闲状态为低电平;如果CPOL=1,串行同步时钟的空闲状态为高电平。

时钟相位(CPHA)能够配置用于选择两种不同的传输协议之一进行数据传输,如果CPHA=0,在串行同步时钟的第一个跳变沿(上升或下降)数据被采样;如果CPHA=1,在串行同步时钟的第二个跳变沿(上升或下降)数据被采样。可这样理解:CPOL=0时,CPHA=0,一个CLK周期是从低到高;CPHA=1时,一个CLK周期是从高到低。

        图示如下:

                                               SPI协议及SDIO协议_通讯

        一般的ARM系统对SPI的支持方式分三种:轮询(POLLING),中断(INTERRUPT,需要定义SPI的中断号),和DMA(配置好SPI和DMA对应的寄存器,和DMA的源头和目的地址,就可以开始进行DMA传输)。

(2)SPI协议在android驱动中的使用

自带spi驱动加载及应用程序编写方法详解 。主要讲述了spidev1.0和spidev0.0这两个设备节点是如何生成的。以及如何用测试程序测试这两个设备节点。

      跑测试程序bin,能显示自定义的数组内容即可。

(3)基于SDIO协议,SD卡的定义如下:

                                                                                              SPI协议及SDIO协议_resources_02

上图是以CD/DAT3的复用来实现卡检测功能,其实CD可以以单独的GPIO中断来实现,但本质上CD是可有可无的,因为很多应用场合并不需要支持SD热插拔。至于SD唤醒系统,也是由GPIO中断来实现,也可以定义数据线中断来实现(如果SDIO数据线协议支持的话)。

       SDIO协议可以支持三种操作模式:SPI,SD一线,SD四线(接口通过寄存器来配置)。SPI速度较低,一线或者四线需要寄存器来选择,高速模式下需要四线支持。其中DAT是数据线,一线模式下默认用DAT0;CMD线上传输串行命令,可以是单机寻址或者广播命令。