📄 ch375.lst
字号:
C51 COMPILER V7.06 CH375 04/07/2006 09:06:59 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE CH375
OBJECT MODULE PLACED IN E:\PROJECT\USB_MOUSE\CH375.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE E:\PROJECT\USB_MOUSE\CH375.C DB SB OE
stmt level source
1 #ifndef __CH375_C__
2 #define __CH375_C__
3 #endif
4
5 #include "head.h"
6 #include "ch375inc.h"
7 #include "usbDef.h"
8 #include "descriptor.h"
9 #include "ch375.h"
10 #include "mcuFun.h"
11 #include "uart.h"
12
13 #define CMD_PORT XBYTE[0x7fff]
14 #define DAT_PORT XBYTE[0x3fff]
15
16
17 extern uint8 eaCount, debug;
18 extern uint16 tCount;
19 extern uint8 idata ep1Buf[8];
20
21 extern unsigned char RECV_LEN; // 刚接收到的数据的长度
22 extern unsigned char RECV_BUFFER[ CH375_MAX_DATA_LEN ]; /* 数据缓冲区,用于保存接收到的下传数据,长度为0到6
-4字节 */
23 extern unsigned char *cmd_buf;
24 extern unsigned char *ret_buf;
25 extern unsigned char mVarSetupRequest; // USB请求码
26 extern unsigned char mVarSetupLength; // 后续数据长度
27 extern unsigned char * VarSetupDescr; // 描述符偏移地址
28 extern unsigned char VarUsbAddress ; //USB设备地址
29 extern bit CH375FLAGERR; //错误清0
30 extern bit CH375CONFLAG; //配置标志
31 extern mREQUEST_PACKET request;
32 sbit led = P1^0;
33 /* 与CH372/CH375有关的基本I/O操作 */
34 /* 向CH375的命令端口写入命令,周期不小于4uS,如果单片机较快则延时 */
35 void CH375_WR_CMD_PORT( unsigned char cmd )
36 {
37 1 _nop_();
38 1 CMD_PORT=cmd;
39 1 }
40
41 //向CH375的数据端口写入数据,周期不小于1.5uS,如果单片机较快则延时
42 void CH375_WR_DAT_PORT( unsigned char dat )
43 {
44 1 _nop_();
45 1 DAT_PORT=dat;
46 1 }
47
48 // 从CH375的数据端口读出数据,周期不小于1.5uS,如果单片机较快则延时
49 unsigned char CH375_RD_DAT_PORT(void)
50 {
51 1 _nop_();
52 1 return(DAT_PORT);
53 1 }
54 //----------------------------------------
C51 COMPILER V7.06 CH375 04/07/2006 09:06:59 PAGE 2
55 //设置CH37X的工作模式
56 //如果设置不成功的话, 指示灯会闪烁
57 //----------------------------------------
58 void set_usb_mode( unsigned char mode )
59 {
60 1 unsigned char i;
61 1 unsigned char RD_Data;
62 1
63 1 CH375_WR_CMD_PORT( CMD_SET_USB_MODE );
64 1 CH375_WR_DAT_PORT( mode );
65 1
66 1 for( i=100; i!=0; i-- ) // 等待设置模式操作完成,不超过30uS
67 1 {
68 2 RD_Data=CH375_RD_DAT_PORT();
69 2 if( RD_Data == CMD_RET_SUCCESS )
70 2 {
71 3 if(debug) uartPrint("set usb mode % ok\n\r", &mode, 1);
72 3 return; // 成功
73 3 }
74 2 }
75 1
76 1 while(1)
77 1 {
78 2 flash_led(); // CH375出错
79 2 }
80 1 }
81
82 //ch375硬复位
83 void disConnect()
84 {
85 1 CH375_WR_CMD_PORT( CMD_RESET_ALL ); //似乎是他模拟了一次插拔
86 1 delay1s();
87 1 }
88
89 //-----------------------------------
90 //CH375初始化子程序
91 //先检查CH375工作是否正常
92 //然后设置工作模式
93 //-----------------------------------
94 void CH375_Init( void )
95 {
96 1 unsigned char i, k;
97 1 unsigned char RD_Data;
98 1
99 1 // 测试CH375是否正常工作
100 1 for( k=100; k!=0; k-- )
101 1 {
102 2 CH375_WR_CMD_PORT( CMD_CHECK_EXIST ); // 测试CH375是否正常工作
103 2 i = 0x5A;
104 2 CH375_WR_DAT_PORT( i ); // 写入测试数据
105 2 i = ~i; // 返回数据应该是测试数据取反
106 2 RD_Data = CH375_RD_DAT_PORT();
107 2 if ( RD_Data != i ) // CH375不正常
108 2 {
109 3 for ( i=5; i!=0; i-- )
110 3 {
111 4 CH375_WR_CMD_PORT( CMD_RESET_ALL ); // 多次重复发命令,执行硬件复位
112 4 }
113 3 delay50ms(); // 延时50ms
114 3 }
115 2 else
116 2 {
C51 COMPILER V7.06 CH375 04/07/2006 09:06:59 PAGE 3
117 3 break;
118 3 }
119 2 }
120 1 if( k==0 )
121 1 {
122 2 while(1)
123 2 {
124 3 flash_led(); // CH375出错
125 3 }
126 2 }
127 1 /*
128 1 #ifdef MY_USB_VENDOR_ID
129 1 #ifdef MY_USB_DEVICE_ID
130 1 // 设置外部自定义的USB设备VID和PID,可选操作,不执行该命令则使用默认的VID和PID,
131 1 // 如果设置使用自定义的ID,那么计算机端驱动程序INF安装文件中的"USB\VID_4348&PID_5537"需要进行类似修改
132 1 CH375_WR_CMD_PORT( CMD_SET_USB_ID ); // 设置外部自定义的USB设备VID和PID,可选操作
133 1 CH375_WR_DAT_PORT( (unsigned char)MY_USB_VENDOR_ID ); // 写入厂商ID的低字节
134 1 CH375_WR_DAT_PORT( (unsigned char)(MY_USB_VENDOR_ID>>8) ); // 写入厂商ID的高字节
135 1 CH375_WR_DAT_PORT( (unsigned char)MY_USB_DEVICE_ID ); // 写入设备ID的低字节
136 1 CH375_WR_DAT_PORT( (unsigned char)(MY_USB_DEVICE_ID>>8) ); // 写入设备ID的高字节
137 1 #endif
138 1 #endif
139 1 */
140 1 /* 设置USB工作模式, 必要操作 */
141 1 set_usb_mode( 1 ); //外部固件模式
142 1 //set_usb_mode( 2 ); //内部固件模式
143 1 }
144
145 //---------------------------------
146 //函数说明: 端点0数据上传
147 //上传的数据的长度放在变量
148 //mVarSetupLength中, 数据放在
149 //结构request中
150 //---------------------------------
151 void mCh375Ep0Up(void)
152 {
153 1 unsigned char i,len;
154 1
155 1 if( mVarSetupLength ) //长度不为0传输具体长度的数据
156 1 {
157 2 if( mVarSetupLength<=8 )
158 2 {
159 3 len=mVarSetupLength;
160 3 mVarSetupLength=0;
161 3 } //长度小于8则传输要求的长度
162 2 else
163 2 {
164 3 len=8;
165 3 mVarSetupLength-=8;
166 3 } //长度大于8则传输8个,切总长度减8
167 2 CH375_WR_CMD_PORT( CMD_WR_USB_DATA3 ); //发出写端点0的命令
168 2 CH375_WR_DAT_PORT( len ); //写入长度
169 2 for( i=0; i!=len; i++ )
170 2 {
171 3 CH375_WR_DAT_PORT( request.buffer[i] ); //循环写入数据
172 3 }
173 2 if(debug) uartPrint("EP0_UP dat: %\n\r", request.buffer, len);
174 2 }
175 1 else
176 1 {
177 2 CH375_WR_CMD_PORT( CMD_WR_USB_DATA3 ); //发出写端点0的命令
178 2 CH375_WR_DAT_PORT( 0 ); //上传0长度数据,这是一个状态阶段
C51 COMPILER V7.06 CH375 04/07/2006 09:06:59 PAGE 4
179 2 if(debug) uartPutStr("NO data left!\n\r");
180 2 }
181 1 }
182 //-------------------------------------
183 //函数名: ep1Up
184 //作用: 端点1上传数据, 把数
185 // 据写入缓冲区一般在调用它后,
186 // 要把缓冲区释放
187 //参数: 要发送的数据长度
188 //-------------------------------------
189 void ep1Up(uint8 len)
190 {
191 1 uint8 i;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -