您现在正在浏览:首页 > 职教文章 > 职教论文 > 应用USB控制芯片SL811HS实现通信

应用USB控制芯片SL811HS实现通信

日期: 2010/2/16 浏览: 49 来源: 学海网收集整理 作者: 佚名

应用USB控制芯片SL811HS实现通信

一、硬件电路的设计

1、SL811HS介绍

SL811HS是Cypress公司推出的具有主/从两种工作模式的USB控制器,遵循USB1.1规范;可自动检测总线速率,支持全速12Mbps和低速1.5Mbps设备;具有8位双向的数据总线,易与单片机连接;片内256字节的SRAM(其中16字节用于工作寄存器),用于数据传输;可自动产生SOF和CRC5/16,简化软件工作量;片内具有根Hub;支持挂起/唤醒工作模式,减少功耗;支持自动加1功能,减少数据读写周期;3.3V工作电源,接口可承受5V的工作电压,可与多种规格的单片机连接。

(1)SL811HS内部寄存器

SL811HS内部寄存器一共有256个单元,每个单元是一个字节,其中地址为[00H]-[0FH]的前16个单元是SL811HS的状态寄存器或控制寄存器(统称为特殊寄存器),其余的是数据缓冲寄存器(240个),表1列出了16个特殊寄存器的名称和主要功能含义。

读写SL811HS内部寄存器子程序是最低层的子程序,系统所进行的各种操作主要都是通过调用这些子程序读写SL811HS内部寄存器实现的。通过读取SL811HS的状态寄存器获取SL811HS的状态信息可以实现设备插拔检测、设备速度检测等,通过向SL811HS的相关控制寄存器写入控制字节可以实现USB总线复位以及USB数据传输等操作。

2、创建元件

在Proteus元件库中没有SL811HS的元器件,要搭建电路、实现虚拟仿真,必须自己绘制一个SL811HS原理图。具体操作是,在ProteusISIS编辑环境下,可以实现SL811HS元件的创建。详细的创建步骤可以参考相关资料。如图一所示,就是一个新绘制的SL811HS接口控制芯片。

图一SL811HS管脚分布



这是一个28管脚的控制芯片,其中D0~D7是8位双向数据传输管脚,管脚9、10外接USB接口,管脚1、4、5、6、15、16分别为数据/地址控制、读控制、写控制、片选、芯片复位和中断等功能管脚。通过这些管脚与单片机相连,就可以通过对单片机编程,实现对该控制器芯片的寄存器的读写操作,实现虚拟仿真。

SL811HS控制芯片与单片机的连接电路图,如下图二所示。8 位双向数据总线D7~D0、读选通输入RD、写选通输入WR、片选输入CS、中断输出INT以及地址输入线A0。SL811HS控制芯片的RD和WR可以分别连接到单片机的读选通输出引脚和写选通输出引脚。INT可以连接到单片机的中断输入引脚,由于控制芯片是输出高电平,而单片机中断请求是低电平有效,所以中间需要串接一个非门电路。当CS和RD为高、A0为低电平时,SL811HS中的数据通过D7~D0 输出;当CS和WR为高、A0 都为低电平时,D7~D0 上的数据被写入SL811HS 芯片中;当CS和WR都为低电平而A0为高电平时,D7~D0 上的数据被作为命令码写入SL811HS芯片中。

图二SL811HS与单片机的连接电路图

二、软件实现

要通过SL811HS完成数据传输,实现单片机与PC机的通信,必须经过软件编程,通过驱动sl811hs工作,才能完成。其工作流程如图三所示。





图三SL811HS工作流程图

1、SL811HS初始化

初始化操作主要包括SL811HS芯片复位、USB总线复位、设备插拔检测和设备USB数据传输速度检测等,通过这些初始化操作,SL811HS将作为USB主机与从机之间建立一个底层协议连接关系,为后续的数据通信做好准备。

(1)SL811HS芯片复位

USB接口芯片SL811HS的复位是对芯片的状态进行复位,包括了对芯片内部寄存器值的复位,实现该操作不需要读写接口芯片内部寄存器,只需向接口芯片的复位引脚输入一个有效的复位脉冲即可。

(2)USB总线复位。

按照USB协议,USB总线复位是指在USB数据线上输出SE0态,并保持10ms以上,接在USB总线上的从机设备受到这个复位信号后就会进行自身的复位操作,为接下来的USB数据传输作好准备,通过设置接口芯片的CtrlReg[05H]寄存器的第4、3位为逻辑"01",并保持10ms,然后再把它们恢复为逻辑"00",就可以让接口芯片产生USB总线复位信号。

(3)设备插拔检测和设备速度检测

在USB协议的物理层上,USB从机设备是否接在USB总线上是通过检测总线的电压得知的,根据该电压的高低,还可获得USB总线上的设备所支持的速度(例如,在USB1.1协议中,分有低速和全速)。USB主机接口芯片SL811HS把这个物理层的电压检测结果反应到状态寄存器的取值上,通过读取这些状态寄存器的值,可以获知当前的设备插拔状态的设备速度。

USB主机所进行的初始化操作除了上述3项外,还包括帧起始包启动/禁止的设置、帧同步设置、帧定时初值的设置等,它们都是通过对接口芯片特殊寄存器进行读写而实现的。 传输事务的实现。

2、数据传输

根据USB1.1协议,一个传输事务一般包含3个包(Packet)的传输,分别是标记包(Token Packet)、数据包(Data Packet)和握手包(Handshake Packet)。USB数据传输方式一共有四种,分别是控制传输(Control Transfer)、同步传输(Isochronous Transfer)、中断传输(Interrupt Transfer)和批传输(Bulk Transfer)。其中,控制传输方式至少由2个传输事务构成,其他三种传输方式则都各由1个传输事务构成,可见,传输事务在USB传输中至关重要。

一个典型的传输事务含有3个包的传送,这连续的3个包数据流如表3所示。

使用SL811HS设计USB主机系统时,用户只需要让单片机设置SL11HS内部几个相关的特殊寄存器,然后把传输事务启动位使能(置为逻辑"1"),就可以让接口芯片自动完成这3个包的发送与接收,在表3所示的例子中,第n个包(标记包)和第n+2个包(握手包)都是由主机法给从机的,第n+1个包(数据包)是由从机发送给主机的。这个传送方向和第n+2个包的传送方向都是由标记包中的标识域取值决定的,其规律可参考USB协议。

如果传输事务的数据包是由从机发送给主机,则该传输事务属于输入类型,称为输入传输事务,反之则称为输出传输事务,可见,表3例子是一个输入传输事务,对于一个输入传输事务,单片机通过设置 SL811HS内部特殊寄存器就可以决定其取值的包域主要有:标记包中的标识域、地址域或端点域,数据包中的标识域。在输入传输事务中,虽然数据包并不是主机发送的,但之所以仍需要单片机设置与数据包标识域相关的寄存器,是因为主机在该传输事务中将只认可标识域符合所设置值的数据包。其余部分,如标记包中的其他域及握手包的内容则都是SL811HS根据情况自动产生的。

具体的,单片机控制USB主机接口芯片进行一次传输事务所需要知执行的操作步骤如下:

首先,如果是输出传输事务,则需要把将在数据包中发送的数据存放到SL811HS的数据缓冲区中。

其次,做好相关的传输准备工作,即设置接口芯片中的4个特殊寄存器,这4个寄存器的名称及其在传输事务中的作用如表4的前4面项所列。

第三、启动传输事务:把寄存器EP0Control[00H]或EP1Control[08H]的第0位(即传输事务启动位)置为逻辑"1",即可启动传输事务。但在此之前必须把这个寄存器中其他位设置好(或与启动位同时设置),与这个寄存器相关的包域如表4中最后一项所列。

第四,单片机读取寄存器EP0Status(03H]或EP1Status[0BH]的值,以获知此次事务传输的完成情况。

最后,如果传输成功,则结束中断返回;否则重新传输,最多三次。

3、实验程序

//写SL811HS寄存器函数

uchar write(addr,data_0){



P0=addr;

P3=0x86; //选中要写的sl811hs寄存器

delay(10); //延时10ms

P3=0x8e;

P0=data_0; //写温度数据

return(P0);

}

//读SL811HS寄存器函数

uchar read (reg,data_1){

//uchar reg,data_1;

P0=reg; //选中将要读的寄存器

P3=0x46;

delay(1);

P3=0x4e; //读到寄存器中的内容

data_1=P0;

return(data_1);

}

//SL811HS初始化函数

void rst_usb(){

write(0x00,0x2f); //传输方向是从机到主机

write(0x05,0xef); //总线复位

delay(10);

write(0x05,0xe7); //全速传输,允许自动SOF

write(0x06,0x7f); //中断设置

}

//将单片机中数据写入sl811hs函数

void send (){

uchar addr,data_1;

uint i;

read(0x01,data_1); //读sl811hs缓冲区首地址

addr=data_1;

for(i=0;i<20;i++){ //将十个温度数据送入sl811hs缓冲区

write(addr,temp_data[i]);

temp_data[i]=0x00;

addr++;

}

}

//USB驱动主函数

void usb(){

uchar data_1;

int i=3; //判断数据传输成功,即有无ACK握手,当没有时,最多重发三次数据

do{

P3=0x07; //初始化SL811HS芯片

send(); //将单片机中数据送入sl811hs

rst_usb(); //初始化sl811hs

read(0x03,data_1);

data_1=data_1&0x01; //检测有无ACK握手

if(!data_1)

i--;

else

i=0;

}

while(i);

P3=0x07; //数据传输结束,清中断返回

}

三、总结

通过这个实验掌握了基于SL811HS USB主/从控制芯片实现数据传输的原理、实现方法、学习了USB传输协议、并进一步加强了C语言的编程思想。

同时在这个实验的进行当中遇到了很多的问题,如对接口的理解不够、对USB传输协议不理解以及用Proteus仿真时其元件库中没有该器件等等问题。问题出现了,将问题解决就是一个学习的过程。经过一段时间的学习与与同学的交流沟通,我逐步的讲问题一一的解决了。当然这当中也还有问题无法完成,如Proteus元件库无该元件问题,虽然这里我们绘制了SL811HS,但是,这仅仅是一个外形,内部的电气性能由于能力所限而无法添加,从而,在图二中所述的仅仅是电路原理图,真正的仿真并没有完成,但这个可以通过实物做实验来验证。


应用USB控制芯片SL811HS实现通信

返回顶部