摘要
三星16/32位ARM处理器S3C4510B是目前在国内应用非常广泛的一种性价比很高的ARM处理器,本文在介绍S3C4510B中HDLC通道结构特点的基础上,详细说明了4510中HDLC通道在DMA收发方式下的工作过程,使用方法和编程中的一些注意事项。
1:S3C4510B简介
S3C4510B(以下简称4510)是韩国三星公司开发的一款基于ARM7TDMI架构的16/32位高性能微处理器。具用丰富的外围接口,如以太网,HDLC等,可灵活配置,适用于多种应用。4510具有以下性能特点:
◆ 8K字节的内部CACHE,也可用作内部SRAM
◆ 两线IIC接口,作为IIC主器件使用
◆ 以太网控制器
◆ 双通道HDLC控制器
◆ 双UART
◆ 双GDMA通道
◆ 两个32位定时器
◆ 18个可编程IO端口
◆ 中断控制功能
◆ 外部SDRAM/DRAM/FLASH/ROM控制
本文主要介绍4510中HDLC通道的使用和编程方法。
2:S3C4510B的HDLC通道简介
HDLC协议帧结构和特性请参阅相关书籍和4510数据手册,这里不详细介绍。
4510的HDLC通道结构如附图1所示。具有以下特点:
1. FIFO:发送和接收模块都有32字节(8字)FIFO,提供CPU内部总线到HDLC串行接口之间的数据缓存功能。
2. DMA:HDLC通道的发送和接收支持DMA方式。
3. 波特率产生:4510的HDLC通道包含一个可编程的波特率产生计数器,能够产生各种波特率的传输速率。
4. DPLL:4510的HDLC通道包含一个数字锁相环(DPLL),提供了时钟恢复功能,可从编码后的数据流中迅速提取出时钟信息。
5. 编码方式:4510的HDLC通道支持五种编码方式,分别为NRZ,NRZI,FM0,FM1和差分曼彻斯特编码,编码波形请参看附图2。
详细的内容请参阅4510数据手册。
3:S3C4510B的HDLC通道工作过程介绍
4510的HDLC通道收发可工作在CPU模式和DMA模式下,在我们的应用和编程中使用了DMA方式,因此这里主要介绍DMA方式下的工作过程。4510的HDLC通道工作过程大致可以分为通道初始化,数据发送,数据接收三个部分。
3.1: HDLC通道初始化过程
HDLC通道初始化过程可分为七个步骤;一:通道复位,恢复其默认配置;二:通过设置工作模式寄存器(HMODE)来配置HDLC工作模式;三:通过设置控制寄存器(HCON)来控制HDLC通道的工作;四:通过设置中断控制寄存器(HINT)来控制HDLC通道的中断产生;五:设置站址寄存器(HSAR0-HSAR3)和站址屏蔽寄存器(HMASK),以完成接收操作的地址比较功能;六:建立DMA方式的发送和接收BUFFER描述符链表结构,并初始化DMA发送BUFFER描述符指针寄存器(HDMATxPTR)和DMA接收BUFFER描述符指针寄存器(HDMARxPTR);七:使能HDLC通道的收发功能。
3.1.1:HDLC通道复位
HDLC通道复位可通过设置控制寄存器(HCON)前4比特来完成,请参阅4510数据手册。
3.1.2:HDLC通道工作模式配置
工作模式寄存器(HMODE)中的不同位定义了不同的工作模式,这里介绍较常用的几种模式设置,详细内容和配置方法请参阅4510数据手册。
1. 数据编码方式选择:从所支持的五种编码方式中选择。
2. 波特率时钟源选择:如果使用4510的内部波特率产生器,则需要为其选择时钟源,同时根据不同的时钟源配置波特率产生计数器(HBRGTC)产生需要的时钟信号。
3. DPLL时钟源选择:如果使用DPLL,则需要为其选择要跟踪的时钟源。
4. 发送时钟选择:4510的HDLC通道支持多种发送时钟源,可通过设置HDLC通道的模式寄存器中的相应位来选择。
5. 接收时钟选择:4510的HDLC通道支持多种接收时钟源,可通过设置HDLC通道的模式寄存器中的相应位来选择。
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中的数据作各种自定义的操作,实现自定义功能。
3.3.2:HDLC通道数据接收中断处理过程
DMA方式下HDLC通道接收完一帧数据,或者接收过程中出现了可引起中断的异常情况,此时软件会进入中断处理程序。引起中断的情况在HDLC通道初始化的步骤4,即中断控制寄存器的设置中已做了说明。在我们的编程中,HDLC通道接收中断处理过程主要完成以下一些功能:
1. 进入中断后,首先清除4510中断指示寄存器INTPEND中相应的标志位。
2. 如果DMA接收正确,则进行数据帧接收成功状态计数,并清除HDLC通道状态寄存器HSTAT中的相应状态位。对接收到的数据帧作相应的处理后,要重新将是用过的接收BUFFER描述符的OWERSHIP位设置为DMA所有。
3. 如果接收出现异常,则完成相应的异常状态计数,并清除HDLC通道状态寄存器HSTAT中的相应位。其中有两个异常会影响以后的DMA操作,一:DMA接收BUFFER描述符不属于DMA所有(DRxNO);二:DMA接收BUFFER描述符指针空(DRxNL)。发生这两个异常时,说明接收BUFFER描述符双向环形链表结构出现错误,处理器会自动禁止DMA发送功能,因此建议重构接收BUFFER描述符双向环形链表结构并重新使能DMA发送功能。
4:S3C4510B的HDLC通道使用中的注意事项
我们编写了4510的HDLC通道底层驱动程序,并应用在了我们的155M SDH设备软件中。通过对软件的调试,感觉在使用4510的HDLC通道时,需要注意下面的问题:
1. 发送和接收数据大端/小端模式要一致,否则收到的数据与发送的数据高字节和低字节颠倒。
2. 使用DMA模式收发数据时,正常状态下进入中断后,读取发送BUFFER描述符指针寄存器(HDMATxPTR)或接收BUFFER描述符指针寄存器(HDMARxPTR)的内容时,他们指向的都是下一个未用的BUFFER描述符。因此想处理接收到的数据或者初始化用过的发送BUFFER描述符时,需要指回到它们。
3. 使用DMA方式时,发送和接收BUFFER描述符在使用时的OWERSHIP位必须是DMA所有。因为发送是主动的,所以当把数据放进BUFFER描述符后,可以设置OWERSHIP位,然后启动DMA发送;而接收是被动的,因此数据到来前,将要使用的BUFFER描述符必须是DMA所有,这就是每次进入接收中断后需要重置接收BUFFER描述符OWERSHIP位的原因。
4. 当发送端的时钟信息无法传递到接收端时,最好使用DPLL或者发送前导码,以便接收端能够恢复发送端的时钟信息。
5. 当使用外部时钟源发送或接收数据时,注意数据采样点和外部时钟源的配合。我们的设备中一块芯片为4510的HDLC通道提供时钟,它在时钟上升沿发送,下降沿接收,4510的HDLC通道默认模式是时钟下降沿发送,上升沿接收。我们以这种模式收发数据,存在严重的数据不稳定问题,当改为上升沿发送,下降沿接收后,完全正常。因此数据采样点的配合很重要。
6. 4510的HDLC通道收发方式还可以采用中断方式,由于时间紧迫和能力有限,我们的程序没有实现,有兴趣地可以参考4510数据手册实现中断方式收发。
5:总结
KS4510B是一款性价比很高的ARM处理器,功能丰富,编程简单,并且可以配合几种嵌入式实时操作系统,如pSOS,NUCLEUS等。我们的155M SDH传输设备中,使用4510B和NUCLEUS操作系统,完成了底层控制软件。经过调试,该软件性能稳定,其中HDLC通道完成了私有网管协议在SDH环网上的传输转发,实现了远程管理的功能。
随着各种电子,通讯产品对性能要求的日益提高,基于先进的ARM架构的各种32位微处理器也将得到越来越广泛的应用。因此,掌握了ARM处理器的使用和编程方法,必然能在工作中事半功倍,得到良好的结果和收益。
----
引用地址:三星ARM处理器S3C4510B的HDLC通道使用及编程