| 本帖最后由 聪聪哥哥 于 2025-10-30 19:14 编辑 
 一:USB基础知识
 USB ,是英文 Universal Serial BUs(通用串行总线)的缩写,而其中文简称为“通串线,是一个外部总线标准,用于规范电脑与外部设备的连接和通讯。是应用在 PC 领域的接口技术。USB 接口支持设备的即插即用和热插拔功能。
 标准 USB 共四根线组成,除 VCC/GND 外,另外为 D+,D-; 这两根数据线采用的是差分电压的方式进行数据传输的。在 USB 主机上,D-和 D+都是接了 15K 的电阻到低的,所以在没有设备接入的时候,D+、D-均是低电平。而在 USB 设备中,如果是高速设备,则会在 D+上接一个 1.5K 的电阻到 VCC,而如果是低速设备,则会在 D-上接一个 1.5K 的电阻到 VCC。这样当设备接入主机的时候,主机就可以判断是否有设备接入,并能判断设备是高速设备还是低速设备。
 
 USBD 模块是基于 USB2.0 全速设备技术规范,设计的 USB 全速、低速协议通讯控制器。内置硬件自动处理物理信号的反向不归零(NRZI)编码/解码、位填充。控制可驱动出 USB 总线多种状态、协议包收发,并提供自动应答进行流控保证应用程序处理时间等功能。
 二 主要特征:
 符合 USB2.0 全速设备技术规范
 支持 USB 全速 12Mbps、低速 1. 5Mbps 模式
 支持配置 16 个传输通道
 支持端点地址范围 0-15
 支持控制、中断、批量、同步传输
 支持批量/同步端点的双缓冲机制
 USB 挂起、唤醒、恢复操作
 硬件自动进行数据 PID 翻转、传输流控
 帧锁定时钟脉冲生成
 注:USBD 和 CAN 控制器在设计中共享了一个专用的 512 字节 SRAM 区域用于数据的发送和接收,因此同时使用 USBD 和 CAN 功能时,需要合理分配此共享区域,防止出现数据冲突。
 三:原理图:
 
   由于开发板上面没有在D+ 上面焊接上拉电阻,所以我在调试的时候焊接了一个1.5k的上拉电阻。
 四:软件代码:
 4.1 配置USB的时钟,这里必须是48Mhz。
 
 可见官方的库,还是很灵活的,可以更具当前的系统时钟,对当前的USB的时钟进行配置。void Set_USBConfig( )
{
    RCC_ClocksTypeDef RCC_ClocksStatus={0};
    RCC_GetClocksFreq(&RCC_ClocksStatus);
    if( RCC_ClocksStatus.SYSCLK_Frequency == 144000000 )
    {
        RCC_USBCLKConfig( RCC_USBCLKSource_PLLCLK_Div3 );
    }
    else if( RCC_ClocksStatus.SYSCLK_Frequency == 96000000 ) 
    {
        RCC_USBCLKConfig( RCC_USBCLKSource_PLLCLK_Div2 );
    }
    else if( RCC_ClocksStatus.SYSCLK_Frequency == 48000000 ) 
    {
        RCC_USBCLKConfig( RCC_USBCLKSource_PLLCLK_Div1 );
    }
#if defined (CH32F20x_D8W)
    else if ( RCC_ClocksStatus.SYSCLK_Frequency == 240000000 )
    {
        RCC_USBCLKConfig( RCC_USBCLKSource_PLLCLK_Div5 );
    }
#endif
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USB, ENABLE);                          
}
4.2 USB的初始化部分:
 
 4.3 USB的配置如下所示:void USB_Init( void )
{
    pInformation = &Device_Info;
    pInformation->ControlState = 2;
    pProperty = &Device_Property;
    pUser_Standard_Requests = &User_Standard_Requests;
    pProperty->Init();
}
 五:调试过程中出现的问题:void USB_Interrupts_Config(void)
{ 
        NVIC_InitTypeDef NVIC_InitStructure;
        EXTI_InitTypeDef EXTI_InitStructure;
        EXTI_ClearITPendingBit(EXTI_Line18);
        EXTI_InitStructure.EXTI_Line = EXTI_Line18; 
        EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
        EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;        
        EXTI_InitStructure.EXTI_LineCmd = ENABLE;
        EXTI_Init(&EXTI_InitStructure);          
        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);
        
        NVIC_InitStructure.NVIC_IRQChannel = USBWakeUp_IRQn;  
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
        NVIC_Init(&NVIC_InitStructure);   
}
 
     这里也是使用的官方库直接移植的,发现在使用USB的时候出现了小问题,等等研究一下,看看是哪里出现的,
 
 
 |