完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
`````` 本帖最后由 friend0720 于 2016-9-23 10:18 编辑 前言 单片机是一门综合技术,它要求学习者具有一定的电子电路基础,和一定的 C 语言或汇编语言基础。当然如果你学习过《微机原理》那就更好了。C 语言是目前单片机开发最常用到的开发语言,因此请务必学好 C 语言。 同时单片机又是一门实践性很强的技术,如果不亲自动手搭建电路编写程序,是很难真正学会单片机的。下面说说单片机学习的主要过程: 1. 确定一款单片机作为自己的学习目标。目前主流8位单片机有stm8、AVR、PIC等。 2. 搜集该型单片机的各种学习资料。比如书籍、论坛帖子、视频教程等。 3. 下载并搭建软件开发环境 4. 购买硬件开发工具、烧录器、调试器、各种元器件。搭建单片机最小系统,编写程序驱动各种片内资源。 5. 扩展外围电路,并为之编写驱动程序。 后续本人将以ATmega16单片机为例,介绍具体的学习过程。下面是未来我们开发板的大致模样。 送给初学者的一句话:“勿在浮沙筑高台” 遥远的海 (待续) 附件加密!请勿下载! ``````
评分
|
||
相关推荐
715 个讨论
|
||
本帖最后由 friend0720 于 2016-6-6 16:57 编辑
CAN 总线 1 CAN 的特点 (1)多主控 总线空闲时,所有的单元都可开始发送消息 最先访问总线的单元可获得发送权 多个单元同时开始发送时,发送高优先级ID消息的单元可获得发送权。 (2)消息的发送 在 CAN 协议中,所有的消息都以固定的格式发送。总线空闲时,所有与总线相连的单元都可以开始发送新消息。两个以上的单元同时开始发送消息时,根据标识符(ID)决定优先级。ID 并不是表示发送的目的地址,而是表示访问总线的消息的优先级。两个以上的单元同时开始发送消息时,对各消息ID的每个位进行逐个仲裁比较。仲裁获胜(被判定为优先级最高)的单元可继续发送消息,仲裁失利的单元则立刻停止发送而进行接收工作。 (3)系统的柔软性 与总线相连的单元没有类似于“地址”的信息。因此在总线上增加单元时,连接在总线上的其它单元的软硬件及应用层都不需要改变。 (4)通信速度 根据整个网络的规模,可设定合适的通信速度。 在同一网络中,所有单元必须设定成统一的通信速度。即使有一个单元的通信速度与其它的不一样,此单元也会输出错误信号,妨碍整个网络的通信。不同网络间则可以有不同的通信速度。 (5)远程数据请求 可通过发送“遥控帧”请求其他单元发送数据。 (6)错误检测功能、错误通知功能、错误恢复功能 所有的单元都可以检测错误(错误检测功能) 检测出错误的单元会立即同时通知其它所有单元(错误通知功能) 正在发送消息的单元一旦检测出错误,会强制结束当前的发送。强制结束的单元会不断反复地重新发送此消息直到成功发送为止(错误恢复功能)。 (7)故障封闭 CAN 可以判定出错误的类型是总线上暂时的数据错误(如外部噪声)还是持续的数据错误(如单元内部故障、驱动器故障、断线等)。由此功能,当总线上发生持续数据错误时,可将引起此故障的单元从总线上隔离出去。 (8)连接 CAN 总线是可同时连接多个单元的总线。可连接的单元总数理论上是没有限制的。但实际上可连接的单元数受总线上的时间延迟及电器负载的限制。降低通信速度,可连接的单元数增加;提高通信速度,则可连接的单元数减少。 |
|
|
|
|
|
本帖最后由 friend0720 于 2016-6-7 16:19 编辑
CAN 总线 2 总线错误 单元始终处于3种状态之一。 (1)主动错误状态 主动错误状态是可以正常参加总线通信的状态。 处于主动错误状态的单元检测出错误时,输出主动错误标志。 (2)被动错误状态 被动错误状态是易引起错误的状态。 处于被动错误状态的单元虽能参加总线通信,但为不妨碍其它单元通信,接收时不能积极地发送错误通知。 处于被动错误状态的单元即使检测出错误,而其它处于主动错误状态的单元如果没发现错误,整个总线也被认为是没有错误的。 处于被动错误状态的单元检测出错误时,输出被动错误标志。 另外,处于被动错误状态的单元在发送结束后不能马上再次开始发送。在开始下次发送前,在间隔帧期间内必须插入“延迟传送”(8个位的隐性位)。 (3)总线关闭态 总线关闭态是不能参加总线上通信的状态。 信息的接收和发送均被禁止。 这些状态依靠发送错误计数和接收错误计数来管理,根据计数值决定进入何种状态。错误状态和计数值的关系如表1及图4所示。 错误计数值 发送错误计数值和接收错误计数值根据一定的条件发生变化。 错误计数值的变动条件如表 2 所示。 一次数据的接收和发送可能同时满足多个条件 错误计数器在错误标志的第一个为出现的时间点上开始计数。 |
|
|
|
|
|
本帖最后由 friend0720 于 2016-6-9 10:16 编辑
CAN 总线 3 CAN 协议显性电平对应逻辑 0 , CAN_H 和 CAN_L 之差为 2.5V左右。 隐性电平对应逻辑 1 , CAN_H 和 CAN_L 之差为 0 V。 隐性电平具有包容的意味,只有所有的单元都输出隐性电平,总线上才为隐性电平。CAN 总线的起止端都有一个 120欧姆的终端电阻,来做阻抗匹配,以减少回波反射。 CAN 协议是通过以下5种类型的帧进行的: 数据帧: 用于发送单元向接收单元传送数据的帧。 遥控帧: 用于接收单元向具有相同 ID 的发送单元请求数据的帧。 错误帧: 用于当检测出错误时向其它单元通知错误的帧。 过载帧: 用于接收单元通知其尚未做好接收准备的帧。 帧间隔: 用于将数据帧及遥控帧与前面的帧分离开来的帧。 |
|
|
|
|
|
本帖最后由 friend0720 于 2016-6-9 14:29 编辑
STM32 bxCAN STM32 自带的 bxCAN ,即基本扩展 CAN,支持 CAN 协议 2.0A 和 2.0B。 STM32 bxCAN 的主要特点有: 支持 CAN 协议 2.0A 和 2.0B 主动模式 波特率最高达 1Mbps 支持时间触发通信 具有3个发送邮箱 具有3级深度的 2 个接收 FIFO 可变的过滤器组(最多 28个) STM32 互联型产品中带有2个 CAN 控制器,增强型产品中只有1个CAN控制器。双CAN的框图如下: 从图中可以看出两个 CAN 都分别拥有自己的发送邮箱和接收 FIFO,但是它们公用 28个滤波器。通过 CAN_FMR 寄存器的设置,可以设置滤波器的分配方式。STM32 互联型有 28 个过滤器组,增强型只有14个,每个滤波器组 X 有 2 个 32 位寄存器, CAN_FxR1 和 CAN_FxR2 组成。 STM32 每个过滤器组的位宽都可以独立配置,以满足应用程序的不同需求。根据位宽的不同,每个过滤器组可提供: 1个32 位过滤器,包括:STDID[10:0]、EXTID[17:0]、IDE和RTR位 2个16位过滤器,包括:STDID[10:0]、IDE、RTR、和 EXTID[17:15]位 此外过滤器可配置为,屏蔽位模式和标识符列表模式。 在屏蔽位模式下,标识符寄存器和屏蔽寄存器一起,指定报文标识符的任何一位,应该按照“必须匹配”或“不用关系”处理。 而在标识符列表模式下,屏蔽寄存器也被当作标识符寄存器用。因此,不是采用一个标识符加一个屏蔽位的方式,而是使用2个标识符寄存器。接收报文标识符的每一位都必须跟过滤器标识符相同。 通过 CAN_FMR 寄存器,可以配置过滤器组的位宽和工作模式,如下图: 为了过滤出一组标识符,应该设置过滤器组工作在屏蔽位模式。 为了过滤出一个标识符,应该设置过滤器组工作在标识符列表模式。 应用程序不用的过滤器组,应该保持在禁用状态。 |
|
|
|
|
|
本帖最后由 friend0720 于 2016-6-10 15:08 编辑
STM32 bxCAN 发送流程 CAN 发送流程为: 程序选择 1 个空置的邮箱 (TIME=1) -> 设置标识符 (ID),数据长度和发送数据 -> 设置 CAN_TIxR 的 TXRQ 位为 1,请求发送 -> 邮箱挂号 (等待成为最高优先级) -> 预定发送 (等待总线空闲) -> 发送-> 邮箱空置。整个流程如下: 上图中,还包含了很多其它处理,不强制退出发送(ABRQ=1)和发送失败处理等。 |
|
|
|
|
|
本帖最后由 friend0720 于 2016-6-10 16:57 编辑
STM32 bxCAN 接收流程 CAN 接收到的有效报文,被存储在3级邮箱深度的 FIFO中。FIFO 完全由硬件来管理,从而节省了 CPU 的处理负荷,简化了软件并保证了数据的一致性。应用程序只能通过读取 FIFO 输出邮箱,来读取 FIFO 中最先收到的报文。这里的有效报文是指那些正确被接收的(直到 EOF 都没有错误)且通过了标识符过滤的报文。CAN 的接收有 2 个 FIFO,每个滤波器组都可以设置其关联的 FIFO,通过 CAN_FFA1R 的设置,可以将滤波器组关联到 FIFO0/FIFO1。 CAN 接收流程为: FIFO 空 -> 收到有效报文 ->挂号_1(存入 FIFO 的一个邮箱,这个由硬件控制,我们不需要理会)->收到有效报文->挂号_2->收到有效报文->挂号_3->收到有效报文->溢出。 这个流程里面,没有考虑从 FIFO 读出报文的情况,实际情况是:我们必须在 FIFO 溢出之前,读出至少 1 个报文,否则下个报文到来,将导致 FIFO 溢出,从而出现报文丢失。每读出 1 个报文,相应的挂号就减1,直到 FIFO 空。CAN 接收流程如下图: FIFO 接收到的报文数,我们可以通过查询 CAN_RFxR 的 FMP 寄存器来得到,只要 FMP 不为 0,我们就可以从 FIFO 读出收到的报文。 |
|
|
|
|
|
本帖最后由 friend0720 于 2016-6-20 08:58 编辑
STM32 CAN 通讯 标示符过滤器设置 屏蔽寄存器全 [转自]http://blog.sina.com.cn/s/blog_ecfa7e220101n3he.html 最近看了下STM32 CAN 通讯 其中标示符过滤器设置大有讲究。特别是你要使用ST库函数时,当过滤器工作在屏蔽模式下,并且你把屏蔽位设了1也就是标示符对应位必须全部匹配才能通过,这是由其要小心。 举个例子吧,过滤器长度为32位,模式为屏蔽模式,假如我要发送的标示符为0x1314;那过滤器设置如下 一、过滤器完全无效 接收到的标示符全部通过 0x1314 二进制码: 0000 0000 0000 0000 0001 0011 0001 0100 CAN_Filter xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx CAN_FilterMask 0000 0000 0000 0000 0000 0000 0000 0000 因为 CAN_FilterMask屏蔽寄存器所有位都是0 ,对应标示符全为“不关心”,也就是接收到数据的ID(标示符)不用与 CAN_Filter寄存器的任何一位进行匹配。 二、过滤器完全有效 接收到的标示符要跟据MASK 寄存器指定需要匹配的位进行比较 部分匹配 0x1314 二进制码: 0000 0000 0000 0000 0001 0011 0001 0100 CAN_Filter xxxx xxxx xxxx xxxx xxxx xxx1 xxxx xxxx CAN_FilterMask 0000 0000 0000 0000 0000 0001 0000 0000 CAN_FilterMask 寄存器指定接收到的标示符要与第8位进行匹配,其他位不管。也就是说接收到的标示符第8位必须为1,否则报文就会被丢弃。 全部匹配 0x1314 二进制码: 0000 0000 0000 0000 0001 0011 0001 0100 CAN_Filter 0000 0000 0000 0000 0000 0011 0001 0100 CAN_FilterMask 1111 1111 1111 1111 1111 1111 1111 1111 这种情况最为严格,接收到的标示符必须每一位都得与过滤器中的标示符的每一位进行匹配,有一位不对报文就会被丢弃。(这个标示符匹配的工作是CAN 模块内部硬件自动完成的) 三、利用ST库进行CAN 过滤器的配置 同样发送端和接收端数据标示符都为0x1314 第一种:过滤器无效,全部通过 static void CAN_Filter_Config(void) CAN_FilterInitStructure.CAN_FilterIdHigh= 0x0000; //要过滤的ID高位 CAN_FilterInitStructure.CAN_FilterMaskIdHigh= 0x0000;//过滤器高16位每位无须匹配
第二种:过滤器每位都必须匹配 static void CAN_Filter_Config(void) CAN_FilterInitStructure.CAN_FilterIdHigh= (((u32)0x1314<<3)&0xFFFF0000)>>16; //要过滤的ID高位 重点来了 在全部匹配的情况下为什么 CAN_FilterIdHigh )中0x1314要左移3位再与0xFFFF0000按位与; CAN_FilterIdLow中0x1314要左移3位再与CAN_ID_EXT CAN_RTR_DATA 按位或咧?实际中我发送数据时把ID标示符就设置为的是0x1314啊,见如下代码: void CAN_SetMsg(void) 那你过滤器里标示符也应该是0x1314才对哦,按照上面那段配置标示符的代码最后存在过滤器标示符寄存器里的值肯定不是0x1314了,原因如下,就是我们用了ST的库,在发送标示符时进行了处理。 uint8_t CAN_Transmit(CAN_TypeDef* CANx, CanTxMsg* TxMessage) if (transmit_mailbox != CAN_TxStatus_NoMailBox)
这是发送时对标示符做的处理,16位时只是先左移21位,然后与TxMessage->RTR(数据帧)按位或就可以了,发送32位时处理的就更多了,左移3位后先与TxMessage->IDE 按位或再与TxMessage->RTR(数据帧)按位或,这就有了我们在设置接收过滤器时为什么有了这样的语句: CAN_FilterInitStructure.CAN_FilterIdLow= (((u32)0x1314<<3)|CAN_ID_EXT|CAN_RTR_DATA)&0xFFFF; //要过滤的ID低位 既然发送时对标示符进行了处理,同样在接收时又把标示符还原回来了: void CAN_Receive(CAN_TypeDef* CANx, uint8_t FIFONumber, CanRxMsg* RxMessage) CANx->sTxMailBox[transmit_mailbox].TIR |= ((TxMessage->ExtId << 3) | 写了这么多太长了,不过还是搞清楚了一些东西,如果在屏蔽模式有效的情况不搞清楚这些,估计你的接收端过滤器怎么都配置不对啦,那调试起来就悲剧了,。。。。 当然如果你的屏蔽位不起作用,那就无所谓了可以随便配置过滤器标示符值,只要过滤器屏蔽寄存器值为0就OK了。。。 |
|
|
|
|
|
|
|
|
|
|
|
本帖最后由 friend0720 于 2016-7-5 14:22 编辑
USB 入门基础知识 [转] 相关名词: 主机(Host) 设备(Device) 接口(Interface) 管道(Pipe) 管道是主机与设备端点数据传输的连接通道,代表了主机的数据缓冲区与设备端点之间交换数据的能力。管道包括数据流管道和消息管道。 Such associations between the host software and a USB device endpoint are called pipes. 端点(Endpoint) 端点,实际上是设备硬件上具有一定大小的数据缓冲区。USB系统中,每一个端点都有唯一的地址,是有设备地址和端点号给出的。默认设置端点0用作控制传输端点,其他端点必须在设备被主机配置后才能使用。 An endpoint is a uniquely(唯一地) identifiable portion of a USB device that is the terminus of a communication flow between the host and device. 问题一:USB的传输线结构是如何的呢? 答案一:一条USB的传输线分别由地线、电源线、D+、D-四条线构成,D+和D-是差分输入线,它使用的是3.3V的电压(注意哦,与CMOS的5V电平不同),而电源线和地线可向设备提供5V电压,最大电流为500MA(可以在编程中设置的,至于硬件的实现机制,就不要管它了)。 问题二:数据是如何在USB传输线里面传送的 答案二:数据在USB线里传送是由低位到高位发送的。 问题三:USB的编码方案? 答案三:USB采用不归零取反来传输数据,当传输线上的差分数据输入0时就取反,输入1时就保持原值,为了确保信号发送的准确性,当在USB总线上发送一个包时,传输设备就要进行位插入(即在数据流中每连续6个1后就插入一个0),从而强迫NRZI码发生变化。这个了解就行了,这些是由专门硬件处理的。 问题四:USB数据通讯结构是怎么样的呢? 答案四:USB数据是由二进制数字串构成的,首先数字串构成域(七种),域再构成包(令牌包、数据包、握手包),包再构成事务(IN、OUT、SETUP),事务最后构成传输(中断传输、同步传输、批量传输和控制传输)。下面简单介绍一下域、包、事务、传输,请注意他们之间的关系。 (一)域:是USB数据最小的单位,由若干位组成,域可分为七种类型: 1、同步域(SYNC),8位,值固定为0000 0001,用于本地时钟与输入同步,标志一个包的起始。 2、标识域(PID),由四位标识符+四位标识符反码构成,表明包的类型和格式,可以计算出USB的标识码有16种,具体分类请看问题五。 3、地址域(ADDR):七位地址,代表了设备在主机上的地址,地址000 0000被命名为零地址,是任何一个设备第一次连接到主机时,在被主机配置、枚举前的默认地址,因此一个USB主机只能接127个设备。 4、端点域(ENDP),4位,由此可知一个USB设备有的端点数量最大为16个。 5、帧号域(FRAM),11位,每一个帧都有一个特定的帧号,帧号域最大容量0x800,帧号连续增加,到0x7ff后从自动0开始,对于同步传输有重要意义。 6、数据域(DATA):长度为0~1023字节,在不同的传输类型中,数据域的长度各不相同,但必须为整数个字节的长度 7、校验域(CRC):对令牌包(CRC5)和数据包(CRC16)中非PID域进行校验的一种方法,CRC校验在通讯中应用很泛,是一种很好的校验方法,至于具体的校验方法请查阅相关资料,只须注意CRC码的除法是模2运算,不同于10进制中的除法 (二)包:由域构成的包有四种类型,分别是令牌包、数据包、握手包和特殊包,前面三种是重要的包,不同的包的域结构不同,介绍如下 1、令牌包:可分为输入包、输出包、设置包和帧起始包(注意这里的输入包是用于设置输入命令的,输出包是用来设置输出命令的,而不是放据数的) 其中输入包、输出包和设置包的格式都是一样的:SYNC+PID+ADDR+ENDP+CRC5 帧起始包的格式:SYNC+PID+11位FRAM+CRC5 2、数据包:分为DATA0包和DATA1包,当USB发送数据的时候,当一次发送的数据长度大于相应端点的容量时,就需要把数据包分为好几个包,分批发送,DATA0包和DATA1包交替发送,即如果第一个数据包是DATA0,那第二个数据包就是DATA1。但也有例外情况,在同步传输中(四类传输类型中之一),所有的数据包都是为DATA0。 格式:SYNC+PID+0~1023字节+CRC16 3、握手包:结构最为简单的包,格式:SYNC+PID (三)事务:分别有IN事务、OUT事务和SETUP事务三大事务,每一种事务都由令牌包、数据包、握手包三个阶段构成,这里用阶段的意思是因为这些包的发送是有一定的时间先后顺序的,事务的三个阶段如下: 1)、令牌包阶段:启动一个输入、输出或设置的事务 2)、数据包阶段:按输入、输出发送相应的数据 3)、握手包阶段:返回数据接收情况,在同步传输的IN和OUT事务中没有这个阶段,这是比较特殊的。 事务的三种类型如下(以下按三个阶段来说明一个事务): 1、SETUT事务: 令牌包阶段——主机发送一个PID为SETUP的设置包给设备,通知设备要接收数据; 数据包阶段——主机给设备发送数据,固定为8个字节的DATA0包,这8个字节的内容就是标准的USB设备请求命令。 握手包阶段——设备-->主机,设备正确接收到主机的命令信息后,返回ACK,此后总线进入空闲状态,并准备下一个传输(在SETUP事务后通常是一个IN或OUT事务构成的传输) 整个过程为: 主机-->设备,SYNC+SETUP+ADDR+ENDP+CRC5 主机-->设备,SYNC+DATA0+8字节+CRC16 设备-->主机,SYNC+ACK/NAK/STALL 2、 IN事务: 令牌包阶段——主机发送一个PID为IN的输入包给设备,通知设备要往主机发送数据; 数据包阶段——设备根据情况会作出三种反应(要注意:数据包阶段也不总是传送数据的,根据传输情况还会提前进入握手包阶段): 1) 设备端点正常,设备往入主机里面发送数据(发送数据太长时拆分成多个IN事务,DATA0与DATA1交替); 2) 设备正在忙,无法往主机发出数据包就发送NAK无效包,IN事务提前结束,到了下一个IN事务才继续; 3) 相应设备端点被禁止,发送错误包STALL包,事务也就提前结束了,总线进入空闲状态。 握手包阶段——主机正确接收到数据之后就会向设备发送ACK包。 整个过程为: 主机-->设备,SYNC+IN+ADDR+ENDP+CRC5 设备-->主机,SYNC+DATA1/0+(0~1023)字节+CRC16或SYNC+NAK/STALL 主机-->设备,SYNC+ACK 3、 OUT事务: 令牌包阶段——主机发送一个PID为OUT的输出包给设备,通知设备要接收数据; 数据包阶段——比较简单,就是主机给设备发送数据(发送数据太长时拆分成多个IN事务,DATA0与DATA1交替); 握手包阶段——设备根据情况会作出三种反应: 1) 设备端点接收正确,设备往入主机返回ACK,通知主机可以发送新的数据,如果数据包发生了CRC校验错误,将不返回任何握手信息; 2) 设备正在忙,无法往主机发出数据包就发送NAK无效包,通知主机再次发送数据; 3) 相应设备端点被禁止,发送错误包STALL包,事务提前结束,总线直接进入空闲状态。 整个过程为: 主机-->设备,SYNC+OUT+ADDR+ENDP+CRC5 主机-->设备,SYNC+DATA1/0+(0~1023)字节+CRC16 设备-->主机,SYNC+ACK/NAK/STALL (四)传输:传输由OUT、IN、SETUP事务其中的事务构成,有四种类型:中断传输、批量传输、同步传输、控制传输,其中中断传输和批量转输的结构一样,同步传输有最简单的结构,而控制传输是最重要的也是最复杂的传输。 1、中断传输:由OUT事务和IN事务构成,用于键盘、鼠标等HID设备的数据传输中 2、批量传输:由OUT事务和IN事务构成,用于大容量数据传输,没有固定的传输速率,也不占用带宽,当总线忙时,USB会优先进行其他类型的数据传输,而暂时停止批量转输。 3、同步传输:由OUT事务和IN事务构成,有两个特殊地方,第一,在同步传输的IN和OUT事务中是没有握手包阶段的;第二,在数据包阶段所有的数据包都为DATA0 4、控制传输:最重要的也是最复杂的传输,控制传输由三个阶段构成(初始设置阶段、可选数据阶段、状态信息步骤),每一个阶段可以看成一个的传输,也就是说控制传输其实是由三个传输构成的,用来于USB设备初次加接到主机之后,主机通过控制传输来交换信息,设置地址和读取设备的描述符,使得主机识别设备,并安装相应的驱动程序,这是每一个USB开发者都要关心的问题。 1)、初始设置步骤:就是一个由SETUP事务构成的传输 2)、可选数据步骤:就是一个由IN或OUT事务构成的传输,这个步骤是可选的,要看初始设置步骤有没有要求读/写数据(由SET事务的数据包步骤发送的标准请求命令决定) 3)、状态信息步骤:顾名思义,这个步骤就是要获取状态信息,由IN或OUT事务构成构成的传输,但是要注意这里的IN和OUT事务和之前的INT和OUT事务有两点不同: a.传输方向相反,通常IN表示设备往主机送数据,OUT表示主机往设备送数据;在这里,IN表示主机往设备送数据,而OUT表示设备往主机送数据,这是为了和可选数据步骤相结合; b.在这个步骤,数据包阶段的数据包都是0长度的DATA1包,即SYNC+PID+CRC16 控制输入时: 1)初始设置步骤: 主机-->设备,SYNC+SETUP+ADDR+ENDP+CRC5 主机-->设备,SYNC+DATA0+8字节+CRC16 设备-->主机,SYNC+ACK/NAK/STALL 2)可选数据步骤:(数据较多时,此步骤可以分多次,此时DATA0/DATA1交替传送) 主机-->设备,SYNC+IN+ADDR+ENDP+CRC5 设备-->主机,SYNC+DATA1+n字节+CRC16或SYNC+NAK/STALL 主机-->设备,SYNC+ACK 3)状态信息步骤: 主机-->设备,SYNC+OUT+ADDR+ENDP+CRC5 主机-->设备,SYNC+DATA1+0字节+CRC16 设备-->主机,SYNC+ACK/NAK/STALL 控制输出时: 1)初始设置步骤: 主机-->设备,SYNC+SETUP+ADDR+ENDP+CRC5 主机-->设备,SYNC+DATA0+8字节+CRC16 设备-->主机,SYNC+ACK/NAK/STALL 2)可选数据步骤:(数据较多时,此步骤可以分多次,此时DATA0/DATA1交替传送) 主机-->设备,SYNC+OUT+ADDR+ENDP+CRC5 主机-->设备,SYNC+DATA1+n字节+CRC16 设备-->主机,SYNC+ACK/NAK/STALL 3)状态信息步骤: 主机-->设备,SYNC+IN+ADDR+ENDP+CRC5 设备-->主机,SYNC+DATA1+0字节+CRC16或SYNC+NAK/STALL 主机-->设备,SYNC+ACK 问题五:标识码有哪些? 答案五:如同前面所说的标识码由四位数据组成,因此可以表示十六种标识码,在USB1.1规范里面,只用了十种标识码,USB2.0使用了十六种标识码,标识码的作用是用来说明包的属性的,标识码是和包联系在一起的,首先简单介绍一下数据包的类型,数据包分为令牌包、数据、握手包和特殊包四种(具体分类请看问题七),标识码分别有以下十六种: 令牌包 : 0x01 输出(OUT)启动一个方向为主机到设备的传输,并包含了设备地址和标号 0x09 输入 (IN) 启动一个方向为设备到主机的传输,并包含了设备地址和标号 0x05 帧起始(SOF)表示一个帧的开始,并且包含了相应的帧号 0x0d 设置(SETUP)启动一个控制传输,用于主机对设备的初始化 数据包 : 0x03 偶数据包(DATA0), 0x0b 奇数据包(DATA1) 握手包: 0x02 确认接收到无误的数据包(ACK) 0x0a 无效,接收(发送)端正在忙而无法接收(发送)信息 0x0e 错误,端点被禁止或不支持控制管道请求 特殊包 0x0C 前导,用于启动下行端口的低速设备的数据传输 问题六:USB主机是如何识别USB设备的? 答案六:当USB设备插上主机时,主机就通过一系列的动作来对设备进行枚举配置(配置是属于枚举的一个态,态表示暂时的状态),这这些态如下: 1、接入态(Attached):全/高速设备D+引脚外接1.5k上拉电阻,低速设备D-引脚外接1.5k上拉电阻,设备接入主机后,主机通过检测信号线上的电平变化来发现设备的接入,并获取设备速度; 2、供电态(Powered):就是给设备供电,分为设备接入时的默认供电值,配置阶段后的供电值(按数据中要求的最大值,可通过编程设置) 3、缺省态(Default):USB在被配置之前,通过缺省地址0与主机进行通信; 4、地址态(Address):经过了配置,USB设备被复位后,就可以按主机分配给它的唯一地址来与主机通信,这种状态就是地址态; 5、配置态(Configured):通过各种标准的USB请求命令来获取设备的各种信息,并对设备的某此信息进行改变或设置。 6、挂起态(Suspended):总线供电设备在3ms内没有总线动作,即USB总线处于空闲状态的话,该设备就要自动进入挂起状态,在进入挂起状态后,总的电流功耗不超过280UA。 问题七:刚才在答案四提到的标准的USB设备请求命令究竟是什么? 答案七:标准的USB设备请求命令是用在控制传输中的“初始设置步骤”里的数据包阶段(即DATA0,由八个字节构成),请看回问答四的内容。标准USB设备请求命令共有11个,大小都是8个字节,具有相同的结构,由5个字段构成(字段是标准请求命令的数据部分),结构如下(括号中的数字表示字节数,首字母bm,b,w分别表示位图、字节,双字节): bmRequestType(1)+bRequest(1)+wvalue(2)+wIndex(2)+wLength(2) 各字段的意义如下: 1、bmRequestType:D7D6D5D4D3D2D1D0 D7=0主机到设备 =1设备到主机; D6D5=00标准请求命令 =01 类请求命令 =10用户定义的命令 =11保留值 D4D3D2D1D0=00000 接收者为设备 =00001 接收者为接口 =00010 接收者为端点 =00011 接收者为其他接收者 =其他 其他值保留 2、bRequest:请求命令代码,在标准的USB命令中,每一个命令都定义了编号,编号的值就为字段的值,编号与命令名称如下(要注意这里的命令代码要与其他字段结合使用,可以说命令代码是标准请求命令代码的核心,正是因为这些命令代码而决定了11个USB标准请求命令): 0) 0 GET_STATUS:用来返回特定接收者的状态 1) 1 CLEAR_FEATURE:用来清除或禁止接收者的某些特性 2) 3 SET_FEATURE:用来启用或激活命令接收者的某些特性 3) 5 SET_ADDRESS:用来给设备分配地址 4) 6 GET_DEscriptOR:用于主机获取设备的特定描述符 5) 7 SET_DEscriptOR:修改设备中有关的描述符,或者增加新的描述符 6) 8 GET_CONFIGURATION:用于主机获取设备当前设备的配置值(注同上面的不同) 7) 9 SET_CONFIGURATION:用于主机指示设备采用的要求的配置 8) 10 GET_INTERFACE:用于获取当前某个接口描述符编号 9) 11 SET_INTERFACE:用于主机要求设备用某个描述符来描述接口 10) 12 SYNCH_FRAME:用于设备设置和报告一个端点的同步帧 以上的11个命令要说得明白真的有一匹布那么长,请各位去看书吧,这里就不多说了,控制传输是USB的重心,而这11个命令是控制传输的重心,所以这11个命令是重中之重,这个搞明白了,USB就算是入门了。 问题八:在标准的USB请求命令中,经常会看到Descriptor,这是什么来的呢? 回答八:Descriptor即描述符,是一个完整的数据结构,可以通过C语言等编程实现,并存储在USB设备中,用于描述一个USB设备的所有属性,USB主机是通过一系列命令来要求设备发送这些信息的。它的作用就是通过如问答节中的命令***作来给主机传递信息,从而让主机知道设备具有什么功能、属于哪一类设备、要占用多少带宽、使用哪类传输方式及数据量的大小,只有主机确定了这些信息之后,设备才能真正开始工作,所以描述符也是十分重要的部分,要好好掌握。标准的描述符有5种,USB为这些描述符定义了编号: 1——设备描述符,描述遵循USB版本号、设备类型等信息,一个USB设备只有一个设备描述符。 2——配置描述符,用于描述一个USB设备的属性和能力等配置信息,如接口总数、当前配置、供电方式、远程唤醒和须获取电流量等,一个USB设备可以有几种相对独立的配置。 3——字符描述符,可选。 4——接口描述符,描述一个接口的属性,如接口类型、使用了哪些非0端点等。一个配置可拥n个接口,每个接口有唯一编号。 5——端点描述符,描述非0端点的属性,包括输入/输出方向、端点号和端点容量。需注意的是端点描述符是作为配置描述符的一部分来返回给主机的,而不能直接通过控制传输中的Get_Descriptor或Set_Descriptor来访问。 上面的描述符之间有一定的关系,一个设备只有一个设备描述符,而一个设备描述符可以包含多个配置描述符,而一个配置描述符可以包含多个接口描述符,一个接口使用了几个端点,就有几个端点描述符。 |
|
|
|
|
|
本帖最后由 friend0720 于 2016-7-6 21:27 编辑
USB 设备描述符 USB 的设备描述符用于表示 USB 设备的总体信息,一个 USB 设备只能有一个设备描述符(Device)。设备描述符中的设置值对该设备中同一传输模式下的所有配置都有效。 USB 设备描述符由 14 个字段组成,总长度固定为 18 个字节,其格式如下: 字段名 长度/字节 地址偏移量 说明 bLength 1 0 描述符的长度(12H) bDescriptorType 1 1 描述符的类型:设备描述符=01H bcdUSB 2 2 USB 规范版本号(采用 BCD 吗) bDeviceClass 1 4 类代码 bDeviceSubClass 1 5 子类代码 bDeviceProtocol 1 6 协议代码 bMaxPackerSize0 1 7 端点0支持最大数据包的长度 idVendor 2 8 供应商 ID idProduct 2 10 产品 ID bcdDevice 2 12 设备版本号(采用BCD码) iManufacturer 1 14 供应商字符串描述符的索引值 iProduct 1 15 产品字符串描述符的索引值 iSerialNumber 1 16 设备序列号字符串描述符的索引值 bNumConfigurations 1 17 所支持的配置数 下面详细说明各个字段的含义。 bLength : 用于表示设备描述符的长度,固定为 18 个字节,即 12H。 bDescriptorType : 用于表示设备描述符的类型值,固定为 01H。 bcdUSB : 用于表示该 USB 设备所遵循的 USB 规范版本号,以 BCD 吗的形式表示。格式为 0xAABC,其中 AA 为主版本号,B为次版本号,C为子次版本号。例如高速USB版本为 USB2.0,即设置为 0200H. bDeviceClass : 用于表示该 USB 设备所属的标准设备类。该字段值在 1~FEH之间的时候,表示 USB 协议中定义的某个设备类,如 03H 表示 HID 设备类;当为 0 时,表示 USB 设备的各个接口互相独立,分别属于不同的设备类,在 USB 固件接口描述符中将进一步定义;当为 FFH 时,表示供应商自定义该设备类。 bDeviceSubClass : 用于表示 USB 设备所属的标准设备子类,主要用于对 USB 设备类进行了更加细致的定义。例如对前面的 HID 设备类,只有一个子类代码 01H。 bDeviceClass=0时,该字段也必须为 0;该字段为 FFH 时,表示由供应商自定义设备子类。 bDeviceProtocol : 用于表示 USB 设备所采用的设备类协议,其值和 bDeviceClass 及 bDeviceSubClass 的值有关。当该字段为 0 时,表示不使用任何设备类协议。如果该 USB 设备属于某个设备和设备子类,则应该继续指明所采用的设备类协议。当该字段为 FFH 时表示设备类协议由供应商自定义。 bMaxPackerSize0 : 用于表示 USB 设备中,端点 0 所支持最大数据包的长度,它以字节为单位。对于低速设备其值为 8;全速设备为 8、16、32或64;对于高速设备其值为 64. idVendor : 用于表示 USB 设备供应商的 ID. USB 组织中规定每种产品都必须包含一个供应商 ID ,这样可以使主机为其加载合适的驱动程序。 idProduct : 用于表示 USB 设备产品的 ID,由设备供应商提供。idProduct 用于表示特定的 USB 设备,在 USB 设备上电的时候可以帮助 USB 主机选择合适的驱动程序。 bcdDevice : 用于表示 USB 设备的版本号,它以 BCD 吗的形式表示。一般由设备供应商指定,在 USB 设备上电的时候可以帮助 USB 主机加载合适的驱动程序。 iManufacturer : 用于表示供应商字符串描述符的索引值。如果没有供应商字符串,可以置为0. iProduct : 用于表示产品字符串描述符的索引值。如果没有产品字符串,可以置为0. iSerialNumber : 用于表示设备序列号字符串描述符的索引值,如果没有,可以置为 0. bNumConfigurations : 用于表示该 USB 设备所支持的配置数。 |
|
|
|
|
|
STM32固件库使用手册(中文版) (把帖子当网盘用了!)
|
|
|
|
|
|
配置描述符 在USB协议中,USB 设备可以有一个或多个配置,每个配置都必须有一个配置描述符(Configuration)。配置描述符用于表示 USB 设备的配置信息。 配置描述符定义 配置描述符由8个字段组成,长度固定为9个字节,其格式如下: 字段名 长度/字节 地址偏移量 说明 bLength 1 0 描述符的长度(09H) bDescriptorType 1 1 描述符类型:配置描述符=02H wTotalLength 2 2 配置信息的总长度 bNumInterfaces 1 4 该配置所支持的接口数 bConfigurationValue 1 5 配置值 iConfiguration 1 6 字符串描述符的索引值 bmAttributes 1 7 配置特性 bMaxPower 1 8 所需要的最大总线电流(2mA为单位) 说明: wTotalLength : 用于表示配置信息的总长度,包括配置描述符、接口描述符和端点描述符长度的总和。 bNumInterfaces : 用于表示所支持的接口数。一般来说, USB 设备的接口至少有一个,因此其最小值为 1 。 bConfigurationValue : 用于表示 USB 设备的配置值。 iConfiguration : 用于指出配置字符串描述符的索引值。如果没有配置字符串可以设置为 0 。 bmAttributes : 用于表示 USB 设备的配置特性。 bmAttributes 是按位寻址的,第六位置1表示使用总线电源;第五位置1表示支持远程唤醒功能; bMaxPower : 因为 USB 总线上获得最大电流为 500mA,因此 bMaxPower 最大值为 250。 |
|
|
|
|
|
本帖最后由 friend0720 于 2016-7-9 10:46 编辑
接口描述符 在 USB 协议中, USB 设备的接口是一个端点的集合,负责完成该 USB 设备的特定功能,例如数据输入和输出。USB 设备的每一个接口都必须有一个接口描述符(Interface),接口描述符用来表示 USB 设备中各个接口的特性,包括接口的端点个数、所属的设备类和子类等。 接口描述符定义 接口描述符由9个字段组成,长度固定为 9 个字节,其格式如下: 字段名 长度/字节 地址偏移量 说明 bLength 1 0 描述符的长度(09H字节) bDescriptorType 1 1 描述符的类型: 接口描述符=04H bInterfaceNumber 1 2 接口号 bAlterateSetting 1 3 可替换设置值 bNumEndpoints 1 4 端点 0 以外的端点数 bInterfaceClass 1 5 类代码 bInterfaceSubClass 1 6 子类代码 bInterfaceProtocol 1 7 协议代码 iInterface 1 8 字符串描述符的索引值 字段含义 bInterfaceClass : 用于表示接口所属的设备类。当 bInterfaceClass 在 1~FEH 范围内时,表示该接口属于 USB 定义的某个设备类;当该字段置为 FFH 时,它表示该设备类是供应商自定义的。 bInterfaceSubClass : 用于表示接口所属的 USB 设备子类。当 bInterfaceClass=0时,该字段必须为 0; bInterfaceProtocol :用于表示接口所采用的 USB 设备类协议,其值和 bInterfaceClass 及 bInterfaceProtocl的值有关。当该字段为0时,表示不使用任何设备类协议。 |
|
|
|
|
|
本帖最后由 friend0720 于 2016-7-12 08:50 编辑
端点描述符 在USB协议中,端点描述符(EndPoint)用于指出USB设备端点的特性,包括其所支持的传输类型、传输方向等信息。USB中规定,端点 0 没有端点描述符,其余端点必须包含端点描述符。 端点描述符定义 端点描述符由6个字段组成,其长度固定为7个字节。端点描述符格式如下: 字段名 长度/字节 地址偏移量 说明 bLength 1 0 描述符的长度(07H) bDescriptorType 1 1 描述符的类型:端点描述符=05H bEndpointAddress 1 2 端点号、传输方向 bmAttributes 1 3 端点特性 wMaxPacketSize 2 4 最大数据包长度 bInterval 1 6 访问间隔 |
|
|
|
|
|
|
|
|
|
|
|
深入解析STM32 USB库.pdf
|
|
|
|
|
|
你正在撰写讨论
如果你是对讨论或其他讨论精选点评或询问,请使用“评论”功能。
使用Keil建立完整的工程,并使用外部中断0触发数码管显示903
151 浏览 0 评论
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-使用AHT20进行环境监测之AHT20传感器介绍
1043 浏览 0 评论
836 浏览 0 评论
874 浏览 1 评论
基于瑞萨FPB-RA4E2智能床头灯项目——1编译环境搭建与点亮驱动ws2812全彩LED
869 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11824 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-30 03:17 , Processed in 1.059153 second(s), Total 77, Slave 68 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号