📄 usbdevci.c
字号:
__usbDevSendCmd(ulTmp | USBCMD_SEL_CLRINT_ENDP, 0);
i = __usbDevGetData(ulTmp | USBDAT_SEL_CLRINT_ENDP);
USBEpIntClr = (unsigned long)(0x01 << ucEpIndex);
return i;
}
/*********************************************************************************************************
** Function name: __usbDevSetEndpointStatus
** Descriptions: 设置端点状态
** input parameters: ucEpIndex 物理端点号
** ucStalled 端点停止位
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void __usbDevSetEndpointStatus (INT8U ucEpIndex, INT8U ucStalled)
{
INT32U ulTmp1 = (INT32U)((ucEpIndex + 0x40) << 16);
INT32U ulTmp2 = (INT32U)(ucStalled << 16);
__usbDevSendCmd(ulTmp1 | USBCMD_SET_ENDP_STATUS, ulTmp2 | USBDAT_SET_ENDP_STATUS);
}
/*********************************************************************************************************
** Function name: __usbDevClearBuffer
** Descriptions: 清除OUT端点缓冲区
** input parameters: 无
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
INT8U __usbDevClearBuffer (void)
{
__usbDevSendCmd(USBCMD_CLEAR_BUFFER, 0); /* 该命令没有数据阶段 */
return __usbDevGetData(USBDAT_CLEAR_BUFFER);
}
/*********************************************************************************************************
** Function name: __usbDevValidBuffer
** Descriptions: 使能 IN 端点缓冲区
** input parameters: 无
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void __usbDevValidBuffer (void)
{
__usbDevSendCmd(USBCMD_VALID_BUFFER, 0);
}
/*********************************************************************************************************
** Function name: __usbDevSoftDisconnect
** Descriptions: 断开与USB总线的连接
** input parameters: 无
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void __usbDevSoftDisconnect (void)
{
__usbDevSetDevStatus(0x00);
}
/*********************************************************************************************************
** Function name: __usbDevSoftConnect
** Descriptions: 连接到USB总线
** input parameters: 无
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void __usbDevSoftConnect (void)
{
__usbDevSetDevStatus(0x01);
}
/*********************************************************************************************************
** Function name: __usbDevSoftReconnect
** Descriptions: 重新连接USB总线
** input parameters: 无
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void __usbDevSoftReconnect (void)
{
INT32U clk_cnt;
__usbDevSoftDisconnect(); /* 断开与USB总线的连接 */
for (clk_cnt = 0;clk_cnt<= 0x1FFFF;clk_cnt++); /* 延时 */
__usbDevSoftConnect(); /* 连接到USB总线 */
}
/*********************************************************************************************************
端点数据传输
*********************************************************************************************************/
/*********************************************************************************************************
** Function name: usbDevReadEndpoint
** Descriptions: 通过指定物理端点读取数据
** input parameters: ucEpIndex 物理端点号
** pucRcvBuf 接收缓冲区指针
** ucReadLen 要读的字节长度
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
INT8U usbDevReadEndpoint (INT8U ucEpIndex,
INT8U *pucRcvBuf,
INT8U ucReadLen)
{
INT32U ulTmp = 0;
INT32U i = 0;
INT32U j = 0;
INT32U ulRcvLen = 0; /* FIFO中已收到的字节数 */
USBCtrl = (INT32U)((ucEpIndex >> 1) << 2 | 0x01); /* 选择逻辑端点并使能读操作 */
if((ucEpIndex % 2 == 0)) {
while((USBRxPLen & 0x00000C00) ==0); /* 等待数据就绪 */
}
ulRcvLen =(INT32U)(USBRxPLen & 0x3FF); /* 获取收到的数据的字节长度 */
if (ulRcvLen > ucReadLen) {
ulRcvLen = ucReadLen;
}
/* 从 EP RAM 中读取数据 */
for (i = 0; i < (ulRcvLen / 4); i++) {
ulTmp =(INT32U)USBRxData;
*pucRcvBuf++ = (INT8U)ulTmp;
*pucRcvBuf++ = (INT8U)(ulTmp >> 8);
*pucRcvBuf++ = (INT8U)(ulTmp >> 16);
*pucRcvBuf++ = (INT8U)(ulTmp >> 24);
}
j = ulRcvLen % 4;
if (j != 0) {
ulTmp = (INT32U)USBRxData;
for(i = 0; i < j; i++) {
*pucRcvBuf++ = (INT8U)(ulTmp >> (i << 3));
}
}
USBDevIntClr = RxENDPKT; /* 清除 RxENDPKT 位 */
__usbDevSelectEndpoint(ucEpIndex);
__usbDevClearBuffer(); /* 清除OUT缓冲区 */
USBCtrl = 0;
return ((INT8U)ulRcvLen); /* 返回实际收到的字节数 */
}
/*********************************************************************************************************
** Function name: usbDevWriteEndpoint
** Descriptions: 向指定物理端点写入数据
** input parameters: ucEpIndex 物理端点号
** pucWriteBuf 发送缓冲区
** ucWriteLen 要写的字节长度
** output parameters: 无
** Returned value: 实际写入的字节数
*********************************************************************************************************/
INT8U usbDevWriteEndpoint (INT8U ucEpIndex,
INT8U *pucWriteBuf,
INT8U ucWriteLen)
{
INT32U ulTmp = 0;
INT32U i = 0;
INT32U j = 0;
ulTmp = ((ucEpIndex >> 1) << 2) | 0x02; /* 选择逻辑端点并使能写操作 */
USBCtrl = (INT32U)ulTmp;
USBTxPLen = (INT32U)ucWriteLen; /* 写入要发送的数据的字节长度 */
j = ucWriteLen >> 2;
for(i = 1; i <= j; i++) {
ulTmp = (INT32U)*pucWriteBuf++;
ulTmp += (INT32U)(*pucWriteBuf++ << 8);
ulTmp += (INT32U)(*pucWriteBuf++ << 16);
ulTmp += (INT32U)(*pucWriteBuf++ << 24);
USBTxData = ulTmp;
while((USBTxPLen & 0x3FF) != (INT8U)(ucWriteLen - (i << 2)));
}
j = ucWriteLen % 4;
if (j != 0) {
ulTmp = 0;
for(i = 0; i < j; i++) {
ulTmp |= ((INT32U)*pucWriteBuf) << (i << 3);
pucWriteBuf++;
}
USBTxData = ulTmp;
while((USBTxPLen & 0x3FF) != 0); /* 等待 USBTxPLen 为 0 */
}
if (ucWriteLen != 0) {
while((USBDevIntSt & TxENDPKT) ==0); /* 等待写入完成 */
USBDevIntClr = TxENDPKT;
}
__usbDevSelectEndpoint(ucEpIndex); /* 使能发送缓冲区 */
__usbDevValidBuffer();
USBCtrl = 0;
return ucWriteLen; /* 返回实际写入长度 */
}
/*********************************************************************************************************
END FILE
*********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -