摘 要: 文章从介绍两块芯片入手,分析了USB设备配置和数据传输过程,详细介绍了一块简单即插即用的基于USB接口的演示板的硬件和软件实现方案。利用编写的测试程序,验证了该演示板硬件设计和单片机控制程序编写的可行性。
关键词:USB; 数据通信 ; 方案
前言
在开发USB设备时最难的就是固件和驱动程序的开发,要想成功的开发这两部分必须完全熟悉USB协议,而这至少需要五到六个月的时间。南京沁恒公司的CH371芯片是一块屏蔽了USB协议的接口芯片,该芯片固化了设备驱动程序和单片机程序中的协议处理部分,因此不需要去了解复杂的设备驱动程序和USB协议,大大减少了开发周期,也降低了开发难度。本文介绍的演示板就是基于该公司的CH371和CH451芯片的一个简单USB外设,通过这块演示板,不仅可以了解基于USB接口的基本结构,而且还可以熟悉基于这种接口的PC和单片机通信的单片机控制程序和计算机应用程序的编写。
芯片介绍
USB接口芯片CH371
CH371是一个USB 总线的通用接口芯片。在本地端,CH371 具有8位数据总线和读、写、片选控制线以及中断输出,可以方便地挂接到单片机、DSP、MCU
等控制器的系统总线上;在计算机系统中,CH371 的配套软件提供了简洁易用的操作接口,与本地端的单片机通讯就如同读写硬盘中的文件。CH371
屏蔽了USB 通讯中的所有协议,在计算机应用层与本地端控制器之间提供端对端的连接。基于CH371,不需要了解任何USB 协议或者固件程序,甚至驱动程序,就可以轻松地将并口、串口的产品升级到USB
接口。
使用时,在本地端CH371具有8位数据总线和读、写、片选控制线以及中断输出,就像操作一般外设芯片一样方便地挂接到DSP、MCU等控制器的系统总线上;在计算机端,CH371的配套软件包括通用驱动程序以及应用软件包,提供了简洁易用的操作接口。
根据不同的工作方式,芯片的接口类型可以有以下几种:被动并行接口、I2C主接口、主控方式接口。按照芯片特点,CH371芯片通过被动并行接口与本地端控制器连接,通过USB接口与计算机连接,如图1所示。
图1 单片机、CH371芯片以及PC连接示意图(略)
键盘控制和数码管驱动芯片CH451
CH451 是一个多功能外围芯片,通过可以级联的4 线串行接口与单片机、DSP、微处理器等控制器交换数据。CH451 包含三个功能:数码管显示驱动、键盘扫描控制、
P 监控,三个功能之间相互独立,控制器可以通过操作命令分别启用、关闭、设定CH451 的任何一个功能。CH451 的串行接口是由硬件实现的,控制器可以频繁地通过串行接口进行高速操作。CH451主要功能包括动态扫描功能和键盘扫描功能。
在计算机应用层,通过应用程序来演示CH451的各种功能。应用程序把控制命令通过CH371传送给单片机,单片机接收到命令后再来控制CH451。CH451通过四线串行接口与单片机连接,如图2所示。
图2 单片机、CH451芯片和键盘、数码管的连接示意图(略)
USB设备配置和数据传输过程描述
USB即插即用的自动配置过程是由CH371 芯片和驱动程序共同完成的。将带有CH371芯片的USB产品插入到计算机的USB插槽中,当PC机检测到USB
插入事件,操作系统有选择地复位USB 产品,并读取USB 产品的设备描述符,在CH371 芯片返回设备描述符后,操作系统根据设备描述符加载CH371
驱动程序;CH371 驱动程序读取CH371 芯片的设备描述符和配置描述符;在CH371 芯片返回设备描述符和配置描述符之后,CH371
驱动程序根据配置描述符请求操作系统对CH371 芯片进行配置。在完成配置后,PC机给CH371 芯片分配一个USB 设备地址,并指定一个USB
配置。以上是CH371 芯片的自动配置过程,在完成自动配置后,CH371 驱动程序向应用层开放操作接口。
数据传输过程是USB 产品的应用层软件与USB 产品的控制器之间的数据进行传输的过程。首先计算机应用层将数据请求发送给CH371
芯片,CH371 芯片以中断方式通知本地端控制器,并使之进入中断程序,查看传输状态信息寄存器中的数据传输方向标志位,如果是上传,则将上传数据长度寄存器置为15,然后退出中断程序;如果是下传,则查看下传数据长度寄存器,从数据下传缓冲区中读取数据块,并分析接收到的数据块,将应答数据和应答数据的长度分别写入数据上传缓冲区和上传数据长度寄存器中,然后退出中断程序。在退出中断程序之后,
CH371 芯片将应答数据返回给计算机,此时计算机应用层将会接收到应答数据。
演示板硬件电路设计
本演示板采用USB 总线接口芯片CH371、数码管驱动和键盘控制芯片CH451和通用的MCS51 系列单片机构成,用于演示CH371
的USB 数据通讯功能,CH451 的数码管驱动/键盘扫描功能,以及CH371 与单片机的连接,CH451 与单片机的连接。演示板通过USB
接口与PC 机进行通讯,并由PC 机控制它的执行,演示板电路设计如图所3示。
图3中,元器件说明如下:
晶振X1 为标准的12MHz,晶振的金属外壳应该接地,以减少来自外界的干扰;振荡电容C1、C2 的容量为20pF(可以在5pF
至30pF 之间选择);另外,建议在CH371 的XI引脚(第14 脚)前串接一个阻值为1K 的电阻(可以在200 至3K 之间选择),即X1与C2
相连接后通过1K 电阻连接到CH371 的XI 引脚。
阻抗匹配电阻R1、R2 为100 (可以在80 至150 之间选择),如果CH371 的工作电压略低于5V ,则R1、R2 的阻值可以适当减少。
U4(单片机89C51)用于测试CH371 的USB 数据通信功能,本例中CH371 工作于复用地址方式,U4 的ALE 与CH371
的ALE 相连接,CH371 的INT#与U4 的INT0 相连接,U4通过CH371 的被动并行接口与CH371 进行数据交换。
U3(EEPROM 器件24C02)作为I2C 接口的目标设备,用于测试CH371 的I2C 接口功能,PC 机的应用层程序可以直接对该器件进行读写测试。
L1(发光二极管LED)用于测试CH371 的主控方式的功能,即使CH371 不连接任何单片机(例如在本例中取出单片机U4),PC
机的应用层程序仍然可以直接控制CH371 的A3引脚输出低电平或者高电平,从而点亮LED 或者熄灭LED。
图3 CH371和CH451演示板硬件电路图(略)
跳线J1 用于测试CH371的片选线CS#的两种用法,在本例中单片机没有其它外围器件,所以CS#引脚可以悬空,作为默认选择,如果单片机还有其它并行接口的外围器件,则CS#应该作为片选控制线,例如由单片机的地址线A15
驱动,从而将CH371 定位于单片机U4 的0000H-7FFFH 地址空间。
跳线J3 用于测试CH371 的USB 带电下线功能,当单片机U4 的P1.4 引脚输出高电平时,可以控制CH371 模拟从USB
总线上断开,当单片机U4 的P1.4 引脚输出低电平时,可以控制CH371 模拟连接到USB 总线。
跳线J2 用于选择单片机U4 上电复位信号的来源,CH371 和CH451 都具有上电复位和看门狗功能,由J2 可以分别测试两个芯片的上电复位功能。电阻R4
用于调节CH451的上电复位门限,阻值为200K 时上电复位门限约为4V,测试时请注意防止干扰。
电阻R5 为数码管的限流电阻,阻值可以在60 至500 之间选择,阻值为200 时限定段电流为13mA 左右;电阻R6 为按键扫描的限流电阻,阻值可以在1K
至10K 之间选择,本例中为2K ,如果不使用CH451 的按键扫描功能,则电阻R6 可以省去。
CH451的SEG0~SEG7引脚和DIG0~ DIG7引脚相互配合,可以最大扩展8个共阴数码管和64个轻触按钮。这部分扩展电路比较容易,由于版面所限,以上电路图省去了这部分。
程序的软件设计一般USB设备的开发,USB接口程序设计包括三部分:单片机程序开发,USB设备驱动程序开发,主机应用程序开发。由于CH371接口芯片固化了设备驱动程序和单片机程序中的协议处理部分,因此软件设计仅仅包括两部分,即单片机中的数据交换部分和主机的应用程序。
单片机控制程序
应用程序和单片机控制程序之间有这样的协议约定:应用程序发送给单片机的数据中的第一个字节是命令,单片机接收到PC发送过来的数据后,先对第一个字节做出响应,根据命令的不同进入不同的子程序。例如:定义DEMOTESTDATA
EQU 90H,这表示90H这个十六进制数据代表测试命令,当单片机接收到来自PC的数据的第一个字节是90H时,就会进入将PC 发来的数据取反的子程序,并将取反后的数据返回。
在整个方案中单片机控制程序的作用主要有:(1)当评估板上的按键按下时,CH451通过中断通知单片机,然后单片机从CH451的缓冲区中读取键码值,单片机再通过中断通知PC机,PC进入相应的中断程序进行处理;2)当PC发送命令时,CH371通过中断通知单片机,单片机对该命令做出响应,或控制CH451,或返回应答数据,流程图如图4所示。
图4 单片机控制程序流程图(略)
PC端应用程序设计
为了检验硬件设计和单片机控制程序编写的可行性,需要在PC端用VB编写一个测试程序,用以测试硬件电路在数据通信方面是否畅通。程序用到了4个窗体,2个模块。其中两个模块主要是定义一些全局变量、函数,以及API函数的声明(因为这些函数只有在声明以后才能调用),设计4个窗体是为了更好地完成演示板的各项功能。
(1)主界面设计
演示主界面如图5所示。
图5 主界面(略)
功能说明:在电路板上有三个按键,对应这三个按键有三个不同的演示程序。根据该界面的提示,每按下一个按键就进入相应的演示程序,而演示完一个程序后可以退回该界面进行另外演示程序的选择。
2)同步可调实时时钟演示程序
界面设计如图6所示。
图6 与真实时间同步的可调时钟演示界面(略)
功能说明:进入该演示程序后,PC会通过命令使数码管上显示当前时间,但时钟不走动。
“启动时钟”:单击该命令按钮时钟开始走动。
“校准时钟”:单击该命令按钮后,文本框下的六个命令按钮会被激活,它们分别对应六个数码管。单击修改时间对应的按钮,会弹出对话框,要求输入要修改的时间。
“校时确定”:当时间校准好以后,单击命令按钮,这时会弹出对话框提示是否已经校准时间,否则可以继续修改。若确定以后,时钟又可以正常走动。
“返回主窗体”:单击该命令按钮回到窗体一,以便继续进行其他程序的演示。
(3)CH451各项功能演示程序
界面设计如图7所示。
图7 键盘控制和数码管驱动芯片CH451各项功能演示界面(略)
功能说明:当进入该演示程序后,会自动在数码管上加在字数据“HELPHELP”。
“右(左)移位”:单击命令按钮,数码管上的字会向右(左)移动,左(右)边移出的空位会加0。
“右(左)循环移位”:单击命令按钮会使数码管的数据分别向右(左)循环移位。
“加载字数据”:单击该命令按钮后,会弹出对话框提示“要加载字数据请单击相应的文本框”。此时文本框会被激活,当单击文本框后,会再次弹出对话框,要求输入要加载的字数据。输入完并确定后,数码管上就会显示加载的字数据了。
“闪烁”:单击该命令按钮后,会弹出对话框提示“要是数码管闪烁请单击对应的单选按钮”,同时8个单选按钮会被激活。每个单选按钮对应一个数码管,选中相应的单选按钮后,对应的数码管就会闪烁。当再选中另外的单选按钮后,前一个就会停止闪烁。
“亮度控制按钮”:单击该命令按钮后,弹出对话框提示“请单击相应的单选按钮进行亮度的选择”,同时,十六个单选按钮会被激活,它们对应控制数码管的十六级亮度显示,当选中第一个按钮时,数码管会变的最暗,当依次选中其他的按钮时,亮度会依次递增。
“DEFAULT”:单击该命令按钮后,会回到默认状态。即:字数据显示为“HELPHELP”;闪烁的数码管会停止闪烁;数码管的亮度会变为16级亮度。
“熄灭数码管”:单击该命令按钮后,数码管会熄灭。
“退出”:单击该命令按钮后,会返回主窗体。
批量数据传输演示程序
界面设计如图8所示。
图8 PC和AT89C51之间通过USB接口芯片CH371的数据块传输界面(略)
功能说明:
“发送数据”:单击该命令按钮后,会弹出对话框,首先要求输入要发送的数据的个数,然后会弹出对话框要求输入要发送的数据。同时发送的数据会在文本框中显示,以便和接收到的数据进行比较,看单片机是否做出了正确的应答。
“接收数据”:单击该命令按钮后,PC会首先发送一个命令给单片机,要求单片机对刚才发送的命令做出响应。单片机接收到此命令后会对接收到的数据按位取反,然后返回给计算机。当计算机接收到返回的数据后会在文本框中显示出来。
“退出”:单击该按钮后会返回主窗体。
程序调试的体会
该演示程序最关键的就是要使得PC和单片机之间能够通过CH371接口芯片进行通信,这必须用到该公司提供的API函数。调试时需要事先理解这些函数的作用以及各个参数的具体意义。PC的命令和数据能够很容易就传给单片机,但单片机得到的按键值却无法传到PC机。后来笔者在查阅了一本关于在Visual
Basic中调用API函数的书后终于找到了问题的原因所在,通过修改一下API函数的中的参数,终于使得PC和单片机之间能够进行双向的通信,这一步成功后其余的调试就比较容易进行了。
|