在基于工控主板EM9160的嵌入式應用中,經常需要與具有SPI接口的芯片或電路單元,進行數據通訊。通常情況下,我們建議采用基于GPIO的SPI通訊協議實現方案,其優點是靈活性,客戶可使用任意的GPIO管腳來實現SPI通訊,有關這方面的技術方案的實現,可參考英創網站的《使用GPIO控制SPI接口的AD芯片》一文。在SPI通訊中,還有一類應用需要進行大數據量的傳輸,且要求盡可能高的波特率,這時若采用基于GPIO的方案,就可能造成占用過多的CPU資源。因此需要使用EM9160的硬件SPI接口。
EM9160的硬件SPI接口為4線制SPI,其管腳與GPIO12–GPIO15復用:
GPIO管腳 | SPI接口信號 | 簡要說明 |
GPIO12 | SPI_DIN | 串行數據輸入 |
GPIO13 | SPI_DOUT | 串行數據輸出 |
GPIO14 | SPI_CLK | 串行數據同步時鐘輸出 |
GPIO15 | SPI_CS# | 片選控制輸出,低電平有效 |
為了操作硬件SPI接口,應用程序需要打開“SPI1:”的設備文件:
HANDLEhDevice;
hDevice = CreateFile( _T('SPI1:'),
GENERIC_READ | GENERIC_WRITE,
0, NULL, OPEN_EXISTING, 0, NULL);
if (hDevice == INVALID_HANDLE_VALUE)
{
return -1;
}
獲得有效的文件句柄后,就可通過DeviceIoControl(…)函數來操作SPI接口了。在EM9160的SDK中已封裝了相應的API函數,以方便應用程序的使用。相關的數據結構和函數定義,包括在“SPI_API.h”中:
// 定義SPI通訊參數結構
typedef struct
{
DWORD dwCLKPolarity; // SPI時鐘極性:=0 或者 =1
DWORD dwCLKPhase; // SPI時鐘相位:=0 或者 =1
DWORD dwDataBitSize; // SPI通訊數據幀的位數:8bit-16bit
DWORD dwBaudRate; // SPI通訊波特率:最高波特率為10Mbps
} SPISTATE;
盡管EM9160的硬件波特率可以高達100Mbps,但為了保證可靠傳輸,建議應用程序把波特率控制在10Mbps以下。SPI時鐘極性dwCLKPolarity,在數據手冊中通常記為CPOL,= 0表示在沒有數據傳輸時為低電平,= 1表示沒有數據傳輸時為高電平。SPI時鐘相位dwCLKPhase,在數據手冊中通常記為CPHA,= 0表示時鐘的第一個沿更新數據、第二個沿鎖存數據,= 1表示時鐘的第一個沿鎖存數據、第二個沿更新數據。下面的事宜圖,以8-bit數據為例:
CPHA = 0的SPI時序
CPHA = 1的SPI時序
SPI通訊參數設置,通過以下兩個函數實現:
// 功能描述:設置SPI通訊參數。
// 輸入參數 HANDLE hDevice: 運行CreateFile( _T('SPI1:'),....)函數返回的有效句柄
// SPISTATE *pSPIState: SPI通訊參數
// 返回值 = TRUE: SPI通訊參數成功。
// = FALSE: SPI通訊參數失敗。
BOOL SetSPIState( HANDLE hDevice, SPISTATE *pSPIState );
// 功能描述:獲取SPI通訊參數。
// 輸入參數 HANDLE hDevice: 運行CreateFile( _T('SPI1:'),....)函數返回的有效句柄
// 輸出 SPISTATE *pSPIState: 獲取的SPI通訊參數
// 返回值 = TRUE: SPI通訊參數成功。
// = FALSE: SPI通訊參數失敗。
BOOL GetSPIState( HANDLE hDevice, SPISTATE *pSPIState );
在調用上述函數時,注意指針pSPIState需要初始化分配空間。在設置好SPI參數后,就可調用下面的函數進行具體的數據通訊了
// 功能描述:全雙工收發SPI數據
// 輸入參數:
// HANDLE hDevice: 運行CreateFile( _T('SPI1:'),....)函數返回的有效句柄
// DWORD DatLength: 需收發的數據樣點長度, (DatLength * 字節數/樣點) < 1024。
// PVOID pTxBuf: 需發送的數據BUFFER,注意一個數據樣點可能占用2個字節。
// PVOID pRxBuf: 需接收的數據BUFFER,注意一個數據樣點可能占用2個字節。
// 返回值 = TRUE: SPI數據通訊成功。
// = FALSE: SPI數據通訊失敗。
BOOL SPI_FullDuplex( HANDLE hDevice,
PVOID pTxBuf,
PVOID pRxBuf,
DWORD DatLength );
在調用上述SPI函數,需要注意以下事宜:
1、SPI設備驅動程序的內部buffer缺省設置為1K字節,因此每次通訊的字節數不能超過1K字節,對大于8-bit的數據,每個數據均按2個字節計算。
2、對8-bit的SPI傳輸,收發數據buffer的類型應設置為UCHAR;而對9-bit – 16-bit的數據傳輸,其收發數據buffer的類型應設置為WORD。
3、參數DatLength是以數據為單位計算的,所以若傳輸8-bit數據,其最大值為1024,若傳輸8-bit以上數據,其最大值為512。
4、對傳輸長度超過SPI設備驅動程序的內部buffer長度的應用,可通過循環多次調用來實現數據通訊。
-
嵌入式主板
+關注
關注
7文章
6096瀏覽量
36134
發布評論請先 登錄
評論