当前位置:网站首页 > 编程语言 > 正文

蓝牙hid设备协议(蓝牙hid设备协议关闭还是打开)



使用的芯片是stm32f103c8t6,使用stm32cubemx配置f103的USB HID,为USB传输固件,实现固件升级做准备。这个教程只是教USB HID通信。最终实现的功能:Linux和stm32之间的USB HID通信。

低速设备与全速设备通过硬件上拉电阻区分 。高速设备与全速设备均是 D+上拉 ,高速设备在枚举过程中host 通过高速设备总线特有的电平序列得知设备类型。

PA8需要配置为低电平,这样连接上电脑时,电脑才能识别到usb设备。(如果没配置PA8,电脑识别不出usb设备)

(因为PA8连接了一个三极管,控制上拉电阻。就是PA8给0,就有上拉电阻)

(原理图公司的,放不了)

当PA8配置为低电平时,DIO板子的D-(DP)会连接了上拉电阻,所以在硬件上就决定了板子使用的是low-speed(USB2.0),理论速度:1.5Mb/s。

使用USART1(PA9 PA10)、波特率、8位、无验证位、1位停止位、使用了DMA

USB 时钟配置为 48MHz,且来源最好是外部晶振分频得到,因为外部时钟更准确。

时钟树如下图所示

        

HSE(外部高速时钟) 为 Crystal/Ceramic Resonator(晶振/陶瓷谐振器)

如果使用了stm32CubeMX,这一步很重要

打开stm32芯片的烧录接口,不配置这个,jlink的引脚就不会配置,就会导致无法使用jlink烧录代码。Flash会被锁着。

USB有主机(Host)和设备(Device)之分。一般电脑的USB接口为主机接口,而键盘、鼠标、U盘等则为设备。

STM32F103系列的只有一个USB Device接口,STM32F407系列的有2个USB接口,既可以作为HOST,又可以作为Device,还可以作为OTG接口。所以本DIO设备只能做Device,不能做HOST,且只有一个USB接口。

VID:0X0483(stm32的)

VID是由 USB 实施论坛(USB Implementers Forum)颁发给 USB 设备制造商的唯一标识码,每个制造商都有一个唯一的 VID。VID 通常是一个十六进制的四位数值,例如,Apple 的 VID 是 0x05AC,表示苹果公司。通过 VID,USB 主机可以识别连接的设备是由哪个制造商制造的。(改变VID会使电脑无法识别出是什么设备,除非去申请一个VID)

PID:0X5750

PID 是由设备制造商分配的,用于标识其产品的唯一标识符。每个具体的 USB 设备都应该有一个唯一的 PID。PID 也是一个十六进制的四位数值。通过 VID 和 PID 的组合,USB 主机可以准确地识别连接的具体设备。

这两个标识符的组合确保了在一个 USB 总线上连接多个设备时,每个设备都能够被唯一地识别。

CUSTOM_HID_FS_BINTERVAL(主机读取设备数据时间间隔): 0x5(STM32将数据发送到一个缓存区,而不是直接发送到上位机,而上位机每隔一端时间会来访问缓冲区读取数据。读取时间间隔过快会导致多次数据发送,过慢会导致数据丢失)

USBD_CUSTOM_HID_REPORT (Total length for Report descriptor(INENDPOINT))(报告描述符大小): 2(默认为2,可根据自定义设备描述符的具体大小修改)

USBD_CUSTOMHID_OUTREPORT_BUF_SIZE (Maximum report buffer size)(发送与接收数据大小): 2(默认为2,HID一次最多可以发送64个字节)

官方提供了HID Descriptor Tool (DT)工具生成描述符。

本代码使用的描述符:(usbd_custom_hid_if.c文件里)

这个描述符定义了一个自定义的USB HID报告格式,其中包括了输入(IN)和输出(OUT)(64个字节)。

描述符(Descriptor)是一种结构体数据,用于描述USB设备的特性和功能。描述符是USB通信协议中的重要部分。描述符是USB设备的重要特性和功能的载体,提供了关于设备的详细信息,帮助主机识别、配置和控制USB设备,并确保设备和主机之间的通信能够正常进行。在Linux和STM32通过USB通信时,描述符起着重要的作用,在设备枚举过程中被主机使用来与设备进行通信和配置。

总结:描述符错了,就通信不了

在usbd_customhid.h文件里

ADDR中最高位代表端点的方向,最低位的1对应IN,0对应OUT,剩下7位为端点号,0x81代表端点1为IN Endpoint 1(EP1),这里修改为OUT的端点为Endpoint 2(EP2),两个端点的SIZE也由2改为64(因为描述符写了发送64个字节,所以这里改成0x40,可根据实际需求修改)。

(stm32上的端点要和Linux上写的代码的端点对应上)

在usbd_conf.h文件里

发送缓冲区大小USBD_CUSTOMHID_OUTREPORT_BUF_SIZE改为最大的64byte,另外报告描述符大小USBD_CUSTOM_HID_REPORT_DESC_SIZE改为30(可根据描述符的大小修改)。

在usbd_custom_hid_if.c文件里

l  获取接收数据长度:调用USBD_GetRxCount()函数获取USB设备接收到的数据长度,并存储在USB_Received_Count变量中。

l  限制数据长度:为了确保数据不超出接收缓冲区的大小,使用MIN()函数将接收到的数据长度限制在USB_Recive_Buffer数组的大小范围内。

l  获取USB句柄:定义一个指向USBD_CUSTOM_HID_HandleTypeDef结构体的指针hhid,用于存储USB设备的自定义HID句柄。

l  复制接收数据:使用memcpy()函数将USB设备接收到的数据从USB设备的接收缓冲区hhid->Report_buf复制到用户定义的缓冲区USB_Recive_Buffer中。

l  串口打印数据:调用HAL_UART_Transmit_DMA()函数通过UART串口将接收到的数据打印出来。

l  USB设备接收到数据后,将接收到的数据复制到缓冲区,并通过串口打印出来。

l  调用usb_control_pca9555函数控制DI或DO

总结:USB收到什么,stm32通过串口1打印什么,并根据接收到不同的数据控制DIO。

通过USB发送数据函数:USBD_CUSTOM_HID_SendReport()

&hUsbDeviceFS是指向 USB 设备的 USB 句柄的指针。

USB_Send_Buffer 是用于存储要发送给主机的数据的缓冲区的指针。

64 是要发送的数据的长度,即要发送的报告的字节数。

__HAL_UART_GET_FLAG()函数获取USART1串口的IDLE标志(空闲标志)。

如果IDLE标志被置位(即USART1接收到了空闲线路状态),则执行以下操作

l  清除IDLE标志:调用__HAL_UART_CLEAR_IDLEFLAG()函数清除USART1的IDLE标志。

l  停止DMA传输:调用HAL_UART_DMAStop()函数停止USART1的DMA传输。

l  获取DMA接收计数:通过__HAL_DMA_GET_COUNTER()函数获取USART1接收DMA通道中尚未传输的数据个数。

计算接收数据长度:将接收缓冲区的总大小减去DMA尚未传输的数据个数,得到已接收数据的总数。

l  设置接收完成标志:将接收完成标志recvDndFlag置为1,表示接收完成。

l  通过DMA传输数据:调用HAL_UART_Transmit_DMA()函数通过USART1发送接收到的数据。

l  重置接收相关参数:将接收数据长度和接收完成标志重置为0。

l  清空接收缓冲区:使用memset()函数清空接收缓冲区,以便下一次接收数据使用。

l  重新开启DMA接收:调用HAL_UART_Receive_DMA()函数重新开启USART1的DMA接收功能,以便继续接收数据。

总结:串口1接收到什么就发送出什么

搞到这里,Linux和stm32可以进行usb通信了。

到此这篇蓝牙hid设备协议(蓝牙hid设备协议关闭还是打开)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!

版权声明


相关文章:

  • 反编译exe(反编译exe工具)2025-10-04 23:13:39
  • k8s最新版本是多少(k8s最新版本安装)2025-10-04 23:13:39
  • 打印控件已安装好怎么还是打印不了(打印控件已安装好怎么还是打印不了文件)2025-10-04 23:13:39
  • 颜色代码(颜色代码在线查询器)2025-10-04 23:13:39
  • 位置信息怎么改变自己的定位(位置信息改变最新方法)2025-10-04 23:13:39
  • 进程控制块包含哪些信息类型(进程控制块包含的主要信息有哪些)2025-10-04 23:13:39
  • 蓝牙hid协议 红魔(手机蓝牙hid协议)2025-10-04 23:13:39
  • st7735r 7735s区别(st7388与st7850)2025-10-04 23:13:39
  • 汽车报文怎么看(汽车报文解析)2025-10-04 23:13:39
  • 打印控件是什么意思(打印控件执行出错什么意思)2025-10-04 23:13:39
  • 全屏图片