ARM7串口9位方式多机遇信的编程技术

Posted on 10月 7th, 2009 in 未分类 作者: armodmli  Tagged

1 主从式多机通信
    所谓主从式多机系统,即在数个ARM(或单片机)中,有一个是主机,其余的为从机。从机要服从主机的调度、支配,其拓扑结构如图1所示。

    主机信息可以发到各个从机,从机发送的信息只能被主机接收,从机之间不进行通信。
    51单片机串口不同寻常的特征是包括第9位方式(在串口模式2和模式3下)。它允许把在串行口通信增加的第9位用于标志特殊字节的接收。一般约定第9位为高时表示该字节为地址字节,第9位为低时为数据字节。第9位方式允许接收单片机信息,仅当字节具有一个第9位时才能被中断。用这种方式,主机首先广播1字节,并让其第9位为高,同时收到该字节的各个从机,只有地址相符的打开,以接收后面的数据字节。所接续的数据字节(第9位为低)不能引起其他从机中断,因为未送它们的地址。
    51单片机用9位方式多机通信时,串口模式必须在方式2或方式3。
    其实现多机通信的原理和工作过程如下:作主机的8051的SM2应设定为O,作从机的sM2设定为1。主机发送并被从机接收的信息有两类:一类是地址,用于指示需要和主机通信的从机地址,由串行数据第9位为“1”来标志;另一类是数据,由串行数据第9位为“0”来标志。由于所有从机的SM2=1,故每个从机总能在R1=O收到主机发来的地址(因为串行数据的第9位为“l”),并进入各自的中断服务程序。在中断服务程序中,每台从机把接收到的从机地址和它的本机地址(系统设计时所分配)进行比较。所有比较不相等的从机均从各自的中断服务程序中退出(SM2仍为1),只有比较成功的从机才足被主机寻址通信的从机。被寻址的从机在程序中使SM2=0,以便接收随之而来的数据或命令(RB8=0)。上述过程进一步归结如下:
    ①主机的SM2为O,所有从机的SM2=1,以便接收主机发来的地址。
    ②主机给从机发送地址时,第9数据位应设置l,以指示从机接收这个地址。
    ③所有从机在SM2=1、RB8=1和RI=O时,接收主机发来的从机地址,进入相应中断服务程序,并与本机地址相比较,以便确认是否为被寻址从机。
    ④被寻址从机通过指令清除SM2,以便正常接收数据,并向主机发回接收到的从机地址,供主机核对。未被寻址的从机保持SM2=1,并退出各自中断服务程序。
    ⑤完成主机和被寻址之间的数据通信,被寻址从机在通信完成后重新使SM2=l,并退出中断服务程序,等待下次通信。
    从以上8051实现9位方式多机通信的过程可见,关键问题在于:
    ①发送端(主机)如何发送第9位,并且可编程设置1或O;
    ②接收端(从机)如何接收到这第9位,并判断出是l还是0。
    以上问题,8051串口可通过控制寄存器SCON中的TB8、RB8和SM2位的设置和读取轻松解决,但在ARM中并没有与805l类似功能的寄存器。那么ARM7多机系统怎样实现如上9位方式多机通信呢?下面通过分析ARM串口(以UART0为例)的内部结构和相关寄存器,给出一个有效的解决方案。
2 ARM7串口UART0内部结构
    使用ARM7串口UARTO之前须设置5个寄存器,即中断使能寄存器UOIER、UARTO格式控制寄存器UOLCR、FIFO控制寄存器UOFCR和波特率设置寄存器UODLM和UODLL。发送过程是:CPU内核通过VPB接口对UARTO的寄存器进行读写访问,数据首先进入发送缓存UOTHR,经发送移位寄存器UOTSR逐位移出,经TxDO引脚输出。接收过程是:数据经RxDO,先进入接收移位寄存器UORSR,经接收缓存U0RBR,通过VPB与CPU内核相连。特别注意的是,通信过程中ARM7串口中的中断标志寄存器U0IIR和UART0状态寄存器UOLSR的各位将随着通信收发而自动受到影响,也就是说这两个寄存器记录了数据通信过程的状态信息,这些信息很有用。
    UOIIR寄存器的描述如表1所列。

    UOIIR提供状态代码,用于指示一个挂起中断的中断源和优先级。在访问UOIIR的过程中,中断被冻结。如果在访问UOIIR时产生了中断,该中断将被记录,在下次访问UOIIR时可以读出,避免了中断的丢失。
    UOLSR寄存器描述如下:

    RDR:接收数据就绪。判断该位是否置1,决定能否从FIF0中读取数据。
    0——UORBR为空。
    l——UORBR中包含有效数据。从接收FIFO中读走所有数据后,恢复为O。
    0E:溢出错误标志。当U0RBR寄存器中已经有新的字符就绪,而接收FIF0已满时,该位置位。
    0——接收缓存区没有溢出。
    1——接收缓存区发生溢出错误。
    PE:奇偶校验错误。在使能奇偶校验位之后,对所有接收的数据都进行奇偶校验,如果与UOLCR中的设置不符,将引起奇偶校验错误。
    O——没有发生奇偶校验错误。
    1——发生奇偶校验错误。读操作使该位恢复为O。
    FE:帧错误标志。当接收字符的停止位为O时,产生帧错误。
    O——没有发生帧错误。
    1——发生帧错误。读取该位时恢复为O。
    BI:间隔中断标志。在发送数据时,如果RXDO引脚保持低电平,将产生间隔中断。发生间隔中断后,接收模块停止数据接收。
    O——没有发生间隔中断。
    1——发生间隔中断。
    THRE:反映UOTHR是否为空,也可以认为发送FIFO是否为空。
    O——不为空。
    1——空。对UOTHR进行写操作,使该位恢复为O。
    TEMT:当发送移位寄存器和UOTHR均为空时,该位置位。
    0——不为空。
    1——空。对UOTHR进行写操作,使该位恢复为0。
    RXFE:如果一个带有接收错误(如帧错误、奇偶错误或间隔中断)的字符装入UORBR时,该位置位。
    O——UORBR中没有接收错误,或UOFCR[O]为0。
    1——UORBR中包含至少一个UARTO Rx错误。
    另外,还有两个很重要的寄存器:一个是前面提到的格式控制寄存器UOLCR,另一个是FIFO控制寄存器UOFCR。
    UOLCR寄存器的描述如下:

其中第3位和第4、5位十分重要。
    奇偶使能:控制是否进行奇偶校验。如果使能,发送时将添加一位校验位。
    O——禁止奇偶产生和校验。
    1——使能奇偶产生和校验。
    奇偶选择:设置奇偶校验类型。
    OO——奇数(数据位+校验位=奇数)。
    01——偶数(数据位+校验位=偶数)。
    10——校验位强制为1。
    11——校验位强制为O。
    U0FCR寄存器的描述如下:

    这里面注意第6、7位。
    Rx触发点设置:通过设置这两位可以调整接收FIF0中触发RDA中断的有效字节数量。
    00——触发点O(1字节)。
    01——触发点1(4字节)。
    10——触发点2(8字节)。
    11——触发点3(14字节)。

3 9
位方式多机通信编程实现
    上面已说明,9位方式多机通信的关键是第9位的编程发送和第9位的接收和判断。
    对于发送端,利用UOLCR寄存器的设置便能实现第9位的编程发送。
    UOLCR=0×2B; //带奇偶校验,强制为l
    UOLCR=Ox3B; //带奇偶校验,强制为O
    通过以上设置,只要编程发送1字节,ARM就自动将第9位按程序设置的0或1发送出去。
    难点在于接收端,即接收端把接收到的第9位放到哪了,程序员又如何知道这第9位是0还是1。
    其实,ARM并不像51单片机那样把接收到的第9位数据自动装入SCON的RB8。实际上,ARM并没有这样的寄存器SCON,也没有RB8位。要实现判断第9位为1或0,只能利用ARM串口通信的奇偶校验功能!
    具体思路如下:
    ①设置奇偶校验使能;
    ②编程读取UOLSR寄存器的PE位(具体含义见UOLSR寄存器的描述部分);
    ③编程判断收到的l字节中有多少个“1”,并设置一标志PP;
    ④将上述标志与PE位比较处理;
    ⑤比较的结果就正确表示了第9位是“O”,还是“1”。
    按照以上思路,可有效实现第9位的判断。下面给出相应的程序代码:


    上述程序中变量u9就是得到的第9位标志:
    当u9=OxFF时,说明第9位为1;
    当u9=OxFE时,说明第9位为O。
    还需注意的是,接收端奇偶校验设置成偶校验还是奇校验,要根据后面程序中标志pp的设置而定。
       本设计方案巧妙地应用ARM串口通信奇偶校验功能,实现了9位方式的多机通信,并在相关课题中成功应用,而且保证了通信的可靠性。

 

更多相关信息请登录:http://www.armodm.com

三星ARM处理器S3C4510B的HDLC通道使用及编程

Posted on 09月 24th, 2009 in 未分类 作者: armodmli  Tagged

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处理器的使用和编程方法,必然能在工作中事半功倍,得到良好的结果和收益。

更多相关信息请登录:http://www.armodm.com

ARM7与FPGA相结合在工业控制和故障检测中的应用

Posted on 09月 15th, 2009 in 未分类 作者: armodmli  Tagged

工业控制中往往需要完成多通道故障检测及多通道命令控制(这种多任务设置非常普遍),单独的CPU芯片由于其外部控制接口数量有限而难以直接完成多路检控任务,故利用ARM芯片与FPGA相结合来扩展检控通道是一个非常好的选择。这里介绍用Atmel公司ARM7处理器(AT91FR40162)和ALTERA公司的低成本FPGA芯片(cyclone2)结合使用完成多通道检控任务的一种实现方法。
  各部分功能简介
  ARM芯片与FPGA芯片之间通过数据总线、地址总线及读写控制线相连,而与终端PC则通过串口通信;FPGA与目标设备通过命令控制总线和故障检测总线相连。 
  1 故障检测和命令控制部分
  故障检测:检测通道的故障(正常)信号以高(低)电平方式指示,其一旦有故障产生就会保持高电平不变直到故障排除。针对这种特征,在ARM控制器端采用定时中断循环查询方式来判断故障通道的状态。定时中断程序通过对ARM 地址总线在FPGA中进行译码而顺序锁定被检测通道的电平值,然后再经数据总线传回ARM进行判断,最后将判断结果送至远程终端。采用主机查询方式而不采用故障中断方式出于两个原因:一方面是通常控制芯片外部中断源有限(多数为4个外部中断源),对于多目标中断信号检测显然是困难的;另一方面,由于检测通道或设备受到短时干扰而产生电平随机反转,造成故障中断触发,而中断触发后又无法在通道电平恢复正常时撤销故障信号,故而形成虚假报警。
  命令控制:ARM芯片先判断主控端发来的控制命令,然后通过地址总线和数据总线将命令状态发送至经FPGA地址译码锁定的控制通道上。
  2ARM芯片与远程检测控制终端通信
  由于只存在命令和故障状态信号的收发,所以利用ARM的串口实现与远程PC的通信,通信标准选为RS232标准。不过,在ARM芯片上要先将TTL电平通过MAX232芯片转换为RS232电平标准,对于距离超过15m的全双工通信,在发送接收两端还要各加一对RS232转RS422电平的转换模块,以增加通信距离。
  3 FPGA内部功能模块说明 
  ARM芯片的ADDR2~0位地址线和片选使能信号一同进入译码器decode1进行地址译码后产生8路输出(FPGA内部可设置一个最大输出为256路的译码模块,所以在实际应用中可扩展为更多通道),低4路用于命令发送通道,高4路用于故障检测通道,读写使能信号控制数据总线。
  ARM芯片接收到发送信号编码命令时,立即在串口接收中断服务子程序中并送相应地址(通道编号)和数据(命令状态)到FPGA中。译码器有效输出作为相应通道D触发器的锁存时钟,而数据状态则被触发器锁定后作为所选通道的输出完成相应控制。
  ARM芯片在定时中断产生进入服务程序后对所有检测通道轮流查询,查询到有通道故障时,故障信号结合选中通路信号经与非运算送往数据端口被读取。
  FPGA程序设计注意问题
  1延时的配置
  通过地址总线和数据总线进行命令传输和故障检测时,FPGA是作为ARM芯片的普通外设来使用的。而ARM芯片对外设访问的速度要远低于片内存储器,所以要在ARM中设置访问的正确等待周期。ARM中提供的延时周期为0~7个,通过调试即可找到外设合适的等待周期,此系统的等待周期根据实际测试设置为5个,具体的配置方法见ARM程序说明。
  2 读写使能信号的连接
    写使能信号NWE及读使能信号NRD应作为数据线(DATA0~5)的三态控制信号连接,即使在ARM芯片无其他外设时也不能缺省。因为ARM的上电加载程序时间要长于同一系统上FPGA的程序配置时间,而FPGA的检测及控制通道与ARM芯片的数据总线相连,FPGA加载完成后数据总线会存有相应通道的逻辑电平值(不为三态),这就会导致ARM芯片在对片内Flash芯片烧写程序或上电加载程序时与FPGA冲突(数据被逻辑锁定),造成无法正确定位操作对象而使读写失败。
  ARM配置及应用程序说明
  1 处理器的资源分配
  ● 存储器
  AT91FR40162内嵌一个256KB的SRAM,1024K个16位字组成的Flash存储器。SRAM通过内部32位数据总线与ARM核相连,单周期访问,Flash存储器则通过外部总线访问。
  ● 系统外围
  EBI:外部总线控制接口,EBI可寻址64MB的空间,通过8个片选线(NCS0~NCS3独立)和24位地址线访问外设,地址线高4位与片选线(NCS4~7)复用,数据总线可配置成8/16位两种模式与外设接口。
  PIO:并口控制器,PIO控制32根I/O线,多数为复用引脚,可通过编程选择为通用或专用。
  AIC:先进中断控制器,实现片内外围中断及4个外部中断源中断的管理,其外部中断引脚与通用I/O复用。
  ● 用户外围
  USART0~1:串口收发控制器,支持8个数据位的发送,可以进行异步/同步传输选择,其片外引脚与通用I/O复用。
  TC:定时/计数器,可以产生定时中断和计数功能,其片外引脚与通用I/O复用。
  2 存储器地址重映射后的空间分配
  在CPU上电后,都会从地址0开始第一条指令代码的执行,而上电复位后0地址必须映射到NCS0片选所接的器件上,这里必须将NCS0连接到片内Flash上以加载初始化程序和应用程序。由于中断和异常的入口地址是0~20H固定不变,它们的产生都是跳转到0~20H之间相应的地址取程序执行,为了加快中断响应,必须将0~20H地址映射到片内RAM区,所以在初始化的重映射命令执行(EB1_RCR的RCB位置1)后,内部RAM就映射到地址0,所有的中断入口响应和堆栈操作都被映射到在RAM区进行。
  由于重映射主要是用于Flash和片内RAM的地址空间交换,所以片内外围接口(EBI、USART、TC)对应的存储器编程地址范围在映射前后不发生改变,而访问外设地址为重映射后所分配。
  3 应用接口的存储器配置
  EBI存储器:在8个EBI片选存储器(EBI_CSR0~EBI_CSR7)中设置外设访问参数。其中,32位存储器中包括数据总线宽度8(16)设置,等待状态数目1~7个周期设置,等待使能(不是使能)设置,片选使能(不使能)设置。这里将FPGA作为外设,使能NCS3(也可根据实际选择其他空闲片选线),选择总线宽度16,使能等待周期并设周期为5(根据调试选择)。因默认NCS0为加载Flash片选线,而Flash为16位信号、7个等待周期,故需在EBI_CSR0中选择16位总线宽度、7个等待周期并使能NCS0。

  AIC存储器:AIC存储器管理所有内外部中断,对此存储器的正确初始化赋值才会打开相应中断。设定AIC工作参数:应用串口通信模式为异步模式,串口发送的数据位字符长度为8位,通信的波特率9600B/s,串口中断优先级为6(中断优先级由低到高0~7),接收发送通道使能。
  TC存储器:定时中断存储器需要设定定时长度为1s(每1s产生中断进行故障查询),定时通道使能及软件触发模式,定时中断优先级设为1。
  4 应用程序说明
  ① 主程序
  #define AT91C_BASE_EBI ((AT91PS_EBI) 0xFFE00000) //EBI基地址定义
  int main()
  {AT91F_EBI_OpenChipSelect (
  AT91C_BASE_EBI, //地址指针
  0×3, //片NCS3使能
  0×30000000+0×3f39); //片选存储器初始化
  Usart_init();//初始化串口
  timer_init();//初始化定时器
  while(1){} //循环等待
  }
  ARM处理器在完成各寄存器初始化后进入应用主程序,在主程序中首先调用EBI接口使能函数来设置参数:在程序中设置存储器基地址值(0xFFE00000),片选设置0×3(NCS3使能),NCS3的存储器初始化;调用USART控制器函数初始化串口:打开串口,串口收发通道初始化,设定串口通信速率;调用定时中断函数:打开定时中断,设置定时中断时间,设定触发方式为软件触发;最后进入等待循环。
  ② 串口命令接收中断服务程序
  #define USART0_INTERRUPT_LEVEL 6//设置中断优先级为6
  #define AT91C_US_USMODE_NORMAL AT91C_US_CHMODE_NORMAL//*设置通信模式(NORMAL定义为异步模式)*//
  AT91PS_USART COM0=AT91C_BASE_US0;//设置COM0为收发口
  char message[4];
  // 控制端串口中断通信程序 //
  //*—————————————————————————-*//
  void Usart0_c_irq_handler(AT91PS_USART USART_pt)//串口中断处理函数
 { volatile unsigned int *conp;unsigned int status;
  int time;
  volatile unsigned int i;
  status = USART_pt->US_CSR &USART_pt->US_IMR;//给状态寄存器赋初值
  if ( status &AT91C_US_RXRDY)//接收通道寄存器判断是否有数据
  {
  AT91F_US_DisableIt(USART_pt,AT91C_US_RXRDY);//关闭接收通道准备好中断
  AT91F_US_EnableIt(USART_pt,AT91C_US_ENDRX);//打开接收结束中断
  AT91F_US_ReceiveFrame(USART_pt,(char*)(message),4);//调用接收数据数接收数据
  }
  if ( status &AT91C_US_ENDRX){
  AT91F_US_DisableIt(USART_pt,AT91C_US_ENDRX); // 关闭接收器传送结束中断
  { if((message[0]^0xff)==message[1])//判断接收代码
 {switch (message[0])
  {case 0×31 : {conp=(volatile unsigned int*)(0×1+0×30000000);//OPE1使能
  *conp=0×2;}; break;//0×31代码送往OPE1端口
  case 0×30 : {conp=(volatile unsigned int*)(0×2+0×30000000);//OPE2使能
  *conp=0×1;}; break; // 0×30代码送往OPE2端口
  case 0×11 : {conp=(volatile unsigned int*)(0×3+0×30000000);//OPE3使能
  *conp=0×2;};break;// 0×11代码则往OPE3端口
  case 0×10 : {conp=(volatile unsigned int*)(0×4+0×30000000);//OPE4使能
  *conp=0×1;};break; //0×10代码送往OPE4端口
  default:break;}
  }
  }
  以上程序为串口中断服务程序,各函数语句说明参见注释。中断级别设置为6(高于定时中断),这样使命令发送优先于故障查询(控制命令随机出现而故障查询总是循环进行);接收缓冲区message[4]数组类型必须设为动态分配,静态数据分配会使处理器开辟数据缓冲区到Flash芯片中,从而引发在一个中断处理程序中由于存取时间过长而导致串口收发超时的错误。因为篇幅有限,其他程序不再一一叙述。
  在ARM应用程序的编写中,应该尽量少的在主函数内使用循环操作,主函数主要完成各接口控制器应用初始化,因为主函数不间断循环操作不但会增加功耗,而且长时间频繁切换于中断服务和主循环之间会造成程序运行的不稳定,所以能用定时中断完成的循环操作尽量用中断完成。
  ARM芯片控制功能结合FPGA灵活的多硬件接口模拟特性在工程上体现出的其独特的优势,已发展为一种流行的硬件架构模式,随着芯片功能的不断强大,这种优势将使其用途更广,对任务处理变得更加灵活高效。

更多相关信息请登录:http://www.armodm.com