基于WinCE的II2C驱动程序设计

发布者:gamma14最新更新时间:2012-06-02 来源: 单片机与嵌入式系统应用关键字:WinCE  流驱动  I2C总线  驱动程序 手机看文章 扫描二维码
随时随地手机看文章

引言

  随着以计算机技术、通信技术和软件技术为核心的信息技术的迅速发展,嵌入式系统在各行业得到了广泛的应用,极大地推动了行业的渗透性应用。嵌入式系统是“以应用为中心、以计算机技术为基础、软硬件可裁剪、适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统”,由嵌入式硬件和嵌入式软件两部分组成。嵌入式软件包括嵌入式操作系统和嵌入式应用软件。Microsoft的桌面操作系统已经为人们熟悉和使用,嵌入式的操作系统 Windows CE.net也日益风行。Windows CE.net是Microsoft推出的功能强大的紧凑、高效、可伸缩的32位嵌入式操作系统,主要面对各种各样的嵌入式系统和产品。该系统所具有的多线程、多任务、完全抢占式的特点是专为各种具有严格资源限制的硬件系统所设计的。为了将操作系统和硬件设备连接起来,联系硬件和软件的驱动就显得很重要。

  下面主要针对三星公司ARM9内核的芯片S3C2410进行分析,介绍在Windows CE.net系统下进行底层设备驱动开发的方法并提供I2C通信的实例。

1  I2C通信协议及S3C2410芯片介绍

  I2C(Inter Integrated Circuit)总线是1980年由Philips公司推出的。 I2C总线用两条线(SDA和SCL)在总线和装置之间传递信息,在微控制器和外部设备之间进行串行通信或在主设备和从设备之间进行双向数据传送。两条通信线通过上拉电阻被拉升至+5 V。在控制系统中的每个集成电路可以通过一个CMOS缓冲器来读每一条线路,也可以通过一个栅极开路的FET管将每一条线的电平下拉。因此,对每个芯片来说,每条线既是输入线,又是输出线。

  I2C总线遵从同步串行传输协议,即各位串行(一位接一位)发送,由时钟(clock)线指示读数据(data)线的时刻。每个数据包前有一个地址,以指示由哪个器件来接收该数据。

  S3C2410是一款基于ARM920T的16/32位RISC微处理器,主要用于手持设备,拥有高性价比,低功耗等特点,也是目前市面上出现较多的嵌入式开发板的处理器之一。芯片拥有16 KB的指令和数据缓存器,有存储管理单元(MMU)、LCD控制器、3个串口、4路DMA、4个时钟定时器、8路10位的A/D转换;支持I2C、 I2S、SPI、主从USB等接口以及SD/MMC卡。

  S3C2410微处理器的I2C总线可以处于下面4种模式下:主接收模式、主发送模式、从接收模式和从发送模式。处理器对I2C进行的操作,主要是对下面的几个寄存器进行读/写:

  ◇ IIC控制寄存器,IICCON(物理地址0X54000000,内存映射后的虚拟地址);
  ◇ IIC控制/状态寄存器,IICSTAT(物理地址0X54000004);
  ◇ IIC数据寄存器,IICDS(物理地址0X54000008);
  ◇ IIC地址寄存器,IICADD(物理地址0X5400000C)。

   本设计主要是CPU工作在主模式下与下面的I2C接口设备进行通信。

2  Windows CE系统驱动特点

  Windows CE.net驱动有两种模型:本机设备驱动程序和流接口驱动程序。本机设备驱动适于集成到基于Windows CE.net平台的设备。这些设备驱动程序是一些硬件所必需的,是由原始设备制造商创建的,用以驱动如键盘、触摸屏、音频设备等,往往在设备售出后就不会再更换,如通用LED驱动、电源驱动、键盘驱动和显示驱动等都是本机设备驱动。对于本机设备驱动程序,Platform Builder提供了一些驱动程序样本,目的是为了方便开发人员快速开发出自己的驱动程序。当Win CE系统启动时,本地设备驱动程序将被加载到系统的内存中。本地驱动程序的开发分为分层驱动和单片驱动程序。分层驱动要利用微软提供的与应用程序通信的上层,称为模块驱动程序层MDD(Model Device Driver)。MDD层通过设备驱动程序接口DDI(Device Driver Interface)与应用程序通信,开发驱动程序通常不修改MDD层,主要关心与具体硬件相关的下层,依赖平台的设备驱动程序层PDD (Platform Dependent Driver), PDD层通过设备驱动服务接口(Device Driver Service Provider Interface)直接管理硬件。流接口设备驱动程序(指可安装的启动程序)可以由第三方生产商提供,以支持添加到系统中的设备。Windows CE下的设备驱动程序在与应用程序相同的保护级上工作。当系统启动时,大多数驱动程序是由设备管理进程(DEVICE.EXE)加载的,所有这些驱动程序将共享同一个进程地址空间。

3  I2C总线底层驱动设计

  I2C总线驱动是放在Windows CE操作系统的内核下层,位于OEM Adaptation Layer(OAL)层的一个真正的驱动。

3.1  初始化I2C中断和编写ISR例程

  I2C的通信是通过操作I2C的寄存器进行的。在I2C通信中主要对上面介绍的4个寄存器进行读写。通过读写这些寄存器中的命令状态字可以检测和控制I2C总线的行为。在Windows CE.net下,首先要在文件oalintr.h添加I2C的中断号的宏定义:

  #defineSYSINTR_I2C(SYSINTR_FIRMWARE+19)[page]

然后在文件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程序,处理中断发生后返回定义的中断号。具体代码如下:
  在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  编写流驱动程序

  I2C总线驱动程序采用的是Win CE流驱动的标准形式。在IIC_Init的函数中,首先通过函数VirtualAlloc()和VirtualCopy(),把芯片中针对I2C的物理地址和操作系统的虚存空间联系起来,对虚拟地址空间的操作就相当于对芯片的物理地址进行操作。地址映射的代码如下:

  reg = (PVOID)VirtualAlloc(0, sz, MEM_RESERVE, PAGE_NOACCESS);
    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是申请虚拟地址空间的实际物理地址在Win CE中的映射地址。
  然后对申请到的虚拟地址进行操作,安装Windows中的流驱动的模型进行驱动的编写,主要包括下面函数的编写。

  IIC_Init()
  在函数中,主要是对I2C的初始化,主要语句如下:
  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 ( !StartDispatchThread( pIIcHead) )
  { IIC_Deinit( pIIcHead );return ( NULL );}在StartDispatchThread()函数中,主要是创建线程、关联事件和中断,主要语句如下:
  InterruptInitialize( 36,pIicHead->hIicEvent,NULL,0 );//关联时间和中断
  CreateThread( NULL,0,IicDispatchThread,pIicHead,0,NULL );//创建线程等待时间
  在IicDispatchThread()函数中,主要是等待中断的产生,然后去执行:WaitReturn =        WaitForSingleObject( pIicHead->hIicEvent,INFINITE );
  IicEventHandler( pIicHead );//事件处理函数
  InterruptDone( 36 );
  最后,在函数IIC_Open、IIC_Read、IIC_Write中,对各个寄存器进行操作,进行数据的赋值,得到I2C读取的数据和发送数据。

4  I2C驱动的封装和添加到Windows CE中

  通过上面的工作,能编译一个DLL函数,但这还不能叫流接口驱动程序。因为它的接口函数还没有导出,还需要告诉链接程序需要输出什么样的函数,为此要建立一个自己的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_MACHINE\Drivers\BuiltIn\STRINGS]
  "Index"=dword:1
  "Prefix"="IIC"
  "Dll"="MyDriver.dll"
  "Order"=dword:0

  最后编写自己的CEC文件。主要是添加一个Build Method,任务是复制注册表到Win CE的系统目录下面。加一个Bib File,其主要功能是把编译的mydrive.dll文件添加到系统内核中去。保存写好的CEC文件。打开Platform Builder,打开“File”菜单,添加刚刚编写的CEC特征到系统选项中去。生成系统的时候,添加自己的CEC特性,就可以包含刚刚编写的I2C驱动了。
以上介绍了Win CE的驱动结构,并给出了基于Win CE的 I2C驱动程序部分源代码。实验证明该设计是可行的。

参考文献

1  陈向群,等. Windows CE.NET系统分析及实验教程. 北京:机械工业出版社,2003
2  周毓林,等. Windows CE.net内核定制及应用开发. 北京:电子工业出版社,2005
3  Microsoft.Windows CE设备驱动程序开发指南. 北京:北京希望电子出版社,1999

王小芳  硕士研究生,主要研究方向为智能仪器控制。
王典洪  博士生导师,主要研究方向为智能仪器控制、计算机图像处理。

关键字:WinCE  流驱动  I2C总线  驱动程序 引用地址:基于WinCE的II2C驱动程序设计

上一篇:基于VxWorks的BSP技术分析
下一篇:QNX:如何继续发挥微内核优势

推荐阅读最新更新时间:2024-05-02 22:05

QNX 4.25设备驱动程序的编写
摘要:介绍实时操作系统QNX4.25下编写设备驱动程序的大体框架、底层细节以及诸多注意点。针对使用较为普遍的PCI设备作为较为详细的描述。 关键词:驱动程序 QNX 实时操作系统 PCI 引言 QNX是一个多任务、多用户、分布式、可嵌入式符合POSIX标准的微内核的主流实时操作系统,广泛用于实时性能、开发灵活性、网络灵活性要求较高的场合,如电信系统、医疗仪器、航空航天、工业自动化、交通运输、POS机、信息家电等。 QNX是一个适合软件/硬件定制的实时操作系统。如果你曾经试图在传统的UNIX或Windows平台下开发设备驱动程序,那么,QNX下开发驱动程序一定会让你受宠若惊。由于QNX的微内核结构,QNX下的系统进程和用户
[应用]
恩智浦推出双向电压I2C总线转换缓冲器
    中国上海,2013年8月19日讯——恩智浦半导体(NXP Semiconductors N.V.)(纳斯达克代码:NXPI)近日宣布推出PCA9617A超快速模式(Fm+) I²C总线缓冲器,该产品专为使用DDR4 SDRAM存储器的新兴服务器应用而设计。这款具有突破性的电压转换总线缓冲器凭借工作频率高达1 MHz的I²C总线以及CPU侧0.8 V至SDRAM模块侧2.5 V的电压电平转换,使工程师能够采用全新DDR4技术设计新一代服务器系统。恩智浦不断推动I²C总线的创新,I²C总线是一种广泛采用的总线系统管理和控制技术,几乎用于所有计算和企业设备应用。PCA9617A是首款专为服务器设计的Fm+器件。该器件工作频率高达
[电源管理]
恩智浦推出双向电压<font color='red'>I2C总线</font>转换缓冲器
msp430和stm32 dht11驱动程序
最近使用msp430f5529读取dht11的温度和湿度数据,记录下驱动程序,需要可移植。 dht11模块是一块温湿度传感器模块,可以采集温度和湿度信息转化为数据发送出来,模块介绍如下: 概述:DHT11 是广州奥松有限公司生产的一款湿温度一体化的数字传感器。该传感器包括一个电阻式测湿元件和一个 NTC 测温元件,并与一个高性能 8 位单片机相连接。通过单片机等微处理器简单的电路连接就能够实时的采集本地湿度和温度。DHT11 与单片机之间能采用简单的单总线进行通信,仅仅需要一个I/O 口。传感器内部湿度和温度数据 40Bit 的数据一次性传给单片机,数据采用校验和方式进行校验,有效的保证数据传输的准确性。DHT11 功耗很低,
[单片机]
msp430和stm32 dht11<font color='red'>驱动程序</font>
一个低级的S3c2416 wince SD eboot汇编错误
C:WINCE500PLATFORMSMDK2416srcbootloaderEboot.Whimorystartup.s(332) : error A0034: undefined symbol: _undef_loc_label_ 不仔细看还真不知道是啥,后来看看逻辑就应该知道。是%B20 的20 有问题,代码根本没有20的标号。并且从逻辑来看,这个应该是100 才对。
[单片机]
STM32 TM1640芯片驱动程序
以下为.h文件: #ifndef __TM1640_H__ #define __TM1640_H__ #include stm32f10x.h #define ADDR_START1640 0XC0 #define DSP1640_DIS 0 #define DSP1640_ENB 1 /* 控制显示 0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f 分别对应 1/16, 2/16, 4/16, 10/16, 11/16, 12/16, 13/16, 14/16 设置数据,0x40,0x44分别对应地址自动加一和固定地址模式 */
[单片机]
STM32 TM1640芯片<font color='red'>驱动程序</font>
基于嵌入式WinCE与MSP430单片机多串口通信设计
摘要:在远程监控和工业自动化系统中,串口通信因其具有连接简单、使用方便、可靠性高的优点,得到越来越广泛的应用。讨论了采用WinCE嵌入式与MSP430单片机构建串口多机通信系统的问题,在分析了WinCE操作系统与MSP430单片机串口模块特性的基础上,给出了进行串口通信的总体框图,针对实际串口通信存在的问题制定串行通信协议,然后在该系统硬件基础上根据需要定制WinCE系统内核,最后实现串口通信设计。实验结果表明:该系统能够达到多串口通信的要求。 关键词:WinCE;MSP430;TCP/IP;串口通信协议 目前WinCE嵌入式与MSP430单片机在仪器仪表、工业控制、移动设备等有着广泛的应用。在很多复杂的应用场合比如多点温
[工业控制]
基于嵌入式<font color='red'>WinCE</font>与MSP430单片机多串口通信设计
STM32开发笔记93: SX1268驱动程序的移植1
单片机型号:STM32L053R8T6 本文详述将SX1268官方驱动程序,移植到C++程序设计框架的方法。 1、文件结构 在系统中加入以下文件。 2、屏蔽和硬件相关的数据类型 sx126x.h文件,屏蔽以下语句。暂时屏蔽,后续需要解决。 typedef struct SX126x_s { // Gpio_t Reset; // Gpio_t BUSY; // Gpio_t DIO1; // Gpio_t DIO2; // Gpio_t DIO3; // Spi_t Spi; PacketParams_t PacketParams; PacketStatus
[单片机]
STM32开发笔记93: SX1268<font color='red'>驱动程序</font>的移植1
09-S3C2440驱动学习(三)嵌入式linux-platform平台总线驱动程序及分离分层构建驱动框架
简介Platform: 内核中有IIC总线、PCI总线、串口总线、SPI总线、can总线、单总线等,一些设备可以挂载在这些总线上,然后通过总线的match进行设备和驱动的匹配。但是有些设备并不属于这些总线,于是引入了虚拟总线,也就是Platform总线,对于的设备叫做Platform设备,对于的驱动叫做Platform驱动。 平台设备框图: Platform总线: struct bus_type platform_bus_type = { .name = platform , .dev_attrs = platform_dev_attrs, .match = platform_match,
[单片机]
09-S3C2440<font color='red'>驱动</font>学习(三)嵌入式linux-platform平台总线<font color='red'>驱动程序</font>及分离分层构建<font color='red'>驱动</font>框架
小广播
最新嵌入式文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved