📄 usbex.lst
字号:
155 // ((unsigned char *)&out)[1] = ((unsigned char *)&in)[0];
156 // ((unsigned char *)&out)[0] = ((unsigned char *)&in)[1];
157 // return( out );
158 //}
159
160 void CH375_WR_CMD_PORT( unsigned char cmd ) { /* 向CH375的命令端口写入命令,周期不小于4uS,如果单片机较
-快则延时 */
161 1 //delay2us();
162 1 CH375_CMD_PORT=cmd;
163 1 Delay2us( );
164 1 }
165
166 void CH375_WR_DAT_PORT( unsigned char dat ) { /* 向CH375的数据端口写入数据,周期不小于1.5uS,如果单片机
-较快则延时 */
167 1 CH375_DAT_PORT=dat;
168 1 Delay1us(); /* 因为MCS51单片机较慢所以实际上无需延时 */
169 1 }
170
171 unsigned char CH375_RD_DAT_PORT() { /* 从CH375的数据端口读出数据,周期不小于1.5uS,如果单片机较快则延
-时 */
172 1 Delay1us( ); /* 因为MCS51单片机较慢所以实际上无需延时 */
173 1 return( CH375_DAT_PORT );
174 1
175 1 }
176 /* CH375初始化子程序 */
C51 COMPILER V7.06 USBEX 04/03/2006 15:21:51 PAGE 4
177 void CH375_Init( )
178 {
179 1 /* 设置USB工作模式, 必要操作 */
180 1 CH375_WR_CMD_PORT( CMD_SET_USB_MODE );
181 1 CH375_WR_DAT_PORT( 1 ); /* 设置为使用内置固件的USB设备方式 */
182 1 for ( ;; ) { /* 等待操作成功,通常需要等待10uS-20uS */
183 2 if ( CH375_RD_DAT_PORT( )==CMD_RET_SUCCESS ) break;
184 2 }
185 1
186 1 /* 下述启用中断,假定CH375连接在INT0 */
187 1 IT0 = 0; /* 置外部信号为低电平触发 */
188 1 IE0 = 0; /* 清中断标志 */
189 1 EX0 = 1; /* 允许CH375中断 */
190 1 }
191 //*********************************************************
192
193 //*********************************************************
194 //端点0数据上传
195 void mCh375Ep0Up(){
196 1 unsigned char i,len;
197 1 if(mVarSetupLength){ //长度不为0传输具体长度的数据
198 2 if(mVarSetupLength<=8){
199 3 len=mVarSetupLength;
200 3 mVarSetupLength=0;
201 3 } //长度小于8则长输要求的长度
202 2 else{
203 3 len=8;
204 3 mVarSetupLength-=8;
205 3 } //长度大于8则传输8个,切总长度减8
206 2 CH375_WR_CMD_PORT(CMD_WR_USB_DATA3); //发出写端点0的命令
207 2 CH375_WR_DAT_PORT(len); //写入长度
208 2 for(i=0;i!=len;i++)
209 2 CH375_WR_DAT_PORT(request.buffer[i]); //循环写入数据
210 2 }
211 1 else{
212 2 CH375_WR_CMD_PORT(CMD_WR_USB_DATA3); //发出写端点0的命令
213 2 CH375_WR_DAT_PORT(0); //上传0长度数据,这是一个状态阶段
214 2 }
215 1 }
216
217
218 //*********************************************************
219
220 //复制描述符以便上传
221 void mCh375DesUp(){
222 1 unsigned char k;
223 1 for (k=0; k!=8; k++ ) {
224 2 request.buffer[k]=*VarSetupDescr; //依次复制8个描述符,
225 2 VarSetupDescr++;
226 2 }
227 1 }
228
229 /* CH375中断服务程序INT0,使用寄存器组1 */
230 void mCH375Interrupt( ) interrupt 0 using 1
231 {
232 1 unsigned char InterruptStatus;
233 1 unsigned char length, c1, len;
234 1 unsigned char *pBuf;
235 1 unsigned char mBuf[64];
236 1 CH375_WR_CMD_PORT(CMD_GET_STATUS); /* 获取中断状态并取消中断请求 */
237 1 InterruptStatus =CH375_RD_DAT_PORT(); /* 获取中断状态 */
238 1 IE0 = 0; /* 清中断标志,对应于INT0中断 */
C51 COMPILER V7.06 USBEX 04/03/2006 15:21:51 PAGE 5
239 1 switch(InterruptStatus){ // 分析中断状态
240 2 case USB_INT_EP2_OUT: // 批量端点下传成功
241 2 pBuf=mBuf; //数据未处理
242 2 CH375_WR_CMD_PORT(CMD_RD_USB_DATA); //发出读数据命令
243 2 length=CH375_RD_DAT_PORT(); //首先读出的是长度
244 2 for(len=0;len!=length;len++,pBuf++)*pBuf=CH375_RD_DAT_PORT(); //将数据读入到缓冲区
245 2 pBuf=mBuf;
246 2 // 演示回传
247 2 CH375_WR_CMD_PORT(CMD_WR_USB_DATA7); //发出写上传端点命令
248 2 CH375_WR_DAT_PORT(length);
249 2 for(len=0;len!=length;len++,pBuf++)CH375_WR_DAT_PORT(*pBuf); //将数据写入上传端点
250 2 break;
251 2 case USB_INT_EP2_IN: //批量端点上传成功,未处理
252 2 CH375_WR_CMD_PORT (CMD_UNLOCK_USB); //释放缓冲区
253 2 break;
254 2 case USB_INT_EP1_IN: //中断端点上传成功,未处理
255 2 CH375_WR_CMD_PORT (CMD_UNLOCK_USB); //释放缓冲区
256 2 break;
257 2 case USB_INT_EP1_OUT: //中断端点下传成功,未处理
258 2 CH375_WR_CMD_PORT(CMD_RD_USB_DATA); //发出读数据命令
259 2 if(length=CH375_RD_DAT_PORT()){ //长度为0跳出
260 3 for(len=0;len!=length;len++)c1=CH375_RD_DAT_PORT(); //取出下传数据
261 3 }
262 2 // CH375_WR_CMD_PORT (CMD_UNLOCK_USB); //释放缓冲区,如果前面没有CMD_RD_USB_DATA命令则使用本命令
263 2 break;
264 2 case USB_INT_EP0_SETUP: //控制端点建立成功
265 2 CH375_WR_CMD_PORT(CMD_RD_USB_DATA);
266 2 length=CH375_RD_DAT_PORT();
267 2 for(len=0;len!=length;len++)request.buffer[len]=CH375_RD_DAT_PORT(); // 取出数据
268 2 if(length==0x08){
269 3 mVarSetupLength=request.buffer[6]&0x7f; //控制传输数据长度最大设置为128
270 3 if((c1=request.r.bmReuestType)&0x40){ //厂商请求,未处理
271 4 }
272 3 if((c1=request.r.bmReuestType)&0x20){ //类请求,未处理
273 4 }
274 3 if(!((c1=request.r.bmReuestType)&0x60)){ //标准请求
275 4 mVarSetupRequest=request.r.bRequest; //暂存标准请求码
276 4 switch(request.r.bRequest){ // 分析标准请求
277 5 case DEF_USB_CLR_FEATURE: //清除特性
278 5 if((c1=request.r.bmReuestType&0x1F)==0X02){ //不是端点不支持
279 6 switch(request.buffer[4]){
280 7 case 0x82:
281 7 CH375_WR_CMD_PORT(CMD_SET_ENDP7); //清除端点2上传
282 7 CH375_WR_DAT_PORT(0x8E); //发命令清除端点
283 7 break;
284 7 case 0x02:
285 7 CH375_WR_CMD_PORT(CMD_SET_ENDP6);
286 7 CH375_WR_DAT_PORT(0x80); //清除端点2下传
287 7 break;
288 7 case 0x81:
289 7 CH375_WR_CMD_PORT(CMD_SET_ENDP5); //清除端点1上传
290 7 CH375_WR_DAT_PORT(0x8E);
291 7 break;
292 7 case 0x01:
293 7 CH375_WR_CMD_PORT(CMD_SET_ENDP4); //清除端点1下传
294 7 CH375_WR_DAT_PORT(0x80);
295 7 break;
296 7 default:
297 7 break;
298 7 }
299 6 }
300 5 else{
C51 COMPILER V7.06 USBEX 04/03/2006 15:21:51 PAGE 6
301 6 CH375FLAGERR=1; //不支持的清除特性,置错误标志
302 6 }
303 5 break;
304 5 case DEF_USB_GET_STATUS: //获得状态
305 5 request.buffer[0]=0;
306 5 request.buffer[1]=0; //上传状态
307 5 break;
308 5 case DEF_USB_SET_ADDRESS: //设置地址
309 5 VarUsbAddress=request.buffer[2]; //暂存USB主机发来的地址
310 5 break;
311 5 case DEF_USB_GET_DESCR: //获得描述符
312 5 if(request.buffer[3]==1) //设备描述符上传
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -