[单片机芯片] 【CH32F207VCT6】开发例程+14 学习一下USB的驱动

[复制链接]
91|0
聪聪哥哥 发表于 2025-10-30 19:11 | 显示全部楼层 |阅读模式
本帖最后由 聪聪哥哥 于 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 功能时,需要合理分配此共享区域,防止出现数据冲突。
三:原理图:
14-1.png
由于开发板上面没有在D+ 上面焊接上拉电阻,所以我在调试的时候焊接了一个1.5k的上拉电阻。
四:软件代码:
4.1 配置USB的时钟,这里必须是48Mhz。
  1. void Set_USBConfig( )
  2. {
  3.     RCC_ClocksTypeDef RCC_ClocksStatus={0};
  4.     RCC_GetClocksFreq(&RCC_ClocksStatus);

  5.     if( RCC_ClocksStatus.SYSCLK_Frequency == 144000000 )
  6.     {
  7.         RCC_USBCLKConfig( RCC_USBCLKSource_PLLCLK_Div3 );
  8.     }
  9.     else if( RCC_ClocksStatus.SYSCLK_Frequency == 96000000 )
  10.     {
  11.         RCC_USBCLKConfig( RCC_USBCLKSource_PLLCLK_Div2 );
  12.     }
  13.     else if( RCC_ClocksStatus.SYSCLK_Frequency == 48000000 )
  14.     {
  15.         RCC_USBCLKConfig( RCC_USBCLKSource_PLLCLK_Div1 );
  16.     }
  17. #if defined (CH32F20x_D8W)
  18.     else if ( RCC_ClocksStatus.SYSCLK_Frequency == 240000000 )
  19.     {
  20.         RCC_USBCLKConfig( RCC_USBCLKSource_PLLCLK_Div5 );
  21.     }
  22. #endif
  23.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_USB, ENABLE);                          
  24. }
可见官方的库,还是很灵活的,可以更具当前的系统时钟,对当前的USB的时钟进行配置。
4.2 USB的初始化部分:
  1. void USB_Init( void )
  2. {
  3.     pInformation = &Device_Info;
  4.     pInformation->ControlState = 2;
  5.     pProperty = &Device_Property;
  6.     pUser_Standard_Requests = &User_Standard_Requests;
  7.     pProperty->Init();
  8. }
4.3 USB的配置如下所示:
  1. void USB_Interrupts_Config(void)
  2. {
  3.         NVIC_InitTypeDef NVIC_InitStructure;
  4.         EXTI_InitTypeDef EXTI_InitStructure;

  5.         EXTI_ClearITPendingBit(EXTI_Line18);
  6.         EXTI_InitStructure.EXTI_Line = EXTI_Line18;
  7.         EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  8.         EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;        
  9.         EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  10.         EXTI_Init(&EXTI_InitStructure);         

  11.         NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn;        
  12.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  13.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  14.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  15.         NVIC_Init(&NVIC_InitStructure);
  16.         
  17.         NVIC_InitStructure.NVIC_IRQChannel = USBWakeUp_IRQn;  
  18.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  19.         NVIC_Init(&NVIC_InitStructure);   
  20. }
五:调试过程中出现的问题:

14-3.png 14-2.png
这里也是使用的官方库直接移植的,发现在使用USB的时候出现了小问题,等等研究一下,看看是哪里出现的,

您需要登录后才可以回帖 登录 | 注册

本版积分规则

110

主题

314

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部