基于C8051F340的USB通讯设计的实现

2016-06-16 22:22沈鑫彪
电脑知识与技术 2016年10期

沈鑫彪

摘要:该设计旨在通过USB(Universal Serial Bus)通讯技术2.0版本协议以及C8051F340芯片尝试与计算机通讯的可行性。通过运用C8051F340这款51家族的高性能芯片的相关寄存器的功能,再根据USB 2.0版的通讯协议完成下位机的固件编写,然后,在主机上编写VB(Visual Basic)的相应接口函数,完成数据传送的工作。经过实验,可以完成下位机与上位机连接,并完成数据传送。

关键词:C8051F340;USB通讯;Visual Basic

中图分类号:TP333 文献标识码:A 文章编号:1009-3044(2016)10-0266-03

USB设备以其热插拔、简单易用的特性被广泛运用在社会的各个领域[1]。部分医疗设备在提供媒体文件,例如图片、视屏等时,也都选择USB作为通讯接口,以方便医院医生可以方便取出所需资料,完成科研或教学工作。但是由于USB的广泛化,导致其的个性化功能很少有厂家提供一套合理有效的方案。本设计通过USB相关协议的学习,将其在C8051F340这款芯片上实现与主机的连接及数据传输,为医院定制自己个性化USB移动设备提供支持。

1 系统设计

本设计不但尝试了和主机建立连接,而且完成随时数据读入,然后传输。数据读入部分用的是CCD芯片输出的数据。

本系统的流程框架为驱动模块成功驱动CCD芯片之后,用AD(Analog to Digital)转换芯片将CCD输出的模拟量数据化,然后读入主控芯片,主控芯片再利用USB传输将数据上传至主机,主机上的程序就会连接数据库,数据库再进行进一步的查询工作。系统框架如图1所示。

1.1条形码数据读取

本设计采用的CCD型号是TCD1206SUP。CCD芯片的驱动需要一个时序产生模块,按照手册说明,提供相应频率和时序的触发信号,就可以成功驱动CCD芯片,完成图片扫描并将数据传输给主控芯片C8051F340。为了检验数据的正确性,本设计在下位机也设置了一个显示模块,使用了型号为12864的液晶显示屏。主控芯片接收传输过来的数据后,进行一定的编码处理后,就把数据一个一个送入主控芯片的USB数据发送缓存区。

图2和图3为CCD驱动信号,图2分别是RS复位信号和Φ1移位信号,RS的下降沿与Φ1移位信号的电平跳变沿对应,RS为1M,Φ1为0.5M,RS占空比约为1/3;图3为Φ1和Φ2移位信号,两个信号根据手册为互补信号,占空比为1/2。

1.2 USB数据传输[2-3]

在USB通讯中,每一次通讯都由主机通过轮询方式发起,本设计采用的USB传输协议是2.0版本,借用C8051F340的特定USB寄存器完成USB传输工作。根据USB2.0协议,通讯前首先要进行一些USB传输的各个描述符的配置和主控芯片C8051F340相关寄存器的配置。

1.2.1 USB描述符设置

由USB协议2.0可知,USB的描述符有设备描述符、配置描述符、接口描述符和终端描述符等。这些描述符在设计固件时被存放在一个结构体中,并以常量的形式存放在ROM(Read-OnlyMemory)中,即本设计主控芯片C8051F340的相关寄存器中,所以在设备使用过程中是不能改变的。

设备描述符中有关于这个设备的基本信息所存储的地址,方便主机接下来的访问。它是在设备连接主机时主机读取的第一个描述符。以下为本设计所用的设备描述符。

18, // 字节长度

0x01, // 固定设备(01h)

SWAP16(0x0200), // USB规范发布号(BCD),此处选2.0版本

0x00, // 类代码

0x00, // 子类代码

0x00, // 协议代码

EP0_PACKET_SIZE, // 终端0最大包的大小

SWAP16(USB_HID_VID), // 销售商ID (unsigned int)0xe001

SWAP16(USB_HID_PID), // 产品ID(unsigned int)0x02ff

0x0001, // 设备发布号(BCD)

0x01, // 制造商字符串描述符的指针

0x02, // 产品字符串描述符的指针

0x03, // 包括了序列号的字符串描述符的指针

0x01 // 配置的号码

主机在接收到设备的配置、接口和终端描述符访问地址以后,会请求选择一个配置并用函数Get_Configuration请求来读入当前的配置,在固件中有一个同名的函数来上传该描述符。在主机发起的轮询中,有11种标准请求,Get_Configuration即为其中一个,其字段取值为8。配置描述符有8个字段。这个描述符包括如下信息:描述符本身、配置和在该配置下设备的电能使用情况。对很多配置,一些字段是用不到的。以下为本设计所用的配置描述符。

0x09, // 描述符的字节长度

0x02, // 固定配置(01h)

SWAP16( sizeof( CON_INT_HID_EP_DESCRIPTOR ) ) , // 所有数据的字节大小

0x01, // 该配置支持的接口号

0x01, // 请求的标识符

0x00, // 字符串描述符的指针

0x80, // 自供电,不支持唤醒

USB_MAX_PWR/2 // 需要的总线电能

每个配置必须支持一个接口,并且对很多设备来说,一个就够了。主机请求申请一个新的接口,并用一个Get_Interface请求来读取当前的接口,然后固件用一个同名的函数上传相应描述符。改变接口比改变配置容易,改变配置要影响这个设备。

一个接口描述符有9个字段。很多设备不需要所有这些字段,例如那些允许替换的设置和协议。以下为本设计所用的接口描述符。

0x09, // 描述符的字节长度

0x04, // 固定接口(04h)

0x00, // 识别这个接口的号

0x00, // 用于选择一个替换设置的值

0x01, // 支持的终端号,除了终端0

0x03, // 类代码

0x01, // 子类代码

0x02, // 协议代码

0x00 // 接口的字符串描述符的指针

以下为本设计的终端描述符。其中0x05表示固定的终端,EP_INTERVAL为一个宏定义。

0x07, // 描述符的字节长度

0x05, // 固定终端(05h)

0x81, // 终端号和方向

0x03, // 支持的传输类型

SWAP16( EP1_PACKET_SIZE ), // 支持的最大包的大小

EP_INTERVAL // 查询间隔,以ms为单位

一个字符串描述符包含了描述文本。USB协议规范为制造商、产品、序列号、配置和接口定义了字符串描述符。一个设备也可以支持其他的字符串描述符。字符串描述符是可选择的。在此就不罗列该字符描述符信息了。

对于任何USB设备,HID(Human Interface Device)的描述符告诉了主机为了和设备通信,它需要知道什么。主机发送Get_Descriptor来请求包含HID的接口配置,类描述符可以有7个或更多个字段,这取决于其他描述符的数量。以下为本设计所用的HID描述符。

9,// 描述符的字节长度

0x21, // 21h表示HID类

SWAP16(0x0110), // HID规范发布号(BCD)

33, // 识别本地化硬件的国家的数字表达式(BCD)

1, // 支持的从属类描述符的数量

0x22, // 类描述符类型

SWAP16( sizeof( ReportDesc ) ) // 报告描述的总长度

1.2.2 C8051F340相关寄存器的配置

C8051F340芯片集成了一个完整的全速/低速USB功能控制器,用于实现USB外部设备(C8051F340不能被用作USB主设备)。C8051F340又包括除了USB0DAT、USB0ADR和USB0XCN这些51寄存器之外的USB控制寄存器,共二十几个(不包括FIFO)。USB控制寄存器又分为公共寄存器、中断寄存器、索引寄存器和FIFO访问。

本设计采用的主控芯片是C8051F340。C8051F340是51家族的一款高速多引脚集成了USB外设的高性能主控芯片,具有64K片内FLASH存储器、4352B片内RAM(Random Access Memory)以及丰富的外设资源,具体详细参数可以参阅该芯片数据手册。

下位机做好相关初始工作,包括USB使能,开中断允许和USB相关寄存器设置,之后就是上位机的中断信号的触发了,触发后就进入中断。其中断后的程序是通过分支结构实现的,结构框图如图4。

1.3主机查询显示

本设计的PC端软件采用VB6.0开发,底层驱动采用WinDriver10.00,是一款由Jungo公司研制开发的可视化的硬件驱动开发平台。

由于VB不包含访问一般USB设备的控制[4],而要使用WinDriver动态连接库中的接口函数(API, Application Programming Interface)。因为API函数对传递和返回的变量有特殊的要求[5],出现错误不会导致应用程序或系统的崩溃,但要用VB正确调用这些函数,就必须要对VB中的调用函数进行适当改动。为了使编程更简单、更安全,VB对一般任务有它自己的控制。

只要下位机的USB固件程序编写正确,就都可以利用WinDriver这款软件顺利生成想要的驱动程序。本设计用到的动态连接库有WDAPI1000.DLL和XP系统中的kernel32.DLL。下面即为将WDAPI1000.DLL文件中的ThreadLoopStart声明为VB_ThreadLoopStart,以供VB的正确调用[6],主要考虑到数据类型的匹配。

Declare Function ThreadLoopStart Lib "WDAPI1000.DLL" Alias "VB_ThreadLoopStart" ( _

ByRef phThread As Long, ByVal pFunc As Long, ByVal pData As Long, _

ByVal hWnd As Long) As Long

2测试与结果

本设计所使用的计算机系统版本是XP profession SP3。提供测试用的间有黑白条纹的纸板来给CCD扫描读取,经过编码后得出一串只有“0”和“1”的代码。主机程序中预置一个对应不同代码的文字信息,然后根据USB传输的代码对应显示相关信息。图5为主机上显示信息的界面。

3结论与总结

C8051F340芯片外围集成USB功能,有许多的USB功能寄存器可供调用,学习相关资料手册,无论是驱动CCD芯片,还是USB通讯都可以完成工作。

所选择的C8051F340主控芯片的PWM管脚输出频率不能达到预期驱动CCD的频率,导致需要另加一块时序产生模块,该控制芯片的端口资源充分利用起来还可以提供更多的实用功能。前端CCD扫描的光路设计不能符合预期要求,以至于在扫描条形码时不能达到预期效果,只能识别简单的黑白条纹。

通过本系统方案的设计及实施,对USB传输协议框架有了一个理性认识,为以后定制USB移动设备提供技术支持,完成更多相关技术产品的开发。

参考文献:

[1]向文芳,邢涛,曹红兵,等.高速数据采集系统的USB接口设计[J]. 计算机测量与控制,2011,19(10):2567-2570.

[2] 美国迈舍尔公司. USB系统体系[M]. 孟文,译. 2版.北京:中国电力出版社,2003.

[3] Jan Axelson. USB大全[M]. 陈逸,译.北京:中国电力出版社,2001.

[4] 李丹,胡满红,金新民.对VB的USB接口虚拟示波器的设计[J].济源职业技术学院学报,2007,6(1):8-10.

[5] 徐袭,杨志红,吴汉松.基于VB的USB设备检测通信研究[J].计算机应用研究,2002(11):99-102,111.

[6] 王希望,于华丽,刘丽娟,等.基于VB的USB通信系统在智能温湿度检测仪中的应用[J].仪表技术与传感器,2007(10):16-17,32.