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

📄 ch375prt.lst

📁 采用51核单片机+375A usb主控芯片驱动hp打印机
💻 LST
📖 第 1 页 / 共 4 页
字号:
             -25~129
 413             0x01,0x28,0x01,0x57,0x01,0x30,0x01,0x59,0x01,0x33,0x01,0x62,0x01,0x35,0x01,0x65,0x01,0x37,0x01,0x68,//1
             -30~134
 414             0x01,0x40,0x01,0x71,0x01,0x42,0x01,0x74,0x01,0x44,0x01,0x76,0x01,0x47,0x01,0x79,0x01,0x49,0x01,0x82,//1
             -35~139
 415             0x01,0x52,0x01,0x85,0x01,0x54,0x01,0x88,0x01,0x56,0x01,0x91,0x01,0x59,0x01,0x94,0x01,0x61,0x01,0x97,//1
             -40~144
 416             0x01,0x64,0x02,0x00,0x01,0x66,0x02,0x03,0x01,0x69,0x02,0x06,0x01,0x71,0x02,0x10,0x01,0x74,0x02,0x13,//1
             -45~149
 417             0x01,0x77,0x02,0x16,0x01,0x79,0x02,0x19,0x01,0x82,0x02,0x22,0x01,0x84,0x02,0x25,0x01,0x87,0x02,0x29,//1
             -50~154
 418             0x01,0x90,0x02,0x32,0x01,0x92,0x02,0x35,0x01,0x95,0x02,0x39,0x01,0x98,0x02,0x42,0x02,0x01,0x02,0x45,//1
             -55~159
 419             0x02,0x03,0x02,0x49,0x02,0x06,0x02,0x52,0x02,0x09,0x02,0x55,0x02,0x12,0x02,0x59,0x02,0x15,0x02,0x62,//1
             -60~164
 420             0x02,0x17,0x02,0x66,0x02,0x20,0x02,0x69,0x02,0x23,0x02,0x73,0x02,0x26,0x02,0x76,0x02,0x29,0x02,0x80,//1
             -65~169
 421             0x02,0x32,0x02,0x84,0x02,0x35,0x02,0x87,0x02,0x38,0x02,0x91,0x02,0x41,0x02,0x94,0x02,0x44,0x02,0x98,//1
             -70~174
 422             0x02,0x47,0x03,0x02,0x02,0x50,0x03,0x05,0x02,0x53,0x03,0x09,0x02,0x56,0x03,0x13,0x02,0x59,0x03,0x17,//1
             -75~179
 423             0x02,0x62,0x03,0x20,0x02,0x65,0x03,0x24,0x02,0x68,0x03,0x28,0x02,0x72,0x03,0x32,0x02,0x75,0x03,0x36,//1
             -80~184
 424             0x02,0x78,0x03,0x40,0x02,0x81,0x03,0x44,0x02,0x84,0x03,0x48,0x02,0x88,0x03,0x52,0x02,0x91,0x03,0x56,//1
             -85~189
 425             0x02,0x94,0x03,0x60,0x02,0x98,0x03,0x64,0x03,0x01,0x03,0x68,0x03,0x04,0x03,0x72,0x03,0x08,0x03,0x76,//1
             -90~194
 426             0x03,0x11,0x03,0x80,0x03,0x14,0x03,0x84,0x03,0x18,0x03,0x88,0x03,0x21,0x03,0x92,0x03,0x25,0x03,0x97,//1
             -95~199
 427             0x03,0x28,0x04,0x01,//200~204
 428             };
 429          
 430          
 431          /* 延时2微秒,不精确 */
 432          void	delay2us( )
 433          {
 434   1      	unsigned char i;
 435   1      	for ( i = 2; i != 0; i -- );
C51 COMPILER V6.12  CH375PRT                                                               07/10/2006 13:52:42 PAGE 12  

 436   1      }
 437          
 438          /* 延时1微秒,不精确 */
 439          void	delay1us( )
 440          {
 441   1      	unsigned char i;
 442   1      	for ( i = 1; i != 0; i -- );
 443   1      }
 444          
 445          /* 以毫秒为单位延时,不精确,适用于24MHz时钟 */
 446          void	mDelaymS( unsigned char delay )
 447          {
 448   1      	unsigned char	i, j, c;
 449   1      	for ( i = delay; i != 0; i -- ) {
 450   2      		for ( j = 200; j != 0; j -- ) c += 3;  /* 在24MHz时钟下延时500uS */
 451   2      		for ( j = 200; j != 0; j -- ) c += 3;  /* 在24MHz时钟下延时500uS */
 452   2      	}
 453   1      }
 454          
 455          /* 基本操作 */
 456          
 457          void CH375_WR_CMD_PORT( unsigned char cmd ) {  /* 向CH375的命令端口写入命令,周期不小于4uS,如果单片机较快则
             -延时 */
 458   1      	delay2us();
 459   1      	CH375_CMD_PORT=cmd;
 460   1      	delay2us();
 461   1      }
 462          
 463          void CH375_WR_DAT_PORT( unsigned char dat ) {  /* 向CH375的数据端口写入数据,周期不小于1.5uS,如果单片机较快
             -则延时 */
 464   1      	CH375_DAT_PORT=dat;
 465   1      	delay1us();  /* 因为MCS51单片机较慢所以实际上无需延时 */
 466   1      }
 467          
 468          unsigned char CH375_RD_DAT_PORT() {  /* 从CH375的数据端口读出数据,周期不小于1.5uS,如果单片机较快则延时 */
 469   1      	delay1us();  /* 因为MCS51单片机较慢所以实际上无需延时 */
 470   1      	return( CH375_DAT_PORT );
 471   1      }
 472          
 473          unsigned char wait_interrupt() {  /* 主机端等待操作完成, 返回操作状态 */
 474   1      	unsigned short i;
 475   1      //	while( CH375_INT_WIRE );  /* 查询等待CH375操作完成中断(INT#低电平) */
 476   1      	for ( i = 0; CH375_INT_WIRE != 0; i ++ ) {  /* 如果CH375的中断引脚输出高电平则等待,通过计数防止超时 */
 477   2      		delay1us();
 478   2      
 479   2        	if(RecvStart==2)
 480   2           {
 481   3            RecvStart=0;
 482   3            I2CReadDate();
 483   3            SendTime();
 484   3           }
 485   2         if(RecvFlage==2)
 486   2           {
 487   3         	  I2CWriteStatus();
 488   3            mDelaymS(2);
 489   3      	  I2CWriteTime();
 490   3            mDelaymS(2);
 491   3      	  RecvFlage=0;
 492   3           }
 493   2           if ( i == 0xF000 ) CH375_WR_CMD_PORT( CMD_ABORT_NAK );  /* 如果超时达61mS以上则强行终止NAK重试,中断返
             -回USB_INT_RET_NAK */
 494   2      	}
C51 COMPILER V6.12  CH375PRT                                                               07/10/2006 13:52:42 PAGE 13  

 495   1      	CH375_WR_CMD_PORT( CMD_GET_STATUS );  /* 产生操作完成中断, 获取中断状态 */
 496   1      	return( CH375_RD_DAT_PORT() );
 497   1      }
 498          
 499          #define	TRUE	1
 500          #define	FALSE	0
 501          unsigned char set_usb_mode( unsigned char mode ) {  /* 设置CH375的工作模式 */
 502   1      	unsigned char i;
 503   1      	CH375_WR_CMD_PORT( CMD_SET_USB_MODE );
 504   1      	CH375_WR_DAT_PORT( mode );
 505   1      	for( i=0; i!=100; i++ ) {  /* 等待设置模式操作完成,不超过30uS */
 506   2      		if ( CH375_RD_DAT_PORT()==CMD_RET_SUCCESS ) return( TRUE );  /* 成功 */
 507   2      	}
 508   1      	return( FALSE );  /* CH375出错,例如芯片型号错或者处于串口方式或者不支持 */
 509   1      }
 510          
 511          /* 数据同步 */
 512          /* USB的数据同步通过切换DATA0和DATA1实现: 在设备端, USB打印机可以自动切换;
 513             在主机端, 必须由SET_ENDP6和SET_ENDP7命令控制CH375切换DATA0与DATA1.
 514             主机端的程序处理方法是为设备端的各个端点分别提供一个全局变量,
 515             初始值均为DATA0, 每执行一次成功事务后取反, 每执行一次失败事务后将其复位为DATA1 */
 516          
 517          void toggle_recv( BOOL1 tog ) {  /* 主机接收同步控制:0=DATA0,1=DATA1 */
 518   1      	CH375_WR_CMD_PORT( CMD_SET_ENDP6 );
 519   1      	CH375_WR_DAT_PORT( tog ? 0xC0 : 0x80 );
 520   1      	delay2us();
 521   1      }
 522          
 523          void toggle_send( BOOL1 tog ) {  /* 主机发送同步控制:0=DATA0,1=DATA1 */
 524   1      	CH375_WR_CMD_PORT( CMD_SET_ENDP7 );
 525   1      	CH375_WR_DAT_PORT( tog ? 0xC0 : 0x80 );
 526   1      	delay2us();
 527   1      }
 528          
 529          unsigned char clr_stall( unsigned char endp_addr ) {  /* USB通讯失败后,复位设备端的指定端点到DATA0 */
 530   1      	CH375_WR_CMD_PORT( CMD_CLR_STALL );
 531   1      	CH375_WR_DAT_PORT( endp_addr );
 532   1      	return( wait_interrupt() );
 533   1      }
 534          
 535          /* 数据读写, 单片机读写CH375芯片中的数据缓冲区 */
 536          
 537          unsigned char rd_usb_data( unsigned char *buf ) {  /* 从CH37X读出数据块 */
 538   1      	unsigned char i, len;
 539   1      	CH375_WR_CMD_PORT( CMD_RD_USB_DATA );  /* 从CH375的端点缓冲区读取接收到的数据 */
 540   1      	len=CH375_RD_DAT_PORT();  /* 后续数据长度 */
 541   1      	for ( i=0; i!=len; i++ ) *buf++=CH375_RD_DAT_PORT();
 542   1      	return( len );
 543   1      }
 544          
 545          void wr_usb_data( unsigned char len, unsigned char *buf ) {  /* 向CH37X写入数据块 */
 546   1      	CH375_WR_CMD_PORT( CMD_WR_USB_DATA7 );  /* 向CH375的端点缓冲区写入准备发送的数据 */
 547   1      	CH375_WR_DAT_PORT( len );  /* 后续数据长度, len不能大于64 */
 548   1      	while( len-- ) CH375_WR_DAT_PORT( *buf++ );
 549   1      }
 550          
 551          /* 主机操作 */
 552          unsigned char endp_out_addr;	/* 打印机数据接收端点的端点地址 */
 553          unsigned char endp_out_size;	/* 打印机数据接收端点的端点尺寸 */
 554          BOOL1	tog_send;				/* 打印机数据接收端点的同步标志 */
 555          unsigned char endp_in_addr;		/* 双向打印机发送端点的端点地址,一般不用 */
 556          BOOL1	tog_recv;				/* 双向打印机发送端点的同步标志,一般不用 */
C51 COMPILER V6.12  CH375PRT                                                               07/10/2006 13:52:42 PAGE 14  

 557          
 558          unsigned char issue_token( unsigned char endp_and_pid ) {  /* 执行USB事务 */
 559   1      /* 执行完成后, 将产生中断通知单片机, 如果是USB_INT_SUCCESS就说明操作成功 */
 560   1      	CH375_WR_CMD_PORT( CMD_ISSUE_TOKEN );
 561   1      	CH375_WR_DAT_PORT( endp_and_pid );  /* 高4位目的端点号, 低4位令牌PID */
 562   1      	return( wait_interrupt() );  /* 等待CH375操作完成 */
 563   1      }
 564          
 565          void soft_reset_print( ) {  /* 控制传输:软复位打印机 */
 566   1      	tog_send=tog_recv=0;  /* 复位USB数据同步标志 */
 567   1      	toggle_send( 0 );  /* SETUP阶段为DATA0 */
 568   1      	buffer[0]=0x21; buffer[1]=2; buffer[2]=buffer[3]=buffer[4]=buffer[5]=buffer[6]=buffer[7]=0;  /* SETUP数据
             -,SOFT_RESET */
 569   1      	wr_usb_data( 8, buffer );  /* SETUP数据总是8字节 */
 570   1      	if ( issue_token( ( 0 << 4 ) | DEF_USB_PID_SETUP )==USB_INT_SUCCESS ) {  /* SETUP阶段操作成功 */
 571   2      		toggle_recv( 1 );  /* STATUS阶段,准备接收DATA1 */
 572   2      		if ( issue_token( ( 0 << 4 ) | DEF_USB_PID_IN )==USB_INT_SUCCESS ) return;  /* STATUS阶段操作成功,操作成
             -功返回 */
 573   2      	}
 574   1      }
 575          
 576          #define	USB_INT_RET_NAK		0x2A		/* 00101010B,返回NAK */
 577          void send_data( unsigned int len, unsigned char *buf ) {  /* 主机发送数据块,一次最多64KB */
 578   1      	unsigned char l, s;
 579   1          endp_out_size=64;
 580   1      	while( len ) {  /* 连续输出数据块给USB打印机 */
 581   2      		toggle_send( tog_send );  /* 数据同步 */
 582   2      		l = len>endp_out_size?endp_out_size:len;  /* 单次发送不能超过端点尺寸 */
 583   2      		wr_usb_data( l, buf );  /* 将数据先复制到CH375芯片中 */
 584   2      		s = issue_token( ( endp_out_addr << 4 ) | DEF_USB_PID_OUT );  /* 请求CH375输出数据 */
 585   2      		if ( s==USB_INT_SUCCESS ) {  /* CH375成功发出数据 */
 586   3      			tog_send = ~ tog_send;  /* 切换DATA0和DATA1进行数据同步 */
 587   3      			len-=l;  /* 计数 */
 588   3      			buf+=l;  /* 操作成功 */
 589   3      		}
 590   2      		else if ( s==USB_INT_RET_NAK ) {  /* USB打印机正忙,如果未执行SET_RETRY命令则CH375自动重试,所以不会返回US
             -B_INT_RET_NAK状态 */
 591   3      			/* USB打印机正忙,正常情况下应该稍后重试 */
 592   3      //			 s=get_port_status( );  /*如果有必要,可以检查是什么原因导致打印机忙 */
 593   3      		}
 594   2      		else {  /* 操作失败,正常情况下不会失败 */
 595   3      			clr_stall( endp_out_addr );  /* 清除打印机的数据接收端点,或者 soft_reset_print() */
 596   3      			soft_reset_print(); /* 打印机出现意外错误,软复位 */
 597   3      			tog_send = 0;  /* 操作失败 */
 598   3      		}
 599   2      /* 如果数据量较大,可以定期调用get_port_status()检查打印机状态 */
 600   2      	}
 601   1      }
 602          
 603          
 604          unsigned char get_port_status( ) {  /* 查询打印机端口状态,返回状态码,如果为0FFH则说明操作失败 */
 605   1      /* 返回状态码中: 位5(Paper Empty)为1说明无纸, 位4(Select)为1说明打印机联机, 位3(Not Error)为0说明打印机出

⌨️ 快捷键说明

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