打印

SOS快崩溃了,虚拟串口有时候可以发送有时候不行,附上代码

[复制链接]
2574|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
清风致影|  楼主 | 2012-12-11 10:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
现在使用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;//出错
        }
    }  
}

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:我在背后默默的看着你 默默的看着你渐去渐远渐无影

162

主题

1163

帖子

2

粉丝