📄 usbci.c
字号:
USB_SendCmd(tmp | USBCMD_SEL_ENDP, 0);
return USB_GetData(tmp | USBDAT_SEL_ENDP);
}
/***************************************************************************************************************
** 函数名称 : USB_SelectClrIntEndpoint() Name : USB_SelectClrIntEndpoint()
** 功能描述 : 选择端点,并获取端点信息和清除对应端点的 Function : select the endpoint, and get the endpoint information
中断 and clear the interrupt of the correspond endpoint
** 输 入 : INT8U endp: 物理端点号 Input : INT8U endp: the physical endpoint number
** 输 出 : 对应端点的信息 Output : the endpoint information
****************************************************************************************************************/
INT8U USB_SelectClrIntEndpoint(INT8U endp)
{
INT8U i;
INT32U tmp = (INT32U)((endp + 0x40) << 16);
USB_SendCmd(tmp | USBCMD_SEL_CLRINT_ENDP, 0);
i = USB_GetData(tmp | USBDAT_SEL_CLRINT_ENDP);
USBEpIntClr = (0x01 << endp);
return i;
}
/***************************************************************************************************************
** 函数名称 : USB_SetEndpointStatus() Name : USB_SetEndpointStatus()
** 功能描述 : 设置端点状态 Function : set endpoint status
** 输 入 : INT8U endp : 物理端点号 Input : INT8U endp : the physical endpoint number
INT8U bStalled: 1 - stall 端点 INT8U bStalled: 1 - stall endpoint
0 - unstall 端点 0 - unstall endpoint
** 输 出 : 无 Output : NULL
****************************************************************************************************************/
void USB_SetEndpointStatus(INT8U endp, INT8U bStalled)
{
INT32U tmp1 = (INT32U)((endp + 0x40) << 16);
INT32U tmp2 = (INT32U)(bStalled << 16);
USB_SendCmd(tmp1 | USBCMD_SET_ENDP_STATUS, tmp2 | USBDAT_SET_ENDP_STATUS);
}
/***************************************************************************************************************
** 函数名称 : USB_ClearBuffer() Name : USB_ClearBuffer()
** 功能描述 : 清除OUT端点缓冲区 Function : clear the OUT endpoint buffer
** 输 入 : 无 Input : NULL
** 输 出 : 一个字节 Output : read a byte
****************************************************************************************************************/
INT8U USB_ClearBuffer(void)
{
/* no data phase */
USB_SendCmd(USBCMD_CLEAR_BUFFER, 0); /* 该命令没有数据阶段 */
return USB_GetData(USBDAT_CLEAR_BUFFER);
}
/***************************************************************************************************************
** 函数名称 : USB_ValidBuffer() Name : USB_ClearBuffer()
** 功能描述 : 使能 IN 端点缓冲区 Function : validate the IN endpoint buffer
** 输 入 : 无 Input : NULL
** 输 出 : 无 Output : NULL
****************************************************************************************************************/
void USB_ValidBuffer(void)
{
USB_SendCmd(USBCMD_VALID_BUFFER, 0);
}
/***********************************************************
端点数据传输 Endpoint Data Transfer
***********************************************************/
/***************************************************************************************************************
** 函数名称 : USB_ReadEndpoint() Name : USB_ReadEndpoint()
** 功能描述 : 读物理端点 Function : Read data from USB endpoint
** 入口参数 : INT8U endp: 物理端点号 Input : INT8U endp: the physical endpoint number
INT8U len : 要读的字节长度 INT8U len : the length that will be read
INT8U *buf: 接收缓冲区 INT8U *buf: receiving buffer
** 输 出 : 实际读到的字节数 Output : the actual length that be read
****************************************************************************************************************/
INT8U USB_ReadEndpoint(INT8U endp, INT8U len, INT8U *buf)
{
INT32U tmp;
INT32U i,j;
INT32U reclen;
/* select logical endpoint and enable read operate */
USBCtrl = (INT32U)((endp >> 1) << 2) | 0x01; /* 选择逻辑端点并使能读操作 */
/* wait for the data ready */
if((endp % 2 == 0))
while((USBRxPLen & 0x00000C00) ==0); /* 等待数据就绪 */
/* get the receive length */
reclen = USBRxPLen & 0x1FF; /* 获取收到的数据的字节长度 */
if (reclen > len)
reclen = len;
/* read data from ep ram */ /* 从 EP RAM 中读取数据 */
for (i = 0; i < (reclen / 4); i++)
{
tmp = USBRxData;
*buf++ = (INT8U)tmp;
*buf++ = (INT8U)(tmp >> 8);
*buf++ = (INT8U)(tmp >> 16);
*buf++ = (INT8U)(tmp >> 24);
}
j = reclen % 4;
if (j != 0)
{
tmp = USBRxData;
for(i = 0; i < j; i++)
*buf++ = (INT8U)(tmp >> (i << 3));
}
/* clear the RxENDPKT bit in USBDevIntClr register */
USBDevIntClr = RxENDPKT; /* 清除 RxENDPKT 位 */
/* clear the OUT buffer */
USB_SelectEndpoint(endp);
USB_ClearBuffer(); /* 清除OUT缓冲区 */
return reclen; /* 返回实际收到的字节数 */
}
/***************************************************************************************************************
** 函数名称 : USB_ReadEndpoint() Name : USB_WriteEndpoint()
** 功能描述 : 向物理端点写入数据 Function : Write data to USB endpoint
** 入口参数 : INT8U endp: 物理端点号 Input : INT8U endp: the physical endpoint number
INT8U len : 要写的字节长度 INT8U len : the length that will be written
INT8U *buf: 发送缓冲区 INT8U *buf: sending buffer
** 输 出 : 实际写入的字节数 Output : the actual length that have being written
****************************************************************************************************************/
INT8U USB_WriteEndpoint(INT8U endp, INT8U len, INT8U *buf)
{
INT32U tmp;
INT32U i,j;
/* select logical endpoint and enable writing operation */
tmp = ((endp >> 1) << 2) | 0x02; /* 选择逻辑端点并使能写操作 */
USBCtrl = (INT32U)tmp;
/* write the length that will be written into endpoint */
USBTxPLen = (INT32U)len; /* 写入要发送的数据的字节长度 */
/* write Data into Transmit Data Register */ /* 写入要发送的数据到发送数据寄存器 */
j = len >> 2;
for(i = 1; i <= j; i++)
{
tmp = (INT32U)*buf++;
tmp += (INT32U)(*buf++ << 8);
tmp += (INT32U)(*buf++ << 16);
tmp += (INT32U)(*buf++ << 24);
USBTxData = tmp;
while((USBTxPLen & 0x3FF) != len - (i << 2));
}
j = len % 4;
if (j != 0)
{
tmp = 0;
for(i = 0; i < j; i++)
{
tmp |= ((INT32U)*buf) << (i << 3);
buf++;
}
USBTxData = tmp;
while((USBTxPLen & 0x3FF) != 0); /* 等待 USBTxPLen 为 0 */
}
if (len != 0)
{
while((USBDevIntSt & TxENDPKT) ==0); /* 等待写入完成 */
USBDevIntClr = TxENDPKT;
}
/* Validate buffer */
USB_SelectEndpoint(endp); /* 使能发送缓冲区 */
USB_ValidBuffer();
return len; /* 返回实际写入长度 */
}
/************************************************************
** Name : disconnect_USB
** Function: disconnect USB bus
************************************************************/
void disconnect_USB(void)
{
USB_SetDevStatus(0x00);
}
/************************************************************
** Name : connect_USB
** Function: connect USB bus
************************************************************/
void connect_USB(void)
{
USB_SetDevStatus(0x01);
}
/************************************************************
** Name : reconnect_USB
** Function: reconnect USB bus
************************************************************/
void reconnect_USB(void)
{
INT32U clk_cnt;
disconnect_USB(); /* disconnect USB bus */
for (clk_cnt = 0;clk_cnt<= 0x1FFFF;clk_cnt++); /* delay */
connect_USB(); /* connect USB bus */
}
/*******************************************************************************************************
** End Of File
********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -