?? 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]; /* 公用緩沖區(qū) */
uchar sendbuff[896];
uchar CH375RUSH=0;
uchar ready=0,finish=0;
extern struct parameter para;//菜單項的參數(shù)
extern struct asc_parameter asc_para; //菜單項的參數(shù)asc
extern savepara storagepara; //存儲區(qū)的參數(shù)
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,如果單片機(jī)較快則延時 */
delay2us();
CH375_CMD_PORT=cmd;
delay2us();
}
void CH375_WR_DAT_PORT( unsigned char dat ) { /* 向CH375的數(shù)據(jù)端口寫入數(shù)據(jù),周期不小于1.5uS,如果單片機(jī)較快則延時 */
CH375_DAT_PORT=dat;
delay1us(); /* 因為MCS51單片機(jī)較慢所以實際上無需延時 */
}
unsigned char CH375_RD_DAT_PORT() { /* 從CH375的數(shù)據(jù)端口讀出數(shù)據(jù),周期不小于1.5uS,如果單片機(jī)較快則延時 */
delay1us(); /* 因為MCS51單片機(jī)較慢所以實際上無需延時 */
return( CH375_DAT_PORT );
}
///////////////////////////////////////////////////////////////////////////////////////
#define TRUE 1
#define FALSE 0
unsigned char set_usb_mode( unsigned char mode ) { /* 設(shè)置CH375的工作模式 */
unsigned char i;
CH375_WR_CMD_PORT( CMD_SET_USB_MODE );
CH375_WR_DAT_PORT( mode );
for( i=0; i!=100; i++ ) { /* 等待設(shè)置模式操作完成,不超過30uS */
if ( CH375_RD_DAT_PORT()==CMD_RET_SUCCESS ) return( TRUE ); /* 成功 */
}
return( FALSE ); /* CH375出錯,例如芯片型號錯或者處于串口方式或者不支持 */
}
unsigned char rd_usb_data( unsigned char *buf ) { /* 從CH37X讀出數(shù)據(jù)塊 */
unsigned char i, len;
CH375_WR_CMD_PORT( CMD_RD_USB_DATA ); /* 從CH375的端點緩沖區(qū)讀取接收到的數(shù)據(jù) */
len=CH375_RD_DAT_PORT(); /* 后續(xù)數(shù)據(jù)長度 */
for ( i=0; i!=len; i++ ) *buf++=CH375_RD_DAT_PORT();
return( len );
}
void wr_usb_data( unsigned char len, unsigned char *buf ) { /* 向CH37X寫入數(shù)據(jù)塊 */
CH375_WR_CMD_PORT( CMD_WR_USB_DATA7 ); /* 向CH375的端點緩沖區(qū)寫入準(zhǔn)備發(fā)送的數(shù)據(jù) */
CH375_WR_DAT_PORT( len ); /* 后續(xù)數(shù)據(jù)長度, len不能大于64 */
while( len-- ) CH375_WR_DAT_PORT( *buf++ );
}
//////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////
initusb() {
unsigned char data_to_send[200]; /* 緩沖區(qū) */
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 ); /* 結(jié)束復(fù)位 */
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 ); // 設(shè)置USB主機(jī)模式 /
s=(*(ISFR)0x30);
displaydata(370,45,(short)s,4,0);
mDelaymS( 50 ); // 復(fù)位時間不少于1mS,建議為10mS /
for(i=0;i<0x0a;i++)
{
set_usb_mode( 2 ); // 結(jié)束復(fù)位 /
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();
//發(fā)31組探頭參數(shù)
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的發(fā)送緩沖區(qū)寫入數(shù)據(jù)塊
CH375_WR_DAT_PORT( 64 ); // 首先寫入后續(xù)數(shù)據(jù)長度,回傳剛接收到的數(shù)據(jù)長度
for ( k = 0; k < 64; k ++ ) CH375_WR_DAT_PORT(buffer[ k ] );
//enusb();
while(finish==0);
//disusb();
}
}
//發(fā)存儲
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的發(fā)送緩沖區(qū)寫入數(shù)據(jù)塊 */
CH375_WR_DAT_PORT( 64 ); /* 首先寫入后續(xù)數(shù)據(jù)長度,回傳剛接收到的數(shù)據(jù)長度 */
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的發(fā)送緩沖區(qū)寫入數(shù)據(jù)塊 */
CH375_WR_DAT_PORT( 64 ); /* 首先寫入后續(xù)數(shù)據(jù)長度,回傳剛接收到的數(shù)據(jù)長度 */
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 ); /* 獲取中斷狀態(tài)并取消中斷請求 */
InterruptStatus = CH375_RD_DAT_PORT( ); /* 獲取中斷狀態(tài) */
switch ( InterruptStatus ) { /* 分析中斷狀態(tài)處理 */
case USB_INT_EP2_OUT: { /* 批量端點下傳成功 */
CH375_WR_CMD_PORT( CMD_RD_USB_DATA ); /* 從當(dāng)前USB中斷的端點緩沖區(qū)讀取數(shù)據(jù)塊,并釋放緩沖區(qū) */
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的發(fā)送緩沖區(qū)寫入數(shù)據(jù)塊 */
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的發(fā)送緩沖區(qū)寫入數(shù)據(jù)塊 */
CH375_WR_DAT_PORT( 64 ); /* 首先寫入后續(xù)數(shù)據(jù)長度,回傳剛接收到的數(shù)據(jù)長度 */
for ( i = 0; i < 64; i ++ ) CH375_WR_DAT_PORT(buffer[ i ] );
}
/* 測試數(shù)據(jù)正確性,將接收到的命令包數(shù)據(jù)取反后返回給PC機(jī) */
}
//CH375_WR_CMD_PORT( CMD_WR_USB_DATA7 ); /* 向USB端點2的發(fā)送緩沖區(qū)寫入數(shù)據(jù)塊 */
//CH375_WR_DAT_PORT( length ); /* 首先寫入后續(xù)數(shù)據(jù)長度,回傳剛接收到的數(shù)據(jù)長度 */
//for ( i = 0; i < length; i ++ ) CH375_WR_DAT_PORT( ~ buff[ i ] ); /* 數(shù)據(jù)取反后返回,由計算機(jī)應(yīng)用程序測試數(shù)據(jù)是否正確 */
break;
}
case USB_INT_EP2_IN: { /* 批量數(shù)據(jù)發(fā)送成功 */
stascii(460,30,'&');
if(ready==1) finish=1;
//else
//{
//testready--;
//if(testready==0) {ready=1;testready=50;}
//}
CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); /* 釋放當(dāng)前USB緩沖區(qū) */
break;
}
default: { /* 其它中斷,未用到,解鎖后退出即可 */
CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); /* 釋放當(dāng)前USB緩沖區(qū) */
break;
}
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -