由于交通需求的不断增加,有越来越多的环形感应线圈检测器用于交通检测。这些埋设在道路表面下的线圈可以检测到车辆通过时的电磁变化进而精确地算出交通流量。交通流量是交通统计和交通规划的基本数据,通过这些检测结果可以用来计算占用率(表征交通密度),在使用双线圈模式时还可以提供速度、车辆行驶方向、车型分类等数据,这些数据对于交通管理和统计是极为重要的。通常高速公路车辆检测系统由多通道环形检测单元LD4和控制单元CCU组成,本文采用PHILIPS公司最新推出的ARM7内核微处理器LPC2114设计实现了车辆检测系统控制单元部分,并且和5个LD4环形检测器一起构成10通道高速公路车辆检测系统,其原理框图如图1所示。
总体方案设计 本文设计的控制板系统原理框图如图2所示,以LPC2114为核心控制单元,该芯片是一种支持实时仿真和跟踪的16/32位基于ARM7TDMI-S内核的CPU。内部集成了4路10位A/D转换器,两个32位定时器、一个实时时钟和看门狗,多个串行接口,包括两个工业标准的UART、高速和两个SPI总线接口,外部多达46个与TTL电平兼容的通用I/O口,非常适用于作为主控单元。CPLDEPM7128作为微处理器的扩展输入/输出,通过光电耦合和LD4标准定义总线相连,该标准定义的总线基于RS-485总线通信协议。LD4和控制板通过标准总线进行数据交换,控制板每隔10秒扫描并发送一次请求数据的命令,相应LD4通道返回请求数据或者无效信息,ARM处理器对获得的各通道数据进行相应的统计运算处理。每隔用户设定的间隔时间就将统计数据存储于静态RAM,供中心站定时获取,同时,以分钟为单位将统计的数据备份至Flash电子硬盘中。中心站可以通过请求备份数据命令获取相应时间段的数据,并存入数据库。中心站和控制板采用RS-232串口方式通信,利用调制解调器实现远程数据传输。为了解决大容量存储问题,系统使用了三星公司提供的K9F2808来作为电子硬盘,16MB的容量能够存储11天备份数据,并且该电子硬盘能够灵活升级。
LPC2114与电子硬盘的接口实现 为了防止传输及中心站故障等问题而导致数据丢失,系统要求对一段时间内的数据进行备份,因此在系统设计的过程中需要考虑大容量存储问题。
设定本系统每分钟需要备份一次统计数据,根据环形检测器LD4的数据格式,一次数据量为1026B,若采用静态RAM作为存储单元,需要多片大容量RAM级联使用,价格昂贵,且存储容量扩展困难。若使用动态RAM作为存储单元,缺点在于控制困难,需要动态RAM控制器辅助操作。Flash作为存储器使用简单,容量大,尽管使用寿命有限,考虑到系统每1分钟存储1026B,就16MB容量而言,11天左右写满一次,那么一个月擦写约3次,以此计算,一年擦写约36次,而Flash寿命一般为擦写10万余次,所以本系统完全可以采用Flash作为电子硬盘用在车辆检测系统中。另外,Flash还具有掉电非易失特性,更适合应用于本系统。
为了便于存储容量的升级扩展,本系统选用K9F2808作为存储器。K9F2808为48脚表面封装器件,芯片内部有(16M+512K)×8bit的存储空间,可组成32768行,528列,其中后备的16列的列地址编码为513~527,可进行528字节为一页的读、写和32页为一块的擦除操作。此外,K9F2808的特点还在于其命令、地址和数据信息均通过8条I/O总线传输,接口标准统一,易于存储容量升级。
图3为LPC2114和Flash电子硬盘之间的连线示意图,由于LPC2114没有外部总线,所以对Flash操作只能采用I/O操作方式。K9F2808各种操作具有共同特点,即在I/O端口首先发送操作命令字到命令寄存器,其后的连续3个周期发送需要操作单元的地址,顺序为:A0~A7,A9~A16,A17~A23,其中A8由命令字确定。
下面以页编程操作为例,给出K9F2808的ARM驱动程序(基于ADS1.2开发环境),而页读以及块擦除等方法与页编程类似,只是读是由#RE信号来锁存数据,而擦除时只须送两个周期的地址。
row_add为页号,需要左移9位得到行地址。erase_flash()——擦除Flash函数 write_command()——写命令函数 write_address()——写地址函数 write_data()——写数据函数 read_data()——读数据函数
- voidflash_store(uint32row_add,uint8*buffer)
- {uint16i;
- uint32statue,address;
- //变量定义
- IO0DIR|=0x00ff0000;
- //设定IO方向
- if((row_add==0)||((row_add%32)==0))
- {address=row_add<<9;
- address&=0x00fffe00;
- erase_flash(address);}
- //擦除Flash
- write_command(0x80);
- //写命令80H
- address=row_add<<9;
- address&=0x00fffe00;
- write_address(address);
- //写地址
- statue=IO0PIN;
- //获取状态
- while((statue&fr_b)==0)
- {statue=IO0PIN;}
- //忙,等待
- for(i=0;i<528;i++)
- //写528字节
- {write_data(*(buffer+i));}
- //写入数据
- write_command(0x10);
- //写命令10H
- statue=IO0PIN;
- //获取状态
- while((statue&fr_b)==0)
- {statue=IO0PIN;}
- //忙,等待
- write_command(0x70);
- //写命令70H
- statue=read_data();
- //获取状态
- if(statue&0x01)
- {IO0SET|=errorled;}
- //操作失败
- }
复制代码
LPC2114串口通信实现 控制系统通过LPC2114的两个UART实现和LD4以及中心站的数据交换,两个UART具备触发点可调的16B收发FIFO。其中,UART1比UART0增加了调制解调器接口。UART的基本操作方法和传统51内核单片机相似。
首先,设置I/O连接到UART;然后设置串口波特率(如U0DLM、U0DLL);接着设置串口工作模式(如U0LCR、U0FCR);这时就可以通过寄存器U0THR和U0RBR发送/接收数据了,发送/接收模块的状态信息可以通过U0LSR寄存器读取。
系统通过RS-485总线和LD4板卡通信,采用MAX3485作为RS-485总线控制器和 LPC2114的UART1通信。MAX3485是3.3V供电的半双工收发芯片,将差分RS-485总线信号转换成ARM核能够接受的串口信号。为了实现和PC机通信,系统采用3.3V工作电压的MAX3232作为RS-232电平转换芯片。
LPC2114设计注意事项 LPC2114在开发的过程中有一些需要特殊注意的问题,总结如下: (1)当用户程序写入Flash后不能运行时,首先,需要考虑中断向量表是否正确,中断向量表累加和必须为0。其次,需要考虑向量表的定位,向量表是否已经定位在0x00000000地址。然后,需要考虑MEMMAP寄存器的设置是否正确,否则中断无法执行。此外,还需要考虑ISP硬件条件是否满足,LPC2114的P0.14脚在#RESET为低时,该引脚线上的低电平将强制芯片进入ISP状态,硬件设计时必须在该引脚加10KW上拉电阻,否则,该引脚不稳定,设备启动将会有影响。
(2)LPC2114共有46个GPIO,这些I/O可以任意配置,但是个别引脚开漏输出(P0.2、P0.3),需加上拉电阻。另外,Flash存储器K9F2808状态输出引脚R/#B开漏输出,需加10KW的上拉电阻。
(3)LPC2114芯片加密后,只能通过ISP对芯片全局擦除后才能恢复JTAG调试以及下载等功能。当#RESET为低时,P1.26的低电平使P1.26~P1.31复位后作为调试端口,注意在P1.26引脚和地之间需接一个弱偏置电阻。
系统软件设计思想及注意事项 车辆检测系统ARM软件采用分层设计思想,整个软件由驱动程序和应用软件两部分构成。驱动程序部分封装了Flash操作、RS-485操作、实时时钟(RTC)操作、RS-232操作和I/O等操作。应用软件分成基本函数库和主程序。其中,主程序流程如图4所示。 在32位ARM核应用系统中,为了进行系统初始化,往往采用一个汇编文件作为启动代码,来实现堆栈、中断、系统变量、I/O初始化以及地址重映射等操作。开发平台ADS的策略是不提供完整的启动代码,不足部分需要开发人员自己编写。
系统设计的启动代码包含中断向量表、堆栈初始化以及相应的中断服务程序与C语言的接口。对LPC2114而言,为了使向量表中所有数据32位累加和为0,向量表中设置保留向量值,将中断向量表中的32个字节数累加,其中,保留向量值不用累加,然后取累加值的补码,这个补码的低32位就是保留向量的值。该保留向量值将被BOOT装载程序用作有效的用户程序关键字。当向量表中所有数据累加和为0时,且ISP外部硬件条件不满足时,BOOT装载程序将执行用户程序。
|