第二十二章 USB 全速设备接口(USB)
单芯片处理方案,敞开全新体会——W55MH32 高功用。以太网。单片机。
W55MH32是。WIZnet。重磅推出的高功用以太网单片机,它为用户带来史无前例的集成化体会。这颗芯片将强壮的组件集于一身,具体来说,一颗W55MH32内置高功用。Arm。® Cortex-M3中心,其主频最高可达216MHz;装备1024KB FLASH与96KB S。RAM。,满意存储与数据处理需求;集成TOE引擎,包含WIZnet全硬件TCP/IP协议栈、内置MAC以及PHY,具有独立的32KB以太网收发缓存,可供8个独立硬件socket运用。如此装备,真实完结了All-in-One处理方案,为。开发者。供给极大便当。
在封装标准上,W55MH32 供给了两种挑选:QFN68和QFN100。
W55MH32Q选用QFN68封装版别,尺度为8x8mm,它具有36个GPIO、3个。ADC。、12通道。DMA。、17个。定时器。、2个。I2C。、3个串口、2个SPI。接口。(其间1个带I2S接口复用)、1个。CAN。以及1个。USB。2.0。在坚持与同系列其他版别一同的中心功用基础上,仅削减了部分GPIO以及。SDI。O接口,其他参数坚持一同,性价比优势明显,特别适宜网关模组等对空间布局要求较高的场景。紧凑的尺度和精简化外设装备,使其能够在有限空间内完结高效的网络衔接与数据交互,成为。物联网。网关、边际核算节点等紧凑型设备的抱负挑选。 同系列还有QFN100封装的W55MH32L版别,该版别具有更丰厚的外设资源,适用于需求多接口扩展的杂乱工控场景,软件运用方法一同。更多信息和材料请进入http://www.w5500.com/网站或许私信获取。
此外,本W55MH32支撑硬件加密。算法。单元,WIZnet还推出TOE+SSL运用,包含TCP SSL、HTTP SSL以及MQTT SSL等,为。网络通讯。安全再添保证。
为助力开发者快速上手与深化开发,依据W55MH32Q这颗芯片,WIZnet精心打造了配套开发板。开发板集成WIZ-Link芯片,凭借一根USB C口数据线,就能轻松完结调试、下载以及串口打印日志等功用。开发板将一切外设悉数引出,拓宽功用也大幅进步,便于开发者全面评价芯片功用。
若您想获取芯片和开发板的更多具体信息,包含产品特性、技能参数以及价格等,欢迎拜访官方网页:http://www.w5500.com/,咱们等候与您一同探究W55MH32的无限或许。
第二十二章 USB 全速设备接口(USB)。
1 USB 简介。
USB 外设完结了 USB2.0 全速总线和 APB1 总线间的接口。
USB 外设支撑 USB 挂起/康复操作,能够中止设备。时钟。完结低功耗。
2 USB 主要特征。
W55MH32的USB接口的主要特征如下:
⚪契合 USB2.0 全速设备的技能标准。
⚪可装备 1 到 8 个 USB 端点。
⚪ CRC(循环冗余校验)生成/校验,反向不归零(NRZI)编码/解码和位填充。
⚪ 支撑同步传输。
⚪支撑批量/同步端点的双缓冲区机制。
⚪支撑 USB 挂起/康复操作。
⚪帧承认时钟脉冲生成。
注: USB 和 CAN 共用一个专用的 512 字节的 SRAM 存储器用于数据的发送和接纳,因而不能一同运用USB 和 CAN(同享的 SRAM 被 USB 和 CAN 模块互斥地拜访) 。USB 和 CAN 能够一同用于一个运用中但不能在同一个时刻运用。下图是 USB 外设的方框图:
USB 设备框图。
3 USB 功用描绘。
USB 模块为 PC 主机和。微操控器。所完结的功用之间供给了契合 USB 标准的。通讯。衔接。PC 主机和微操控器之间的数据传输是经过同享一专用的数据缓冲区来完结的,该数据缓冲区能被 USB 外设直接拜访。这块专用数据缓冲区的巨细由所运用的端点数目和每个端点最大的数据分组巨细所决议,每个端点最大可运用 512 字节缓冲区,
最多可用于 16 个单向或 8 个双向端点。USB 模块同 PC 主机通讯,依据 USB标准完结令牌分组的检测,数据发送/接纳的处理,和握手分组的处理。整个传输的格局由硬件完结,其间包含 CRC 的生成和校验。每个端点都有一个缓冲区描绘块,描绘该端点运用的缓冲区地址、巨细和需求传输的字节数。当 USB 模块辨认出一个有用的功用/端点的令牌分组时,(假如需求传输数据而且端点已装备)随之产生相关的数据传输。
USB 模块经过一个内部的 16 位。寄存器。完结。端口。与专用缓冲区的数据交流。在一切的数据传输完结后,假如需求,则依据传输的方向,发送或接纳恰当的握手分组。在数据传输完毕时,USB 模块将触发与端点相关的中止,经过读状况寄存器和/或许运用不同的中止处理程序,微操控器能够承认:
⚪哪个端点需求得到服务。
⚪产生如位填充、格局、CRC、协议、缺失。 AC。K、缓冲区溢出/缓冲区未满等过错时,正在进行的是哪种类型的传输。USB 模块对同步传输和高吞吐量的批量传输供给了特别的双缓冲区机制,在微操控器运用一个缓冲区的时分,该机制保证了 USB 外设总是能够运用另一个缓冲区。
在任何不需求运用 USB 模块的时分,经过写操控寄存器总能够使 USB 模块置于低功耗形式(SUSPEND 形式)。在这种形式下,不产生任何静态。电流。耗费,一同 USB 时钟也会减慢或中止。经过对 USB 线上数据传输的检测,能够在低功耗形式下唤醒 USB 模块。也能够将一特定的中止输入源直接衔接到唤醒引脚上,以使体系能当即康复正常的时钟体系,并支撑直接发动或中止时钟体系。
3.1 USB 功用模块描绘。
USB 模块完结了标准 USB 接口的一切特性,它由以下部分组成:
⚪串行接口操控器(SIE):该模块包含的功用有:帧头同步域的辨认,位填充,CRC 的产生和校验,PI。D 的验证/产生,和握手分组处理等。它与 USB。 收发器。交互,运用分组缓冲接口供给的虚拟缓冲区存储部分数据。它也依据 USB 事情,和类似于传输完毕或一个包正确接纳等与端点相关事情生成。信号。,例如帧首(Start of Frame),USB 复位,数据过错等等,这些信号用来产生中止。
⚪定时器:本模块的功用是产生一个与帧开端报文同步的时钟脉冲,并在 3ms 内没有数据传输的状况,检测出(主机的)大局挂起条件。
⚪分组缓冲器接口:此模块办理那些用于发送和接纳的暂时本地内存单元。它依据 SIE 的要求分配适宜的缓冲区,并定位到端点寄存器所指向的存储区地址。它在每个字节传输后,主动递加地址,直到数据分组传输完毕。它记载传输的字节数并避免缓冲区溢出。
⚪端点相关寄存器:每个端点都有一个与之相关的寄存器,用于描绘端点类型和当时状况。关于单向和单缓冲器端点,一个寄存器就能够用于完结两个不同的端点。总共 8 个寄存器,能够用于完结最多 16 个单向/单缓冲的端点或许 7 个双缓冲的端点或许这些端点的组合。例如,能够一同完结 4 个双缓冲端点和 8 个单缓冲/单向端点。
⚪操控寄存器:这些寄存器包含整个 USB 模块的状况信息,用来触发比方康复,低功耗等 USB事情。
⚪中止寄存器:这些寄存器包含中止屏蔽信息和中止事情的记载信息。装备和拜访这些寄存器能够获取中止源,中止状况等信息,并能铲除待处理中止的状况标志。
留意: 端点 0 总是作为单缓冲形式下的操控端点。
USB 模块经过 APB1 接口部件与 APB1 总线相连,APB1 接口部件包含以下部分:
⚪分组缓冲区:数据分组缓存在分组缓冲区中,它由分组缓冲接口操控并创立数据结构。运用软件能够直接拜访该缓冲区。它的巨细为 512 字节,由 256 个 16 位的字构成。
⚪裁定器:该部件负责处理来自 APB1 总线和 USB 接口的存储器恳求。它经过向 APB1 供给较高的拜访优先权来处理总线的抵触,而且总是保存一半的存储器带宽供 USB 完结传输。它选用时分复用的战略完结了虚拟的双端口 SRAM,即在 USB 传输的一同,答应运用程序拜访存储器。此战略也答应恣意长度的多字节 APB1 传输。
⚪寄存器映射单元:此部件将 USB 模块的各种字节宽度和位宽度的寄存器映射成能被 APB1 寻址的 16 位宽度的内存调集。
⚪APB1 封装:此部件为缓冲区和寄存器供给了到 APB1 的接口,并将整个 USB 模块映射到 APB1地址空间。
⚪中止映射单元:将或许产生中止的 USB 事情映射到三个不同的 NVIC 恳求线上:
······− USB 低优先级中止(通道 20):可由一切 USB 事情触发(正确传输,USB 复位等)。固件在处理中止前应当首要承认中止源。
······− USB 高优先级中止(通道 19):仅能由同步和双缓冲批量传输的正确传输事情触发,意图是保证最大的传输速率。
······− USB 唤醒中止(通道 42):由 USB 挂起形式的唤醒事情触发。
4。 编程。中需求考虑的问题。
鄙人面的章节中,将介绍 USB 模块和运用程序之间的交互进程,有利于简化运用程序的开发。
4.1 体系复位和上电复位。
产生体系复位或许上电复位时,运用程序首要需求做的是供给 USB 模块所需求的时钟信号,然后铲除复位信号,使程序能够拜访 USB 模块的寄存器。复位之后的初始化流程如下所述:
首要,由运用程序激活寄存器单元的时钟,再装备设备时钟办理逻辑单元的相关操控位,铲除复位信号。
其次,有必要装备 CNTR 寄存器的 PDWN 位用以敞开 USB 收发器相关的。模仿。部分,这点需求特别的处理。此位能翻开为端点收发器供电的内部参照电压。由于翻开内部电压需求一段发动时刻(数据手册中的 tSTARTUP),在此期间内 USB收发器处于不承认状况,所以在设置 CNTR寄存器的 PDWN后必需等候一段时刻之后,才干铲除 USB 模块的复位信号(铲除 CNTR 寄存器上的 FRES 位),和ISTR 寄存器的内容,以便在使能其他任何单元的操作之前铲除未处理的假中止标志。
最终,运用程序需求经过装备设备时钟办理逻辑的相应操控位来为 USB 模块供给标准所界说的48MHz 时钟。
当体系复位时,运用程序应该初始化一切需求的寄存器和分组缓冲区描绘表,使 USB 模块能够产生正常的中止和完结数据传输。一切与端点无关的寄存器需求依据运用的需求进行初始化(比方中止使能的挑选,分组缓冲区地址的挑选等)。接下来依照 USB 复位处理(拜见下段)。
USB 复位(RESET 中止)。
产生 USB 复位时,USB 模块进入前面章节中描绘过的体系复位状况:一切端点的通讯都被制止(USB 模块不会呼应任何分组)。在 USB 复位后,USB 模块被使能,一同地址为 0 的默许操控端点(端点 0)也需求被使能。这能够经过装备 USB_DA。DDR。寄存器的 EF 位,EP0R 寄存器和相关的分组缓冲区来完结。
在 USB 设备的枚举阶段,主机将分配给设备一个仅有的地址,这个地址有必要写入USB_D。AD。DR 寄存器的 ADD[6:0]位中,一同装备其他所需的端点。
当复位中止产生时,运用程序必需在中止产生后的 10ms 之内使能端点 0 的传输。
分组缓冲区的结构和用处。
每个双向端点都能够接纳或发送数据。接纳到的数据存储在该端点指定的专用缓冲区内,而另一个缓冲区则用于寄存待发送的数据。对这些缓冲区的拜访由分组缓冲区接口模块完结,它提出缓冲区拜访恳求,并等候承认信息后回来。
为避免产生微操控器与 USB 模块对缓冲区的拜访抵触,缓冲区接口模块运用裁定制,使 APB1 总线的一半周期用于微操控器的拜访,另一半保证 USB模块的拜访。这样,微操控器和 USB 模块对分组缓冲区的拜访如同对一个双端口 SRAM 的拜访,即便微操控器接连拜访缓冲区,也不会产生拜访抵触。USB 模块运用固定的时钟,依照 USB 标准,此刻钟频率被固定为 48MHz。APB1 总线的时钟能够大于或许小于这个频率。
留意: 为满意 USB 数据传输率和分组缓冲区接口的体系需求,APB1 总线时钟的频率有必要大于 8MHz,以避免数据缓冲区溢出或不满每个端点对应于两个分组缓冲区(一般一个用于发送,另一个用于接纳)。这些缓冲区能够坐落整个分组存储区的恣意方位,由于它们的地址和长度都界说在缓冲区描绘表中,而缓冲区描绘表也相同坐落分组缓冲区中,其地址由 USB_BTABLE 寄存器承认。缓冲区描绘表的每个表项都相关到一个端点寄存器,它由 4 个 16 位的字组成,因而缓冲区描绘表的开端地址按 8 字节对齐(寄存器的最低 3 位总是'000')。第 21.5.3 节具体介绍缓冲区描绘表表项。假如对错同步非双缓冲的单向端点,只需求一个分组缓冲区(即发送方向上的分组缓冲区)。其他未用到的端点或某个未运用的方向上的缓冲区描绘表项能够用于其他用处。
分组缓冲区对应的缓冲区描绘表项定位。
不管是接纳仍是发送,分组缓冲区都是从底部开端运用的。USB 模块不会改动超出当时分配到的缓冲区区域以外的其他缓冲区的内容。假如缓冲区收到一个比自己大的数据分组,它只会接纳最大为自身巨细的数据,其他的丢掉,即产生了所谓的缓冲区溢出反常。
端点初始化。
初始化端点的第一步是把恰当的值写到 ADDRn_TX 或 ADDRn_RX 寄存器中,以便 USB 模块能找到要传输的数据或预备好接纳数据的缓冲区。USB_EPnR 寄存器的 EP_TYPE 位承认端点的根本类型,EP_KIND 位承认端点的特别特性。作为发送方,需求设置 USB_EPnR 寄存器的 STAT_TX 位来使能端点,并装备 COUNTn_TX 位决议发送长度。作为接纳方,需求设置 STAT_RX 位来使能端点,而且设置 BL_SIZE 和 NUM_BLOCK 位,承认接纳缓冲区的巨细,以检测缓冲区溢出的反常。
关于非同步非双缓冲批量传输的单向端点,只需求设置一个传输方向上的寄存器。一旦端点被使能,运用程序就不能再修正 USB_EPnR 寄存器的值和 ADDRn_TX/ADDRn_RX,COUNTn_TX/COUNTn_RX 地点的方位,由于这些值会被硬件实时修正。当数据传输完结时,CTR 中止会产生,此刻上述寄存器能够被拜访,并从头使能新的传输。
IN 分组(用于数据发送)。
当接纳到一 IN 令牌分组时,假如接纳到的地址和一个装备好的端点地址相契合的话,USB 模块将会依据缓冲区描绘表的表项,拜访相应的 ADDRn_TX 和 COUNTn_TX 寄存器,并将这些寄存器中的数值存储到内部的 16 位寄存器 ADDR 和 COUNT(运用程序无法拜访)中。此刻,USB 模块开端依据 DTOG_TX 位发送 DATA0 或 DATA1 分组,并拜访缓冲区(请参阅'分组缓冲区的结构和用处'阶段)。
在 IN 分组传输完毕之后,从缓冲区读到的第一个字节将被装载到输出移位寄存器中,并开端发送。最终一个数据字节发送完结之后,核算好的 CRC 将被发送。假如收到的分组所对应的端点是无效的,将依据 USB_EPnR 寄存器上的 STAT_TX 位发送 NAK 或 STALL 握手分组而不发送数据。
ADDR 内部寄存器被用作当时缓冲区的指针,COUNT 寄存器用于记载剩余未传输的字节数。USB总线运用低字节在先的方法传输从缓冲区中读出的数据。数据从 ADDRn_TX 指向的数据分组缓冲区开端读取,长度为 COUNTn_TX/2 个字。假如发送的数据分组为奇数个字节,则只运用最终一个字的低 8 位。
在接纳到主机呼应的 ACK 后,USB_EPnR 寄存器的值有以下更新:DTOG_TX 位被翻转,STAT_TX位为'10',使端点无效,CTR_TX 位被置位。运用程序需求经过 USB_ISTR 寄存器的 EP_ID 和 DIR 位辨认产生中止的 USB 端点。CTR_TX 事情的中止服务程序需求首要铲除中止标志位,然后预备好需求发送的数据缓冲区,更新 COUNTn_TX 为下次需求传输的字节数,最终再设置 STAT_TX 位为'11'(端点有用),再次使能数据传输。
当 STAT_TX 位为'10'时(端点为 NAK 状况),任何发送到该端点的 IN 恳求都会被 NAK,USB 主时机重发 IN 恳求直到该端点承认恳求有用。上述操作进程是必需恪守的,以避免丢掉紧随上一次 CTR 中止恳求的下一个 IN 传输恳求。
OUT 分组和 SETUP 分组(用于数据接纳)。
USB 模块对这两种分组的处理方法根本相同;对 SETUP 分组的特别处理将鄙人面关于操控传输部分具体阐明。当接纳到一个 OUT 或 SETUP 分组时,假如地址和某个有用端点的地址相匹配,USB模块将拜访缓冲区描绘表,找到与该端点相关的 ADDRn_RX 和 COUNTn_RX 寄存器,并将ADDRn_RX寄存器的值保存在内部 ADDR 寄存器中。
一同,COUNT 会被被复位,从 COUNTn_RX中读出的 BL_SIZE 和 NUM_BLOCK 的值用于初始化内部 16 位寄存器 BUF_COUNT,该寄存器用于检测缓冲区溢出(一切的内部寄存器都不能被运用程序拜访)。USB 模块将随后收到的数据按字方法安排(先收到的为低字节),并存储到 ADDR 指向的分组缓冲区中。一同,BUF_COUNT 值主动递减,COUNT 值主动递加。当检测到数据分组的完毕信号时,USB 模块校验收到 CRC 的正确性。假如传输中没有任何过错产生,则发送 ACK握手分组到主机。即便产生 CRC过错或许其他类型的过错(位填充,帧过错等),数据仍是会被保存到分组缓冲区中,至少会保存到产生过错的数据点,仅仅不会发送 ACK 分组,而且 USB_ISTR 寄存器的 ERR 位将会置位。在这种状况下,运用程序一般不需求干与处理,USB 模块将从传输过错中主动康复,并为下一次传输做好预备。假如收到的分组所对应的端点没有预备好,USB 模块将依据 USB_EPnR 寄存器的 STAT_RX 位发送 NAK 或 STALL 分组,数据将不会被写入接纳缓冲区。
ADDRn_RX 的值决议接纳缓冲区的开端地址,长度由包含 CRC 的数据分组的长度(即有用数据长度+2)决议,但不能超越 BL_SIZE 和 NUM_BLOCK 所界说的缓冲区的长度。假如接纳到的数据分组的长度超出了缓冲区的规模,超越规模的数据不会被写入缓冲区,USB 模块将陈述缓冲区产生溢出,并向主机发送 STALL 握手分组,告诉此次传输失利,也不产生中止。
假如传输正确完结,USB 模块将发送 ACK 握手分组,内部的 COUNT 寄存器的值会被复制到相应的COUNTn_RX 寄存器中,BL_SIZE 和 NUM_BLOCK 的值坚持不变,也不需求重写。USB_EPnR 寄存器按下列方法更新:DTOG_RX 位翻转,STAT_RX=10(NAK)使端点无效,CTR_RX 方位位(假如 CTR中止已使能,将触发中止)。假如传输进程中产生了过错或许缓冲区溢出,前面所列出的动作都不会产生。
CRT 中止产生时,运用程序需求首要依据 USB_ISTR 寄存器的 EP_ID 和 DIR 位辨认是哪个端点的中止恳求。在处理 CTR_RX 中止事情时,运用程序首要要承认传输的类型(依据 USB_EPnR寄存器的 SETUP 位),一同铲除中止标志位,然后读相关的缓冲区描绘表表项指向的 COUNTn_RX寄存器,取得此次传输的总字节数。处理完接纳到的数据后,运用程序需求将 USB_EPnR 中的STAT_RX方位成'11',使能下一次的的传输。当 STAT_RX位为'10'时(NAK),任何一个发送到端点上的 OUT 恳求都会被 NAK,PC 主机将不断重发被 NAK 的分组,直到收到端点的 ACK 握手分组。以上描绘的操作次第是必需恪守的,以避免丢掉紧随上一个 CTR 中止的另一个 OUT 分组恳求。
操控传输。
操控传输由 3 个阶段组成,首要是主机发送 SETUP 分组的 SETUP 阶段,然后是主机发送零个或多个数据的数据阶段,最终是状况阶段,由与数据阶段方向相反的数据分组构成。SETUP 传输只产生在操控端点,它十分类似于 OUT 分组的传输进程。使能 SETUP 传输除了需求别离初始化DTOG_TX 位为'1',DTOG_RX 位为'0'外,还需求设置 STAT_TX 位和 STAT_RX 位为 10(NAK),由运用程序依据 SETUP 分组的相应字段决议后边的传输是 IN 仍是 OUT。
操控端点在每次产生CTR_RX中止时,都有必要查看USB_EPnR寄存器的SETUP位,以辨认是一般的OUT分组仍是SETUP分组。USB 设备应该能够经过 SETUP 分组中的相应数据决议数据阶段传输的字节数和方向,而且能在产生过错的状况下发送 STALL 分组,回绝数据的传输。因而在数据阶段,未被运用到的方向都应该被设置成 STALL,而且在开端传输数据阶段的最终一个数据分组时,其反方向的传输仍设成 NAK 状况,这样,即便主机马上改动了传输方向(进入状况阶段),依然能够坚持为等候操控传输完毕的状况。在操控传输成功完毕后,运用程序能够把 NAK 变为 VALD,假如操控传输犯错,就改为 STALL。
此刻,假如状况分组是由主机发送给设备的,那么 STATUS_OUT 位(USB_EPnR 寄存器中的 EP_KIND)应该被置位,只要这样,在状况传输进程中收到了非零长度的数据分组,才会产生传输过错。在完结状况传输阶段后,运用程序应该铲除 STATUS_OUT 位,而且将 STAT_RX 设为 VALID 表明已预备好接纳一个新的指令恳求,STAT_TX 则设为 NAK,表明鄙人一个 SETUP 分组传输完结前,不接受数据传输的恳求。
USB 标准界说 SETUP 分组不能以非 ACK 握手分组来呼应,假如 SETUP 分组传输失利,则会引发下一个 SETUP 分组。因而,以 NAK 或 STALL 分组呼应主机的 SETUP 分组是被制止的。当 STAT_RX 位被设置为'01'(STALL)或'10'(NAK)时,假如收到 SETUP 分组,USB 模块会接纳分组,开端分组所要求的数据传输,并回送 ACK 握手分组。假如运用程序在处理前一个 CTR_RX 事情时USB 模块又收到了 SETUP 分组(即 CTR_RX 依然坚持置位),USB 模块会丢掉收到的 SETUP 分组,而且不回答任何握手分组,以此来模仿一个接纳过错,迫使主机再次发送 SETUP 分组。这样做是为了避免丢掉紧随一次 CTR_RX 中止之后的又一个 SETUP 分组传输。
4.2 双缓冲端点。
USB 标准不仅为不同的传输形式界说了不同的端点类型,而且对这些数据传输所需求的体系要求做了描绘。其间,批量端点适用于在主机 PC 和 USB 设备之间传输大批量的数据,由于主机能够在一帧内运用尽或许多的带宽批量传输数据,使传输功率得到进步。可是,当 USB 设备处理前一次的数据传输时,又收到新的数据分组,它将回应 NAK 分组,使 PC 主机不断重发相同的数据分组,直到设备在能够处理数据时回应 ACK 分组。这样的重传占用了许多带宽,影响了批量传输的速率,因而引入了批量端点的双缓冲机制,进步数据传输率。
运用双缓冲机制时,单向端点的数据传输将运用到该端点的接纳和发送两块数据缓冲区。数据翻转位用来挑选当时运用到两块缓冲区中的哪一块,使运用程序能够在 USB 模块拜访其间一块缓冲区的一同,对另一块缓冲区进行操作。例如,对一个双缓冲批量端点进行 OUT 分组传输时,USB模块将来自 PC 主机的数据保存到一个缓冲区,一同运用程序能够对另一个缓冲区中的数据进行处理(关于 IN 分组来说,状况是相同的)。由于切换缓冲区的办理机制需求用到一切 4 个缓冲区描绘表的表项,别离用来表明每个方向上的两个缓冲区的地址指针和缓冲区巨细,因而用来完结双缓冲批量端点的 USB_EPnR 寄存器必需装备为单向。所以只需求设定 STAT_RX 位(作为双缓冲批量接纳端点)或许 STAT_TX 位(作为双缓冲批量发送端点)。
假如需求一个双向的双缓冲批量端点,则须运用两个 USB_EPnR 寄存器。为尽或许运用双缓冲的优势,到达较高的传输速率,双缓冲批量端点的流量操控流程与其他端点的稍有不同。它只在缓冲区产生拜访抵触时才会设置端点为 NAK 状况,而不是在每次传输成功后都将端点设为 NAK 状况。
DTOG 位用来标识 USB 模块当时所运用的贮存缓冲区。双缓冲批量端点接纳方向的缓冲区由DTOG_RX(USB_EPnR 寄存器的第 14 位)标识,而双缓冲批量端点发送方向的缓冲区由DTOG_TX(USB_EPnR 寄存器的第 6 位)标识。一同,USB 模块也需求知道当时哪个缓冲区正在被运用程序运用,以避免产生抵触。由于 USB_EPnR 寄存器中有 2 个 DTOG 位,而 USB 模块只运用其间的一位来标识硬件所运用的缓冲区,因而,运用程序可运用另一位来标识当时正在运用哪个缓。
冲区,这个新的标识被称为 SW_BUF 位。下表列出了双缓冲批量端点在完结发送和接纳操作时,USB_EPNR 寄存器的 DTOG 位和 SW_BUF 位之间的联系。
双缓冲批量端点缓冲区标识界说。
缓冲区标识位。 | 作为发送端点。 | 作为接纳端点。 |
DTOG。 | DTOG_TX (USB_EPnR 寄存器的第 6 位)。 | DTOG_RX (USB_EPnR 寄存器的第 14 位)。 |
SW_BUF。 | USB_EPnR 寄存器的第 14 位。 | USB_EPnR 寄存器的第 6 位。 |
USB 模块当时运用的缓冲区由 DTOG 位标识,而运用程序所运用的缓冲区由 SW_BUF 位标识,这两个位的标识方法相同,下表描绘了这种标识方法。
双缓冲批量端点的缓冲区运用标识。
端点类型。 | DTOG 位。 | SW_BUF 位。 | USB 模块运用的缓冲区。 | 运用程序运用的缓冲区。 |
IN 端点。 | 0 | 1。 | ADDRn_TX_0/COUNTn_TX_0。 | ADDRn_TX_1/COUNTn_TX_1。 |
OUT 端点。 | 1。 | 0 | ADDRn_RX_1/COUNTn_RX_1。 | ADDRn_RX_0/COUNTn_RX_0。 |
OUT 端点。 | 0 | 0 | 无 (1)。 | ADDRn_RX_0/COUNTn_RX_0。 |
OUT 端点。 | 1。 | 1。 | 无 (1)。 | ADDRn_RX_0/COUNTn_RX_0。 |
1.端点处于 NAK 状况。
能够经过以下方法设置一个双缓冲批量端点:
⚪将 USB_EPnR 寄存器的 EP_TYPE 位设为'00',界说端点为批量端点。
⚪将 USB_EPnR 寄存器的 EP_KIND 位设为'1',界说端点为双缓冲端点。
运用程序依据传输开端时用到的缓冲区来初始化 DTOG 和 SW_BUF 位;这需求考虑到这两位的数据翻转特性。设置好 DBL_BUF 位之后,每完结一次传输后,USB 模块将依据双缓冲批量端点的流量操控操作,而且继续到 DBL_BUF 变为无效中止。
每次传输完毕,依据端点的传输方向,CTR_RX 位或 CTR_TX 位将会置为'1'。与此一同,硬件将设置相应的 DTOG 位,彻底独立于软件来完结缓冲区。交流机。制。DBL_BUF 位设置后,每次传输完毕时,双缓冲批量端点的 STAT 位的取值不会像其他类型端点相同遭到传输进程的影响,而是一向坚持为'11'(有用)。可是,假如在收到新的数据分组的传输恳求时,USB 模块和运用程序产生了缓冲区拜访抵触(即 DTOG 和 SW_BUF 为相同的值,),状况位将会被置为'10'(NAK)。运用程序呼应 CTR 中止时,首要要铲除中止标志,然后再处理传输完结的数据。
运用程序拜访缓冲区之后,需求翻转 SW_BUF 位,以告诉 USB模块该块缓冲区已变为可用状况。由此,双缓冲批量传输的 NAK 分组的数目只由运用程序处理一次数据传输的快慢所决议:假如数据处理的时刻小于 USB 总线上完结一次数据传输的时刻,则不会产生重传,此刻,数据的传输率仅受限于 USB 主机。
运用程序也能够不考虑双缓冲批量端点的特别操控流程,直接在相应 USB_EPnR 寄存器的 STAT 位写入非'11'的任何状况,在这种状况下,USB 模块将依照写入的状况履行流程而疏忽缓冲器实践的运用状况。
4.3 同步传输。
USB 标准界说了一种全速的需求坚持固定和准确的数据传输率的传输方法:同步传输。同步传输一般用于传输。音频。流、紧缩的。视频。流等对数据传输率有严格要求的数据。一个端点假如在枚举时被界说为“同步端点”,USB 主机则会为每个帧分配固定的带宽,而且保证每个帧正好传送一个IN 分组或许 OUT 分组(由端点传输方向承认分组类型)。为了满意带宽要求,同步传输中没有犯错重传;这也就意味着,同步传输在发送或接纳数据分组之后,无握手协议,即不会发送 ACK 分组。相同,同步传输只传送 PID(分组 ID)为 DATA0 的数据包,而不会用到数据翻转机制。
经过设置 USB_EPnR 寄存器 EP_TYPE 为'10',能够使其成为同步端点。同步端点没有握。手机。制,依据 USB 标准中的阐明,USB_EPnR 寄存器的 STAT_RX 位和 STAT_TX 位别离只能设成'00'(制止)和'11'(有用)。同步传输经过完结双缓冲机制来简化软件运用程序开发,它相同运用两个缓冲区,以保证在 USB 模块运用其间一块缓冲区时,运用程序能够拜访别的一块缓冲区。USB 模块运用的缓冲区依据不同的传输方向,由不同的 DTOG 位来标识。(同一寄存器中的DTOG_RX 位用来标识接纳同步端点,DTOG_TX 位用来标识发送同步端点),见下表。
步端点的缓冲区运用标识同。
端点类型。 | USB 模块运用的缓冲区。 | 运用程序运用的缓冲区。 | |
IN 端点。 | 0 | ADDRn_TX_0/COUNTn_TX_0。 | ADDRn_TX_1/COUNTn_TX_1。 |
IN 端点。 | 1。 | ADDRn_TX_1/COUNTn_TX_1。 | ADDRn_TX_0/COUNTn_TX_0。 |
OUT 端点。 | 0 | ADDRn_RX_0/COUNTn_RX_0。 | ADDRn_RX_1/COUNTn_RX_1。 |
OUT 端点。 | 1。 | ADDRn_RX_1/COUNTn_RX_1。 | ADDRn_RX_0/COUNTn_RX_0。 |
与双缓冲批量端点相同,一个 USB_EPnR 寄存器只能处理同步端点单方向的数据传输,假如要求同步端点在两个传输方向上都有用,则需求运用两个 USB_EPnR 寄存器。运用程序需求依据初次传输的数据分组来初始化 DTOG 位;它的取值还需求考虑到 DTOG_RX 或DTOG_TX 两位的数据翻转特性。每次传输完结时,USB_EPnR 寄存器的 CTR_RX 位或 CTR_TX 方位位。与此一同,相关的 DTOG 位由硬件翻转,然后使得交流缓冲区的操作彻底独立于运用程序。传输完毕时,STAT_RX 或 STAT_TX 位不会产生改变,由于同步传输没有握手机制,所以不需求任何流量操控,而一向设为'11'(有用)。同步传输中,即便 OUT 分组产生 CRC 过错或许缓冲区溢出,本次传输仍被看作是正确的,而且能够触发 CTR_RX 中止事情;可是,产生 CRC 过错时硬件会设置 USB_ISTR 寄存器的 ERR 位,提示运用程序数据或许损坏。
4.4 挂起/康复事情。
USB 标准中界说了一种特别的设备状况,即挂起状况,在这种状况下 USB 总线上的均匀电流耗费不超越 500uA。这种电流约束关于由总线供电的 USB 设备至关重要,而自供电的设备则不需求严格恪守这样的电流耗费约束。USB 主机以 3 毫秒内不发送任何信号标志进入挂起状况。一般状况下 USB 主机每毫秒会发送一个 SOF,当 USB 模块检测到 3 个接连的 SOF 分组丢掉事情即可断定主机发出了挂起恳求,接着它会置位 SB_ISTR 寄存器的 SUSP 位,以触发挂起中止。USB 设备进入挂起状况之后,将由“唤醒”序列唤醒。所谓的“唤醒”序列,能够由 USB 主机主张,也能够由 USB设备自身触发;可是,只要 USB 主机能够完毕“唤醒”序列。
被挂起的 USB 模块有必要至少还具有检测 RESET 信号的功用,它会将其当作一次正常的复位操作来履行。实践的挂起操作进程关于不同的 USB 设备来说是不同的,由于需求不同的操作来下降。电源。耗费。下面描绘了一同典型的挂起操作,要点介绍运用程序怎么呼应 USB 模块的 SUSP 信号。
将 USB_CNTR 寄存器的 FSUSP 置为'1',这将使 USB 模块进入挂起状况。USB 模块一旦进入挂起状况,对 SOF 的检测马上中止,以避免在 USB 挂起时又产生新的 SUSP 事情。
消除或削减 USB 模块以外的其他模块的静态电流耗费。
将 USB_CNTR 寄存器的 LP_MODE 方位为'1',这将消除模仿 USB 收发器的静态电流耗费,但仍能检测到唤醒信号。
能够挑选封闭外部。振荡器。和设备的 PLL,以中止设备内部的任何活动。当设备处于挂起状况时产生 USB 事情,该设备会被唤醒,并需求调用“唤醒”例程来康复体系时钟,和 USB 数据传输。假如唤醒设备的是 USB 复位操作,则应该保证唤醒的进程不要超越 10 毫秒(拜见“USB 协议标准”)。USB 模块处于挂起状况时,唤醒或复位事情需求铲除 USB_CNTR 寄存器的 LP_MODE 位。
即便唤醒事情能够马上触发一个 WKUP 中止事情,但由于康复体系时钟需求比较长的延迟时刻,处理 WKUP 中止的中止服务程序有必要十分当心;为了减短体系唤醒的时刻,主张将唤醒代码直接写在挂起代码后边,这样就能够在体系时钟重启后敏捷进入唤醒代码中履行。为避免或削减。 ESD。等搅扰意外地唤醒体系(从挂起形式退出是一个异步事情),在挂起进程中数据线被过滤,滤波宽度大约为 70nS。下面是唤醒操作的进程:
发动外部振荡器和设备的 PLL(此项可选)。
清零 USB_CNTR 寄存器的 FSUSP 位。
USB_FNR 寄存器的 RXDP 和 RXDM 位能够用来判别是什么触发了唤醒事情,如表 124 所示,它还一同列出了各种状况软件应该采纳的操作。假如需求的话,能够经过检测这两位变成'10'(代表闲暇总线状况)的时刻来知道唤醒或复位事情的完毕。此外,在复位事情完毕时,USB_ISTR 寄存器的 RESET 位被置为'1',假如 RESET 中止被使能,就会产生中止。此中止应该按正常的复位操作处理。
唤醒事情检测。
[RXDP, RXDM] 的状况。 | 唤醒事情。 | 运用程序应履行的操作。 |
00。 | 复位。 | 无。 |
10。 | 无 (总线搅扰)。 | 康复到挂起状况。 |
01。 | 康复挂起。 | 无。 |
11。 | 未界说的值 (总线搅扰)。 | 康复到挂起状况。 |
设备或许不是被与 USB 模块相关的事情唤醒的(例如一个鼠标的移动可唤醒整个体系)。在这种状况下,先将 USB_CNTR 寄存器的 RESUME 方位为'1',然后在 1ms-15ms 之间再把它清为 0 能够发动唤醒序列(这个距离能够用 ESOF 中止来完结,该中止在内核正常运行时每 1ms 产生一次)。RESUME 位被清零后,唤醒进程将由主机 PC 完结,能够运用 USB_FNR 寄存器的 RXDP 和 RXDM 位来判别唤醒是否完结。
留意:只要在 USB 模块被设置为挂起状况时(设置 USB_CNTR 寄存器的 FSUSP 位为'1'),才干够设置 RESUME 位。
5 例程规划。
5.1 CompositeEquipmentHID&VCP。
该程序是一个依据W55MH32微操控器的USB复合设备固件,结合了虚拟串口(VCP)和HID功用,并经过USART输出调试信息。以下是程序规划的总结:
1. 体系初始化。
时钟装备:运用外部高速时钟(HSE)作为PLL输入,倍频至方针频率(如HSE 8MHz ×27 = 216MHz)。装备AHB、APB1、APB2总线时钟分频,优化外设时钟。启用内部低速(LSI)和高速(HSI)时钟源,或许供其他外设运用。
USART初始化:装备USART1(PA9-TX, PA10-RX),波特率115200,用于调试信息输出。重定向printf至USART,便于经过串口打印体系状况。
2. USB功用装备。
USB设备初始化:设置USB时钟(Set_USBClock)和中止(USB_Interrupts_Config)。初始化USB协议栈(USB_Init),使能DP上拉。电阻。(DP_PUUP=1)以宣告设备衔接。
复合设备处理:主循环监控USB衔接状况(bDeviceState),状况改变时经过串口告诉用户。
当USB装备成功(CONFIGURED状况)时,检测接纳缓冲区(Receive_Buffer_port)是否有数据,并经过C。DC。接口回传数据(CDC_Send_DATA)。
3.数据通讯流程。
// 主循环中的数据通讯处理while (1){ // 当USB设备处于已装备状况(与主机树立衔接) if (bDeviceState == CONFIGURED) { // 查看接纳缓冲区是否有数据且前次发送已完结 if (Receive_length_port != 0 && packet_sent == 1) { // 经过USB CDC(虚拟串口)发送数据 CDC_Send_DATA((unsigned char *)Receive_Buffer_port, Receive_length_port); // 重置接纳缓冲区状况 Receive_length_port = 0; // 从头使能端点接纳数据(预备下一次接纳) Se。tE。PRxValid(ENDP7); } } // 检测USB衔接状况改变 if (usbstatus != bDeviceState) { usbstatus = bDeviceState; // 更新状况 // 打印衔接状况改变信息(调试用) if (usbstatus == CONFIGURED) { printf("USB connec。ti。on successfuln"); } else { printf("USB disconnectedn"); } }}// USB中止服务函数(示例,一般在其他文件中完结)void USB_LP_CAN1_RX0_IRQHandler(void){ USB_Istr(); // USB中止处理主函数}// 端点数据接纳回调函数(示例)void EP7_IN_Callback(void){ packet_sent = 1; // 符号发送完结}void EP6_OUT_Callback(void){ // 从端点缓冲区读取数据到运用缓冲区 Receive_length_port = USB_SIL_Read(EP6, Receive_Buffer_port); // 符号接纳到新数据 new_data_received = 1;}。
CDC数据传输:接纳数据经过USB端点中止填充至缓冲区,主循环检测到数据后发送。运用SetEPRxValid(ENDP7)从头使能接纳端点,预备下一次数据传输。
调试输出:体系发动时经过USART输出时钟装备信息(SYSCLK、HCLK等)。USB衔接状况改变时打印提示信息,便于调试设备状况。
4. 要害代码规划。
时钟装备函数(RCC_ClkConfiguration):经过HSE和PLL供给。高精度。体系时钟,保证USB和USART安稳作业。
USART重定向:SER_PutChar和fputc完结字符发送,支撑printf格局化输出。
USB中止与轮询结合:中止处理底层数据传输,主循环轮询状况及处理运用层逻辑。
6 下载验证。
6.1 CompositeEquipmentHID&VCP。
现象描绘:
⚪上电后,USART1当即输出体系时钟信息,包含SYSCLK(如216MHz)HCLK、PCLK1/2等。
⚪刺进USB线后,主机辨认到复合设备(VCP + HID),设备办理器中显现虚拟串口(如“USB Serial Device (COMx)”)和HID设备。
⚪USART打印“USB connection successful”。
⚪经过串口东西(如PuTTY)向虚拟串口发送数据,设备当即回显相同数据。
⚪USB断开时,USART打印“USB disconnected”。
WIZnet 是一家无晶圆厂。半导体。公司,成立于 1998 年。产品包含互联网。处理器。iMCU™,它选用 TOE(TCP/IP 卸载引擎)技能,依据共同的专利全硬连线 TCP/IP。iMCU™ 面向各种运用中的。嵌入式。互联网设备。
WIZnet 在全球具有 70 多家分销商,在香港、韩国、美国设有办事处,供给技能支撑和产品营销。
香港办事处办理的区域包含:澳大利亚、印度、土耳其、亚洲(韩国和日本在外)。
审阅修改 黄宇。
内容来源:https://sonybravia.xyz/app-1/f99 club apk,http://chatbotjud-teste.saude.mg.gov.br/app-1/eitabet-reclame-aqui
相关文章:
- 众橙搭乘全域农业快车宣告上市方案构建村庄旅行新业态
- 致态携多款存储产品 初次露脸台北世界电脑展COMPUTEX 2025线上展
- 15岁男生应战塑料凳套头 被卡后街头求救 画面社死
- 首款搭载小爱同学产品,快要“8 岁”的小米 AI 音箱中止功能性更新
- 算计索赔超 120 亿欧元:谷歌在欧洲面对 12 起民事诉讼,被控乱用商场主导地位
- 曝三星将越过One UI 7 Watch 直接迈向One UI 8 Watch -
- SIAL SHANGHAI 韩国馆满意闭幕
- 苹果智能眼镜估计2026年末发布 但不支撑AR功用 -
- TI解读光耦合器常识 怎么保证光耦合器正确偏置
- 紫光闪存发布企业级E5200 PCIe 5.0 SSD:全栈国产化架构