资源描述
基于ARM的门禁系统设计
摘要
随着人类生活水平、认知水平和人们对安防规定的不断提高以及工业自动化的蓬勃发展,智能化管理已经走进了人们的社会生活,而在智能化管理中,门禁监控系统得到了越来越多的应用,门禁,又称出入管理控制系统,是一种管理人员进出的数字化管理系统。但传统的门禁监控系统一般采用门禁控制和视频图片摄录相分离的实现办法,这给现场布线带来了很多的不便,同时其成本也会大大提高。所以,设计稳定性高、保密性强和易于扩展的较通用型门禁系统具有重要的实际意义。
整个系统的设计采用品有丰富多片内外设的 LPC2368 ARM为微控制器,选用 ZLG522S/LT 读卡模块为读卡器(使用 Mifare 卡),并采用 HUIGANG 继电器作为门锁开关,同时有门状态指示灯。
系统通过 RS-485 总线与上位机进行通信。该系统具有按用户与时间权限刷卡开门和记录功能、添加用户功能、设立时间权限和考勤时间段,并能将记录信息通过SD 卡导出。
该电子门禁系统具有实际应用中的单门门禁考勤系统的重要功能,并具有稳定性、可靠性,保密性强和人机界面和谐的优点。
关键词:ARM 微控制器,读卡模块,RS-485,SD 卡
概述
本设计皆在完毕一个管理人员进出的数字化出入管理控制系统。
在现今的社会生活中,人们已经逐渐进入并融入到了数字化电子化的生活,社会的各个方面都已经实现或基本实现了数字化,门禁系统作为人们生活中必不可少的管理类应用,在人类的工作中显得尤为的重要,而对于这样一个应用,在这样一个大的背景下,实现其数字化与电子化是十分必要的,智能考勤系统基于现代电子与信息技术,运用智能卡或指纹等生物信息的唯一性来对员工上下班进行现代化高效管理,在各厂矿、机关、银行等场合已广泛应用并成为单位管理现代化和信息化的标志。
但目前很多门禁系统的核心控制单元重要依赖单片机来实现,它虽然也能完毕相应的基本功能,但其扩展能力有限,在性能和存储容量等方面已不能很好地满足人们的规定,然而,随着嵌入式技术的不断发展,特别是基于ARM 解决器的嵌入式系统由于其可扩展性强、稳定性高、功耗低、性能和价格比较合理等特点已在实际生活中得到了越来越多的应用。因此,决定尝试做一个基于ARM的电子门禁系统。
目前,欧美电子门禁系统市场正逐渐进入成熟阶段,其产业的分工已进人细分阶段。在国内,电子门禁系统处在成长期和初始阶段。
第1章系统总体方案概述
§1.1系统工作原理
系统采用 LPC2368 ARM 为微控制器,选用ZLG522S/LT 读卡模块为读卡器(使用Mifare 卡),并采用HUIGANG 继电器作为门锁开关,具有门状态指示灯,同时仿效实际产品引出必要的接口,如门磁检测,门内开关接口,门外铃声按钮接口,RS-485 通信接口和电源接口等。
系统通过 RS-485 总线与上位机进行通信。该系统具有按用户与时间权限刷卡开门和记录功能、添加用户功能、设立时间权限和考勤时间段,并能将记录信息通过SD 卡导出。
上位机在 VC 开发环境下编程,具有一些实际电子门禁系统的重要简朴功能。
更具体的工作原理在下面的软硬件部分具体给出。
§1.2 设计思想
门禁系统由门禁控制器、读卡器、出门按钮、通讯集线器、感应卡和管理软件组成。
§1.2.1 门禁控制器的选择
门禁控制器有多种控制芯片可以选择,如 8051 系列单片机、ARM 系列控制器等。由于本门禁考勤系统使用的串行口较多,在速度的规定上较高,而ARM 系列控制器很容易得到满足。虽然其价格较贵,但综合考虑,ARM 系列控制器更适合本系统。在众多的ARM 控制器中,LPC2300 系列较其他系列的优点显著,十分合用于串行通信的场合。
§1.2.2 门禁系统的类型选择
门禁系统一般有以下类型:
1. 不联网门禁:合用场合:已装修好不便于重新布线,安全性能规定不高的场合。
2. RS-485 联网门禁:合用场合:社区、学校、仓库等人数稍多,门需统一管理,安全性能规定一般的场合。
3. CAN-bus 联网门禁:合用场合:通信性能稳定性规定高,传输速度规定快、传输距离规定远的场合,如金融机构、政府企事业机关等。
4. TCP/IP 以太网联网门禁:合用场合:适合安装在大项目、人数多、速度快、跨地区的工程中。
由于本系统的技术规定和应用场合是中距离通信场合,综合以上四种类型及本系统对安全性的规定不是很高的基础上,RS-485 联网系统可以胜任。
§1.2.3 感应卡的选择
常见的门禁系统有:密码门禁系统、非接触 IC 卡(感应式IC 卡)门禁系统和指纹虹膜掌型生物辨认门禁系统等。密码门禁系统由于其自身的安全性弱和便捷性差已经面临淘汰;生物辨认门禁系统安全性高,但成本高;现在国际最通用的还是非接触IC 卡门禁系统。非接触IC 卡由于其较高的安全性,便捷性和性价比高成为门禁系统的主流。所以该系统使用非接触IC 卡。非接触IC 卡RS-485 门禁考勤系统示意图如图1-1所示。
图 1-1 非接触IC 卡RS-485 门禁考勤系统示意图
第2章硬件设计技术文档
本设计为门禁考勤系统,顾名思义,其兼具门禁和考勤的功能。下面为本系统的硬件设计说明。
§2.1 门禁考勤系统的功能框图见图2-1
图 2-1 门禁考勤系统的功能框
§2.2 硬件电路分析
§2.2.1 电路原理图(见图2-2)
图 2-2 门禁考勤系统电路原理图
§2.2.2 硬件使用的资源
LPC2368 是基于一个支持实时仿真和嵌入式跟踪的 32/16 位ARM7TDMI-STM CPU 的微控制器,并带有512 kB 的嵌入高速Flash 存储器。128 位宽度的存储器接口和独特的加速结构使32 位代码可以在最大时钟速率下运营。对代码规模有严格控制的应用可使用16 位Thumb 模式将代码规模减少超过30%,而性能的损失却很小。其特别适合于串行通信的场合。
LPC2368 内部由512K 的Flash,58K 的片内SRAM,涉及32K 的局部总线SRAM、8K 的USB 使用的SRAM、16K 的以太网SRAM 和2K 的电池SRAM。此门禁考勤系统只使用了片内 Flash、局部总线SRAM 和2K 的电池SRAM,没有外部扩展存储器。如表2-1 所示,为LPC2368I/O 口的使用和分派表。
表 2-1 LPC2368I/O 口的使用和分派表
功能模块
使用LPC2368引脚
引脚功能
看门狗复位
P1.24
给SP706S喂狗
串口UARTO(RS-232C和RS-485)接口
P0.2(TXDO)
串口UARTO的
输出输入
P0.3(RXDO)
P1.22(GPIO)
RSM485CHT的收发控制
读卡器模块
P0.10(TXD2)
微控制器与读卡模块的UART通信接口
P0.11(RXD2)
P0.27(SDAO)
微控制器与读卡模块的I2C通信接口
P0.28(SCLO)
P2.11(INT)
按键和门内开关
P0.6~P0.9
四个独立按键
P0.23
门内开门开关输入
指示灯
P1.28
门关闭指示灯
P1.29
门打开指示灯
继电器和蜂鸣器
P1.26
继电器控制端(高电平有效)
P1.27
直流蜂鸣器控制(低电平有效)
门磁检测
P1.25
检测门磁状态(低电平为门开)
SD卡接口
P0.21、P0.22、P2.11、P2.12、P2.13、P0.20、P0.19、P2.8、P3.25
引脚具体说明见表2-3
ZLG7290接口
P0.0(SDAO)
此接口出去次三接口外,尚有电源和地接口
§2.2.3 各个部分单元电路原理及其分析
1. 电源电路
系统设计为 3.3V 应用系统,但是LPC2300 系列ARM 微控制器需要2种类型的电源,分别是3.3V 和1.8V,而与PC 机通信使用的RS-485 收发器(RSM485CHT)和继电器都是5V 器件,所以设计5V 电源为系统前级电源,3.3V 为后级电源。对于LPC2300 系列ARM 的1.8V 内核供电,本系统使用片内的DC-DC,由于本系统没有使用AD/DA 功能,所以不区分模拟电源和数字电源。
如图 2-3(a)、(b)所示,一方面由CON30 电源接口输入9V 直流电源,二极管D11 防止电源反接,通过C11、C12 滤波,再通过LM2575 将电源稳压至5V,然后通过L2、C111、C110 组成的滤波电路,输出稳定的低纹波5V 电压,再使用LDO 芯片(低压差电源芯片)稳压输出3.3V 电压。考虑到系统长时间处在工作状态,从节能方面考虑采用了开关电源LM2575 设计。
系统使用的电源是 9V 直流电源,由CON30 电源接口输入,接头上的电源极性为外正内负。当系统上电后,POWER 指示LED1 应点亮。LDO 芯片采用了SPX1117M3-3.3,其特点为输出电流大,输出电压精度高,稳定性高。
图 2-3 系统前后级电源和RTC 电源电路
LPC2300 系列ARM 集成有RTC 外设,其单独供电,本次设计中提供了
两种供电方式,系统电源和外部电池供电,如图2-3(c)所示。系统电源方式便于调试系统时使用,电池供电方式在实际应用中使用。
2. 时钟系统、RTC 时钟电路
系统采用 ARM 嵌入式工业控制模块T2368 中的最小系统,其中使用外部12.000MHz 无源晶振作为主时钟源。对于实时时钟(RTC)功能,在CPU的RTCK1 和RTCK2 脚之间接一个32.768KHz 的晶振。
3. 看门狗复位电路
由于 ARM 芯片的高速、低功耗、低工作电压等特性导致其噪声容限低,对电源的纹波、瞬态响应性能、时钟源的稳定性、电源监控可靠性等诸多方面也提出了更高的规定。使用了专用微解决器电源监控芯片SP706S 以提高系统的可靠性,同时该芯片还带有硬件看门狗电路。
如图 2-4 所示,在电路中将看门狗复位信号输出脚( WDO )通过R32 连接到 SP706S 的手动复位输入脚( MR )上,信号nRST 连接到CPU 的复位脚nRST。
可通过定期翻转 P1.24 的电平来喂狗,一旦在1.6 秒内未翻转P1.24 的电平,则SP706S 内部的看门狗溢出,WDO 脚输出低电平, MR 脚被WDO 脚拉低为低电平,导致SP706S 在RST脚输出200ms 的复位脉冲令CPU 复位,同时SP706S 内部清零看门狗让其重新计数。
图 2-4 系统复位电路
当复位按键RST 按下时,SP706S 的RST脚输出低电平复位系统。
4. 串口 UART0(RS-232C 和 RS-485)接口
由于系统是 3.3V ,所以使用了SP3232E 进行RS-232C 电平转换,SP3232E 是3V 工作电源的RS-232C 转换芯片。如图2-5 所示,CON2 为UART0接口,可以在串口调试阶段使用,在实际应用中,则要使用CON3 的RS-485接口。
RS-485 收发器采用嵌入式隔离RS-485 收发器RSM485CHT,如图2-5(c)所示。RSM485CHT 隔离收发器模块,是集成电源隔离、电气隔离、RS-485接口芯片,总线保护器件于一身,其为5V 工作电源器件。电路设计中采用保守方法,加入了PESD1CAN 隔离,是系统稳定性更高。
RS-232C 与RS-485 功能可以通过跳线JP2 来切换,如图2-5(b)。JP2跳线器说明见表2-2。
图 2-5 UART0(RS-232C AND RS-485)接口
JP2
功能
备注
控制器的UART0与CON2(RS-232C)连接
(模式1)串口调试时使用
控制器的UART0与CON3(RS-485C)连接
(模式2)实际应用中使用
5. JTAG 接口电路和ISP 跳线电路
采用 ARM 公司提出的标准20 脚JTAG 仿真调试接口,JTAG 信号的定义及与T2368 的连接如图2-6(a)所示。其中RTCK 引脚加上拉电阻,使系统重启后,LPC2368 内部的JTAG 接口使能,可以直接进行JTAG 仿真调试,同时P2[9:0]引脚不为跟踪功能;当要使用 ISP 功能时,将PC 的串口与CON2 相连,并将跳线JP2 设立为第一种模式,使用UART0 通信。同时把JP1(如图2-6 JTAG 接口电路(c))短接,是ISP 的硬件条件得到满足。
图 2-6 JTAG 接口电路
6. 读卡模块
现在,门禁考勤系统一般都使用非接触式无线智能卡,Mifare 卡就是其中的一员,可以实现一卡通功能,具有数据传送速度快、防碰撞、保密性高等特点。读卡器采用 ZLG500S 系列读卡模块(ZLG522S/LT),ZLG522S/LT 为3.3V 供电,具有I2C 和UART 两种通信接口,和天线一体化,积极检测卡片进入的模块。此系统中,将两种接口都引出来,但只使用UART 接口,如图2-7(b)所示。
图 2-7 读卡模块
7. 按键、门内开关和指示灯
此系统中设计了四个独立按键、一个门内开关按钮接口和门状态指示灯(红:门关;绿:门开)、下位机向PC 机发送信息指示灯(通信时闪烁),如图2-8(a)(b)所示。
图 2-8 按键、门内开关和指示灯电路
8. 继电器和蜂鸣器
此系统应用继电器做开门开关;且有蜂鸣器提醒声。
继电器采用 HUIGANG 继电器,其为5V 工作器件,而系统为3.3V 系统,所以在设计上采用了NPN 三极管来实现3.3V 系统控制5V 的器件,用P1.26控制(高电平闭合),驱动电路如图2-9(a)所示;直流蜂鸣器,用P1.27 控制(低电平蜂鸣),驱动电路如图2-9(b)所示。两个驱动中的二极管起到继流的作用。
图 2-9 继电器和蜂鸣器驱动电路
9. SD 卡接口
系统使用LPC2368 为控制器,使用该内部自带SD/MMC 卡控制器来访问SD 卡。LPC2368 与SD/MMC 卡卡座的连接引脚LPC2368 微控制器与SD/MMC 卡卡座接口电路如图2-10 所示。图中,微控制器与 SD/MMC 卡卡座的连接引脚如表2-3 所示。
表 2-3 LPC2368 与SD/MMC 卡卡座的连接引脚
LPC2368 引脚
引脚名称
卡座引脚
含义
P0.21
SDPWR
--
卡供电控制引脚。P0.21 为低电平时给卡供电
P0.22
SDDATA0
DAT0/DO
双向的数据信号DAT0
P2.11
SDDATA1
DAT1/IRQ
双向的数据信号DAT1
P2.12
SDDATA2
DAT2
双向的数据信号DAT2
P2.13
SDDATA3
DAT3/CS
双向的数据信号DAT3
P0.20
SDCMD
CMD/DI
双向的命令/响应信号
P0.19
SDCLK
CLK/SCK
微控制器向卡发送的用于同步双方通信的时钟信号
P2.8
SD_CD
CARD_INSRET
卡完全插入到卡座中检测线。完全插入时,卡座输出低电平,否则输出高电平
P3.25
SD_WP
CARD_WP
看是否写保护检测。写保护时,卡座输出高电平;否则输出低电平
图 2-10 SD/MMC 卡的SD 总线接口电路
接口电路涉及以下部分:
(1)SD 总线
如图 2-10 所示,LPC2368 的P0.22、P2.11、P2.12、P2.13、P0.20 根据引脚功能,直接连接到卡座的相应接口,其中数据线DAT0~DAT3 双向数据线P0.22、P2.11、P2.12、P2.13 和命令线P0.20 分别接上拉电阻。
(2) SD/MMC 卡ESD 保护电路
如图 2-10 所示,在卡座的数据总线DAT0~DAT3、时钟线CLK 和命令线CMD 上,使用了一个ESD 保护器件PESD5V0L6U,作用是:当SD/MMC卡插入或拔出时,保护卡不受高压静电的损害。
(3) 卡供电控制
卡的供电采用可控方式,这是为了防止 SD/MMC 卡进入不拟定状态时,可以通过对卡重新上电使卡复位而无需拔卡。可控电路采用P 型MOS 管2SJ355,有微控制器的GPIO 口P0.21 进行控制。采用 2SJ355 的目的是当它开通时,管子上的压降比较小。
(4) 卡检测电路
涉及:卡是否完全插入到卡座中和卡是否写保护。检测信号由卡座的两个引脚以电平的方式输出。当卡插入到卡座并插入到位时,卡座的CARD_INSERT(第10 脚)由于卡座内部触点连接到GND,输出低电平;当卡拔出时,该引脚由于上拉电阻R83 的存在而输出高电平,该输出由微控制器的输入引脚GPIO(P2.8)来检测。
卡是否写保护的检测与卡是否完全插入到卡座中的检测原理是同样的。
10. TinyARM2300 接口
图 2-11 底板与核心板接口电路
以上介绍的是此系统的底板电路设计,下面是底板与核心板T2368 的接口排针(2.00mm),如图2-11 所示。此系统只使用了T2368 中的LPC2368最小系统,所以只给出此最小系统的原理图,如图2-12 所示。T2368 中的以太网接口没有使用,不区分模拟地和数字地。
图 2-12 T2368 核心板的最小系统电路图
11. 外部测试板、外部接口和剩余 IO 引出插针
如所示,其有继电器指示灯,门磁模拟和门内开门开关三部分组成。
如图 2-13(b)所示,其为本次设计的外部接口和几个测试点,P1.25 为门磁检测输入端,BELL_1 和GND 为外部按铃接口,RelayA 和RelayB 为继电器输出接口,BELL_2 为门内开门开关接口。
图 2-13(a)和(c)为剩余IO 引出排针和与ZLG7290 相连的接口,为系统的更新和升级做好准备。
图 2-13 外部接口和剩余IO 引出接口
注:由于本次制板为单面腐蚀制板,所以图2-11 中的(a)(b)在本次制板中没有引出。
第3章软件设计说明
§3.1 软件任务
软件设计分为下位机和上位机两大块。
下位机软件任务:以 LPC2368 芯片为主微控制器,对硬件的各个模块(各模块参见硬件技术文档)进行控制,制作一个具有刷卡开门和记录功能的门禁考勤系统,编程实现如下功能:
1. 准时间和权限刷卡开门及在不同时间段内考勤功能;
2. 记录刷卡事件、 记录考勤信息、 添加用户——发卡功能;
3. 与 PC 机通讯使用RS-485 总线,可以将用户数据下载到下位机系统中、 将记录信息导出到 SD 卡上;
上位机软件任务:上位机软件的任务重要是与下位机通过定义的 RS-485 协议,进行通信,进而实现以下功能:
1. 将用户数据下载到下位机系统中;
2. 显示刷卡信息、 发卡功能;
3. 设定期间权限和考勤时间段、 查看刷卡记录功能;
4. 开门功能: 设立刷卡后的允许开门时间长度(即刷卡开门后,在这个时间内门没有打开,则系统将门关闭);
§3.2 下位机软件设计资源分派
本设计应用前后台系统,使用到的LPC2368 片内外设和I/O 口使用参见硬件技术文档。下面介绍一下微控制器片内部分存储器的使用和分派。
§3.2.1 512K 片内Flash 部分扇区和电池SRAM 分派
片内 Flash 部分扇区分派如图3-1 所示,池SRAM 地址分派如图3-2 所示。
图 3-1 片内Flash 部分扇区分派 图 3-2 电池SRAM 地址分派
§3.2.2 后台任务和中断优先级分派
后台任务和中断优先级分派如下表 3-1 所示:
表 3-1 VIC 中断功能和优先级分派
中断源
功能
VIC 优先等级
串口UART0
与上位机通信
0
GPIO(P0口)的EINT3
中断收键
1
TIMER2
(1)中断收键延时,(2)继电器工作
2
UART2
与ZLG522S/LT 读卡器通信
3
RTC
(1)检查门磁,点亮门状态灯,并将门状态发送到上位机,(2)门处在开状态过长,则关闭门,(3) 更新开门时间权限段和考勤时间段
4
§3.3 下位机软件设计
§3.3.1 下位机软件设计整体思想
系统中有四种模式,分别为:刷卡开门考勤模式、发卡模式、RS-485 协议解决模式、将记录数据导出到SD 卡中。通过按键KEY1 的值来判断系统该工作在那种模式和切换模式。
对于解决上位机命令、中断延时收键和RTC 中断的功能则在后台解决。
§3.3.2 主程序的流程框架
作为前台的主函数,一方面对使用到的 GPIO 口、各个模块和外设进行初始化,然后进入模式选择循环,其流程框图如图3-3 所示。
§3.3.3 重要功能模式——刷卡开门和考勤模式程序设计
1. 刷卡开门和考勤模式主程序设计
此模式是此设计的重要功能,系统通过读卡器读出进入读卡范围内的Mifare 卡序列号,然后查询系统中的用户数据库,然后进行用户权限级别和时间权限的判断,从而进行相应的解决(记录刷卡信息和考勤信息)。
用户权限是指权限是大权限,还是小权限,大权限用户则不受时
图 3-3 主程序流程框图
间的约束,随时可以刷卡开门;小权限用户则在设定的时间段内才可以开门。此权限在发卡的时候拟定。
时间权限是指,小权限用户在哪个时间段内可以刷卡开门。此时间段可以通过上位机来随时设立。
此模式主程序流程框图如图 3-4 所示。
图 3-4 刷卡开门和考勤模式主程序流程框图
2. 重要子函数的程序设计
系统模式中重要子函数有:主控制器和 ZLG522S/LT 读卡模块与Mifare卡通信、用户查询函数、刷卡记录函数与考勤解决和记录函数。
(1)主控制器和ZLG522S/LT 读卡模块与Mifare 卡通信调用ZLG522S模块的操作软件包,重要是读卡器对Mifare 卡的一系列操作此模式中对卡片的请求使用“标准模式”。
(2)用户查询函数、刷卡记录函数与考勤解决和记录函数用户信息、刷卡事件记录和考勤事件记录,是三个结构体,同时开门时间权限和考勤段的设立也是一个结构体,如程序清单3-1 所示。
用户查询函数作用是在读到Mifare 卡序列号后,查询“用户信息存储区”,假如有此用户,则返回True 和此用户信息的首地址,否则返回False。
刷卡记录函数的作用是将刷卡的信息记录在存储器中,程序流程图如图3-5 所示。
考勤记录函数的作用是将考勤的信息记录在存储器中,其程序流程图和刷卡记录函数的流程图类似,不再赘述。
程序清单3-1 定义的结构体
struct infoUser1 /* 用户信息(6 个字) */
{
uint32 cardNO;
char name[8];
char phoneNO[11];
char limet;
};
struct eventRcd1 /* 刷卡事件记录结构体(6) */
{
uint32 cardNO;
char name[8];
uint32 active;
uint32 datas;
uint32 times;
};
struct attdRcd1 /* 考勤事件记录结构体(5) */
{
uint32 cardNO;
char name[8];
uint32 datas;
uint32 times;
};
struct timeamr1 /* 开门权限设立结构体 */
{
uint8 alhour;
uint8 almin;
uint8 purview; /* 开门时间权限3:no;1:yes */
uint8 check; /* 考勤阶段标志3:no; */
/* 1:yes 第一阶段;2:yes 第二阶段*/
};
考勤解决函数的功能,是判断现在是否为考勤时间段,假如在则进行考勤,否则不考勤。此系统中,设立了两个考勤时间段,并且可以用上位机来设立。其功能实现思想,是在每个考勤时间段内,将用户第一次刷卡做为考勤信息,且同时在卡片的指定存储块内设立一个标志,当此用户再次刷卡时,就不对其进行考勤。
§3.3.4 重要功能模式——发卡模式
一些门禁系统,都有专门的发卡器。而此项功能完全可以在一个系统中完毕。此系统中的发卡模式,可以将上位机的新用户信息写到新卡片的指定存储块内,并将新用户添加到用户信息存储区。模式的工作流程如图3-6 所示。
此模式中,将新用户数据添加到用户信息存储区时,用到了LPC2300 系列ARM 的在应用编程(IAP)功能。
由于本次实验中的用户比较少,所以,在添加新用户时,先将原有用户信息拷贝到一个数组中,再将新用户信息添加到该数组中,然后将更新了的用户信息烧写到Flash 中。同时更改用户数量也用到了IAP 功能,原理与此类似。
§3.3.5 RS-485 通信协议定义
1. 通信协议概述
门禁考勤系统分为下位机和上位机,两者通过 RS-485 来通信,所以根据此系统的特点,定义了一个RS-485 通信协议。该协议可以分为功能层、通信协议层和通信驱动层,但是由于其要实现的功能比较简朴,所以将功能层与通信协议层合二为一,分为功能协议层和通信驱动层:
(1) 通信驱动层:本层负责从通信接口UART0 发送数据和接受数据。
(2) 功能协议层:下位机与上位机通信定义了一套协议,本层负责把要发送的数据和命令按协议进行组装和把接受到的数据按协议进行解析。
图 3-6 发卡模式工作流程框图
2. 通信驱动层
此驱动层就是 LPC2368 的片内外设UART0。
3. 功能协议层
(1) 通信帧结构
下位机和上位机通信的帧结构如图 3-7 所示,各字段的意义见表3-2。
图 3-7 RS-485 通信帧结构
表3-2 通信帧各字段意义
字段
长度(Byte)
说明
帧头STX0
1
数据帧的起始位,数值为:0x2A
目的机地址AIM
1
此数据帧是发给地址为AIM 的节点
源机地址ORG
1
此数据帧是从地址为ORG 的节点发出
总帧长FrameLen
1
整个数据帧的总长度
命令类型Cmd
1
发送数据节点发给接受节点的数据用途或命令(命令集参见下位机程序文献UART0.h 和上位机文献protocol.h)
信息长度InfoLen
1
该帧所带信息的长度若所发信息长度为0,则Length = 0
信息Info
InfoLen
信息数据,其长度由InfoLen 字段指出,当InfoLen = 0时,则该字段不存在
校验和BCC
1
校验和。从STX0 开始到Info 的最后一个字节的异或,最后取反
帧结束符ETX0
1
帧结束标志,数值为:0x05
4. 发送数据到上位机
下位机发送数据到上位机函数如下所示。
/**********************************************************
** 函数名称: RS485_Send
** 函数功能: 通过 RS-485 发送数据到上位机
** 输入参数: nCMD: 命令类型;
pInfo: 要发送信息的指针;
nInfoLen1:要发送信息的长度
** 输出参数: 无
**********************************************************/
void RS485_Send(uint8 nCMD,const void *pInfo, uint8 nInfoLen)
{
uint8 SendBuf[60]; // 发送缓冲区
RS485_SEND(); // 将RSM485CHT 隔离收发器设立为发送模式
// 组装数据
SendBuf[FRAME_START] = STX0;
SendBuf[AIM_ADDR] = AIM;
SendBuf[ORG_ADDR] = ORG;
SendBuf[FRAME_LEN] = nInfoLen+PROTOCOL_485_LEN; // 帧长
SendBuf[CMD_CODE] = nCMD; // 命令码
SendBuf[INFO_LEN] = nInfoLen; // 信息长度
memcpy(&SendBuf[INFO], pInfo, nInfoLen); // 信息
SendBuf[BCC+nInfoLen]= CheckSum(SendBuf,
SendBuf[FRAME_LEN] - 2); // 校验码
// CheckSum()为计算校验码函数
SendBuf[FRAME_END + nInfoLen] = ETX0;
// 发送数据
UART0_Send(SendBuf, (uint32)SendBuf[FRAME_LEN]);
RS485_RECEIVE(); // 将RSM485CHT 隔离收发器设立为接受模式
}
程序将帧内各字段填入发送缓冲区,最后调用通信驱动层函数UART0_Send 把缓冲区的数据发送出去。
5. 接受上位机命令和数据
下位机接受上位机命令和数据的函数如下所示:
/*********************************
** 函数名称:IRQ_UART0
** 函数功能:串口 0 接受中断服务程序
** 入口参数:无
** 出口参数:无
**********************************/
void __irq IRQ_UART0(void)
{
uint32 i = 0;
uint32 IIR = 0;
/* UART0 接受中断解决 */
while (((IIR = U0IIR) & 0x01) == 0) // 若尚有中断待解决
{
switch (IIR & 0x0e)
{
case 0x04: /* RDA中断解决入口 */
for (i = 0; i < (8 - 1); i++)
{
GuiUAT0DataBuf[GuiRcvNum++] = U0RBR;
// 读空FIFO,清除RDA 中断
}
break;
case 0x0c: /* CTI 中断解决入口 */
while ((U0LSR & 0x01) != 0)
{
GuiUAT0DataBuf[GuiRcvNum++] = U0RBR;
}
if (GuiUAT0DataBuf[GuiRcvNum - 1] == ETX0)
{
// 检查各字段的合法性
// 检查帧起始位
if (GuiUAT0DataBuf[FRAME_START] != STX0)
{
GuiRcvNum = 0;
return FALSE;
}
// 检查信息归属性
if (GuiUAT0DataBuf[AIM_ADDR] != ORG)
{
GuiRcvNum = 0;
return FALSE;
}
// 检查帧总数据长度
if (GuiRcvNum < PROTOCOL_485_LEN)
{
GuiRcvNum = 0;
return FALSE;
}
// 检查帧数据长度
if (GuiUAT0DataBuf[FRAME_LEN] != GuiRcvNum)
{
GuiRcvNum = 0;
return FALSE;
}
// 检查帧信息长度
if (GuiUAT0DataBuf[INFO_LEN] !=
(GuiRcvNum - PROTOCOL_485_LEN))
{
GuiRcvNum = 0;
return FALSE;
}
// 检查帧结束符
if (GuiUAT0DataBuf[GuiRcvNum - 1] != ETX0)
{
GuiRcvNum = 0;
return FALSE;
}
// 检查校验码
if (GuiUAT0DataBuf[BCC + GuiUAT0DataBuf[INFO_LEN]] !=
CheckSum(GuiUAT0DataBuf, GuiUAT0DataBuf[FRAME_LEN] - 2))
{
GuiRcvNum = 0;
return FALSE;
}
// 验证成功后,进入相应解决
if (GuiUAT0DataBuf[CMD_CODE] == 'X')
{
GuiNewInfo_RCV = 1;
/* 接受的是新用户信息则置标准位为1 */
}
else
{
GuiKeyvalue1 = 100;
/* 接受成功,进入RS-485 协议的解决函数 */
}
}
break;
case 0x02: /* 发送中断 */
break;
default:
break;
}
}
VICVectAddr = 0x00; // 告知VIC 中断解决结束
}
一方面是由通信驱动层IRQ_UART0 函数来接受数据,当接受完数据,并且最后一位为帧结束符时,对整个数据帧的各字段进行合法性检查,检核对的后,设立进入RS-485 协议解决模式,通过判断命令类型Cmd,来执行相应的操作。
在驱动层 IRQ_UART0 函数中进行帧各字段合法性检查的目的,是为了避免中断嵌套。考虑此因素是由于,RS-485 协议解决模式中需要用到IAP功能,进入中断,所以,按照命令类型Cmd 进行操作,需要在退出UART0接受中断后解决,即在主函数中解决,而在发卡模式下,接受新用户信息时,又不能退出该模式,所以就无法进入RS-485 协议解决模式,从而产生了矛盾冲突。而将合法性验证放在UART0 接受中断中,当验证合法后,将一个标志位置一即可,从而解决了此矛盾。
§3.3.6 后台程序介绍
1. 按键接受程序设计
在主函数中,通过按键KEY1 的值来判断和切换工作模式。按键通过中断接受,启动定期器延时12ms,然后再判断是否有的确有键按下和是那个键按下,进而给此键值寄存器赋值。其流程框图如图3-8所示。
/*********************************************************
** 函数名称:EINT3_ISR
** 函数功能:GPIO EINT3 中断,接受按键
** 入口参数:无
** 出口参数:无
** 调用函数:无
********************************************/
void __irq EINT3_ISR(void)
{
if ((IO0IntStatF & KEY) != 0) /* 判断是否有键按下*/
{
Timer2_StartCount(11); /* 启动定期器去抖延时12ms */
}
IO0IntClr = KEY; /* 清除GPIO 中断标志 */
VICVectAddr = 0x00; /* 告知VIC 中断解决结束 */
}
图 3-8 按键接受程序流程图
2. 使用 RTC 的中断和报警程序设计
由 VIC 中断功能和优先级分派表表3-1,可知RTC 中断的功能比较多。下面简要说明一下RTC 的中断程序设计。如表3-1 中RTC 中断的功能,前三项是秒中断的功能,第四项是报警中断的功能,且报警中断的匹配值,在每次报警中断后将重新赋值。其程序流程图如图3-9 所示。
3. 用于延时的定期器 Timer2 程序设计
Timer2 重要功能是用于显示信息和继电器接通的时间控制。可通过Timer2_Star
展开阅读全文