ImageVerifierCode 换一换
格式:DOCX , 页数:26 ,大小:534.30KB ,
资源ID:6424517      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/6424517.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(WINCE60+S3C6410串口驱动.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

WINCE60+S3C6410串口驱动.docx

1、WINCE60+S3C6410串口驱动WINCE6.0+S3C6410串口驱动*LoongEmbedded*作者:LoongEmbedded(kandi)时间:2011.05.21类别:WINCE驱动开发*LoongEmbedded*WINCE串口驱动备注:本博文基于Real6410+WINCE6.0的系统来学习的1. 硬件设计 图1UART接口在此开发板中的应用如下:UART0作为调试口来使用 图2UART1用于和GPRS模块SIM900通信 图3UART2用于和GPS模块COMPASS_EB818通信 图4UATR3用于和蓝牙模块通信 图52. 软件设计2.1 WINCE串口驱动的架构在W

2、INCE系统中,串口驱动是作为一个流驱动的形式存在,其驱动架构如下图所示: 图6串口驱动分为MDD层和PDD层,DD层对上层的Device Manager(device.dll)提供了标准的流设备驱动接口(COM_xxx),PDD层实现了HWOBJ结构及结构中若干针对于串口硬件操作的函数指针,这些函数指针将指向PDD层中的串口操作函数。DDSI是指MDD层与PDD层的接口,在串口驱动中实际上就是指HWOBJ,PDD层会传给MDD层一个HWOBJ结构的指针,这样MDD层就可以调用PDD层的函数来操作串口。2.2 MDD层的导出接口函数MDD层为系统提供流设备接口,这些接口微软已经实现,但还是有必

3、要学习一下2.2.1 COM_Init此函数始化串口设备,该函数通过读取注册表获得串口设备号,并获得相应的HWOBJ的结构指针,通过该指针调用PDD层的硬件初始化函数初始化串口。Identifier:如果驱动被设备管理器加载,那么这个参数将包含一个注册表键值在” HKEY_LOCAL_MACHINEDriversActive”路径下。如果驱动是通过调用RegisterDevice函数来加载的,那么这个值等于dwInfo的值。在COM_Init中,会先打开该键值,用返回的句柄来查询DeviceArrayIndex值,并根据该值获得PDD层的HWOBJ结构指针,下图是COM_Init函数的一部分

4、图72.2.2 COM_Deinit卸载串口设备,该函数中主要做了一些释放资源的操作。也可以被DeregisterDevice函数调用,而DeregisterDevice函数可以被应用程序调用。2.2.3 COM_PreDeinit2.2.4 COM_Open打开串口设备,当应用程序调用CreateFile函数打开串口时,该函数会被调用来打开串口设备。 pContext:COM_Init函数返回的Handle。AccessCode:设置访问模式,比如共享读或者是读写模式。ShareMode:在参数从应用程序中的CreateFile函数中传来,表示是否支持独自占有。2.2.5 COM_Close

5、关闭串口设备,当应用程序调用CloseHandle函数的时候会调用这个函数。pContext:COM_Init函数返回的Handle。2.2.6 COM_PreClose2.2.7 COM_Read读串口数据,应用程序调用ReadFile函数读串口的时候,会调用该函数。pContext:COM_Open函数返回的Handle。pTargetBuffer:指向一个用于存放读到数据的Buffer。BufferLength:pTargetBuffer指向的Buffer的大小。pBytesRead:实际读到的数据的大小。2.2.8 COM_Write写串口数据。应用程序调用WriteFile函数写串口

6、的时候,该函数被调用。pContext:COM_Open函数返回的Handle。pSourceBytes:指向一个Buffer,该Buffer包含要写入串口的数据。NumberOfBytes:要写入串口的数据的大小。2.2.9 COM_Seek2.2.10 COM_PowerDown该函数主要用于串口设备从正常模式进入suspend状态之前需要做的动作。pContext:串口设备的Handle。2.2.11 COM_PowerUp该函数主要用于串口设备从suspend模式恢复到正常模式。pContext:串口设备的Handle。2.2.12 COM_IOControl该函数主要实现了一些串口的

7、IO控制,它会被应用层的一些串口函数调用来获得或者设置串口的状态。dwOpenData:COM_Open函数返回的Handle。dwCode:I/O控制操作码。pBufIn:传入的Buffer。dwLenIn:传入的Buffer的大小。pBufOut:传出的Buffer。dwLenOut:传出的Buffer的大小。pdwActualOut:实际传出的数据的大小。对于串口驱动来说,COM_IOControl函数非常有用,应用程序通过调用COM_IOControl函数并传入不同的操作码,实现了控制串口的功能。这里列举一些操作码如下:操作码 解释IOCTL_SERIAL_CLR_DTR 设置串口的D

8、TR管脚为低IOCTL_SERIAL_CLR_RTS 设置串口的RTS管脚为低IOCTL_SERIAL_DISABLE_IR 禁用串口的红外模式IOCTL_SERIAL_ENABLE_IR 启用串口的红外模式IOCTL_SERIAL_GET_COMMSTATUS 清除串口设备的异常标记并返回当前状态IOCTL_SERIAL_GET_DCB 获得串口的DCB结构IOCTL_SERIAL_GET_MODEMSTATUS 获得当前Modem的控制寄存器值IOCTL_SERIAL_GET_PROPERTIES 重新获得当前串口设备的硬件属性IOCTL_SERIAL_GET_TIMEOUTS 获得串口设

9、备的读写超时IOCTL_SERIAL_GET_WAIT_MASK 获得等待事件标记掩码IOCTL_SERIAL_IMMEDIATE_CHAR 在发送数据前,先发送一个特定的字符 IOCTL_SERIAL_PURGE 清除串口中的输入输出Buffer,也可以中止未进行的读写操作IOCTL_SERIAL_SET_BREAK_OFF 串口通讯从中断状态恢复IOCTL_SERIAL_SET_BREAK_ON 设置串口为中断状态,停止发送接收数据IOCTL_SERIAL_SET_DCB 设置串口的DCB结构IOCTL_SERIAL_SET_DTR 设置串口的DTR管脚为高IOCTL_SERIAL_SET

10、_QUEUE_SIZE 目前,在微软的MDD层代码中没有支持 IOCTL_SERIAL_SET_RTS 设置串口的RTS管脚为高IOCTL_SERIAL_SET_TIMEOUTS 设置串口的读写操作超时IOCTL_SERIAL_SET_WAIT_MASK 设置等待事件标记掩码IOCTL_SERIAL_SET_XOFF 软件流控模式下,终止数据传输IOCTL_SERIAL_SET_XON 软件流控模式下,启动数据传输IOCTL_SERIAL_WAIT_ON_MASK 等待一个与事件掩码中匹配的事件 上述的操作码,很多都会被应用程序调用,看看MDD层中的实现,其中一些也是调用了PDD层下的函数来完

11、成对串口硬件的设置。2.3 PDD层为MDD层提供的接口MDD层和PDD层交互的接口是结构体HWOBJ,在串口驱动中,HWOBJ结构中的函数实现了对串口硬件的操作,并在MDD层被调用,定义如下: 图8BindFlags:用于控制MDD层还是PDD层来启动IST,具体值如下 图9dwInitID:系统的中断号 ,此成员本来用于当BindFlags取值为THREAD_IN_MDD,也就是在MDD层启动IST线程时记录串口使用的逻辑中断号,但是当前的串口驱动实在PDD层启动IST,所以现在dwIntID成员的取值不是中断号信息,而是借用来记录与串口驱动程序的PDD层对应的串口的端口号。pFuncTb

12、l: 指向一个PHW_VTBL结构,该结构中包含一个函数指针列表,这些函数指针指向串口硬件操作函数,用于操作串口。那么结构体HWOBJ的成员是在哪里赋值的呢?从图7我们控制COM_Init函数调用函数GetSerialObject来获取PDD层的创建并且初始化的串口对象,就是在该函数中初始化HWOBJ的结构体成员的,如下图 图10下面我们来看HW_VTBL类型的全局变量IoVTbl的定义图11 图12下面来学习这些函数的功能2.3.1 HWInit函数结合图7、11和12可知COM_Init函数在调用GetSerialObject函数来填充全局变量IoVTbl的成员函数指针后,就调用HWIni

13、t也就是SerInit函数来初始化PDD层,下面来看看这个函数的实现 图13下面就来看看CreateSerialObject函数体 图142.3.2 HWPostInit函数在MDD层COM_Init函数的末尾阶段,在初始化所有的数据结构之后和准备IST开始处理中断之前,会调用该函数来执行一些必要的操作。代表性地,可以在该函数中enable硬件中断,但这里只是具体没有做实质上的工作,只是m_dwInterruptFlag = INTR_NONE;pContext:指向HWIint函数返回的设备上下文结构体,此结构体包含了对设备进行具体描述的数据信息。2.3.3 HWDeinit函数当卸载串口驱

14、动的时候,MDD层会调用该函数来释放一些资源。pContext:指向HWIint函数返回的设备上下文结构体,此结构体包含了对设备进行具体描述的数据信息。 图152.3.4 HWOpen函数MDD层调用该函数来打开一个串口设备,并且为此串口设备供电。pContext:指向HWIint函数返回的设备上下文结构体,此结构体包含了对设备进行具体描述的数据信息。 图16下面我们学习InitLine函数 图17下面看看EnableInterrupt函数 图18继续深入看看Write_UINTSP函数,如下: 图19假如现在加载的是UART1对应的出口驱动,我们先来看下面调用关系m_pReg在哪里初始化的,

15、CreateSerialObject()-CPdd6410Serial1:()-CPdd6410Uart:Init()-CPdd6410Uart:MapHardware()+CPdd6410Uart:CreateHardwareAccess()下面就来看看这两个函数体: 图20结合下图 图212.3.5 HWClose函数关闭由HWInit函数初始化的设备。pContext:指向HWIint函数返回的设备上下文结构体,此结构体包含了对设备进行具体描述的数据信息。2.3.6 HWGetIntrType函数当中断发生的时候,MDD层会调用该函数来获取中断类型,可能的中断类型值有INTR_NONE、

16、INTR_LINE、INTR_RX、INTR_TX和INTR_MODEM。pContext:指向HWIint函数返回的设备上下文结构体,此结构体包含了对设备进行具体描述的数据信息。2.3.7 HWGetRxStart函数返回硬件接收buffer的起始位置。pContext:这个参数目前没有使用。2.3.8 HWGetBytes函数当RX_INTR从HWGetIntrTypes函数返回时,MDD层会调用HWGetBytes函数来从UART中获取接收到的数据。2.3.9 HWRxIntrHandler函数接收数据中断处理函数。pContext:指向HWIint函数返回的设备上下文结构体,此结构体包

17、含了对设备进行具体描述的数据信息。pTargetBuffer:接收到的数据要存放的buffer的起始地址。pByteNumber:接收到的数据的字节数。该函数实际会调用ReceiveInterruptHandler函数,我们下面就来看此函数 图222.3.10 HWLineIntrHandler函数该函数调用LineInterruptHandler()-GetModemStatus()来收集串口的line状态并且更新串口驱动状态信息。pContext:指向HWIint函数返回的设备上下文结构体,此结构体包含了对设备进行具体描述的数据信息。 图232.3.11 HWGetRxBufferSize

18、函数该函数返回硬件buffer能够保持的最大字节数,确保要接收保存数据的buffer至少大于一个硬件buffer要保存的数据数。pContext:指向HWIint函数返回的设备上下文结构体,此结构体包含了对设备进行具体描述的数据信息。2.3.12 HWTxIntrHandler函数该函数处理串口数据发送中断,该函数指针就是由XmitInterruptHandler来赋值的,下面来分析这个函数。pContext:指向HWIint函数返回的设备上下文结构体,此结构体包含了对设备进行具体描述的数据信息。pSourceBuffer:发送数据Buffer。pByteNumber:最大能够发送的数据的大小

19、。函数返回时,指向实际发送的数据的大小。 图24m_AutoFlowEnabled:用于表示是否支持自动流控。fOutxCtsFlow:表示串口在发送数据时要检测CTS(清除发送)引脚的信号状态,如果该成员为TRUE并且对方将CTS的电平拉低,则发送数据;如果CTS引脚恢复为高电平时就暂停发送数据。fOutxDsrFlow:成员表示串口在发送数据时要监视DSR(数据通信设备就绪,比如GPRS模块SIM900)引脚的信号状态,如果该成员为TRUE并且对方(这里假设是SIM900模块)将DSR的电平拉低,则发送数据;如果DSR引脚恢复为高电平时才继续发送数据。IsCTSOff()和IsDSROff

20、()函数分别用于判断UMSTAT寄存器的第4和第5位的状态值,见下图 图252.3.13 HWModemIntrHandler函数该函数代替了HWOtherHandler函数,该函数实际会调用ModemInterruptHandler函数,然后通过调用GetModemStatus函数来实现,下面来看此函数pContext:指向HWIint函数返回的设备上下文结构体,此结构体包含了对设备进行具体描述的数据信息。 图262.3.14 HWPutBytes函数该函数用于写数据到硬件来直接发送数据。pContext:指向HWIint函数返回的设备上下文结构体,此结构体包含了对设备进行具体描述的数据信息

21、。pSrc:指向要发送的数据Buffer。NumberOfBytes:要发送的数据长度。pBytesSent:实际发送的数据长度。2.3.15 HWPowerOff函数在进入睡眠状态前,MDD层调用该函数来通知PDD层对关闭PCLK对串口提供时钟,以节省功耗,见下图pContext:指向HWIint函数返回的设备上下文结构体,此结构体包含了对设备进行具体描述的数据信息。2.3.16 HWPowerOn函数在从睡眠状态唤醒的时候,MDD层调用该函数来通知PDD层对关闭PCLK对串口提供时钟,以节省功耗pContext:指向HWIint函数返回的设备上下文结构体,此结构体包含了对设备进行具体描述的

22、数据信息。 图272.3.17 HWClearDTR函数该函数用于清除DTR(数据终端设备就绪)信号,通过调用SetDTR函数来实现pContext:指向HWIint函数返回的设备上下文结构体,此结构体包含了对设备进行具体描述的数据信息。2.3.18 HWClearRTS函数该函数用于清除RTS(请求发送)信号,通过调用SetRTS函数来实现pContext:指向HWIint函数返回的设备上下文结构体,此结构体包含了对设备进行具体描述的数据信息。 图28结合下图可以更深刻去理解 图292.3.19 HWSetDCB函数该函数用于设置串口设备的信息,通过调用SetDCB函数来实现。pContex

23、t:指向HWIint函数返回的设备上下文结构体,此结构体包含了对设备进行具体描述的数据信息。pDCB:指向DCB结构,该结构描述相关的串口硬件设置信息。 图302.3.20 2.4 流控的相关概念和方式流控的“流”指进出串口的数据流,数据在串口之间传输时,如果接收方由于CPU负荷很重或者串口的中断优先级很低而导致接收数据缓冲区被充满,而发送方并不知情的情况下继续发送的数据就会被接收方丢掉,为了解决这个问题,引进了串口的流控机制。这样当接收方数据处理不过来时,就会发出“暂停接收”的信号,发送端就停止发送,直到收到“可以继续发送”的信号再继续发送数据。流控的方式有硬件和软件流控的方式,其中硬件流控

24、有DTR/DSR和RTS/CTS另种不同的硬件流控方式;软件流是通过向对方发送特殊的指示字符,这就是被称为X-ON/X-OFF的软件流控方式,下面主要学习硬件流控方式RTS/CTS流控方式 图31RTS/CTS流控方式的工作原理其实就是RTS和CTS两个引脚的工作方式,我们以DTE(这里为UART1)和DCE(这里为SIM900)为例来说明。当UART1要发送数据时,就将nRTS的引脚拉低,表示UART1要向SIM900发送数据。nCTS信号时nRTS的响应信号,在SIM900准备好以后,就将引脚nCTS引脚信号拉低(结合图25和29来理解),这就表示SIM900准备好接受UART1发来的数据,这时候UART1就可以从TX引脚给SIM900发送数据了。DTR/DSR流控方式这种方式和RTS/CTS相似,DTR(data terminal ready,数据终端就绪)引脚置高表示数据终端设备处在有效的可使用状态,DSR(data set ready,数据通信设备就绪)引脚置高则表示数据通信设备处于可使用的状态。这两个引脚为高电平仅表示对应的设备有效存在,并不表示它们之间的通信链路可以进行数据传输,这是它们和RTS/CTS的不同之处。在串口直接通信并且不使用DTR/DSR流控的情况下,通常将这两个引脚直接接到电源上,串口一上电就拉高有效。

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1