英創(chuàng)EM9280工控主板帶有半雙工的硬件SPI,與SPI協(xié)議的芯片通信時比使用GPIO模擬時序更加簡單方便。本文以TLC2543芯片為例,介紹如何使用SPI獲得芯片的AD數(shù)據(jù)。也為客戶使用SPI驅動與其它型號芯片通信提供參考。
TLC2543芯片簡介
TLC2543是德州儀器公司生產(chǎn)的12位開關電容型逐次逼近模數(shù)轉換器,有11路AD輸入。參考芯片手冊資料,TLC2543支持8bit,12bit,16bit 的SPI協(xié)議,EM9280可以使用8bit和16bit的SPI與TLC2543通信。TLC2543是12位的AD,所以8bit會省略4位數(shù)據(jù),而16bit會添加4位軟件模擬數(shù)據(jù)。本文只介紹16bit的使用方法。
參考芯片數(shù)據(jù)手冊。
上圖為TLC2543 16bit的時序圖,我們可以設置SPI為16bit,數(shù)據(jù)長度1字節(jié)來訪問。
TLC2543發(fā)送數(shù)據(jù)定義,例如需要訪問AIN6,即D7-D4為0110。讀取數(shù)據(jù)采用單極性,MSB first,8bit,即D3-D0為0100。那么發(fā)送的1字節(jié)數(shù)據(jù)就為b0110 0100,即0x64。
因為EM9280的SPI為半雙工,第一次16bit發(fā)送數(shù)據(jù),第二次16bit讀入數(shù)據(jù)。
資料說明TLC2543為12位AD。當使用16bit模式時會返回16位的數(shù)據(jù),低4位為無效0。我們可以通過移位,處理為12位的數(shù)據(jù)
參考EM9280光盤目錄C# SPI例程,對照TLC2543芯片資料,修改相關參數(shù)設置。16bit本來應該使用short(2字節(jié))數(shù)組進行操作,但是C#的Marshal.Copy只能操作byte數(shù)組,所以需要用byte數(shù)組來代替short數(shù)組,同時2位byte表示1位short。
比如:希望傳送short[0] = 0x0c00;那么就設置byte[0] = 0x00;byte[1] = 0x0c;
同樣在最后解析數(shù)據(jù)的時候,byte[0] = 0xc0;byte[1] = 0x6c;那么轉換后便是short[0] = 0x6cc0;
先定義SPI為16bit,在SPI.cs中定義
private const int SSP_WORD_LENGTH_16BITS = 0xF;
在SPIConfigure函數(shù)中定義
spiinit.eLength = SSP_WORD_LENGTH_16BITS;
執(zhí)行代碼
…
//spi初始化代碼---------------------------------
SPI.SPISetBandRate(hSPI, 2000000); //設置頻率2MHz
//spi發(fā)送---------------------------------------
i = 0; //讀取AIN0
//16bit
TxBuffer[0] = 0;
TxBuffer[1] = (byte)((i << 4) + 0x0c); //i左移4位到D7-D4,后面0x04為D3-D0?
sSPI.BitCount = 16; //設置為16bit
sSPI.pDatBuf = pTxBuffer;
sSPI.dwDatLen = 1; //設置數(shù)據(jù)1字節(jié)
sSPI.bLockCS = 0; //0為發(fā)送
Marshal.Copy(TxBuffer, 0, pTxBuffer, 10);
bRes = SPI.WriteFile(hSPI, ref sSPI, sizeSPI, ref uLen, 0);
//spi接收---------------------------------------
sSPI.BitCount = 16;
sSPI.pDatBuf = pRxBuffer;
sSPI.dwDatLen = 10;
sSPI.bLockCS = 1;
bRes = SPI.ReadFile(hSPI, ref sSPI, sizeSPI, ref uLen, 0);
Marshal.Copy(pRxBuffer, RxBuffer, 0, 10);
int AIN = RxBuffer[0] + RxBuffer[1]*256; //讀得數(shù)據(jù)
測試結果
AIN = AIN / 16; //右移4位,舍棄后4位軟件模擬數(shù)據(jù)
Double dAIN = (double)AIN / 4096.0 * 4.86;
這里讀得AIN為0x6cc0,右移動4位為0x06cc,為12位AD數(shù)據(jù),所以除以2^12即4096,再乘上基準電壓(用萬用表測得4.86V),結果為2.064V,用萬用表量得結果,幾乎是一樣的。
C程序代碼
參考EM9280光盤目錄C SPI例程,對照TLC2543芯片資料,修改相關參數(shù)設置。
先定義SPI為16bit
#define UseBitCount16 1 //修改該定義為或,實現(xiàn)位數(shù)據(jù)位或位數(shù)據(jù)位通訊
#if UseBitCount16
#define dBitCount 16
#else
#define dBitCount 8
#endif
定義BUFFER為16字節(jié)數(shù)組
WORD SPI_TxBuf[10],SPI_RxBuf[10];
執(zhí)行代碼
…
//spi初始化代碼---------------------------------
SPISetBandRate( hSPI , 2000000); //設置頻率2MHz
//spi發(fā)送---------------------------------------
i = 0; //讀取AIN0
SPI_TxBuf[0]= ((i << 4) + 0x0c)<<8; //i左移位到D7-D4,后面x0c為D3-D0,最后要左移8位,因為協(xié)議里16位前8位有效?
hSPI_Box.BitCount = dBitCount; //設置為8bit
hSPI_Box.bLockCS = 0; //0為發(fā)送
hSPI_Box.dwDatLen = 1; //設置數(shù)據(jù)1字節(jié)
hSPI_Box.pDatBuf = (BYTE*)SPI_TxBuf;
WriteFile( hSPI , &hSPI_Box , sizeof( hSPI_Box ) , (DWORD*)&i , 0 );
//spi接收---------------------------------------
hSPI_Box.bLockCS = 1;
hSPI_Box.dwDatLen = 1;
hSPI_Box.pDatBuf = (BYTE*)SPI_RxBuf;
ReadFile( hSPI , &hSPI_Box , sizeof( hSPI_Box ) , (DWORD*)&i , 0 );
測試結果
f=(double)(SPI_RxBuf[0]>>4)/4096.0*4.86 ;
這里讀得SPI_RxBuf[0]為0x6ca0,右移動4位為0x06ca,為12位AD數(shù)據(jù),所以除以2^12即4096,再乘上基準電壓(用萬用表測得4.86V),結果為2.062V,用萬用表量得結果,幾乎是一樣的。
詳細SPI例程代碼見光盤SPI例程,相關問題,客戶可以聯(lián)系英創(chuàng)工程師咨詢。
-
嵌入式主板
+關注
關注
7文章
6085瀏覽量
35295
發(fā)布評論請先 登錄
相關推薦
評論