×
嵌入式开发 > 详情

BC7281A串行通讯的解决方案

发布时间:2020-06-17 发布时间:
|

2004年7月A版


摘 要:本文重点阐述数码管显示及键盘接口专用控制芯片BC7281A与MCU串行通讯中应注意的几个问题,给出了有效的解决方法,并提出了改进建议。

关键词嵌入式系统串行通信BC7281A

传统的数码管显示和键盘接口一般直接采用MCU的I/O口对键盘或数码管进行动态扫描的方法,硬件上需要较多的外围部件,且占用MCU大量I/O口,软件上则浪费CPU资源,且给编程人员带来很大的不便。数码管显示及键盘接口专用控制芯片以其实现方法简单、功能强大等显著特点得到广泛的应用。这种芯片外围部件少、与MCU通讯一般采用串行接口或总线、在硬件上和软件上都占用极少资源、且功能强大、使得编程人员可以将更多的时间花在控制上。目前的这类接口芯片主要有:BC728X、HD7279A、ZLG7290、CH451等,BC7281A是其中性价比较高的一种。

典型应用电路

BC7281A的典型应用电路如图1所示,显示位数为16位,连接的键盘个数为64个,其外接移位寄存器采用74HC164,控制MCU采用ATMEL公司的AT89C51,为简单起见,图中仅画出与BC7281A相关的电路。

BC7281A与MCU之间的通讯

BC7281A与MCU之间的通讯是采用2线高速串行接口,这两个连线分别是数据线DAT和同步时钟线CLK,其中DAT为双向数据传输线,BC7281A既用该线从MCU接收数据,也用该线向MCU发送数据。BC7281A的DAT引脚为漏极开路输出结构,使用时须在该线上加20KW左右的上拉电阻。CLK引脚为串行时钟接口的同步时钟,由MCU控制,下降沿有效。串行接口数据宽度为8位,时序图如图2所示。

由于BC7281A的2线串行接口是自行规定的,一般MCU都不具备此通讯接口,但可以采用软件实现。MCU发送指令或数据到BC7281A子程序为SEND,MCU接收数据子程序为RECEIVE,采用51指令系统编写,其中DATA_OUT为MCU向BC7281A发送数据的寄存器,该寄存器既能直接寻址又能位寻址,DATA_IN为MCU接收BC7281A的数据寄存器,CLK和DAT定义为MCU的I/O口,分别连接到BC7281A芯片上的CLK和DAT引脚。

MCU发送指令或数据到BC7281A子程序

SEND: CLR CLK

SETB CLK ;发送握手请求脉冲

WAIT1: JB DAT,SEND ; DAT

CLR CLK ;建立通讯

SETB CLK

WAIT2: JNB DAT,WAIT2 ;发送串行数据

MOV BIT_COUNT,#8

SEND_LOOP: MOV C,DATA_OUT.7 ; BIT7

MOV DAT,C

CLR CLK ; CLK

SETB CLK

MOV A,DATA_OUT

RL A

MOV DATA_OUT,A

NOP

NOP

DJNZ BIT_COUNT,SEND_LOOP

SETB DAT

NOP

NOP

RET

MCU接收数据子程序

RECEIVE: CLR CLK ;发送握手请求脉冲

SETB CLK

WAIT3: JB DAT,WAIT3 ;建立通讯

CLR CLK ; CLK ,

SETB CLK

MOV BIT_COUNT,#8

RECV_LOOP: NOP ;发送串行数据

NOP

MOV A,DATA_IN

MOV C,DAT

RLC A

MOV DATA_IN,A

CLR CLK

SETB CLK

DJNZ BIT_COUNT,RECV_LOOP

NOP ;

NOP

RET

在使用过程中,只要根据需要调用SEND或RECEIVE子程序即可。但在某些情况下可能引起严重的问题,通讯时间过长会影响显示在数据传送期间,BC7281A将不会进行显示和键盘扫描,因此虽然数据传送的速度并没有下限的限制,但如果数据的传送时间大于扫描周期(最小为8mS),将会对显示造成影响。

一般情况下,通讯周期是很短的,用Insight ME-52H仿真器测试MCU与BC7281A单个字节的通讯周期,时钟由仿真器内部提供,为12MHz,测得SEND平均的通讯周期在170mS左右,RECEIVE的为160mS左右,远远小于扫描周期,不会影响显示。但在有中断的情况下,就可能间接延长通讯周期了,因为中断是随机的,MCU就有可能在通讯期间响应中断,则此时的传送时间还应包括中断响应的时间,如果中断处理时间较长,就可能影响显示了。

例如,在中断服务程序里利用UART发送批量数据,为了确保数据的正确发送,必须在每个字节发送完毕后即发送缓冲器为空时才发送下一个数据,每个数据的发送时间由波特率决定,在波特率为9600bps,采用10位异步收发方式情况下,则传送一个8位的数据至少需要1(1/960S)mS,实验证明,当发送数据量为8个时,数码管显示有明显的闪烁现象,并随着发送数据量的增加,闪烁更加明显。

显然,在中断源比较多,且中断比较频繁的情况下,就可能在一个传递周期内多次响应中断(包括中断嵌套),即使每个中断的响应时间较短,通讯时间也会显著的延长,也会引起闪烁现象。

通讯协议被破坏导致数据传送错误

由于MCU与BC7281A的通讯是采用2根半双工的串行总线,传送数据时要求以字节为单位进行传送,即传送一个字节后才能传送下一个字节,否则会引起传送数据错误。

如果调用这些通讯子程序的指令分布在主程序和中断服务程序里,就可能出现以下情况:主程序正在执行某条通讯指令期间,响应中断服务程序里的另一条通讯指令,此时通讯协议将出错,导致数据传送错误。特别是会出现在以下情况:主程序完成显示功能,键盘采用中断方式,这时若在中断服务程序出现读取键值的指令,将会引起数据传输出错。因此要求所有调用通讯指令均在主程序或中断服务程序中。

解决方法

从上面的分析可以看出,这些问题主要是由中断引起的,可以采用在软件上调整程序结构,硬件上进一步完善等方法加以解决,具体如下:

调整程序结构

禁止在通讯期间内响应中断:禁止在通讯期间内响应中断,就是在每次调用通讯子程序前关闭所有的中断,调用完毕后再开放中断,这样传递时间就不会增加,也不会出现在同一个通讯周期里分时传送两个数据的情况。该方法虽然简单,但有一定的局限性,对于有些实时性要求很高的场合,或者利用中断实现精确延时等场合就不适用了。

采用中断配合查询标志位:该方法中,对于实时性要求高或执行时间较短的中断则直接在相应的中断服务程序中完成,其他的中断则采用中断配合查询标志位的方法处理,即仅在中断服务程序里设置中断标志位,在主程序里查询该标志位的状态,若有中断发生则进行相应的处理,这样就可以将原来中断服务程序中的处理部分转移至主程序了,也就不会出现通讯子程序的指令分布在主程序和中断服务程序的情况了,也就避免了在一个通讯期间内分时传送两个数据,同时也有效的减少了中断时间。另外,尽量减少通讯的频率,如在显示的数据不变化时不更新BC7281A中相应的显示寄存器,这样就可以减少在通讯期间响应中断的可能性了,也提高了CPU的利用率,可以作为该方法的有效补充。

用硬件实现双向通讯

上述这两种解决方法在一定程度上给编程人员带来不便,主要原因是由软件来完成MCU和BC7281A之间的通讯,如均用硬件实现,对编程人员来说完全可以将BC7281A完全看成“黑匣子”,就会给编程人员提供更大的自由度,从这种意义上说,也提高了性能。目前标准的串行接口或串行总线有SPI接口、I2C总线、MicroWire接口、MSBus总线、1-Wire总线等。现在很多单片机都支持这些标准串行接口或总线(即使没有也可以用软件实现),如MicroChip公司的PIC16F87X系列单片机就同时支持SPI接口和I2C总线。采用其中的某一种接口或总线后,MCU与数码管显示及键盘扫描控制芯片的通讯协议由硬件实现,几乎不占用CPU的资源,也不必考虑上述提到的情况,使用起来更加方便。

结语

BC781A价格低廉,功能强大,外围电路少,软件控制简单,使用方便;但在应用时会出现数据传送错误等问题,可以使用多种软硬件方法解决。在机载多通道扫描仪(MAMS)黑体定标源系统中采用了本文提出的调整程序结构的解决方法,该系统于日前进行航空试验,试验结果表明,系统在较恶劣的电磁环境中,仍能可靠运行,效果令人满意。

参考文献:

1. BC7281A 128段LED显示及64键键盘控制芯片数据手册. 北京凌志比高公司.



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
Recogni:将高端AI芯片推向自动驾驶边缘