S3C44B0X与C54X DSP的接口设计
3.1.3:HDLC通道控制寄存器配置
控制寄存器(HCON)控制HDLC通道工作情况,这里介绍常用的控制选项,详细的内容和配置方法请参阅4510数据手册。
1.波特率产生/DPLL使能:如果使用了内部的波特率产生器或者DPLL,为使它们工作,需要设置HDLC通道的控制寄存器中相应位来启动工作。
2.收发FIFO深度设置:当使用CPU方式进行HDLC收发时,可设置收发FIFO深度。FIFO深度可设置为8字节/32字节。当使用DMA方式时,此设置无效。
3.DMA发送停止/跳过方式设置:使用DMA方式发送时,如果当前使用的发送BUFFER描述符不属于DMA所有,可根据此设置来停止DMA发送,或是跳到发送BUFFER描述符链表中的下一个描述符。
4.DMA接收停止/跳过方式设置:使用DMA方式接收时,如果当前使用的接收BUFFER描述符不属于DMA所有,可根据此设置来停止DMA接收,或是跳到接收BUFFER描述符链表中的下一个描述符。
5.通道空闲标志模式设置:确定通道空闲时发送哪种空闲标志(全1或者0X7E)。
6.Flag发送模式设置:确定帧分隔方式(单FLAG或者双FLAG方式)。
7.收发CRC校验设置:确定HDLC收发过程中是否进行CRC校验。
8.HDLC环回设置:用于HDLC环回测试,正常工作时HDLC环回应打开。
3.1.4:HDLC通道中断控制寄存器(HINT)配置
中断控制寄存器(HINT)控制HDLC收发中断的产生。共有24种中断产生条件,这里介绍DMA方式收发时编程中用到的一些中断产生条件。详细内容请参阅4510数据手册。
对于HDLC通道发送中断:
1.发送FIFO下冲:此条件(TxUIE)当发送FIFO产生下冲时发生。此时DMA发送被自动禁止,因此发送中断处理程序中必须首先清除HDLC状态寄存器(HSTAT)中的相应位,然后在下次发送前使能DMA发送。
2.DMA发送Abort:此条件(DTxABTIE)当DMA发送放弃时产生,发送中断处理程序中必须清除HDLC状态寄存器(HSTAT)中的相应位。
3.DMA发送完毕:此条件(DTxFDIE)当DMA发送完一帧时产生,发送中断处理程序中必须清除HDLC状态寄存器(HSTAT)中的相应位。
4.DMA发送BUFFER描述符指针空:此条件(DTxNLIE)当当前DMA发送BUFFER描述符中指向下一个描述符的指针为空时产生。发送中断处理程序中必须清除HDLC状态寄存器(HSTAT)中的相应位。并重新初始化发送BUFFER描述符链表。
5.DMA发送BUFFER描述符不属于DMA所有:此条件(DTxNOIE)当当前DMA发送BUFFER描述符不属于DMA所有时发生。发送中断处理程序中必须清除HDLC状态寄存器(HSTAT)中的相应位。
对于HDLC通道接收中断:
1.接收Abort:此条件(RxABTIE)当接收到Abort帧时产生,接收中断处理程序中必须清除HDLC状态寄存器(HSTAT)中的相应位。
2.DMA接收完毕:此条件(DRxFDIE)当DMA接收到一个完整帧时发生,接收中断处理程序中必须清除HDLC状态寄存器(HSTAT)中的相应位。
3.DMA接收BUFFER描述符指针空:此条件(DRxNLIE)当当前DMA接收BUFFER描述符中指向下一个描述符的指针为空时产生。接收中断处理程序中必须清除HDLC状态寄存器(HSTAT)中的相应位。并重新初始化接收BUFFER描述符链表。
4.DMA接收BUFFER描述符不属于DMA所有:此条件(DRxNOIE)当当前DMA接收BUFFER描述符不属于DMA所有时发生。此时DMA接收被自动禁止。因此接收中断处理程序中必须清除HDLC状态寄存器(HSTAT)中的相应位,并作相应的错误处理,避免再次发生这种错误,然后使能DMA接收功能,否则不能继续接收数据。
3.1.5:站址寄存器(HSAR0-HSAR3)和站址屏蔽寄存器(HMASK)初始化
4510利用在4个站址寄存器(HSAR0-HSAR3)中保存的站点地址配合站址屏蔽寄存器(HMASK)完成接受过程中的地址比较功能,如果一个HDLC数据帧的地址不符,此帧将被简单地丢弃而不做任何处理。具体的设置请参阅4510数据手册。
3.1.6:DMA收发BUFFER描述符链表结构建立和指针寄存器初始化
4510的HDLC通道利用BUFFER描述符这种数据结构完成DMA操作,接收和发送BUFFER
描述符以及描述符链表结构分别如附图2,3,4所示。我们的应用中,建立了双向环形链表的链表结构,而不是单向环形链表结构,双向环形链表结构与单项环形链表结构不同的地方是每个链表中的元素多了一个指向前一元素的指针。这样在软件中进行链表操作时不用每次都遍历整个链表,提高了处理速度。
链表结构建立后,需要初始化收发描述符指针寄存器,对于发送BUFFER描述符指针寄存器(HDMATxPTR),将发送BUFFER描述符链表结构的头节点地址写入其中,之后每完成一次DMA发送操作,4510会自动更新其中的地址,指向下一个发送BUFFER描述符;对于接收BUFFER描述符指针寄存器(HDMARxPTR),将接收BUFFER描述符链表结构的头节点地址写入其中,之后每完成一次DMA接收操作,4510会自动更新其中的地址,指向下一个接收BUFFER描述符。
3.1.7:使能HDLC通道的收发功能
所有的初始化工作做完后,就可以使能HDLC通道的收发功能。此时要分两种情况:
一:如果使用DMA方式收发,则需要使能HDLC通道控制寄存器(HCON)中的TxEN,RxEN,DTxEN,DRxEN四个比特位。不过,一般在发送时,有数据后才需要打开发送使能。
二:如果使用CPU方式收发,则需要使能HDLC通道控制寄存器(HCON)中的TxEN,RxEN两个比特位,DTxEN,DRxEN两个比特位一定不能打开。
3.2: HDLC通道数据发送及中断处理过程
3.2.1:HDLC通道数据发送过程
DMA方式下HDLC通道的数据发送过程可分为以下几个步骤:
1.读取发送帧描述符指针寄存器HDMATxPTR,得到当前发送帧描述符的地址,进而得到整个发送帧描述符的内容。
2.得到发送帧描述符中帧数据BUFFER起始地址。
3.将准备好的HDLC帧拷贝到BUFFER中。
4.设置当前帧描述符中的相应控制位。
5.将发送帧描述符的OWERSHIP位设置为DMA所有。
6.使能HDLC的DMA发送。
完成上面各步骤后,HDLC通道的DMA机制会自动将BUFFER中的数据拷贝到HDLC通道
的TxFIFO中发送出去。一帧发送完毕后,4510自动将已使用的发送BUFFER描述符的OWERSHIP位设置为CPU所有,并将帧描述符指针寄存器HDMATxPTR中的内容更新为下一个未使用的发送BUFFER描述符地址。
3.2.2:HDLC通道数据发送中断处理过程
当一帧数据通过DMA方式发送完毕,或者发送过程中出现了可引起中断的异常情况,此时软件会进入中断处理程序。引起中断的情况中断控制寄存器的设置中已做了说明。在我们的编程中,HDLC通道发送中断处理过程主要完成以下一些功能:
1.进入中断后,首先清除4510中断指示寄存器INTPEND中相应的标志位。
2.如果DMA发送成功,则进行数据帧发送成功状态计数,并清除HDLC通道状态寄存器HSTAT中的相应状态位。
3.如果发送出现异常,则完成相应的异常状态计数,并清除HDLC通道状态寄存器HSTAT中的相应位。其中有两个异常会影响以后的DMA操作,一:发送下冲异常(TxU),发生此异常时,处理器会自动禁止DMA发送功能,因此下一次发送时必须重新使能DMA发送功能;二:下一个发送帧描述符指针为空异常(DTxNL),发生此异常时,说明建立的DMA发送BUFFER描述符链表结构出现了错误,因此需要重新初始化DMA发送BUFFER描述符链表结构。
4.做完上述处理可关闭HDLC通道的DMA发送功能,等待有数据需要发送时再重新打开,也可以不关闭。
3.3: HDLC通道数据接收工作原理及中断处理过程
3.3.1:HDLC通道数据接收工作原理
DMA方式下HDLC通道的数据接收工作主要在HDLC通道初始化和DMA接收中断处理中完成,这里主要分析HDLC通道接收工作原理,明白了数据接收原理,会给我们编程带来极大的方便。HDLC通道接收工作原理如下所述:
1.通道初始化阶段,我们建立并初始化了HDLC接收BUFFER描述符链表结构,并将链表头节点的地址写入到HDLC接收BUFFER描述符指针寄存器HDMARxPTR,这是正确完成DMA方式接收的前提,下面的工作都是在这个前提下自动完成的。
2.当有数据到来时,DMA机制会从HDMARxPTR指向的接收BUFFER描述符中找到接收BUFFER起始地址,然后把收到的数据写入到BUFFER中。
3.如果接收无误,4510自动更新HDMARxPTR寄存器的值,使其指向下一个还未使用的接收BUFFER描述符,以备下一次接收使用。使用过的接收BUFFER描述符的OWERSHIP位将自动设置为CPU所有,因此为了能再次使用这个接收BUFFER描述符,必须将它的OWERSHIP位重置为DMA所有。
4.可以对已存储在接收BUFFER中的数据作各种自定义的操作,实现自定义功能。
评论