现在使用stm32f103x的单片机做了个虚拟串口和u盘,现在u盘工作正常。
但最近测试发现usb虚拟串口部分处于有时候可以发送有时候不行,调试程序发现有时候发送几个数据后,再发数据就无法发送成功,usb也没有进入中断。
请问是什么原因造成的?
以下是程序代码:
端口地址设置:
虚拟串口用3个端口(1,2,3),大容量用2个(4,5) +端口0
#define EP_NUM (6)
#define BTABLE_ADDRESS (0x00)
/* EP0 */
#define ENDP0_RXADDR (0x60)//6*16
#define ENDP0_TXADDR (0xa0)
/* EP1 */
/* tx buffer base address */
#define ENDP1_TXADDR (0xe0)
/* EP2 */
/* Rx buffer base address */
#define ENDP2_TXADDR (0x120)
#define ENDP3_RXADDR (0x140)//140
#define ENDP4_TXADDR (0x180)//180
#define ENDP5_RXADDR (0x1c0)//1c0
/* CTR service routines */
/* associated to defined endpoints */
//#define EP1_IN_Callback NOP_Process
//#define EP2_IN_Callback NOP_Process
#define EP3_IN_Callback NOP_Process
//#define EP4_IN_Callback NOP_Process
#define EP5_IN_Callback NOP_Process
#define EP6_IN_Callback NOP_Process
#define EP7_IN_Callback NOP_Process
#define EP1_OUT_Callback NOP_Process
#define EP2_OUT_Callback NOP_Process
//#define EP3_OUT_Callback NOP_Process
#define EP4_OUT_Callback NOP_Process
//#define EP5_OUT_Callback NOP_Process
#define EP6_OUT_Callback NOP_Process
#define EP7_OUT_Callback NOP_Process
usb初始化:
void usb_rcc_init(void)
{
/* Select USBCLK source */
RCC_USBCLKConfig(RCC_USBCLKSource_PLLCLK_Div1);//单片机 48m频率
/* Enable the USB clock */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USB, ENABLE);
}
void usb_gpio_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; //开关控制
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
}
void usb_nvic_init(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
端口设置:
void USB_Reset()
{
/* Set the device as not configured */
Device_Info.Current_Configuration = 0;
/* Current Feature initialization */
pInformation->Current_Feature = MASS_ConfigDescriptor[7];
SetBTABLE(BTABLE_ADDRESS);
/* Initialize Endpoint 0 */
SetEPType(ENDP0, EP_CONTROL);
SetEPTxStatus(ENDP0, EP_TX_NAK);
SetEPRxAddr(ENDP0, ENDP0_RXADDR);
SetEPTxAddr(ENDP0, ENDP0_TXADDR);
Clear_Status_Out(ENDP0);
SetEPRxCount(ENDP0, 64);
SetEPRxValid(ENDP0);
// Initialize Endpoint 1
SetEPType(ENDP1, EP_BULK);
SetEPTxAddr(ENDP1, ENDP1_TXADDR);
// SetEPTxCount(ENDP1, 64);
SetEPTxStatus(ENDP1, EP_TX_NAK);
SetEPRxStatus(ENDP1, EP_RX_DIS);
// Initialize Endpoint 2
SetEPType(ENDP2, EP_INTERRUPT);
SetEPTxAddr(ENDP2, ENDP2_TXADDR);
// SetEPTxCount(ENDP2, 32);
SetEPRxStatus(ENDP2, EP_RX_DIS);
SetEPTxStatus(ENDP2, EP_TX_NAK);
// Initialize Endpoint 3
SetEPType(ENDP3, EP_BULK);
SetEPRxAddr(ENDP3, ENDP3_RXADDR);
SetEPRxCount(ENDP3, 64);
SetEPRxStatus(ENDP3, EP_RX_VALID);
SetEPTxStatus(ENDP3, EP_TX_DIS);
/* Initialize Endpoint 4 */
SetEPType(ENDP4, EP_BULK);
SetEPTxAddr(ENDP4, ENDP4_TXADDR);
SetEPRxCount(ENDP4, 64);
SetEPTxStatus(ENDP4, EP_TX_NAK);
SetEPRxStatus(ENDP4, EP_RX_DIS);
/* Initialize Endpoint 5 */
SetEPType(ENDP5, EP_BULK);
SetEPRxAddr(ENDP5, ENDP5_RXADDR);
SetEPRxCount(ENDP5, 64);
SetEPRxStatus(ENDP5, EP_RX_VALID);
SetEPTxStatus(ENDP5, EP_TX_DIS);
/* Set the device to response on default address */
SetDeviceAddress(0);
bDeviceState = ATTACHED;
CBW.dSignature = BOT_CBW_SIGNATURE;
Bot_State = BOT_IDLE;
}
发送中断处理:
void EP1_IN_Callback(void)
{
if(usbstate == USB_BUSY)
{
usbstate = USB_FREE;
}
}
void EP2_IN_Callback(void)
{
}
void EP3_OUT_Callback(void)
{
}
void EP4_IN_Callback(void)
{
Storage_In();
}
void EP5_OUT_Callback(void)
{
Storage_Out();
}
///////////////////////////////////
发送一串数据,数据是小于64个的
void usb_send_string(uint8_t *pindat,uint8_t len)
{
if(bDeviceState != CONFIGURED)
{
return;
}
usbstate = USB_BUSY;
UserToPMABufferCopy(pindat, ENDP1_TXADDR,len);
SetEPTxCount(ENDP1,len);
SetEPTxValid(ENDP1);
int timout = 0;
while( usbstate == USB_BUSY)
{
if(timout++ > 0xffff)
{
return;//出错
}
}
}
|
|