本帖最后由 聪聪哥哥 于 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。
- 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);
- }
可见官方的库,还是很灵活的,可以更具当前的系统时钟,对当前的USB的时钟进行配置。
4.2 USB的初始化部分:
- void USB_Init( void )
- {
- pInformation = &Device_Info;
- pInformation->ControlState = 2;
- pProperty = &Device_Property;
- pUser_Standard_Requests = &User_Standard_Requests;
- pProperty->Init();
- }
4.3 USB的配置如下所示:
- 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的时候出现了小问题,等等研究一下,看看是哪里出现的,
|