?? 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,如果單片機(jī)較
-快則延時 */
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的數(shù)據(jù)端口寫入數(shù)據(jù),周期不小于1.5uS,如果單片機(jī)
-較快則延時 */
167 1 CH375_DAT_PORT=dat;
168 1 Delay1us(); /* 因?yàn)镸CS51單片機(jī)較慢所以實(shí)際上無需延時 */
169 1 }
170
171 unsigned char CH375_RD_DAT_PORT() { /* 從CH375的數(shù)據(jù)端口讀出數(shù)據(jù),周期不小于1.5uS,如果單片機(jī)較快則延
-時 */
172 1 Delay1us( ); /* 因?yàn)镸CS51單片機(jī)較慢所以實(shí)際上無需延時 */
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 /* 設(shè)置USB工作模式, 必要操作 */
180 1 CH375_WR_CMD_PORT( CMD_SET_USB_MODE );
181 1 CH375_WR_DAT_PORT( 1 ); /* 設(shè)置為使用內(nèi)置固件的USB設(shè)備方式 */
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; /* 置外部信號為低電平觸發(fā) */
188 1 IE0 = 0; /* 清中斷標(biāo)志 */
189 1 EX0 = 1; /* 允許CH375中斷 */
190 1 }
191 //*********************************************************
192
193 //*********************************************************
194 //端點(diǎn)0數(shù)據(jù)上傳
195 void mCh375Ep0Up(){
196 1 unsigned char i,len;
197 1 if(mVarSetupLength){ //長度不為0傳輸具體長度的數(shù)據(jù)
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); //發(fā)出寫端點(diǎn)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]); //循環(huán)寫入數(shù)據(jù)
210 2 }
211 1 else{
212 2 CH375_WR_CMD_PORT(CMD_WR_USB_DATA3); //發(fā)出寫端點(diǎn)0的命令
213 2 CH375_WR_DAT_PORT(0); //上傳0長度數(shù)據(jù),這是一個狀態(tài)階段
214 2 }
215 1 }
216
217
218 //*********************************************************
219
220 //復(fù)制描述符以便上傳
221 void mCh375DesUp(){
222 1 unsigned char k;
223 1 for (k=0; k!=8; k++ ) {
224 2 request.buffer[k]=*VarSetupDescr; //依次復(fù)制8個描述符,
225 2 VarSetupDescr++;
226 2 }
227 1 }
228
229 /* CH375中斷服務(wù)程序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); /* 獲取中斷狀態(tài)并取消中斷請求 */
237 1 InterruptStatus =CH375_RD_DAT_PORT(); /* 獲取中斷狀態(tài) */
238 1 IE0 = 0; /* 清中斷標(biāo)志,對應(yīng)于INT0中斷 */
C51 COMPILER V7.06 USBEX 04/03/2006 15:21:51 PAGE 5
239 1 switch(InterruptStatus){ // 分析中斷狀態(tài)
240 2 case USB_INT_EP2_OUT: // 批量端點(diǎn)下傳成功
241 2 pBuf=mBuf; //數(shù)據(jù)未處理
242 2 CH375_WR_CMD_PORT(CMD_RD_USB_DATA); //發(fā)出讀數(shù)據(jù)命令
243 2 length=CH375_RD_DAT_PORT(); //首先讀出的是長度
244 2 for(len=0;len!=length;len++,pBuf++)*pBuf=CH375_RD_DAT_PORT(); //將數(shù)據(jù)讀入到緩沖區(qū)
245 2 pBuf=mBuf;
246 2 // 演示回傳
247 2 CH375_WR_CMD_PORT(CMD_WR_USB_DATA7); //發(fā)出寫上傳端點(diǎn)命令
248 2 CH375_WR_DAT_PORT(length);
249 2 for(len=0;len!=length;len++,pBuf++)CH375_WR_DAT_PORT(*pBuf); //將數(shù)據(jù)寫入上傳端點(diǎn)
250 2 break;
251 2 case USB_INT_EP2_IN: //批量端點(diǎn)上傳成功,未處理
252 2 CH375_WR_CMD_PORT (CMD_UNLOCK_USB); //釋放緩沖區(qū)
253 2 break;
254 2 case USB_INT_EP1_IN: //中斷端點(diǎn)上傳成功,未處理
255 2 CH375_WR_CMD_PORT (CMD_UNLOCK_USB); //釋放緩沖區(qū)
256 2 break;
257 2 case USB_INT_EP1_OUT: //中斷端點(diǎn)下傳成功,未處理
258 2 CH375_WR_CMD_PORT(CMD_RD_USB_DATA); //發(fā)出讀數(shù)據(jù)命令
259 2 if(length=CH375_RD_DAT_PORT()){ //長度為0跳出
260 3 for(len=0;len!=length;len++)c1=CH375_RD_DAT_PORT(); //取出下傳數(shù)據(jù)
261 3 }
262 2 // CH375_WR_CMD_PORT (CMD_UNLOCK_USB); //釋放緩沖區(qū),如果前面沒有CMD_RD_USB_DATA命令則使用本命令
263 2 break;
264 2 case USB_INT_EP0_SETUP: //控制端點(diǎn)建立成功
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(); // 取出數(shù)據(jù)
268 2 if(length==0x08){
269 3 mVarSetupLength=request.buffer[6]&0x7f; //控制傳輸數(shù)據(jù)長度最大設(shè)置為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)){ //標(biāo)準(zhǔn)請求
275 4 mVarSetupRequest=request.r.bRequest; //暫存標(biāo)準(zhǔn)請求碼
276 4 switch(request.r.bRequest){ // 分析標(biāo)準(zhǔn)請求
277 5 case DEF_USB_CLR_FEATURE: //清除特性
278 5 if((c1=request.r.bmReuestType&0x1F)==0X02){ //不是端點(diǎn)不支持
279 6 switch(request.buffer[4]){
280 7 case 0x82:
281 7 CH375_WR_CMD_PORT(CMD_SET_ENDP7); //清除端點(diǎn)2上傳
282 7 CH375_WR_DAT_PORT(0x8E); //發(fā)命令清除端點(diǎn)
283 7 break;
284 7 case 0x02:
285 7 CH375_WR_CMD_PORT(CMD_SET_ENDP6);
286 7 CH375_WR_DAT_PORT(0x80); //清除端點(diǎn)2下傳
287 7 break;
288 7 case 0x81:
289 7 CH375_WR_CMD_PORT(CMD_SET_ENDP5); //清除端點(diǎn)1上傳
290 7 CH375_WR_DAT_PORT(0x8E);
291 7 break;
292 7 case 0x01:
293 7 CH375_WR_CMD_PORT(CMD_SET_ENDP4); //清除端點(diǎn)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; //不支持的清除特性,置錯誤標(biāo)志
302 6 }
303 5 break;
304 5 case DEF_USB_GET_STATUS: //獲得狀態(tài)
305 5 request.buffer[0]=0;
306 5 request.buffer[1]=0; //上傳狀態(tài)
307 5 break;
308 5 case DEF_USB_SET_ADDRESS: //設(shè)置地址
309 5 VarUsbAddress=request.buffer[2]; //暫存USB主機(jī)發(fā)來的地址
310 5 break;
311 5 case DEF_USB_GET_DESCR: //獲得描述符
312 5 if(request.buffer[3]==1) //設(shè)備描述符上傳
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -