<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 基于嵌入式WinCE的I2C驅動(dòng)程序設計

基于嵌入式WinCE的I2C驅動(dòng)程序設計

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

  引言

本文引用地址:http://dyxdggzs.com/article/256368.htm

  隨著(zhù)以計算機技術(shù)、通信技術(shù)和軟件技術(shù)為核心的信息技術(shù)的迅速發(fā)展,系統在各行業(yè)得到了廣泛的應用,極大地推動(dòng)了行業(yè)的滲透性應用。

  系統是“以應用為中心、以計算機技術(shù)為基礎、軟硬件可裁剪、適應應用系統對功能、可靠性、成本、體積、功耗嚴格要求的專(zhuān)用計算機系統”,由硬件和嵌入式軟件兩部分組成。嵌入式軟件包括嵌入式操作系統和嵌入式應用軟件。Microsoft的桌面操作系統已經(jīng)為人們熟悉和使用,嵌入式的操作系統 Windows CE.net也日益風(fēng)行。Windows CE.net是Microsoft推出的功能強大的緊湊、高效、可伸縮的32位嵌入式操作系統,主要面對各種各樣的嵌入式系統和產(chǎn)品。該系統所具有的多線(xiàn)程、多任務(wù)、完全搶占式的特點(diǎn)是專(zhuān)為各種具有嚴格資源限制的硬件系統所設計的。為了將操作系統和硬件設備連接起來(lái),聯(lián)系硬件和軟件的驅動(dòng)就顯得很重要。

  下面主要針對三星公司ARM9內核的芯片S3C2410進(jìn)行分析,介紹在Windows CE.net系統下進(jìn)行底層設備驅動(dòng)開(kāi)發(fā)的方法并提供通信的實(shí)例。

  1 通信協(xié)議及S3C2410芯片介紹

  (Inter Integrated Circuit)總線(xiàn)是1980年由Philips公司推出的。 I2C總線(xiàn)用兩條線(xiàn)(SDA和SCL)在總線(xiàn)和裝置之間傳遞信息,在微控制器和外部設備之間進(jìn)行串行通信或在主設備和從設備之間進(jìn)行雙向數據傳送。兩條通信線(xiàn)通過(guò)上拉電阻被拉升至+5 V。在控制系統中的每個(gè)集成電路可以通過(guò)一個(gè)CMOS緩沖器來(lái)讀每一條線(xiàn)路,也可以通過(guò)一個(gè)柵極開(kāi)路的FET管將每一條線(xiàn)的電平下拉。因此,對每個(gè)芯片來(lái)說(shuō),每條線(xiàn)既是輸入線(xiàn),又是輸出線(xiàn)。

  I2C總線(xiàn)遵從同步串行傳輸協(xié)議,即各位串行(一位接一位)發(fā)送,由時(shí)鐘(clock)線(xiàn)指示讀數據(data)線(xiàn)的時(shí)刻。每個(gè)數據包前有一個(gè)地址,以指示由哪個(gè)器件來(lái)接收該數據。

  S3C2410是一款基于A(yíng)RM920T的16/32位RISC微處理器,主要用于手持設備,擁有高性?xún)r(jià)比,低功耗等特點(diǎn),也是目前市面上出現較多的嵌入式開(kāi)發(fā)板的處理器之一。芯片擁有16 KB的指令和數據緩存器,有存儲管理單元(MMU)、LCD控制器、3個(gè)串口、4路DMA、4個(gè)時(shí)鐘定時(shí)器、8路10位的A/D轉換;支持I2C、 I2S、SPI、主從USB等接口以及SD/MMC卡。

  S3C2410微處理器的I2C總線(xiàn)可以處于下面4種模式下:主接收模式、主發(fā)送模式、從接收模式和從發(fā)送模式。處理器對I2C進(jìn)行的操作,主要是對下面的幾個(gè)寄存器進(jìn)行讀/寫(xiě):

  IIC控制寄存器,IICCON(物理地址0X54000000,內存映射后的虛擬地址);

  IIC控制/狀態(tài)寄存器,IICSTAT(物理地址0X54000004);

  IIC數據寄存器,IICDS(物理地址0X54000008);

  IIC地址寄存器,IICADD(物理地址0X5400000C)。

  本設計主要是CPU工作在主模式下與下面的I2C接口設備進(jìn)行通信。

  2 Windows CE系統驅動(dòng)特點(diǎn)

  Windows CE.net驅動(dòng)有兩種模型:本機設備驅動(dòng)程序和流接口驅動(dòng)程序。本機設備驅動(dòng)適于集成到基于Windows CE.net平臺的設備。這些設備驅動(dòng)程序是一些硬件所必需的,是由原始設備制造商創(chuàng )建的,用以驅動(dòng)如鍵盤(pán)、觸摸屏、音頻設備等,往往在設備售出后就不會(huì )再更換,如通用LED驅動(dòng)、電源驅動(dòng)、鍵盤(pán)驅動(dòng)和顯示驅動(dòng)等都是本機設備驅動(dòng)。對于本機設備驅動(dòng)程序,Platform Builder提供了一些驅動(dòng)程序樣本,目的是為了方便開(kāi)發(fā)人員快速開(kāi)發(fā)出自己的驅動(dòng)程序。當Win CE系統啟動(dòng)時(shí),本地設備驅動(dòng)程序將被加載到系統的內存中。本地驅動(dòng)程序的開(kāi)發(fā)分為分層驅動(dòng)和單片驅動(dòng)程序。分層驅動(dòng)要利用微軟提供的與應用程序通信的上層,稱(chēng)為模塊驅動(dòng)程序層MDD(Model Device Driver)。MDD層通過(guò)設備驅動(dòng)程序接口DDI(Device Driver Interface)與應用程序通信,開(kāi)發(fā)驅動(dòng)程序通常不修改MDD層,主要關(guān)心與具體硬件相關(guān)的下層,依賴(lài)平臺的設備驅動(dòng)程序層 PDD(Platform Dependent Driver), PDD層通過(guò)設備驅動(dòng)服務(wù)接口(Device Driver Service Provider Interface)直接管理硬件。流接口設備驅動(dòng)程序(指可安裝的啟動(dòng)程序)可以由第三方生產(chǎn)商提供,以支持添加到系統中的設備。Windows CE下的設備驅動(dòng)程序在與應用程序相同的保護級上工作。當系統啟動(dòng)時(shí),大多數驅動(dòng)程序是由設備管理進(jìn)程(DEVICE.EXE)加載的,所有這些驅動(dòng)程序將共享同一個(gè)進(jìn)程地址空間。

  3 I2C總線(xiàn)底

  層驅動(dòng)設計

  I2C總線(xiàn)驅動(dòng)是放在Windows CE操作系統的內核下層,位于OEM Adaptation Layer(OAL)層的一個(gè)真正的驅動(dòng)。

  3.1 初始化I2C中斷和編寫(xiě)ISR例程

  I2C的通信是通過(guò)操作I2C的寄存器進(jìn)行的。在I2C通信中主要對上面介紹的4個(gè)寄存器進(jìn)行讀寫(xiě)。通過(guò)讀寫(xiě)這些寄存器中的命令狀態(tài)字可以檢測和控制 I2C總線(xiàn)的行為。在Windows CE.net下,首先要在文件oalintr.h添加I2C的中斷號的宏定義:

  #defineSYSINTR_I2C(SYSINTR_FIRMWARE+19)

  然后在文件cfw.c的文件中添加I2C中斷的初始化,禁止和復位。具體代碼如下:

  在OEMInterruptEnable函數中加入

  case SYSINTR_IIC:

  s2410INT->rSRCPND=BIT_IIC;

  if (s2410INT->rINTPND & BIT_IIC) s2410INT->rINTPND = BIT_IIC;

  s2410INT->rINTMSK&=

  ~BIT_IIC;

  break;

  在OEMInterruptDisable函數中加入

  case SYSINTR_IIC:

  s2410INT->rINTMSK|= BIT_IIC;

  break;

  在armint.c文件中添加ISR程序,處理中斷發(fā)生后返回定義的中斷號。具體代碼如下:

  在OEMInterruptHandler函數中添加

  else if (IntPendVal == INTSRC_IIC) {

  s2410INT->rSRCPND= BIT_IIC; /* 清除中斷 */

  if (s2410INT->rINTPND & BIT_IIC) s2410INT->rINTPND= BIT_IIC;

  s2410INT->rINTMSK|= BIT_IIC; /* I2C中斷禁止 */

  return (SYSINTR_RTC_ALARM);

  }

  3.2 編寫(xiě)流驅動(dòng)程序

  I2C總線(xiàn)驅動(dòng)程序采用的是Win CE流驅動(dòng)的標準形式。在IIC_Init的函數中,首先通過(guò)函數VirtualAlloc()和VirtualCopy(),把芯片中針對I2C的物理地址和操作系統的虛存空間聯(lián)系起來(lái),對虛擬地址空間的操作就相當于對芯片的物理地址進(jìn)行操作。地址映射的代碼如下:

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

上一頁(yè) 1 2 下一頁(yè)

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

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>