📄 ch375prt.c
字号:
#include <reg51.h>
#include <string.h>
#include <stdio.h>
#include "CH375INC.H"
#define TRUE 1
#define FALSE 0
unsigned char volatile xdata Command _at_ 0xBDF1; /* CH375A命令端口地址 */
unsigned char volatile xdata ChData _at_ 0xBCF0; /* CH375A数据端口地址 */
sbit ChInt0 = P3^2; /* 连接CH375A的INT#引脚,查询CH375A中断状态 */
typedef unsigned char BOOL1;
typedef unsigned char UCHAR;
typedef unsigned short USHORT;
/* 主机操作 */
unsigned char endp_out_addr; /* 打印机数据接收端点的端点地址 */
unsigned char endp_out_size; /* 打印机数据接收端点的端点尺寸 */
BOOL1 tog_send; /* 打印机数据接收端点的同步标志 */
unsigned char endp_in_addr; /* 打印机状态发送端点的端点地址,为0则只支持单向接口 */
BOOL1 tog_recv; /* 打印机状态发送端点的同步标志 */
unsigned char ChBuffer[64]; /* 定义公用缓冲区 */
#define UNKNOWN_USB_DEVICE 0xF1
#define UNKNOWN_USB_PRINT 0xF2
typedef struct _USB_DEVICE_DESCRIPTOR {
UCHAR bLength;
UCHAR bDescriptorType;
USHORT bcdUSB;
UCHAR bDeviceClass;
UCHAR bDeviceSubClass;
UCHAR bDeviceProtocol;
UCHAR bMaxPacketSize0;
USHORT idVendor;
USHORT idProduct;
USHORT bcdDevice;
UCHAR iManufacturer;
UCHAR iProduct;
UCHAR iSerialNumber;
UCHAR bNumConfigurations;
} USB_DEV_DESCR, *PUSB_DEV_DESCR;
typedef struct _USB_CONFIG_DESCRIPTOR {
UCHAR bLength;
UCHAR bDescriptorType;
USHORT wTotalLength;
UCHAR bNumInterfaces;
UCHAR bConfigurationValue;
UCHAR iConfiguration;
UCHAR bmAttributes;
UCHAR MaxPower;
} USB_CFG_DESCR, *PUSB_CFG_DESCR;
typedef struct _USB_INTERF_DESCRIPTOR {
UCHAR bLength;
UCHAR bDescriptorType;
UCHAR bInterfaceNumber;
UCHAR bAlternateSetting;
UCHAR bNumEndpoints;
UCHAR bInterfaceClass;
UCHAR bInterfaceSubClass;
UCHAR bInterfaceProtocol;
UCHAR iInterface;
} USB_ITF_DESCR, *PUSB_ITF_DESCR;
typedef struct _USB_ENDPOINT_DESCRIPTOR {
UCHAR bLength;
UCHAR bDescriptorType;
UCHAR bEndpointAddress;
UCHAR bmAttributes;
USHORT wMaxPacketSize;
UCHAR bInterval;
} USB_ENDP_DESCR, *PUSB_ENDP_DESCR;
typedef struct _USB_CONFIG_DESCRIPTOR_LONG {
USB_CFG_DESCR cfg_descr;
USB_ITF_DESCR itf_descr;
USB_ENDP_DESCR endp_descr[4];
} USB_CFG_DESCR_LONG, *PUSB_CFG_DESCR_LONG;
/*12MHz晶振时,延时2微秒 */
void delay2us( )
{
unsigned char i;
for ( i = 2; i != 0; i -- );
}
/* 12MHz晶振时,延时1微秒 */
void delay1us( )
{
unsigned char i;
for ( i = 1; i != 0; i -- );
}
/* 12MHz晶振时,延时100毫秒*/
void delay100ms( )
{
unsigned char i, j, c;
for ( i = 200; i != 0; i -- ) for ( j = 200; j != 0; j -- ) c+=3;
}
/* 基本操作 */
void WrCommand( unsigned char cmd ) { /* 向CH375的命令端口写入命令*/
delay2us();
Command=cmd;
delay2us();
}
void WrData( unsigned char dat ) { /* 向CH375A的数据端口写入数据*/
ChData=dat;
delay1us(); /* MCS51单片机较慢,可以无需延时 */
}
unsigned char RdData() { /* 从CH375A的数据端口读出数据*/
delay1us(); /*MCS51单片机较慢,可以无需延时 */
return( ChData );
}
unsigned char WaitInt() { /* 主机端等待操作完成, 返回操作状态 */
while( ChInt0 ); /* 查询等待CH375A操作完成中断(INT#低电平) */
WrCommand( CMD_GET_STATUS ); /* 产生操作完成中断, 获取中断状态 */
return( RdData() );
}
unsigned char set_usb_mode( unsigned char mode ) { /* 设置CH375A的工作模式 */
unsigned char i;
WrCommand( CMD_SET_USB_MODE );
WrData( mode );
for( i=0; i!=100; i++ ) { /* 延时,等待操作完成,不超过30uS */
if ( RdData()==CMD_RET_SUCCESS ) return( TRUE ); /* 成功 */
}
return( FALSE ); /* CH375A出错*/
}
/* 数据同步 */
/* USB的数据同步通过切换DATA0和DATA1实现: 在设备端, USB打印机可以自动切换;
在主机端, 必须由SET_ENDP6和SET_ENDP7命令控制CH375切换DATA0与DATA1.
主机端的程序处理方法是为设备端的各个端点分别提供一个全局变量,
初始值均为DATA0, 每执行一次成功事务后取反, 每执行一次失败事务后将其复位为DATA1 */
void toggle_recv( BOOL1 tog ) { /* 主机接收同步控制:0=DATA0,1=DATA1 */
WrCommand( CMD_SET_ENDP6 );
WrData( tog ? 0xC0 : 0x80 );
delay2us();
}
void toggle_send( BOOL1 tog ) { /* 主机发送同步控制:0=DATA0,1=DATA1 */
WrCommand( CMD_SET_ENDP7 );
WrData( tog ? 0xC0 : 0x80 );
delay2us();
}
unsigned char clr_stall( unsigned char endp_addr ) { /* USB通讯失败后,复位设备端的指定端点到DATA0 */
WrCommand( CMD_CLR_STALL );
WrData( endp_addr );
return( WaitInt() );
}
/* 数据读写, 单片机读写CH375芯片中的数据缓冲区 */
unsigned char rd_usb_data( unsigned char *buf ) { /* 从CH37X读出数据块 */
unsigned char i, len;
WrCommand( CMD_RD_USB_DATA ); /* 从CH375的端点缓冲区读取接收到的数据 */
len=RdData(); /* 后续数据长度 */
for ( i=0; i!=len; i++ ) *buf++=RdData();
return( len );
}
void wr_usb_data( unsigned char len, unsigned char *buf ) { /* 向CH37X写入数据块 */
WrCommand( CMD_WR_USB_DATA7 ); /* 向CH375的端点缓冲区写入准备发送的数据 */
WrData( len ); /* 后续数据长度, len不能大于64 */
while( len-- ) WrData( *buf++ );
}
/* 主机操作 */
unsigned char issue_token( unsigned char endp_and_pid ) { /* 执行USB事务 */
/* 执行完成后, 将产生中断通知单片机, 如果是USB_INT_SUCCESS就说明操作成功 */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -