Windows CE串口驱动简析(3)-PDD层实现:RX,MODEM,LINE,IR部分(基于WinCE5.0 SMDK2410 BSP的Serial驱动)

接下来就是接收函数了:
15. GetWaterMarkBit和GetWaterMark
WaterMark存储的实际上是接收中断模式,对应与UFCON的第4,5位:

这两个函数用了s_HighWaterPairs这样一个结构数组来保存对应关系:

GetWaterMarkBit用来获得s_HighWaterPairs的key值,也就是0,1,2,3中的一个,用m_dwWaterMark与这个数组成员的AssociatedValue的比较来获得.

GetWaterMark用来获得s_HighWaterPairs的AssociatedValue值,也就是0,4,8,16中的一个,m_dwWaterMark必须为这4个值中的一个,如不是则取最较小相近的.

16. InitReceive
InitReceive负责初始化串口的数据接收功能. 和InitXmit一样有bool型一个参数,表示初始化还是解除初始化串口接收.
如果为TRUE,则先reset RX FIFO,设置UFCON Tx Trigger Level,写uWarterMarkBit,使能RX FIFO,清除error status,最后使能RX Timeout Interrupt,中断触发方式为level,接收模式为中断请求或轮询.

17.ReceiveInterruptHandler
同XmitInterruptHandler一样还有个处理接收中断的ReceiveInterruptHandler
ReceiveInterruptHandler首先检查buffer的有效性,然后读取UFSTAT获得当前接收FIFO字节数,如满则设置dwNumRxInFifo为16字节,然后从URXH寄存器读取dwNumRxInFifo字节数的数据到接收buffer,在读数据的过程中会调用GetLineStatus获取线路状态,并调用DataReplaced进行判断如果无错误进读数据.

18.CancelReceive
CancelReceive供驱动程序取消串口的数据接收.通过调用InitReceive(TRUE)来重新重新初始化串口,reset FIFO等.

下面再来看看和MODEM相关的部分.
19. InitModem
InitModem初始化串口的MODEM功能.设置UMCON寄存器禁止AFC(Auto Flow Control)和使能RTS(Request To Send).
  
20. GetModemStatus
GetModemStatus供驱动程序获取串口的MODEM状态. 通过读取UMSTAT寄存器来获取MODEM状态,进行事件通知或报告状态.

21. SetRTS
设置RTS,根据输入参数来使能或禁止RTS.

下面是线路相关处理函数:
22. InitLine
InitLine初始化串口的数据收发属性.这里就是使能或禁止串口ERR中断.

23. GetLineStatus
GetLineStatus用来获取线路状态.读取UERSTAT寄存器来获得错误状态并返回或调用回调事件(Break Receive).

24. SetBreak
SetBreak用来向对端发出一个间断信号(指串口的发送数据引脚上持续一个数据帧事件的低电平).这里通过设置UCON的bit4.

25.SetBaudRate
SetBaudRate设置波特率,调用CReg2410Uart类对象的Write_BaudRate来实现.

26. SetByteSize
SetByteSize设置串口的数据帧中的数据位的位数,设置ULCON寄存器的0,1位来设置.

27. SetParity
SetParity设置传输数据的校验方式(奇偶).通过设置ULCON的3,4,5位来实现.

28.SetStopBits
SetStopBits用来设置停止位.通过设置ULCON的第2位来实现.

29.SetOutputMode
最后还有个IR处理函数SetOutputMode,这个函数有两个bool输入参数,UseIR表示是否启用红外输出模式,Use9Pin表示是否启用9针引脚工作模式.
SetOutputMode首先调用基类的SetOutputMode,然后根据UseIR来设置ULCON的第6位.

这里附上ULCON的具体位的含义:

更多对寄存器的操作请参考s3c2410A的datasheet.

CPdd2410Uart类基本介绍完了,这里介绍的都是需要实现的成员函数,还有些函数在基类CSerialPDD类中实现了,如SetReceiveError和GetReceiveError等.具体内容可以参考cserpdd.c中的CSerialPDD实现.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值