usb_prop.c文件里面,实现对端点的设置。
void Joystick_Reset(void)
{
pInformation->Current_Configuration =0;
pInformation->Current_Interface =0;
pInformation->Current_Feature =Joystick_ConfigDescriptor[7]; //供电模式选择
#ifdefSTM32F10X_CL
OTG_DEV_EP_Init(EP1_IN, OTG_DEV_EP_TYPE_INT, 4);
#else
SetBTABLE(BTABLE_ADDRESS); //分组缓冲区描述表地址设置
SetEPType(ENDP0,EP_CONTROL); //初始化为控制端点类型
SetEPTxStatus(ENDP0,EP_TX_STALL); //端点以STALL分组响应所有的发送请求。
//也就是端点状态设置成发送无效,也就是主机的IN令牌包来的时候,回送一个STALL。
SetEPRxAddr(ENDP0,ENDP0_RXADDR); //设置端点0描述符的接受地址,
SetEPTxAddr(ENDP0,ENDP0_TXADDR); //设置端点0描述符的发送地址
Clear_Status_Out(ENDP0);
//仅用于控制端点 如果STATUS_OUT位被清除,OUT分组可以包含任意长度的数据
SetEPRxCount(ENDP0,Device_Property.MaxPacketSize);
//设置端点0的接受字节寄存器的最大值是64
SetEPRxValid(ENDP0); //设置接受端点有效
SetEPType(ENDP1,EP_INTERRUPT); //初始化为中断端点类型
SetEPTxAddr(ENDP1,ENDP1_TXADDR); //设置发送数据的地址
SetEPTxCount(ENDP1,4); //设置发送的长度
SetEPRxStatus(ENDP1,EP_RX_DIS); //设置接受端点关闭
SetEPTxStatus(ENDP1,EP_TX_NAK); //设置发送端点端点非应答
SetDeviceAddress(0); //设置设备用缺省地址相应
#endif
bDeviceState =ATTACHED; //当前状态连接
}
usb_sil.c的文件里面,主要是使能了如下这些中断
CNTR_CTRM 正确传输(CTR)中断使能 CNTR_WKUPM唤醒中断使能
CNTR_SUSPM 挂起(SUSP)中断使能 CNTR_ERRM 出错中断使能
CNTR_SOFM 帧首中断使能 CNTR_ESOFM 期望帧首中断使能CNTR_RESETM设置此位将向PC主机发送唤醒请求。根据USB协议,如果此位在1ms到15ms内保持有效,主机将对USB模块实行唤醒操作。
uint32_t USB_SIL_Init(void)
{
#ifndef STM32F10X_CL
_SetISTR(0); //清除中断标志
wInterrupt_Mask = IMR_MSK;
//这组寄存器用于定义USB模块的工作模式,中断的处理,设备的地址和读取当前帧的编号
_SetCNTR(wInterrupt_Mask); //设置相应的控制寄存器
#else
OTG_DEV_Init();
#endif
return 0;
}
***************(3)**************
1.获取设备描述符
usb_int.c的文件里面
低优先级中断 在控制中断 批量传输下使用(在单缓冲模式下使用)
当一次正确的OUT,SETUP,IN数据传输完成后,硬件会自动设置此位为NAK状态,使应用程序有足够的时间处理完当前传输的数据后,响应下一个数据分组 |