<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 基于嵌入式WinCE的I2C驅(qū)動程序設(shè)計

          基于嵌入式WinCE的I2C驅(qū)動程序設(shè)計

          作者: 時間:2014-08-01 來源:網(wǎng)絡(luò) 收藏

            reg = (PVOID)VirtualAlloc(0, sz, MEM_RESERVE, PAGE_NOACCESS);

          本文引用地址:http://www.ex-cimer.com/article/256368.htm

            if (reg) {

            if (!VirtualCopy(reg, addr, sz, PAGE_READWRITE | PAGE_NOCACHE )) {

            RETAILMSG( DEBUGMODE,( TEXT( "Initializing interrupt \n\r" ) ) );

            VirtualFree(reg, sz, MEM_RELEASE);

            reg = NULL;

            }

            }

            其中sz是申請的長度,addr是申請?zhí)摂M地址空間的實際物理地址在Win CE中的映射地址。

            然后對申請到的虛擬地址進行操作,安裝Windows中的流驅(qū)動的模型進行驅(qū)動的編寫,主要包括下面函數(shù)的編寫。

            IIC_Init()

            在函數(shù)中,主要是對的初始化,主要語句如下:

            v_pIICregs = ( volatile IICreg *)IIC_RegAlloc((PVOID)IIC_BASE, sizeof(IICreg));

            v_pIOPregs = ( volatile IOPreg *)IOP_RegAlloc((PVOID)IOP_BASE, sizeof(IOPreg));

            v_pIOPregs->rGPEUP|= 0xc000;

            v_pIOPregs->rGPECON |= 0xa00000;

            v_pIICregs->rIICCON = (1<<7) | (0<<6) | (1<<5) | (0xf);

            v_pIICregs->rIICADD= 0x10;

            v_pIICregs->rIICSTAT = 0x10;

            VirtualFree( ( PVOID )v_pIOPregs,sizeof( IOPreg ),MEM_RELEASE );

            v_pIOPregs = NULL;

            if ( !S

            tartDispatchThread( pIIcHead) )

            { IIC_Deinit( pIIcHead );return ( NULL );}在StartDispatchThread()函數(shù)中,主要是創(chuàng)建線程、關(guān)聯(lián)事件和中斷,主要語句如下:

            InterruptInitialize( 36,pIicHead->hIicEvent,NULL,0 );//關(guān)聯(lián)時間和中斷

            CreateThread( NULL,0,IicDispatchThread,pIicHead,0,NULL );//創(chuàng)建線程等待時間

            在IicDispatchThread()函數(shù)中,主要是等待中斷的產(chǎn)生,然后去執(zhí)行:WaitReturn = WaitForSingleObject( pIicHead->hIicEvent,INFINITE );

            IicEventHandler( pIicHead );//事件處理函數(shù)

            InterruptDone( 36 );

            最后,在函數(shù)IIC_Open、IIC_Read、IIC_Write中,對各個寄存器進行操作,進行數(shù)據(jù)的賦值,得到讀取的數(shù)據(jù)和發(fā)送數(shù)據(jù)。

            4 驅(qū)動的封裝和添加到Windows CE中

            通過上面的工作,能編譯一個DLL函數(shù),但這還不能叫流接口驅(qū)動程序。因為它的接口函數(shù)還沒有導(dǎo)出,還需要告訴鏈接程序需要輸出什么樣的函數(shù),為此要建立一個自己的def文件,可以用記事本建一個,取名mydrive.Def:

            LIBRARY MyDriver

            EXPORTS

            IIC_Close

            IIC_Deinit

            IIC_Init

            IIC_IOControl

            IIC_Open

            IIC_PowerDown

            IIC_PowerUp

            IIC_Read

            IIC_Seek

            IIC_Write

            然后同樣用記事本編寫一個注冊表文件,取名為mydrive.reg:

            [HKEY_LOCAL_MACHINEDriversBuiltInSTRINGS]

            "Index"=dword:1

            "Prefix"="IIC"

            "Dll"="MyDriver.dll"

            "Order"=dword:0

            最后編寫自己的CEC文件。主要是添加一個Build Method,任務(wù)是復(fù)制注冊表到Win CE的系統(tǒng)目錄下面。加一個Bib File,其主要功能是把編譯的mydrive.dll文件添加到系統(tǒng)內(nèi)核中去。保存寫好的CEC文件。打開Platform Builder,打開“File”菜單,添加剛剛編寫的CEC特征到系統(tǒng)選項中去。生成系統(tǒng)的時候,添加自己的CEC特性,就可以包含剛剛編寫的I2C驅(qū)動了。

            以上介紹了Win CE的驅(qū)動結(jié)構(gòu),并給出了基于Win CE的 I2C驅(qū)動程序部分源代碼。實驗證明該設(shè)計是可行的。

          linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)
          上拉電阻相關(guān)文章:上拉電阻原理

          上一頁 1 2 下一頁

          關(guān)鍵詞: 嵌入式 WinCE I2C

          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();