应用USB控制芯片SL811HS实现通信
应用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实现通信