📄 main.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 + -