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

📄 usb375.c

📁 这是一个有关USB接口中传输数据的C语言源代码,对于通信方面的设计有很大的帮助
💻 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 + -