⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 USB固件程序
💻 C
字号:
#include <c8051f020.h>

#include "CH375INC.H"
#ifdef __CX51__
#ifndef __C51__
#define __C51__		1
#endif
#endif

typedef unsigned char                UINT8;
typedef unsigned short               UINT16;
typedef unsigned long                UINT32;
#ifdef __C51__
typedef unsigned char  idata        *PUINT8;
#else
typedef unsigned char               *PUINT8;
#endif
#ifdef __C51__
typedef unsigned char  xdata        *PUINT8X;
#else
typedef unsigned char               *PUINT8X;
#endif
#ifdef __C51__
typedef unsigned char  code         *PUINT8C;
#else
typedef unsigned char               *PUINT8C;
#endif
#ifdef __C51__
#pragma NOAREGS
#endif


#ifndef MAX_DATA_SIZE
#define MAX_DATA_SIZE		32			/* 单次命令处理的最大数据长度,有效值是1到56 */
#endif

typedef	struct	_USB_DOWN_PACKET {		/* 下传的数据包结构,用于命令/写数据 */
	UINT8	mCommand;					/* 命令码,见下面的定义 */
	UINT8	mStatus;			    
	UINT16  mAddress;
	UINT8	mLength;					/* 下面的缓冲区的长度,读写操作的字节数 */
	UINT8	mBuffer[ MAX_DATA_SIZE ];	/* 数据缓冲区 */
}	USB_DOWN_PKT;

typedef	struct	_USB_UP_PACKET {		/* 上传的数据包结构,用于状态/读数据 */
	UINT8	mStatus;					/* 状态码,见下面的定义 */
	//UINT8	mCommandNot;				/* 命令码的反码,用于校验上传数据包 */
	UINT8	mReserved[2];
	UINT8	mLength;					/* 下面的缓冲区的长度,读操作的字节数 */
	UINT8	mBuffer[ MAX_DATA_SIZE ];	/* 数据缓冲区 */
}	USB_UP_PKT;

typedef union	_USB_DATA_PACKET {		/* USB上传或者下传数据缓冲区 */
	USB_DOWN_PKT	down;
	USB_UP_PKT		up;
}	USB_DATA_PKT;
/**延时MS**/
void Delay_ms(unsigned char m)
{
unsigned char a;
unsigned int b;
for(a=m;a!=0;a--)
for(b=595;b!=0;b--);    
}
void Delay1us()
{
 UINT8 i;
 for(i=0;i!=0;i--);
}
void Delay2us()
{
 UINT8 i;
 for(i=1;i!=0;i--);
}
void IO_Init() 
{
EA=0;
WDTCN=0xde;
WDTCN=0xad;
EA=1;
EA=0;
XBR0=0x05;
XBR1=0X14;
XBR2=0x04;
P2MDOUT|=0x21;
//P4MDOUT|=0xff;
P74OUT|=0xff;
XBR2|=0x40;
}
void Init_CLK()
{
unsigned short i;
OSCXCN=0x66;
for(i=0;i<256;i++);
while(!(OSCXCN&0x80));
OSCICN=0x08;
}
/* 与CH372/CH375有关的基本I/O操作 */

void CH375_WR_CMD_PORT( UINT8 cmd ) {  /* 向CH375的命令端口写入命令,周期不小于4uS,如果单片机较快则延时 */
	P7=cmd;
	P4&=0xf7;//置低片选    
	P4|=0x04;   //A0置高
	Delay2us();
	P4&=0x7f;		//WR=0
    Delay2us();
    P4|=0x80;		//WR=1
    Delay2us();	
}

void CH375_WR_DAT_PORT( UINT8 dat ) {  /* 向CH375的数据端口写入数据,周期不小于1.5uS,如果单片机较快则延时 */
	P7=dat;
	P4&=0xf7;//置低片选
	P4&=0xfb;   //A0置低
	Delay1us(); 
    P4&=0x7f;		//WR=0
    Delay1us();
    P4|=0x80;		//WR=1
    Delay1us();
}
UINT8 CH375_RD_DAT_PORT( void ) {  /* 从CH375的数据端口读出数据,周期不小于1.5uS,如果单片机较快则延时 */
	UINT8 state;
	P7=0xff;
	P4&=0xf7;//置低片选
    Delay1us(); 
	P4&=0xfb;   //A0置低
    Delay1us();
	P4&=0xbf;		//WR=1,RD=0
	Delay1us();
	state=P7;
	P4|=0x40;		//WR=1,RD=1	
	Delay1us();	
	return state;
}
/* CH375初始化子程序 */
void	CH375_Init( void ) {
	UINT8 i;


/* 设置USB工作模式, 必要操作 */
	CH375_WR_CMD_PORT( CMD_SET_USB_MODE );
	CH375_WR_DAT_PORT( 2 );  /* 设置为使用内置固件的USB设备方式 */
	for ( i=100; i!=0; i-- ) if ( CH375_RD_DAT_PORT( ) == CMD_RET_SUCCESS ) break;  /* 等待操作成功,通常需要等待10uS-20uS */
/*	if ( i == 0 ) { CH372/CH375芯片内部或者物理连接存在硬件错误 }; */
	IT0 = 0;  /* 置外部信号为低电平触发 */
	IE0 = 0;  /* 清中断标志 */
	EX0 = 1;  /* 允许CH375中断,假定CH375的INT#引脚连接到单片机的INT0 */
}
main( void ) 
{
Delay_ms(50);	
Init_CLK();
IO_Init();
CH375_Init();
IT0=0;
EX0=1;
EA=1;
while(1)
{

}
}
void	mCh375Interrupt( ) interrupt 0 using 1
{
	unsigned char InterruptStatus;
	unsigned char i, length;
	unsigned char data buffer[ 64 ];
	CH375_WR_CMD_PORT( CMD_GET_STATUS );  /* 获取中断状态并取消中断请求 */
	InterruptStatus = CH375_RD_DAT_PORT( );  /* 获取中断状态 */
		switch ( InterruptStatus ) {  /* 分析中断状态处理 */
		case USB_INT_EP2_OUT: {  /* 批量端点下传成功 */
			CH375_WR_CMD_PORT( CMD_RD_USB_DATA );  /* 从当前USB中断的端点缓冲区读取数据块,并释放缓冲区 */
			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: {  /* 批量数据发送成功 */
			CH375_WR_CMD_PORT( CMD_UNLOCK_USB );  /* 释放当前USB缓冲区 */
			break;
		}
		default: {  /* 其它中断,未用到,解锁后退出即可 */
			CH375_WR_CMD_PORT( CMD_UNLOCK_USB );  /* 释放当前USB缓冲区 */
			break;
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -