EDN首页   博客首页 用户登陆  |  注册
aaa
发表于 2009/5/18 17:53:33

1

关于投票

USB学习笔记4:CH372基本读写程序(51单片机)

USB学习笔记4CH372基本读写程序(51单片机)

        CH372官网上已经给出了CH372的测试程序,下面是我在官方网站的测试程序的基础上进行整理和梳理。CH375支持USB-HOST主机方式和USB-DEVICE/SLAVE 设备方式。,而CH375从设备方式与CH372的功能程序是一样的,于是两者作为从机芯片是一样的。

       

        CH372 内置了USB 通讯中的底层协议,具有省事的内置固件模式和灵活的外置固件模式。在内置固件模式下,CH372自动处理默认端点0 的所有事务,本地端单片机只要负责数据交换,所以单片机程序非常简洁。在外置固件模式下,由外部单片机根据需要自行处理各种USB 请求,从而可以实现符合各种USB 类规范的设备。为了简单起见,一般PC机与单片机通信使用内置固件模式,下面程序也是基于内置固件模式的。

 

#pragma NOAREGS                 //禁止编译器使用绝对寄存器寻址,一定要加上

#include <REG52.H>                //51单片机头文件

#include "CH375INC.H"           //CH372/CH375头文件

 

///////////////////////////////////////////////

//说明: CH372总线地址,这个是按照学习笔记1总线扩展方式定的

//       采用别的方式,地址另外设定

///////////////////////////////////////////////

unsigned char volatile xdata CH375_CMD_PORT _at_ 0x03F1;          

unsigned char volatile xdata CH375_DAT_PORT _at_ 0x03F0;

 

/*********************延时程序********************/

///////////////////////////////////////////////

//函数:delay2us

//说明:延时2us

//入口:无

//返回:无

///////////////////////////////////////////////

 

void    delay2us( )  

{  

    unsigned char i;  

    for ( i = 2; i != 0; i -- );   

}  

 

///////////////////////////////////////////////

//函数:delay50ms

//说明:延时50ms

//入口:无

//返回:无

///////////////////////////////////////////////

void    Delay50ms( )  

{  

    unsigned char i, j;  

    for ( i="200"; i!=0; i-- ) for ( j="250"; j!=0; j-- );  

}  

 

/*********************基本读写程序********************/

///////////////////////////////////////////////

//函数:CH375_WR_CMD_PORT

//说明:写USB命令

//入口:unsigned char cmd:待写入命令

//返回:无

///////////////////////////////////////////////

void CH375_WR_CMD_PORT( unsigned char cmd )   

{   

    delay2us();  

    CH375_CMD_PORT=cmd;  

    delay2us();  

}  

 

///////////////////////////////////////////////

//函数:CH375_WR_DAT_PORT

//说明:写一字节USB数据

//入口:unsigned char dat:待写入一字节数据

//返回:无

///////////////////////////////////////////////

void CH375_WR_DAT_PORT( unsigned char dat )   

{    

    CH375_DAT_PORT=dat;  

}

 

///////////////////////////////////////////////

//函数:CH375_RD_DAT_PORT

//说明:读一字节USB数据

//入口:

//返回:从CH372/CH375读一字节数据

///////////////////////////////////////////////

unsigned char CH375_RD_DAT_PORT( void )   

{ 

    return( CH375_DAT_PORT );  

}

 

/*********************初始化和中断服务程序********************/

///////////////////////////////////////////////

//函数:CH375_Init

//说明:CH372/CH375初始化

//入口:

//返回:无

///////////////////////////////////////////////

void    CH375_Init( )  

{  

    /* 设置USB工作模式, 必要操作 */

unsigned char i;  

    CH375_WR_CMD_PORT( CMD_SET_USB_MODE );   //设置USB工作模式

    CH375_WR_DAT_PORT( 2 );    //设置为内置固件模式

    for ( i="100"; i!=0; i-- )   

    {     /* 等待操作成功,通常需要等待10uS-20uS */

        if ( CH375_RD_DAT_PORT( ) == CMD_RET_SUCCESS ) break;  

    }  

/* 下面启用USB中断,CH372/CH375INT#引脚可以连接到单片机的中断引脚,中断为低电平有效或者下降沿有效,如果不使用中断,那么也可以用查询方式,由单片机程序查询CH372/CH375INT#引脚为低电平 */

IT0 = 0;     /* 置外部信号为低电平触发 */

    IE0 = 0;     /* 清中断标志 */

    EX0 = 1;    /* 允许CH372中断,假定CH372INT#引脚连接到单片机的INT0 */

}

 

///////////////////////////////////////////////

//函数:mCh375Interrupt

//说明:CH372/CH375中断程序

//入口:

//返回:无

///////////////////////////////////////////////

void mCh375Interrupt( ) interrupt 0 using 1  

{  

    unsigned char i, length;

    unsigned char data buffer[64];

    unsigned char InterruptStatus;  

    CH375_WR_CMD_PORT( CMD_GET_STATUS );   //获取中断状态并取消中断请求

    InterruptStatus = CH375_RD_DAT_PORT( );       //获取中断状态

    //采用边沿触发的外部中断请求,CPU在相应中断后,自动清除中断标志                       

    switch ( InterruptStatus )   

    {    

        case USB_INT_BUS_RESET1:   //USB总线复位

        {

break;

 }

        case USB_INT_BUS_RESET2:   //USB总线复位

        {

break;

}

        case USB_INT_BUS_RESET3:   //USB总线复位

        {

break;

 }   

        case USB_INT_BUS_RESET4:   //USB总线复位

        {

break;

 }

        case USB_INT_EP0_SETUP:

        {    //端点0 的接收器接收到数据,SETUP 事务成功,内部固件模式时不需要处理

break;        

        }

        case USB_INT_EP0_OUT:

        {    //端点0 的接收器接收到数据,OUT 事务成功,内部固件模式时不需要处理

            break;  

        }

        case USB_INT_EP0_IN:

        {   //端点0 的发送器发送完数据,IN 事务成功,内部固件模式时不需要处理

            break; 

        }

        case USB_INT_EP2_OUT:            //批量端点/端点2接收到数据,OUT成功

        {     //从当前USB中断的端点缓冲区读取数据块,并释放缓冲区

                     CH375_WR_CMD_PORT( CMD_RD_USB_DATA ); 

                     length = CH375_RD_DAT_PORT( );  /* 首先读取后续数据长度 */

                     for ( i = 0; i < length; i ++ ) buffer[ i ] = CH375_RD_DAT_PORT( );  //接收数据包

                    

/* -----------测试数据正确性,将接收到的命令包数据返回给PC----------- */

                     CH375_WR_CMD_PORT( CMD_WR_USB_DATA7 ); 

/* USB端点2的发送缓冲区写入数据块 */

                     CH375_WR_DAT_PORT( length ); 

/* 首先写入后续数据长度,回传刚接收到的数据长度 */

                     for ( i = 0; i < length; i ++ ) CH375_WR_DAT_PORT( buffer[ i ] ); 

/* 数据返回,由计算机应用程序测试数据是否正确 */

          /* ------------------------------------------------------------------------------------------------------ */

                     break;

        }   

        case USB_INT_EP2_IN:             //批量端点/端点2发送完数据,IN成功

        {    

            CH375_WR_CMD_PORT( CMD_UNLOCK_USB );    //释放当前USB缓冲区

            break;  

        }  

        default:  

        {    

            CH375_WR_CMD_PORT( CMD_UNLOCK_USB );   

            break;  

        }  

    }  

}  

 

///////////////////////////////////////////////

//函数:main

//说明:主程序。对CH372初始化,对USB进行读写及其他程序

//入口:

//返回:无

///////////////////////////////////////////////

main( )

{  

    Delay50ms( );

 

CH375_Init( );     //CH375/CH372初始化

EA = 1;           //允许中断

while(1);

}

 

 

下面是中断状态的分析说明。在内置固件模式的USB设备方式下,单片机只需要处理表中标注为灰色的中断状态,CH372 内部自动处理了其它中断状态。所以可以看到中断服务程序中对端点0SETUPOUTIN还有USB总线复位都不做处理。

 

 点击看大图

 

本文工程文档:****************http://space.ednchina.com/upload/2009/5/18/c613dd79-1738-480f-aa53-9faaae7ddde0.rar*******************

系统分类: 单片机  |  用户分类: USB  |  标签: CH372 CH375 51单片机 USB IN  |  来源: 原创  | 

点击查看原文

发表评论 阅读全文(1380) | 回复(1)

发表于 2009/5/18 17:48:26

2

关于投票

USB学习笔记3:端点与传输模式

USB学习笔记3:端点与传输模式

端点——端点位于USB 外设内部,所有通信数据的来源或目的都基于这些端点,是一个可寻址的FIFO

每个USB 外设有一个唯一的地址,可能包含最多十六个端点。主机通过发出器件地址和每次数据传输的端点号,向一个具体端点(FIFO)发送数据。每个端点的地址为0 15,一个端点地址对应一个方向。所以,端点2-IN 与端点2-OUT 完全不同。 每个器件有一个默认的双向控制端点0,因此不存在端点0-IN 和端点0-OUT

 

CH372提供如下端点:(5个物理端点)

? EP0:默认控制点(CONTROL)

? EP1-OUT

? EP1-IN

? EP2-OUT

? EP2-IN

 

端点0默认端点,支持上传和下传,上传和下传缓冲区各是8个字节

 

端点1包括上传端点下传端点,上传和下传缓冲区各是8个字节,上传端点的端点号是81H

下传端点的端点号是01H

 

端点2包括上传端点下传端点,上传和下传缓冲区各是64 个字节,上传端点的端点号是82H,下传端点的端点号是02H

 

CH372内置固件模式:

EP1-OUT——辅助下传

EP1-IN  ——中断上传

EP2-OUT——批量下传

EP2-IN  ——批量上传

 

CH372外部固件模式:

EP0    ——默认端点

EP1/EP2——根据USB产品的需要选择使用,可以由外部固件提供的描述符分别定义其用途。

            EP1——辅助端点

            EP2——数据传输的主端点

______________________________________________________________ 

USB四种传输模式

控制传输批量传输中断传输同步传输

USB 有上述四种传输类型。枚举期间外设告诉主机每个端点支持哪种传输类型。

 

USB设备驱动向USB控制器驱动请求的每次传输被称为一个事务(Transaction),

事务有四种类型:Bulk TransactionControl TransactionInterrupt TransactionIsochronous Transaction

 

数据包包含部分

每次事务都会分解成若干个数据包在USB总线上传输。每次传输必须历经两个或三个部分,第一部分——USB控制器向USB设备发出命令,

第二部分——USB控制器和USB设备之间传递读写请求,其方向主要看第一部分的命令是读还是写,第二部分有时候可以没有

第三部分——握手信号。

 

批量(Bulk)传输事务

作用:主要应用在数据大量数据传输和接受数据上同时又没有带宽和间隔时间要求的情况下;

特点:要求保证传输。打印机和扫描仪属于这种类型这种类型的设备

适合于传输非常慢和大量被延迟的传输,可以等到所有其它类型的数据的传输完成之后再传输和接收数据。

 

批量数据传输分三个阶段:

第一部分——令牌阶段。

Host端发出一个Bulk的令牌请求。

如果令牌是IN请求  ,则是从DeviceHost的请求;

如果令牌是OUT请求,则是从HostDevice端的请求。

第二部分——传送数据的阶段。

根据先前请求的令牌的类型,数据传输有可能是IN方向,也有可能是OUT方向。传输数据的时候用DATA0DATA1令牌携带着数据交替传送。

数据传输格式DATA1DATA0,这两个是重复数据,确保在1数据丢失时0可以补上,不至于数据丢失。

 

第三部分——握手阶段。

如果数据是IN   方向,握手信号应该是Host端发出;

如果数据是OUT方向,握手信号应该是Device端发出。

握手信号可以为ACK  表示正常响应,

 NAK  表示没有正确传送。

STALL表示出现主机不可预知的错误。

如图所示。

 

Bulk传输

 

 

Bulk传输时的令牌

 

 

控制(Control)传输

作用:USB系统软件用来主要进行查询配置和给USB设备发送通用的命令;

特点:控制传输是双向传输,数据量通常较小;数据传送是无损性的。

数据宽度:控制传输方式可以包括8163264字节的数据,这依赖于设备和传输速度。

 

控制传输典型地用在主计算机和USB外设之间的端点0EP0)之间的传输

控制传输也分为三个阶段,即令牌阶段数据传送阶段握手阶段,如下图所示。

 

 

图 控制传输事务

 

中断(Interrupt)传输事务

作用:主要用于定时查询设备是否有中断数据要传输;

特点:设备的端点模式器的结构决定了它的查询频率从1255ms之间。

典型的应用在少量的分散的不可预测数据的传输键盘操纵杆和鼠标就属于这一类型

(数据量很小)

中断方式传输是单向的并且对于host 来说只有输入(IN)的方式

 

在中断事务中,也分为三个阶段,即令牌阶段数据传输阶段握手阶段,如下图所示。

 

 

中断传输事务

 

同步(Isochronous)传输事务

作用:用于时间严格并具有较强容错性的流数据传输,或者用于要求恒定的数据传输率的即时应用中。例如执行即时通话的网络电话。

特点:保证传输的同步性。保证每秒有固定的传输量。

(与Bulk传输不同)同步传输允许有一定的误码率。(这样符合视频会议等传输的需求,因为视频会议首先要保证实时性,在一定条件下,允许有一定的误码率。)

 

同步传输事务有只有两个阶段,即令牌阶段、数据阶段,因为不关心数据的正确性,故没有握手阶段,

 

如下图所示:

 

图 同步传输事务

 

 

CH372支持 控制传输批量传输中断传输

 

 

 

参考资料:

1)            USB协议的中文简要说明

2)            USB四种传输模式 - 51CTO.COM

http://book.51cto.com/art/200807/79726.htm

系统分类: 嵌入式  |  用户分类: USB  |  标签: 端点 传输模式 USB CH372 Transaction  |  来源: 整理  | 

点击查看原文

发表评论 阅读全文(813) | 回复(0)

发表于 2009/5/12 17:57:52

1

关于投票

USB学习笔记2:USB接口插座引脚

USB学习笔记2USB接口插座引脚

USB是英文Universal Serial Bus的缩写,中文含义是通用串行总线

 

USB的版本

  第一代:USB 1.0/1.1的最大传输速率为12Mbps1996年推出。

  第二代:USB 2.0的最大传输速率高达480MbpsUSB 1.0/1.1USB 2.0的接口是相互兼容的。

  第三代:USB 3.0 最大传输速率5Gbps, 向下兼容USB 1.0/1.1/2.0

 

PCB板的时候要知道USB的引脚排列,现整理如下,方便使用。

 

注:以下均为插座或插头的前视图,即将插座或插头面向自己。

 

USB-A插座是用在主机上的
USB-B
插座是用在外设上的

 

USB A型插座和插头

             

          

             USB A型插座引脚分布                   USB A型插头引脚排列分布

 

USB B型插座和插头

              

                              

      USB B型插座引脚分布          USB B型插头引脚分布

 

USB A-B型引脚功能

引脚序号

功能名

典型电线颜色

1

VBUS

2

D-

3

D+

绿

4

GND

Shell

Shield

 

 

 

USB mini-B 插座和插头

          

                               

    USB mini-B型插座引脚分布                USB mini-B型插头引脚分布

 

USB mini-B型引脚功能

引脚序号

功能名

典型电线颜色

1

VBUS

2

D-

3

D+

绿

4

ID

不用

5

GND

Shell

Shield

 

 

关于插座插头的机械尺寸请参考USB标准上的典型机械尺寸,更可靠的是以连接器生产厂的尺寸为准。

USB典型的机械尺寸可以参考下面网站。

http://www.cypressindustries.com/products/usb.html#usb1

这个网站给出了大部分USB插座的封装尺寸,不过设计PCB的时候最好还是先到市场上先购买合适的USB插座,再用千分尺测量这个插座引脚的间距大小,再画封装。避免封装画得不合适,因为在中国,插座可能不一定是按标准的,即使是按标准的来,也要考虑到购买的难易程度以及价格。

 

USB A型插座DIP直插

点击看大图

 

USB A型插座SMT贴片

 点击看大图

 

USB B型插座DIP直插

点击看大图

 

USB Mini-B型插座贴片

点击看大图

 

下载:网上某人画好的USB Mini-B Protel封装库http://space.ednchina.com/upload/2009/5/12/d2be20db-313e-4213-ab9f-c4c1ba5ab109.rar

(来源:lxysduky's Blog)

 

 

USB实物图

点击看大图

 点击看大图

 

参考资料:

1)            各种USB插座插头引脚说明图片 -- freemark's Blog

http://blog.ednchina.com/freemark/205877/message.aspx

2)            USB接口标准及常用USB接口_成志电子制作网 电子电路图站

http://hi.baidu.com/diydz/blog/item/b24c998b90aebc789e2fb4a9.html

3)            USB的不同接口与数据线

http://www.pdp.com.cn/dictionary/4082.shtml  

4)            USB 各型插座插头引脚分布_王天喜

http://hi.baidu.com/wangtianxi2008/blog/item/f5f7c7fc5d7ac383b801a024.html

系统分类: 接口电路  |  用户分类: USB  |  标签: USB CH372 A型插座 B型插头 封装尺寸  |  来源: 原创  | 

点击查看原文

发表评论 阅读全文(1960) | 回复(0)

发表于 2009/5/12 17:42:29

1

关于投票

USB学习笔记1:CH372硬件电路

USB学习笔记1CH372硬件电路

相比于PDIUSBD12来说,CH372简单易用很多,它具有内置固件模式,屏蔽了USB协议,还具有灵活的外部固件模式,适合于多种应用场合。

 

USB 2.0 标准规定了以下三种传输速率:

1. 低速模式传输速率为1.5Mbps,多用于键盘和鼠标。

2. 全速模式传输速率为12Mbps

3. 高速模式传输速率为480Mbps

 

CH372兼容USB2.0,但不是USB2.0设备,不能用于高速(480Mbps)操作。

 

通过下面命令修改:

CMD_SET_USB_SPEED   0x04                   

/* 设置USB总线速度, 在每次CMD_SET_USB_MODE设置USB工作模式时会自动恢复到12Mbps全速 */

/* 输入: 总线速度代码 */

//00H=12Mbps全速FullSpeed(默认值),

//01H=1.5Mbps(仅修改频率),

//02H=1.5Mbps低速LowSpeed

 

CH372引脚配置和引脚分配:

 

 

点击看大图

 

 

CH372硬件连线图

 

点击看大图

 

晶体X1、电容C1 C2——用于CH372 的时钟振荡电路。

晶体X1 的频率是12MHz

C1 C2 是容量为15pF30pF的独石或者高频瓷片电容。

 

电容C3——用于CH372内部电源节点退耦。

C3 是容量为4700pF~0.02μF的独石或者高频瓷片电容。

 

如果CH372 的电源电压为3.3V,那么应该将V3 引脚与VCC 引脚短接,共同输入3.3V 电压,并且电容C3 可以省掉。

 

电容C4C5——用于外部电源退耦。

C4 是容量为0.1μF的独石或者高频瓷片电容。

 

 

电阻R1——(串在USB电源与本板电源之间)是为了便于双电源供电,防止两个电源电压不同冲突。

计算机USB供电:

USB 总线提供的电源电流最大可以达到500mA,一般情况下,低功耗的USB 产品可以直接使用USB总线提供的5V电源。此时单片机也是使用计算机给USB5V电源,单片机系统不需要外接电源,也可以省略电阻R1,但必须保证500mA能满足整个单片机系统的电流要求。

 

单片机外接电源:

可以通过阻值约为的电阻R1连接USB总线的5V电源线与USB产品的5V常备电源,并且两者的接地线直接相连接。这样可以防止两个电源电压不同冲突。

 

P1接线:

P1USB端口,USB总线包括一对5V 电源线和一对数据信号线,通常:

红色——+5V电源线;

黑色——接地线GND

绿色——D+信号线;

白色——D-信号线。

 

电阻R2——充放电使USB复位。

可选电阻R2 用于在电源断电后将电解电容C5中的电能及时释放掉,使VCC 及时下降到0V,确保在下次通电时CH372 能够可靠地上电复位。

为使CH372 能够可靠复位,电源电压从0V 上升到5V 的上升时间应该少于100mS,所以电容C5 的容量和电阻R1 的阻值都不能太大。

 

设计印刷板PCB时注意:

    退耦电容C3C4尽量靠近CH372 的相连引脚;

    使D+D-信号线贴近平行布线,尽量在两侧提供地线或者覆铜,减少来自外界的信号干扰;

    尽量缩短XI XO引脚相关信号线的长度,为了减少高频时钟对外界的干扰,可以在相关元器件周边环绕地线或者覆铜。

 

CH372与单片机连接

有两种方式:非总线扩展和总线扩展。

 

连接单片机I/O(非总线扩展)

 

点击看大图

 

单片机可以用普通的I/O引脚模拟出8位并口时序操作。

CH372 芯片。在普通的MCS-51 系列简化单片机的典型应用电路中,CH372 CS#固定为低电平,一直处于片选状态,U5P1 端口作为8位双向数据总线,在单片机程序中,可以控制各个I/O引脚模拟并口时序与CH372 进行数据交换。

缺点是占用了单片机的I/O口,CH372一直处于片选状态。

 

连接单片机总线(总线扩展)

 

 

关于单片机总线方式可以参考我的另一篇博文。

这种方式的优点是节省了单片机I/O口引线,通过地址选择CH37274LS373的作用是对地址进行锁存。74LS373可以用74LS573/74HC573代替,好处是74LS373的管脚排列不整齐,D0~Q0管脚不是相对排列,而74LS573的是相对排列,有利于PCB布线和在万用版、面包板上排线。

 

74LS373管脚图

 

 

74LS573管脚图

 

    总线扩展方式中的74LS138起到地址译码产生片选信号的作用。CH372 芯片的片选地址范围为B000H-BFFFH,而实际上CH372 只需要占用两个地址:地址BXX1H用于写命令,地址BXX0H 用于读写数据。

总线扩展方式中的地址锁存和地址译码可以用CPLD完成。简单几行Verilog命令就可以实现对CH372的操作,而且有利于其他总线扩展方式芯片的操作,省去了对应单片机操作每个总线扩展方式芯片所必须的锁存芯片74LS573/74LS373

CPLD选择Xilinx公司的XC9572-PLCC84。具体请参见我的另外一篇博文。

 

参考资料:

1实用USB 术语  pdf

http://www.maxim-ic.com.cn/appnotes.cfm?an_pk=3803

2CH372 中文手册(一)pdf

374LS373手册 pdf

474LS573手册 pdf

系统分类: 接口电路  |  用户分类: USB  |  标签: USB CH372 PDIUSBD12 电路 74LS573  |  来源: 整理  | 

点击查看原文

发表评论 阅读全文(1326) | 回复(2)

Total , Page /