📄 usb375.c
字号:
#include <ez80.h>
#include <string.h>
#include "CH375INC.H"
#include "push.h"
//#include "storage.h"
#define PD2_IVECT 0x54
#define uchar unsigned char
#define uint unsigned int
#define ushort unsigned short
#define CH375_CMD_PORT (*(ISFR)0x31)
#define CH375_DAT_PORT (*(ISFR)0x30)
unsigned char buffer[64]; /* 公用缓冲区 */
uchar sendbuff[896];
uchar CH375RUSH=0;
uchar ready=0,finish=0;
extern struct parameter para;//菜单项的参数
extern struct asc_parameter asc_para; //菜单项的参数asc
extern savepara storagepara; //存储区的参数
extern void set_vector(unsigned short vector,void (*hndlr)(void));
extern void delay1us(void);
extern void delay2us(void);
extern void CH375_WR_CMD_PORT( unsigned char cmd );
extern void CH375_WR_DAT_PORT( unsigned char dat );
extern uchar CH375_RD_DAT_PORT( void );
extern unsigned char set_usb_mode( unsigned char mode );
extern void senddata(StorageNum);
extern void interrupt PD20_isr( void );
extern uchar RParameter(uchar Tsindex);
extern void para_to_ascpara(void);
extern uchar ReadStoragePara(uchar n);
//////////////////////////////////////////////////
/* 延时2微秒,不精确 */
void delay2us( )
{
unsigned char i;
for ( i = 2; i != 0; i -- );
}
/* 延时1微秒,不精确 */
void delay1us( )
{
unsigned char i;
for ( i = 1; i != 0; i -- );
}
//////////////////////////////////////////////////
/* 以毫秒为单位延时,不精确,适用于24MHz时钟 */
void mDelaymS( unsigned char delay )
{
unsigned char i, j, c;
for ( i = delay; i != 0; i -- ) {
for ( j = 200; j != 0; j -- ) c += 3; /* 在24MHz时钟下延时500uS */
for ( j = 200; j != 0; j -- ) c += 3; /* 在24MHz时钟下延时500uS */
}
}
/* 基本操作 */
void CH375_WR_CMD_PORT( unsigned char cmd ) { /* 向CH375的命令端口写入命令,周期不小于4uS,如果单片机较快则延时 */
delay2us();
CH375_CMD_PORT=cmd;
delay2us();
}
void CH375_WR_DAT_PORT( unsigned char dat ) { /* 向CH375的数据端口写入数据,周期不小于1.5uS,如果单片机较快则延时 */
CH375_DAT_PORT=dat;
delay1us(); /* 因为MCS51单片机较慢所以实际上无需延时 */
}
unsigned char CH375_RD_DAT_PORT() { /* 从CH375的数据端口读出数据,周期不小于1.5uS,如果单片机较快则延时 */
delay1us(); /* 因为MCS51单片机较慢所以实际上无需延时 */
return( CH375_DAT_PORT );
}
///////////////////////////////////////////////////////////////////////////////////////
#define TRUE 1
#define FALSE 0
unsigned char set_usb_mode( unsigned char mode ) { /* 设置CH375的工作模式 */
unsigned char i;
CH375_WR_CMD_PORT( CMD_SET_USB_MODE );
CH375_WR_DAT_PORT( mode );
for( i=0; i!=100; i++ ) { /* 等待设置模式操作完成,不超过30uS */
if ( CH375_RD_DAT_PORT()==CMD_RET_SUCCESS ) return( TRUE ); /* 成功 */
}
return( FALSE ); /* CH375出错,例如芯片型号错或者处于串口方式或者不支持 */
}
unsigned char rd_usb_data( unsigned char *buf ) { /* 从CH37X读出数据块 */
unsigned char i, len;
CH375_WR_CMD_PORT( CMD_RD_USB_DATA ); /* 从CH375的端点缓冲区读取接收到的数据 */
len=CH375_RD_DAT_PORT(); /* 后续数据长度 */
for ( i=0; i!=len; i++ ) *buf++=CH375_RD_DAT_PORT();
return( len );
}
void wr_usb_data( unsigned char len, unsigned char *buf ) { /* 向CH37X写入数据块 */
CH375_WR_CMD_PORT( CMD_WR_USB_DATA7 ); /* 向CH375的端点缓冲区写入准备发送的数据 */
CH375_WR_DAT_PORT( len ); /* 后续数据长度, len不能大于64 */
while( len-- ) CH375_WR_DAT_PORT( *buf++ );
}
//////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////
initusb() {
unsigned char data_to_send[200]; /* 缓冲区 */
unsigned char str_to_print[]="OK, support text print\n";
unsigned char s,k,g,i;
for(k=0;k<0x0a;k++)
{
CH375_WR_CMD_PORT(0x06);
CH375_WR_DAT_PORT(0xaa);
g=CH375_RD_DAT_PORT();
displaydata(460-20*k,70,(short)g,4,0);
if(g==0x55&&k!=0) break;
CH375_WR_CMD_PORT(0x05);
mDelaymS(50);
for(i=0;i<0x0a;i++)
{
set_usb_mode( 2 ); /* 结束复位 */
delay2us();
if(CH375_RD_DAT_PORT()==CMD_RET_SUCCESS) break;
}
}
set_vector(PD2_IVECT,PD20_isr);
}
/////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
void senddata()
{
int i,j,k,StorageNum;
uchar *p,g,s;
int checkout=0;
mDelaymS( 200 );
set_usb_mode( 7 ); // 设置USB主机模式 /
s=(*(ISFR)0x30);
displaydata(370,45,(short)s,4,0);
mDelaymS( 50 ); // 复位时间不少于1mS,建议为10mS /
for(i=0;i<0x0a;i++)
{
set_usb_mode( 2 ); // 结束复位 /
delay2us();
if(CH375_RD_DAT_PORT()==CMD_RET_SUCCESS) break;
}
mDelaymS( 100 );
StorageNum=*STORAGENUM_H;
StorageNum=(StorageNum<<8)+*STORAGENUM_L;
ready=0;
enusb();
while(ready==0);
//disusb();
//发31组探头参数
for(i=0;i<31;i++)
{
for(k=0;k<5;k++) {s=RParameter(i); if(s!='f') break;}
para_to_ascpara();
p=(uchar*)&asc_para;
for (j=0;j<sizeof(asc_para);j++,p++) {sendbuff[j]=*p;checkout+=*p;}
p=(uchar*)&storagepara;
for (;j<( LEN_STORAGE+sizeof(asc_para) );j++,p++) {sendbuff[j]=*p;checkout+=*p;}
for(;j<893;j++) sendbuff[j]=0;
*( (int*)(sendbuff+893) )=checkout;
//for (j=0;j<824;j++) sendbuff[j]=i+1;
for(j=0;j<896;)
{
for(k=0;k<64;k++)
buffer[k]=sendbuff[j++];
finish=0;
CH375_WR_CMD_PORT( CMD_UNLOCK_USB );
CH375_WR_CMD_PORT( CMD_WR_USB_DATA7 ); // 向USB端点2的发送缓冲区写入数据块
CH375_WR_DAT_PORT( 64 ); // 首先写入后续数据长度,回传刚接收到的数据长度
for ( k = 0; k < 64; k ++ ) CH375_WR_DAT_PORT(buffer[ k ] );
//enusb();
while(finish==0);
//disusb();
}
}
//发存储
for (i=1;i<=StorageNum;i++)
{
//ReadStoragePara(i);
for(k=0;k<5;k++) {s=ReadStoragePara(i); if(s!='f') break;}
para_to_ascpara();
p=(uchar*)&asc_para;
for (j=0;j<sizeof(asc_para);j++,p++) {sendbuff[j]=*p;checkout+=*p;}
p=(uchar*)&storagepara;
for (;j<( LEN_STORAGE+sizeof(asc_para) );j++,p++) {sendbuff[j]=*p;checkout+=*p;}
for(;j<893;j++) sendbuff[j]=0;
*( (int*)(sendbuff+893) )=checkout;
for(j=0;j<896;)
{
for(k=0;k<64;k++)
buffer[k]=sendbuff[j++];
finish=0;
//CH375_WR_CMD_PORT( CMD_UNLOCK_USB );
CH375_WR_CMD_PORT( CMD_WR_USB_DATA7 ); /* 向USB端点2的发送缓冲区写入数据块 */
CH375_WR_DAT_PORT( 64 ); /* 首先写入后续数据长度,回传刚接收到的数据长度 */
for ( k = 0; k < 64; k ++ ) CH375_WR_DAT_PORT(buffer[ k ] );
//enusb();
while(finish==0);
//disusb();
}
}
buffer[0]='e';
buffer[1]='n';
buffer[2]='d';
finish=0;
CH375_WR_CMD_PORT( CMD_WR_USB_DATA7 ); /* 向USB端点2的发送缓冲区写入数据块 */
CH375_WR_DAT_PORT( 64 ); /* 首先写入后续数据长度,回传刚接收到的数据长度 */
for ( k = 0; k < 64; k ++ ) CH375_WR_DAT_PORT(buffer[ k ] );
//enusb();
while(finish==0);
disusb();
}
////////=======================================/////////////////////
//////===========================================///////////////////
void interrupt PD20_isr( void )
{
unsigned char InterruptStatus;
unsigned char i, length;
uchar buf[64];
// static uchar testready=50;
static uchar t='0';
stascii(1,5,'z');
CH375RUSH=1;
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( );
displaydata(460,1,(short)length,3,0);
for ( i = 0; i < length; i ++ )
buf[i] = CH375_RD_DAT_PORT( );
if(ready==0)
{
stascii(1,7,t++);
// if(buf[0]==137&&buf[1]==139&&buf[2]==141) //保留
if(buf[0]=='o'&&buf[1]=='k'&&buf[2]=='E'&&length==3)
{CH375_WR_CMD_PORT( CMD_WR_USB_DATA7 ); /* 向USB端点2的发送缓冲区写入数据块 */
CH375_WR_DAT_PORT(4);
for ( i = 0; i <2; i ++ ) CH375_WR_DAT_PORT( 0 );CH375_WR_DAT_PORT( *STORAGENUM_L ); CH375_WR_DAT_PORT(*STORAGENUM_H);
ready=1;wrasc1624(1,19,'%');
}
else if(buf[0]!='e'||buf[1]!='r'||buf[2]!='r'||length!=3)
{CH375_WR_CMD_PORT( CMD_WR_USB_DATA7 );
CH375_WR_DAT_PORT(length);stascii(1,29,'*');
for ( i = 0; i < length; i ++ ) CH375_WR_DAT_PORT( ~ buf[ i ] );
}
}
//////////////////////////////////
else
{
//for ( i = 0; i < 3; i ++ )
//buf[0] = CH375_RD_DAT_PORT( );
//if(buf[0]==137&&buf[1]==139&&buf[2]==141)
stascii(460,20,'@');
{
CH375_WR_CMD_PORT( CMD_WR_USB_DATA7 ); /* 向USB端点2的发送缓冲区写入数据块 */
CH375_WR_DAT_PORT( 64 ); /* 首先写入后续数据长度,回传刚接收到的数据长度 */
for ( i = 0; i < 64; i ++ ) CH375_WR_DAT_PORT(buffer[ i ] );
}
/* 测试数据正确性,将接收到的命令包数据取反后返回给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( ~ buff[ i ] ); /* 数据取反后返回,由计算机应用程序测试数据是否正确 */
break;
}
case USB_INT_EP2_IN: { /* 批量数据发送成功 */
stascii(460,30,'&');
if(ready==1) finish=1;
//else
//{
//testready--;
//if(testready==0) {ready=1;testready=50;}
//}
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 + -