一、接口簡介
串行外圍接口(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設備。為