📄 usbci.lst
字号:
218
219
220 /********************************************************************************************************
-*******
221 ** 函数名称 : USB_SelectEndpoint() Name : USB_SelectEndpoint()
222 ** 功能描述 : 选择端点,并获取端点信息 Function : select the endpoint, and get the endpoint infor
-mation
223 ** 输 入 : INT8U endp: 物理端点号 Input : INT8U endp: the physical endpoint number
224 ** 输 出 : 对应端点的信息 Output : the endpoint information
225 *********************************************************************************************************
-*******/
226 INT8U USB_SelectEndpoint(INT8U endp)
227 {
228 1 INT32U tmp = (INT32U)(endp << 16);
229 1
230 1 USB_SendCmd(tmp | USBCMD_SEL_ENDP, 0);
231 1
232 1 return USB_GetData(tmp | USBDAT_SEL_ENDP);
233 1 }
234
ARM COMPILER V2.53, USBCI 28/06/07 09:54:12 PAGE 5
235
236 /********************************************************************************************************
-*******
237 ** 函数名称 : USB_SelectClrIntEndpoint() Name : USB_SelectClrIntEndpoint()
238 ** 功能描述 : 选择端点,并获取端点信息和清除对应端点的 Function : select the endpoint, and get the endpoin
-t information
239 中断 and clear the interrupt of the correspond endpoint
240 ** 输 入 : INT8U endp: 物理端点号 Input : INT8U endp: the physical endpoint number
241 ** 输 出 : 对应端点的信息 Output : the endpoint information
242 *********************************************************************************************************
-*******/
243 INT8U USB_SelectClrIntEndpoint(INT8U endp)
244 {
245 1 INT8U i;
246 1 INT32U tmp = (INT32U)((endp + 0x40) << 16);
247 1
248 1 USB_SendCmd(tmp | USBCMD_SEL_CLRINT_ENDP, 0);
249 1 i = USB_GetData(tmp | USBDAT_SEL_CLRINT_ENDP);
250 1
251 1 USBEpIntClr = (0x01 << endp);
252 1
253 1 return i;
254 1 }
255
256 /********************************************************************************************************
-*******
257 ** 函数名称 : USB_SetEndpointStatus() Name : USB_SetEndpointStatus()
258 ** 功能描述 : 设置端点状态 Function : set endpoint status
259 ** 输 入 : INT8U endp : 物理端点号 Input : INT8U endp : the physical endpoint number
260 INT8U bStalled: 1 - stall 端点 INT8U bStalled: 1 - stall endpoint
261 0 - unstall 端点 0 - unstall endpoint
262 ** 输 出 : 无 Output : NULL
263 *********************************************************************************************************
-*******/
264 void USB_SetEndpointStatus(INT8U endp, INT8U bStalled)
265 {
266 1 INT32U tmp1 = (INT32U)((endp + 0x40) << 16);
267 1 INT32U tmp2 = (INT32U)(bStalled << 16);
268 1
269 1 USB_SendCmd(tmp1 | USBCMD_SET_ENDP_STATUS, tmp2 | USBDAT_SET_ENDP_STATUS);
270 1 }
271
272
273 /********************************************************************************************************
-*******
274 ** 函数名称 : USB_ClearBuffer() Name : USB_ClearBuffer()
275 ** 功能描述 : 清除OUT端点缓冲区 Function : clear the OUT endpoint buffer
276 ** 输 入 : 无 Input : NULL
277 ** 输 出 : 一个字节 Output : read a byte
278 *********************************************************************************************************
-*******/
279 INT8U USB_ClearBuffer(void)
280 {
281 1 /* no data phase */
282 1 USB_SendCmd(USBCMD_CLEAR_BUFFER, 0); /* 该命令没有数据阶段 */
283 1
284 1 return USB_GetData(USBDAT_CLEAR_BUFFER);
285 1 }
286
287
288 /********************************************************************************************************
-*******
289 ** 函数名称 : USB_ValidBuffer() Name : USB_ClearBuffer()
290 ** 功能描述 : 使能 IN 端点缓冲区 Function : validate the IN endpoint buffer
291 ** 输 入 : 无 Input : NULL
292 ** 输 出 : 无 Output : NULL
ARM COMPILER V2.53, USBCI 28/06/07 09:54:12 PAGE 6
293 *********************************************************************************************************
-*******/
294 void USB_ValidBuffer(void)
295 {
296 1 USB_SendCmd(USBCMD_VALID_BUFFER, 0);
297 1 }
298
299
300 /***********************************************************
301
302 端点数据传输 Endpoint Data Transfer
303
304 ***********************************************************/
305
306 /********************************************************************************************************
-*******
307 ** 函数名称 : USB_ReadEndpoint() Name : USB_ReadEndpoint()
308 ** 功能描述 : 读物理端点 Function : Read data from USB endpoint
309 ** 入口参数 : INT8U endp: 物理端点号 Input : INT8U endp: the physical endpoint number
310 INT8U len : 要读的字节长度 INT8U len : the length that will be read
311 INT8U *buf: 接收缓冲区 INT8U *buf: receiving buffer
312 ** 输 出 : 实际读到的字节数 Output : the actual length that be read
313 *********************************************************************************************************
-*******/
314 INT8U USB_ReadEndpoint(INT8U endp, INT8U len, INT8U *buf)
315 {
316 1 INT32U tmp;
317 1 INT32U i,j;
318 1 INT32U reclen;
319 1
320 1 /* select logical endpoint and enable read operate */
321 1 USBCtrl = (INT32U)((endp >> 1) << 2) | 0x01; /* 选择逻辑端点并使能读操作 */
322 1
323 1 /* wait for the data ready */
324 1 if((endp % 2 == 0)) //判断被读取的物理端点号是否为偶数(偶数继续)
325 1 while((USBRxPLen & 0x00000C00) ==0); /* 等待数据就绪 */
326 1
327 1 /* get the receive length */
328 1 reclen = USBRxPLen & 0x1FF; /* 获取收到的数据的字节长度 */
329 1 if (reclen > len)
330 1 reclen = len;
331 1
332 1 /* read data from ep ram */ /* 从 EP RAM 中读取数据 */
333 1 for (i = 0; i < (reclen / 4); i++)
334 1 {
335 2 tmp = USBRxData;
336 2 *buf++ = (INT8U)tmp;
337 2 *buf++ = (INT8U)(tmp >> 8);
338 2 *buf++ = (INT8U)(tmp >> 16);
339 2 *buf++ = (INT8U)(tmp >> 24);
340 2 }
341 1
342 1 j = reclen % 4; //读取不足4bytes的数据
343 1 if (j != 0)
344 1 {
345 2 tmp = USBRxData;
346 2
347 2 for(i = 0; i < j; i++)
348 2 *buf++ = (INT8U)(tmp >> (i << 3));
349 2 }
350 1
351 1 /* clear the RxENDPKT bit in USBDevIntClr register */
352 1 USBDevIntClr = RxENDPKT; /* 清除 RxENDPKT 位 */
353 1
354 1 /* clear the OUT buffer */
355 1 USB_SelectEndpoint(endp);
ARM COMPILER V2.53, USBCI 28/06/07 09:54:12 PAGE 7
356 1 USB_ClearBuffer(); /* 清除OUT缓冲区 */
357 1
358 1 return reclen; /* 返回实际收到的字节数 */
359 1 }
360
361
362 /********************************************************************************************************
-*******
363 ** 函数名称 : USB_WriteEndpoint() Name : USB_WriteEndpoint()
364 ** 功能描述 : 向物理端点写入数据 Function : Write data to USB endpoint
365 ** 入口参数 : INT8U endp: 物理端点号 Input : INT8U endp: the physical endpoint number
366 INT8U len : 要写的字节长度 INT8U len : the length that will be written
367 INT8U *buf: 发送缓冲区 INT8U *buf: sending buffer
368 ** 输 出 : 实际写入的字节数 Output : the actual length that have being written
369 *********************************************************************************************************
-*******/
370 INT8U USB_WriteEndpoint(INT8U endp, INT8U len, INT8U *buf)
371 {
372 1 INT32U tmp;
373 1 INT32U i,j;
374 1
375 1 /* select logical endpoint and enable writing operation */
376 1 tmp = ((endp >> 1) << 2) | 0x02; /* 选择逻辑端点并使能写操作 */
377 1 USBCtrl = (INT32U)tmp;
378 1
379 1 /* write the length that will be written into endpoint */
380 1 USBTxPLen = (INT32U)len; /* 写入要发送的数据的字节长度 */
381 1
382 1 /* write Data into Transmit Data Register */ /* 写入要发送的数据到发送数据寄存器 */
383 1 j = len >> 2;
384 1 for(i = 1; i <= j; i++)
385 1 {
386 2 tmp = (INT32U)*buf++;
387 2 tmp += (INT32U)(*buf++ << 8);
388 2 tmp += (INT32U)(*buf++ << 16);
389 2 tmp += (INT32U)(*buf++ << 24);
390 2 USBTxData = tmp;
391 2
392 2 while((USBTxPLen & 0x3FF) != len - (i << 2));
393 2 }
394 1
395 1 j = len % 4;
396 1 if (j != 0)
397 1 {
398 2 tmp = 0;
399 2 for(i = 0; i < j; i++)
400 2 {
401 3 tmp |= ((INT32U)*buf) << (i << 3);
402 3 buf++;
403 3 }
404 2 USBTxData = tmp;
405 2
406 2 while((USBTxPLen & 0x3FF) != 0); /* 等待 USBTxPLen 为 0 */
407 2
408 2 }
409 1
410 1 if (len != 0)
411 1 {
412 2 while((USBDevIntSt & TxENDPKT) ==0); /* 等待写入完成 */
413 2 USBDevIntClr = TxENDPKT;
414 2 }
415 1
416 1 /* Validate buffer */
417 1 USB_SelectEndpoint(endp); /* 使能发送缓冲区 */
418 1 USB_ValidBuffer();
419 1
ARM COMPILER V2.53, USBCI 28/06/07 09:54:12 PAGE 8
420 1 return len; /* 返回实际写入长度 */
421 1 }
422
423
424 /************************************************************
425 ** Name : disconnect_USB
426 ** Function: disconnect USB bus
427 ************************************************************/
428 void disconnect_USB(void)
429 {
430 1 USB_SetDevStatus(0x00);
431 1 }
432
433 /************************************************************
434 ** Name : connect_USB
435 ** Function: connect USB bus
436 ************************************************************/
437 void connect_USB(void)
438 {
439 1 USB_SetDevStatus(0x01);
440 1 }
441
442 /************************************************************
443 ** Name : reconnect_USB
444 ** Function: reconnect USB bus
445 ************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -