- 博客(19)
- 收藏
- 关注
原创 LWIP一探究竟
Lwip中使用tcpip_msg_type枚举类型定义了系统中可能出现的消息的类型,消息结构msg字段是一个共用体,其中定义了各种消息类型的具体内容,每种类型的消息对应了共用体中的一个字段,其中定义了各种消息类型的具体内容,每种类型的信息对应了共用体中的一个字段,其中注册与删除事件的消息使用了同一个tmo字段.LWIP中的API相关的信息内容很多,不适合直接放在tcpip_msg中,所以Lwip用一个api_msg结构体来描述API消息,在tcpip_msg中只存在指向api_msg结构体的指针.
2024-04-10 22:43:07
999
原创 STM32的CAN外设
我们的CAN控制器支持最高的通讯速率为1Mb/s,可以自动地接收和发送CAN报文,支持使用标准ID和扩展ID地报文,外设中具有3个发送邮箱,发送报文的优先级可以使用软件控制,还可以记录发送的时间,具有两个3级深度的接收FIFO,可使用过滤功能只接受或不接收某些ID号,可配置成自动重发,不支持使用DMA进行数据收发。
2024-04-04 23:13:22
963
原创 CAN的协议层
CAN属于异步通讯,没有时钟信号线,连接在同一个总线网络中的各个节点会像串口异步通讯那样,节点间使用约定好的波特率进行通信,特别的,CAN还会使用“位同步”的方式来抗干扰,吸收误差,实现对总线电平信号进行正确的采样,确保通讯正常。
2024-04-04 02:20:29
895
原创 CAN总线的物理层
通过上图我们可以发现CAN通讯节点是一个控制器和一个收发器构成的,控制器和收发器是由CAN_Rx和CAN_Tx连接的,收发器和CAN总线之间就是CAN_High和CAN_Low信号线相连的。为什么要分隐形电平和显性电平,是因为我们的CAN总线协议物理层只有一对差分线,在一个时刻只能表示一个信号,所以对通讯节点来说,CAN通讯是半双工,收发数据需要分时进行,在同一个时刻,我们只能一个节点发送,其他接收,所以这时候就是类似I2C总线的“线与”特性将使它处于显性电平状态,可以认为显性具有优先的意思,
2024-04-01 21:09:24
360
原创 项目:USB键盘和鼠标的复合设备
第四步,我们的复合设备是两个接口,每个接口就是对应一个HID设备类,因此我们的主机必须对每个接口获取相应的HID描述符与报告描述符,那么怎么样提交这些描述符的数据呢?第二个就是使用多个接口来实现复合设备,每一个接口实现一个功能,这个做法比较复杂,能让我们更加深入的了解USB,所以这次我们使用这种做法来实现复合设备。第三步就是复合设备需要相应总线枚举,我们的主机首先要对设备进行复位,所以会进入Joystick_Reset函数中,加上键盘的端点2的初始化。第二步,我们修改完报告描述符以后就是修改配置描述符,
2024-03-31 21:06:54
1232
1
原创 USB的报告描述符(2)
比如我们的光标大小,形状,颜色,双击速度,轨迹长度等等,这些都不是正常使用鼠标的过程中可以正常改变的,而Feature标签就可以用来描述这些属性(要记住哈,我们鼠标这些特征都是从操作系统层面实现的,并没有在报告描述符中指定,仅仅用来方便理解特征),相当于另外开辟了一个通道来改变设备的特征了。主机与显示设备之间可以有多种数据传输方式。他是一个八位的数据,逻辑值最大定义2,这是一个输入装置,当我们的显示装置状态发生改变的时候,中断端点会产生输入报告,它包含未准备好状态已准备好,不可加载字符错误,相应报告如下。
2024-03-26 22:33:31
606
2
原创 USB的报告描述符(1)
如果我们的设备,将自己枚举成HID设备以后,那么我们的HID描述符是必不可少的,报告描述符也是必需的。报告描述符就是对传输数据的用途与格式的具体定义,他是拥有属于自己的一个格式定义。报告描述符是以标签的方式排列而成,长度不定,后面跟随的括号中为该标签携带的数据。下面是鼠标的报告描述符上述是报告描述符的伪代码,我们实际运行的代码还是编译后的二进制数据。我们可以使用USB-IF提供的HID描述符编辑工具(HID Descripor Tool)快速进行报告描述符的设计与转换。如下图,与上面是一样的。
2024-03-24 17:39:25
1334
原创 HID描述符
键盘,鼠标就是HID设备,它们如果要将自己枚举成HID设备类,就必须要有对应的HID描述符,报告描述符,以及可选的实体描述符。设备描述符的第四个字段(bDeviceClass)就是表示USB设备所属的设备类,如果是0,那么我们就在接口描述符中进一步定义其具体功能为0x03,设置为HID设备。低五位就是表示用户需要用多大的力气才能影响相应的控制项,我们为0的时候就越容易,越大越难,高三位就是进一步修饰身体部位,左手,右手,左脚,右脚。获取特定类描述符的请求数据和之前的标准描述符有所不同,但是结构是一样的。
2024-03-20 23:09:44
1143
原创 USB主机是如何获取设备描述符
当针对设备的时候,我们的wIndex必须为0,当针对设备的接口时候,wIndex字段就要给出对应的端口号,针对设备的端点时候wIndex就要给出相应的端点号,D6和D5都是种类,种类是针对于请求的,其值为0表示USB标准请求.为1就是特定类请求,比如HID设备就有获取报告描述符的请求,他是不属于标准请求的。在USB定义的八种标准请求的表中,bmRequestType,他是具体用途的细分,用来定义请求的性(含传输方向,类型,及接收方),具体如下图。举个例子,我们要获取设备描述符,需要发送的请求是啥呢?
2024-03-19 22:52:53
637
原创 USB接口与端点描述符
主机在第一次发送获取配置描述符的命令时,只会读取配置描述符的前九个字节,它包含了配置描述符以及所有从属的接口,端点(及其他特定类描述符)的总长度。获取其他长度不固定的描述符也是这样分成两步执行如果一个配置描述符不只支持一个接口描述符,并且每个接口描述符都有自己从属的端点描述符,那么我们USB设备在响应USB主机发送获取配置描述符命令时,第一个字段(bLength)表示接口描述符的长度,第二个字段(bDescriptorType)表示描述符类型 此处应该为0x04。
2024-03-17 19:24:18
707
原创 USB配置描述符
我们的主机在枚举过程中会读取设备所支持的所有配置描述符,最后才发送命令来选择一个配置,如果我们选择的配置值与该字段值一样,说明该值对应的配置被激活。第七位 D6 表示USB设备的供电模式,1 就是自供电 它主要供电来源不是USB电源,而是单独配置了一个供电电源接口,0就不是自供电,就是可以USB供电,比如键盘,鼠标啥的。USB主机对于设备描述符的获取是有两次的,第一次只是获取如上图的8个字段,也就是前9个字节,这9个字节就是配置描述符信息(暂时还不包括接口与端点描述符的具体信息),下节讲接口和端点描述符。
2024-03-17 13:35:38
377
原创 USB的设备描述符
第十三个字段(iserialNumber)表示设备序列号字符串描述的索引值,如果没有就是0,它可以区分多个相同设备,就是同一个USB系统连接了多个相同厂家生产的同一型号设备,这些设备的VID,PID,设备的版本号都是一样的,那该怎么区分,厂商会根据该iserialNumber字段中针对每一个产品设置不同的序列号即可,我们ST的官方例程也是这样做的,它根据单片机的唯一96位ID来设置iserialNumber字段。低速设备为8字节,全速可以为8,16,32,64字节,高速设备直接为64字节。
2024-03-17 00:02:05
1083
原创 USB的字符串描述符
如果设备没有字符串描述符 我们索引值必须为0,主机一般分成两个步骤获取字符串描述符,首先从设备获取索引值为0的Joystick_StringLangID这个数组,也就是获得设备支持的语种(可多个语种)然后再向设备其他索引值不为0的字符串描述符,并用选择的语种解析。第三个(bString)是指语种的语言标识符,上面的是0x0409 代表英语 0x0804代表中国,可以设置多个。设备描述符这里的1,2,3对应的是这数组里的1,2,3元素。分别是总的字节长度和描述符种类。1.表示语种的字符串描述符。
2024-03-16 23:57:56
414
原创 USB枚举过程中的各种获取描述符的标准请求
如果确实是获取状态请求,就紧接着判断是获取设备,接口还是端点状态。首先我们判断是不是设备,如果是的话,我们就应该返回“支持唤醒与供电模式与否”的状态数据,所以我们首先取出Current_Feature,这个变量在Joystick_Reset函数中已经设置为了配置描述符数据Joystick_ConfigDescriptor索引值为7的数据,他保存的恰好就是“设备是否支持远程唤醒与自供电模式”那个字节(bmAttributes字段),所以接下来根据Current_Feature来逐步设置数据,最后返回。
2024-03-14 00:16:34
932
原创 USB的初始化
首先注意在这里面定义了几个全局变量,都是很重要的第一个就是 EPindex 用来保存当前的端点号,指出当前传输完成的事务是针对哪个端点,对应我们上面USB_ISTR寄存器中的EP_ID[3:0],实际工作中我们会把其数据读出来放在EPindex中DEVICE_INFO,DEVICE_PROP,USB_STANDARD_REQUESTS 这三个结构体都在usb_core.h。
2024-03-03 20:07:51
1188
1
原创 USB学习笔记
注意: NAK STALL NYET只有设备才可以返回,因为请求都是主机发送的 ,NYET握手包只有在高速设备输出事务中使用,表示设备的本次事务成功接收,但没有足够的缓冲区来接收下一次数据,主机在下一次输出数据的时候,先使用PING令牌包来询问一下是否有足够的接收缓冲区,防止带宽浪费。校验字段是类型字段的。
2024-03-03 01:13:36
819
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人