#pragma NOAREGS //禁止编译器使用绝对寄存器寻址,一定要加上#include <REG52.H> //51
单片机头文件#include "CH375INC.H" //CH372/CH375头文件 ///////////////////丛衡//////////////////////////////说明: CH372
总线地址// 采用别的方式,地址另外设定///////////////////////////////////////////////unsigned char volatile xdata CH375_CMD_PORT _at_ 0x03F1 unsigned char volatile xdata CH375_DAT_PORT _at_ 0x03F0/*********************延时程序********************/////////////////////////辩芹/////////////////////////函数:delay2us//说明:延时2us//入口:无//返回:无/////////////////////////////////////////////// voiddelay2us( ) { unsigned char i for ( i = 2i != 0i -- ) }/////////////////////////////////////////////////函数:delay50ms//说明:延时50ms//入口:无//返回:无///////////////////////////////////////////////voidDelay50ms( ) { unsigned char i, j for ( i="200"i!=0i-- ) for ( j="250"j!=0j-- ) }/*********************基本读写程序********************/////////////////////////////渗灶做/////////////////////函数: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初始化//入口:无//返回:无///////////////////////////////////////////////voidCH375_Init( ) { /* 设置USB工作模式, 必要 *** 作 */unsigned char i CH375_WR_CMD_PORT( CMD_SET_USB_MODE ) //设置USB工作模式CH375_WR_DAT_PORT( 2 ) //设置为内置固件模式for ( i="100"i!=0i-- ){ /* 等待 *** 作成功,通常需要等待10uS-20uS */if ( CH375_RD_DAT_PORT( ) == CMD_RET_SUCCESS ) break } /* 下面启用USB中断,CH372/CH375的INT#引脚可以连接到单片机的中断引脚,中断为低电平有效或者下降沿有效,如果不使用中断,那么也可以用查询方式,由单片机程序查询CH372/CH375的INT#引脚为低电平 */IT0 = 0/* 置外部信号为低电平触发 */IE0 = 0/* 清中断标志 */EX0 = 1 /* 允许CH372中断,假定CH372的INT#引脚连接到单片机的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 = 0i <lengthi ++ ) buffer[ i ] = CH375_RD_DAT_PORT( ) //接收数据包 /* -----------测试数据正确性,将接收到的命令包数据返回给PC机----------- */ CH375_WR_CMD_PORT( CMD_WR_USB_DATA7 ) /* 向USB端点2的发送缓冲区写入数据块 */ CH375_WR_DAT_PORT( length ) /* 首先写入后续数据长度,回传刚接收到的数据长度 */ for ( i = 0i <lengthi ++ ) 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总线(下图)
P1 是USB 端口,USB 总线包括一对5V 电源线和一对数据信号线,通常,+5V 电源线是红色,接
地线是黑色,D+信号线是绿色,D-信号线是白色。USB 总线提供的电源电流最大可以达到500mA,一
般情况下,低功耗的USB 产品可以直接使用USB 总线提供的5V 电源。如果USB 产品通过其它供电方
式提供常备电源,那么CH372 应该与单片机一起使用该常备电源并且断开USB 总线的电源;如果需要
同时使用USB总线的电源,那么可以通过阻值约为1Ω 的电阻R1 连接USB总线的5V 电源线与USB产
品的5V 常备电源,并且两者的接地线直接相仔改连接。
图中,可选电阻R2 用于在电源断电后将电解电容C5 中的电能及时释放掉,使VCC 及时下降到
0V,确保在下次通电时CH372 能够可靠地上电复位。为使CH372 能够可靠复位,电源电压从0V 上升
到5V 的上升时间应该少于100mS,所以电容C5 的容量和电阻R1 的阻值都不能太大。
电容C3 用于CH372 内部电源节点退耦,C3 是容量为4700pF 到0.02μF 的独石或者高频瓷片电
容。电容C4和C5 用于外部电源退耦,C4 是容量为0.1μF 的独石或者高频瓷片电容。晶体X1、电容
C1 和C2 用于CH372 的时钟振荡电路。晶体X1 的频率是12MHz,C1 和C2 是贺慧容量为15pF~30pF 的独
石或者高频瓷片电容。
如果CH372 的电源电压为3.3V,那么应该将V3 引脚与VCC 引脚短接,共同输入3.3V 电压,并
且电容C3 可以省掉。
在禅戚答设计印刷线路板PCB 时,需要注意:退耦电容C3 和C4 尽量靠近CH372 的相连引脚;使D+和
D-信号线贴近平行布线,尽量在两侧提供地线或者覆铜,减少来自外界的信号干扰;尽量缩短XI 和
XO 引脚相关信号线的长度,为了减少高频时钟对外界的干扰,可以在相关元器件周边环绕地线或者
覆铜。
CH372 芯片具有通用的被动并行接口,可以直接连接多种单片机、DSP、MCU 等。在普通的MCS-51
系列单片机的典型应用电路中,CH372 芯片可以通过8 位被动并行接口的D7~D0、-RD、-WR、-CS、
A0 直接挂接到单片机U2 的系统总线上。
如果MCS-51单片机没有用U3锁存A7~A0 地址,那么可以用U2 的P20 等引脚驱动CH372的地址
线A0,当然单片机程序中的端口地址需要相应修改。U4 用于简单的地址译码,产生所需的片选信号,
图中CH372 芯片的片选地址范围为B000H-BFFFH,而实际上CH372 只需要占用两个地址:地址BXX1H
用于写命令,地址BXX0H 用于读写数据。
评论列表(0条)