一、接口简介
串行外围接口(Serial Peripheral Interface)设备通常需要快速的数据传输速率。SPI适合高带宽使用情况,如外部非易失性存储器和图形显示,许多传感器除了I2C也支持SPI。
SPI总线是一种同步的串行接口:这意味着它依赖于共享的时钟信号来同步设备之间的数据传输。控制时钟信号的设备被称为master。其它所有连接的外设被认为是Slaves。每个设备连接到同一组数据信号以形成总线。从理论上讲,SPI数据传输率是仅限于master切换时钟信号的快慢。时钟速度通常在16MHz到25MHz范围。高速共享时钟允许SPI外设更快的传输数据,比UART错误更少。
SPI支持全双工数据传输:意味着master和slave可以同时交换数据。为了支持全双工传输,总线必须提供下列单独的信号,使得SPI最少四线接口:
- Master出Slave入(MOSI);
- Mater入Slave出(MISO);
- 共享时钟信号(CLK);
- 共同的接地参考(GND);
SPI支持同一总线连接多个从设备:和I2C不同,slave设备使用硬件寻址。每个slave都需要外部芯片选择信号,来让master定位特定的设备作为数据传输的目标。如果仅仅使用一个slave这个信号就不必须。
二、接口使用
打开连接
创建PeripheralManagerService对象,使用你想打开端口的名称,调用open()方法打开连接。public class HomeActivity extends Activity { // SPI Device Name private static final String SPI_DEVICE_NAME = ...; private SpiDevice mDevice; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Attempt to access the SPI device try { PeripheralManagerService manager = new PeripheralManagerService(); mDevice = manager.openSpiDevice(SPI_DEVICE_NAME); } catch (IOException e) { Log.w(TAG, "Unable to access SPI device", e); } } @Override protected void onDestroy() { super.onDestroy(); if (mDevice != null) { try { mDevice.close(); mDevice = null; } catch (IOException e) { Log.w(TAG, "Unable to close SPI device", e); } } } }
配置时钟和数据模式
在一个SPI总线连接建立之后,配置数据传输速率和操作模式来匹配同一条总线上的Slave设备。为了成功的传输数据,在总线的所有设备必须具有相同的时钟和数据格式行为。设置SPI模式,定义了时钟信号的极性和相位。你选择的属性基于三个属性:
- 闲置级别:当没有数据传输的时候,时钟信号的级别(或高或低);
- 前沿:每个时钟脉冲的前沿;
- 后沿:每个时钟脉冲前沿相反过渡;
支持以下模式:
- MODE0-时钟信号闲置为低,数据传输在前时钟边沿;
- MODE1-时钟信号闲置为高,数据传输在后时钟边沿;
- MODE2-时钟信号闲置为低,数据传输在前时钟边沿;
- MODE3-时钟信号闲置为高,数据传输在后时钟边沿;
设置如下SpiDevice参数:
- 频率:以Hz为单位指定共享时钟信号。时钟信号的能力在不同的设备之间有所不同。在设置这个值之前,你应该确认下你设备支持的频率。
- xxx:指定在总线上传输的每个字节中比特的顺序,这也被称为数据的字节序。默认情况下,数据将会把最高有效位(MSB)首先发送。
- 每个字的比特:配置一次传输的比特数,…,默认的值是8比特每字。
pu