<strike id="kiyse"></strike>
  • <tr id="kiyse"></tr>
  • <strike id="kiyse"></strike><samp id="kiyse"><tbody id="kiyse"></tbody></samp>
    <strike id="kiyse"><s id="kiyse"></s></strike>
    <tr id="kiyse"></tr>
    <noframes id="kiyse"><code id="kiyse"></code></noframes>
    <th id="kiyse"></th>
    <samp id="kiyse"></samp>
  • <th id="kiyse"><s id="kiyse"></s></th>
  • EM9280工控主板使用SPI訪問(wèn)TLC2543 AD示例

     2013-11-22              

            英創(chuàng)EM9280工控主板帶有半雙工的硬件SPI,與SPI協(xié)議的芯片通信時(shí)比使用GPIO模擬時(shí)序更加簡(jiǎn)單方便。本文以TLC2543芯片為例,介紹如何使用SPI獲得芯片的AD數(shù)據(jù)。也為客戶使用SPI驅(qū)動(dòng)與其它型號(hào)芯片通信提供參考。

     

    TLC2543芯片簡(jiǎn)介

     

             TLC2543是德州儀器公司生產(chǎn)的12位開關(guān)電容型逐次逼近模數(shù)轉(zhuǎn)換器,有11路AD輸入。參考芯片手冊(cè)資料,TLC2543支持8bit,12bit,16bit 的SPI協(xié)議,EM9280可以使用8bit和16bit的SPI與TLC2543通信。TLC2543是12位的AD,所以8bit會(huì)省略4位數(shù)據(jù),而16bit會(huì)添加4位軟件模擬數(shù)據(jù)。本文只介紹16bit的使用方法。

     

            參考芯片數(shù)據(jù)手冊(cè)。

     

     

            上圖為TLC2543 16bit的時(shí)序圖,我們可以設(shè)置SPI為16bit,數(shù)據(jù)長(zhǎng)度1字節(jié)來(lái)訪問(wèn)。

     

     

            TLC2543發(fā)送數(shù)據(jù)定義,例如需要訪問(wèn)AIN6,即D7-D4為0110。讀取數(shù)據(jù)采用單極性,MSB first,8bit,即D3-D0為0100。那么發(fā)送的1字節(jié)數(shù)據(jù)就為b0110 0100,即0x64。

     

            因?yàn)镋M9280的SPI為半雙工,第一次16bit發(fā)送數(shù)據(jù),第二次16bit讀入數(shù)據(jù)。

     

     

            資料說(shuō)明TLC2543為12位AD。當(dāng)使用16bit模式時(shí)會(huì)返回16位的數(shù)據(jù),低4位為無(wú)效0。我們可以通過(guò)移位,處理為12位的數(shù)據(jù)

     

    C#程序代碼

     

            參考EM9280光盤目錄C# SPI例程,對(duì)照TLC2543芯片資料,修改相關(guān)參數(shù)設(shè)置。16bit本來(lái)應(yīng)該使用short(2字節(jié))數(shù)組進(jìn)行操作,但是C#的Marshal.Copy只能操作byte數(shù)組,所以需要用byte數(shù)組來(lái)代替short數(shù)組,同時(shí)2位byte表示1位short。

     

            比如:希望傳送short[0] = 0x0c00;那么就設(shè)置byte[0] = 0x00;byte[1] = 0x0c;

     

            同樣在最后解析數(shù)據(jù)的時(shí)候,byte[0] = 0xc0;byte[1] = 0x6c;那么轉(zhuǎn)換后便是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); //設(shè)置頻率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; //設(shè)置為16bit 
            sSPI.pDatBuf = pTxBuffer; 
            sSPI.dwDatLen = 1; //設(shè)置數(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ù)

     

            測(cè)試結(jié)果

                    AIN = AIN / 16; //右移4位,舍棄后4位軟件模擬數(shù)據(jù) 
                    Double dAIN = (double)AIN / 4096.0 * 4.86;

            這里讀得AIN為0x6cc0,右移動(dòng)4位為0x06cc,為12位AD數(shù)據(jù),所以除以2^12即4096,再乘上基準(zhǔn)電壓(用萬(wàn)用表測(cè)得4.86V),結(jié)果為2.064V,用萬(wàn)用表量得結(jié)果,幾乎是一樣的。

     

    C程序代碼

     

            參考EM9280光盤目錄C SPI例程,對(duì)照TLC2543芯片資料,修改相關(guān)參數(shù)設(shè)置。

     

            先定義SPI為16bit

                    #define UseBitCount16 1 //修改該定義為或,實(shí)現(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); //設(shè)置頻率2MHz 

            //spi發(fā)送--------------------------------------- 
            i = 0; //讀取AIN0 
            SPI_TxBuf[0]= ((i << 4) + 0x0c)<<8; //i左移位到D7-D4,后面x0c為D3-D0,最后要左移8位,因?yàn)閰f(xié)議里16位前8位有效 

            hSPI_Box.BitCount = dBitCount; //設(shè)置為8bit 
            hSPI_Box.bLockCS = 0; //0為發(fā)送 
            hSPI_Box.dwDatLen = 1; //設(shè)置數(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 );

     

            測(cè)試結(jié)果 
                    f=(double)(SPI_RxBuf[0]>>4)/4096.0*4.86 ; 
            這里讀得SPI_RxBuf[0]為0x6ca0,右移動(dòng)4位為0x06ca,為12位AD數(shù)據(jù),所以除以2^12即4096,再乘上基準(zhǔn)電壓(用萬(wàn)用表測(cè)得4.86V),結(jié)果為2.062V,用萬(wàn)用表量得結(jié)果,幾乎是一樣的。

     

            詳細(xì)SPI例程代碼見光盤SPI例程,相關(guān)問(wèn)題,客戶可以聯(lián)系英創(chuàng)工程師咨詢。

    精品欧洲男同同志videos| 久久久无码人妻精品无码| 国产精品美女一区二区三区| 久久精品人人爽人人爽| 国产福利电影一区二区三区久久久久成人精品综合 | 日产精品久久久久久久性色 | 久久久久人妻一区精品果冻| 久久久这里只有精品加勒比| 久久久亚洲精品国产| 国产精品福利片免费看| 国产精品91在线播放| 亚洲性色精品一区二区在线 | 久久乐国产综合亚洲精品| 老司机67194精品线观看| 国产伦精品免编号公布| 国产精品无码素人福利不卡| 国产成人精品视频一区| 香蕉久久丫精品忘忧草产品| 亚洲另类春色国产精品| 日韩精品无码一本二本三本| 99精品国产一区二区三区| 亚洲精品成人网久久久久久| 嫩草影院在线观看精品视频| 国产香蕉免费精品视频| 91精品国产91久久久久青草| 久久久久无码精品亚洲日韩| 亚洲精品国产精品乱码不卡√ | 91精品一区国产高清在线| 午夜精品久久久内射近拍高清| 精品久久久无码中字| 精品无码久久久久久国产| 亚洲午夜精品一区二区麻豆 | 亚洲国产精品无码久久| 国产精品乳摇在线播放| 国产福利在线观看精品| 国产精品嫩草影院一二三区入口| 久久久久无码精品国产不卡 | 最新国产精品精品视频| 久久久久久青草大香综合精品| 国产成人精品久久一区二区三区av | 日韩精品国产另类专区|