📄 ch375prt.lst
字号:
-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 + -