关于32/AI8051U的USB控制器学习笔记
<h1>前言</h1><p>最近在逛漫展的时候,就吃到了USB用作定制键盘的好处,因为自己对着HID的英文文档花了二十几天的时间吃透Report Descriptor(数据报表格式描述符),吃透的第一件事就是用官方提供的键盘例程改了一个Consumer Page,使得P3.2至P3.5可以直接控制歌曲播放暂停。漫展前一天,为了克服上次由于蓝牙信道拥挤导致无法使用手写笔控制手机录像的问题,又用了一块追风剑开发板改了一下按键映射,这下配合便携式显示器自带的USB-HUB,不仅实现手机录像画面零延迟直传手机,还可以在不收起独脚架的情况下直接用追风剑控制手机的录像行为。这两件事大幅提高了我自己学USB的信心,后续想做的事情就是把UAC跑通,做高保真的STC声卡。</p>
<p>紧接着,我就动起了自己重写USB驱动例程的脑筋,但一直苦于难以洞悉USB硬件控制器的工作原理,还有部分中断位如何响应的问题,紧接着就是自己的编程水平退步,因为验证发现自己留存的编程习惯不是一堆报错就是一堆警告。所以我想通过这个帖子询问一些关于USB硬件控制器的核心原理。</p>
<p>注意,我想询问的这些核心原理大多都没有在STC的官方文档里独立声明,或者声明有遗漏。</p>
<h1>笔记正文</h1>
<blockquote>
<p>STC32 USB全速模式硬件控制器 速查手册<br />
*注:调试USB相关功能请确保相关知识已具备,预计需要连续 45天 的学习时间。<br />
分类:通信总线<br />
关于USB和USB国际基金会的说明,请看“USB开发琐碎知识点”,此处不予赘述。<br />
从STC32G和STC8H系列开始,STC后续的所有芯片都集成了USB全速模式的硬件控制器,这种硬件控制器基于USB-IF官方许可并由STC作出适配性改造,可代替用户省略多数繁琐电气状态判定,让用户程序仅需集中在通信协议或以上的层级进行开发。<br />
可被硬件控制器自动执行的步骤如下:<br />
①自动检查总线电平的特殊状态(单端、J/K状态)<br />
②自动检查特殊电源管理信号(挂起、总集线器唤醒、设备复位)<br />
③自动识别SOF(帧起始包、又被称作“帧头”)并抄写帧头编号<br />
④自动识别传输事务和封包有效性(同步传输类型无此效果)<br />
⑤自动识别从机地址分配</p>
<p>USB硬件控制器可通过以下事件响应中断:<br />
USB中断(EUSB)<br />
*USB设备管理中断(USB电源中断)<br />
**SOF帧包头<br />
**RST主机向设备请求复位<br />
**RSU主机唤醒设备<br />
**SUS设备被主机挂起<br />
*端点全局中断<br />
**端点0全局中断<br />
***SUEND成功接收SETUP包<br />
***STSTL已完成对STALL握手的发送<br />
***IPRDY打包好的IN包已成功发送?<br />
***OPRDY收到有效OUT包<br />
**数据入点全局中断<br />
***已发送STALL信号<br />
***数据欠载<br />
***FIFO存在数据?<br />
***打包好的IN包已成功发送?<br />
**数据出点全局中断<br />
***已发送STALL信号<br />
***同步传输类型:发现位填充/CRC5错误<br />
***同步传输类型:FIFO已满导致丢包<br />
***FIFO队列已满<br />
***收到有效的OUT包</p>
<p>异步读写控制器<br />
USBCON USB控制寄存器<br />
绝对地址:0000F4H<br />
07 ENUSB USB功能与时钟控制位<br />
0 关闭USB硬件控制器<br />
1 启用USB硬件控制器<br />
关于USB硬件控制器所用时钟,请参阅时钟树部分。<br />
06 ENUSBRST USB复位设置控制位<br />
0 USB硬件控制器自由工作<br />
1 USB硬件控制器全部初始化<br />
05 PS2M USB控制器进入PS2模式<br />
0 标准USB模式<br />
1 PS2模式<br />
04 PUEN USB端口上拉1.5kΩ电阻开关<br />
03 PDEN USB端口下拉500kΩ电阻开关<br />
0 断开<br />
1 接通<br />
02 DFREC D+ / D- 差分状态位<br />
0 差分0<br />
1 差分1<br />
此位只读。<br />
01 DP D+接口状态<br />
00 DN D-接口状态<br />
0 逻辑0电平<br />
1 逻辑1电平<br />
USB模式下只读,PS2模式下可自由读写。</p>
<p>USBCLK USB时钟控制寄存器<br />
绝对地址:0000DCH<br />
07 ENCKM PLL倍频器控制<br />
0 不使用PLL<br />
1 使用PLL倍频器<br />
06-05 PCKI PLL倍频器的时钟源<br />
0 1/1<br />
1 1/2<br />
2 1/4<br />
3 1/8<br />
请参阅时钟树部分,与该内存位配合必须要求抵达USB硬件控制器的速度为48MHz.<br />
04 CRE USB时钟追频器<br />
0 USB不追频<br />
1 启用USB追频<br />
03 TSTUSB USB测试模式<br />
0 USB硬件控制器自由工作<br />
1 USB硬件控制器强制测试模式<br />
02 TSTPHY USB电气接口(PHY)测试模式<br />
0 PHY自由工作<br />
1 启用PHY测试模式<br />
01-00 PHYTST USB电气接口(PHY)测试<br />
0 正常<br />
1 强制差分1<br />
2 强制差分0<br />
3 强制单端0</p>
<p>USBADR USB地址寄存器<br />
绝对地址:0000ECH<br />
07 BUSY USB寄存器读忙标志位<br />
写0 不起作用<br />
写1 启动USB寄存器读取操作<br />
读0 USBDAT中数据有效<br />
读1 正在读写USB相关寄存器到USBDAT位<br />
06 AUTORD USB寄存器自动读标志<br />
写0 每次读取都要求写BUSY位<br />
写1 单次读取结束后继续读取<br />
注意:此位在AI8051U/STC8051U的说明文档中已被标记为“不可用”。<br />
05-00 UADR USB硬件控制器的寄存器地址<br />
从0x00开始作为基地址,各寄存器所在IP核的内存位置请参阅下文。<br />
USBDAT USB数据寄存器<br />
绝对地址:0000FCH<br />
07-00 UDAT USB硬件控制器相关数据<br />
读数据 读取上次从USB硬件控制器读出的数据<br />
写数据 写入计划提交到USB硬件控制器的数据<br />
写数据完成后,写入操作立即执行,读取操作请参阅USBADR(0000ECH).</p>
<p>USB硬件控制器<br />
FADDR USB功能地址寄存器<br />
IP核地址:00H<br />
07 UPDATE 更新USB功能地址<br />
0 USB地址分配进行中<br />
1 已完成USB设备的地址分配<br />
初始化流程中,首次分配至0号地址不被视作“已分配地址”;USB设备描述符前8字节被读取后,分配至非0x00地址时方可视作“已分配地址”。<br />
06-00 UADDR 设备所属地址<br />
读数据 读取USB在工作期间被分配的地址<br />
写数据 强制绑定某个USB地址<br />
若非通过设备端强制卸载USB控制器(复位到地址0的初始化阶段),请勿随意修改设备地址。<br />
若设备已完成首次读取设备描述符的工作,会在收到SET_ADDRESS请求之后自动保存地址。<br />
如果多个USB设备连接到了不同的总集线器,有可能会出现同一地址。</p>
<p>POWER 电源管理寄存器<br />
IP核地址:01H<br />
07 ISOUD ISO更新时机<br />
0 IPRDY写1后,数据包在下一个IN令牌后立即发送<br />
1 IPRDY写1后,数据包延迟到下一个SOF令牌后的第一个IN令牌发送,在此之前的其他IN令牌发送0长度数据包。<br />
06-04 未使用<br />
03 USBRST USB复位控制位<br />
读0 未发现复位信号<br />
读1 已发现复位信号<br />
写1 强制USB硬件控制器复位<br />
写0 解挂复位信号<br />
02 USBRSU USB恢复控制位<br />
写1 强制USB恢复信号<br />
写0 解除信号强制<br />
软件应在强制USB恢复信号10-15ms后及时解除强制。<br />
如果未在配置描述符标明【USB可远程唤醒】,请勿强制支配此类信号。<br />
01 USBSUS USB挂起控制位<br />
读0 USB未处于挂起状态<br />
读1 USB设备已被挂起(选择性暂停)<br />
此位只读。<br />
停用自动挂起检测时,此位恒定为0.<br />
00 ENSUS 启用USB挂起自动检测<br />
0 忽略总线上的挂起信号<br />
1 自动检测总线上的挂起信号</p>
<p>INTRIN1 入点中断标志寄存器1<br />
IP核地址:02H<br />
此内存行只读,单次读取会将所有中断标志复0.<br />
07-06 未使用<br />
05 EP5INIF 入点5中断标志<br />
04 EP4INIF 入点4中断标志<br />
03 EP3INIF 入点3中断标志<br />
02 EP2INIF 入点2中断标志<br />
01 EP1INIF 入点1中断标志<br />
00 EP0IF 控制端点0中断标志<br />
读1 存在入点中断<br />
控制端点0被视作双向端点进行管理。<br />
触发时机:<br />
*USB的IN事务已成功将数据从上位机传到设备入点的FIFO时<br />
*单次传输只能获取满FIFO容量数据时<br />
*上位机发来空包时<br />
*OUT事务将控制端点0的FIFO内容打包至上位机时</p>
<p>INTRIN2 入点中断标志寄存器2<br />
IP核地址:03H<br />
已被屏蔽的寄存器,在STC33F(AI33F)系列型号后启用。</p>
<p>INTROUT1 出点中断标志位<br />
IP核地址:04H<br />
此内存行只读,单次读取会将所有中断标志复0.<br />
07-06 未使用<br />
00 已禁用<br />
05 EP5OUTIF 出点5中断标志<br />
04 EP4OUTIF 出点4中断标志<br />
03 EP3OUTIF 出点3中断标志<br />
02 EP2OUTIF 出点2中断标志<br />
01 EP1OUTIF 出点1中断标志<br />
读1 存在出点中断<br />
触发时机:<br />
*USB总集线器已通过OUT事务将FIFO内容打包至上位机时<br />
*成功上传空包(0字节数据)时</p>
<p>INTRIN2 出点中断标志寄存器2<br />
IP核地址:05H<br />
已被屏蔽的寄存器,在STC33F(AI33F)系列型号后启用。</p>
<p>INTRUSB 电源中断标志位<br />
IP核地址:06H<br />
此内存行只读,单次读取会将所有中断标志复0.<br />
07-04 未使用<br />
03 SOFIF 发现帧头(SOF)事务<br />
02 RSTIF 发现复位信号<br />
01 RSUIF 发现解除挂起信号<br />
00 SUSIF 发现挂起信号<br />
读1 存在对应信号中断</p>
<p>INTRIN1E 入点中断屏蔽寄存器1<br />
IP核地址:07H<br />
05 EP5INIE 入点5中断开关<br />
04 EP4INIE 入点4中断开关<br />
03 EP3INIE 入点3中断开关<br />
02 EP2INIE 入点2中断开关<br />
01 EP1INIE 入点1中断开关<br />
00 EP0IE 控制端点0中断开关<br />
INTROUT1E 出点中断屏蔽寄存器1<br />
IP核地址:09H<br />
05 EP5OUTIE 出点5中断开关<br />
04 EP4OUTIE 出点4中断开关<br />
03 EP3OUTIE 出点3中断开关<br />
02 EP2OUTIE 出点2中断开关<br />
01 EP1OUTIE 出点1中断开关<br />
INTRUSBE 电源中断屏蔽寄存器<br />
IP核地址:0BH<br />
03 SOFIE 帧头(SOF)事务<br />
02 RSTIE 复位信号<br />
01 RSUIE 解除挂起信号<br />
00 SUSIE 挂起信号<br />
以上寄存器同时使用此内存行设置:<br />
INTRIN1E + INTROUT1E + INTRUSBE<br />
0 停用中断<br />
1 开放中断</p>
<p>FRAMEn 帧号寄存器<br />
IP核地址:0DH(高8bit) + 0CH(低8bit)<br />
此类组合寄存器需要分开读取以获取完整的11位帧号。<br />
其中FRAME1保存帧号低8位,FRAME2保存帧号高3位。<br />
用户程序可通过帧号识别数据发送时机与USB总集线器响应状况,对于USB-FS设备,大致每1ms更新1帧,帧号溢出后从0继续计数。</p>
<p>INDEX FIFO选择器<br />
IP核地址:0EH<br />
0 控制端点0<br />
1 入点1和出点1<br />
2 入点2和出点2<br />
……<br />
5 入点5和出点5<br />
更改FIFO选择器将同时选中此选择器对应编号的入点和出点。<br />
端点0与其他端点的内存结构有所不同。<br />
此行内存将同时影响以下内存行:<br />
*INMAXP<br />
*CSR0/INCSR1<br />
*INCSR2<br />
*OUTMAXP<br />
*OUTCSR1<br />
*OUTCSR2<br />
*COUNT0/OUTCOUNT1<br />
*OUTCOUNT2</p>
<p>INMAXP 入点FIFO长度上限<br />
IP核地址:10H<br />
读取数据 指示对应入点的FIFO上限<br />
写入数据 设置对应入点的FIFO上限<br />
写入数值为8的整数倍,若写入8,则表示入点的FIFO上限为8×8=64(字节)。<br />
由于USB全速设备限制,至多允许1023字节,因此至多可设置0x80.<br />
对于控制端点0,仅允许 8行、16行、32行、64行 四选一。<br />
控制端点0的入点和出点FIFO上限相互联锁,若用户程序已将USB描述符 bMaxPacketSize0发送成功,请不要随意修改端点0的长度。</p>
<p>CSR0 控制端点0控制与状态寄存器<br />
IP核地址:11H(ENDP==0)<br />
此内存仅用于控制端点0.<br />
SETUP事务类<br />
07 SSUEND SETUP令牌已响应指令<br />
写1 发送SETUP令牌已响应指令<br />
读0 已响应SETUP令牌<br />
不可读取此位,因为写1后会立即被USB控制器在下一个时钟复0.<br />
发现SETUP令牌后,请及时控制用户程序启用对SETUP事务的响应。<br />
若不能及时发送SETUP令牌被响应指令,将在收到PAYLOAD(仅DATA0)包后中止握手,等候主机重新发送SETUP令牌。<br />
04 SUEND SETUP令牌标志<br />
读1 发现有效SETUP令牌<br />
此位只读,若标记SETUP令牌被响应,请使用SSUEND.<br />
此位为1期间,请通过SSUEND位响应SETUP令牌。<br />
STALL握手类<br />
05 SDSTL 发送STALL信号<br />
写1 发送STALL信号<br />
读0 STALL信号指令已被下达<br />
STALL信号不能表达SETUP令牌的传输成败,请使用SSUEND以标记SETUP令牌被响应。在完成对SETUP令牌的响应后,同时发送STALL信号以表示对应USB请求不受设备支持。<br />
02 STSTL 已完成对STALL信号的发送<br />
读1 已发送STALL信号<br />
写0 解除已发送标记<br />
缓存控制类<br />
03 DATAEND 数据传输结束指令<br />
写1 控制最后数据标记<br />
读0 最后数据已被标记<br />
符合以下条件其一必须使用此位:<br />
*发送最后一包IN包时,必须同时写IPRDY。<br />
*先前发送数据大小为控制端点0大小上限的整数倍之后,额外发送空IN包后使用。<br />
*接收到最后一包OUT包时,最后一包OUT包长度低于FIFO上限或收到空OUT包时使用。<br />
如果不按上述要求使用,会导致以下情形:<br />
*OUT包被意外STALL导致主机意外重发<br />
*IN包发送成功后不能识别主机的握手包<br />
01 IPRDY IN包打包标志<br />
写1 打包IN包<br />
读1 存在等候发送的IN包<br />
读0 IN包发送事件已完成<br />
若发送超出控制0点长度上限的数据时,抵达上限后的部分需要拆包发送;若数据长度恰好为长度上限的整数倍,请在最后一包数据载入FIFO后进行连续两次IN包打包,因为第二次要发送空包充当数据结束句。<br />
如果没有任何写入FIFO时,写入此位即发送空IN包。<br />
以下情况会将该位复0:<br />
*响应IN事务发送IN包时<br />
*被其他事务(OUT、SETUP)中止发送时<br />
06 SOPRDY OUT包处理结束<br />
写1 标记OUT包被签收<br />
不可读取此位,因为写1后会立即被USB控制器在下一个时钟复0.<br />
如果不及时标记OUT包被处理,会导致数据传输出现意外STALL或后置数据包被流失。<br />
若接收的数据长度恰好为长度上限的整数倍,请为额外的空包作出处理。<br />
00 OPRDY 收到OUT包标志<br />
读1 收到有效的OUT包<br />
此位只读,若标记OUT包被处理,请使用SOPRDY.</p>
<p>COUNT0 控制端点0的出点数据大小<br />
IP核地址:16H(ENDP==0)<br />
此内存行只读。<br />
读取数据 上次收到的OUT包大小<br />
此处数值保存最新收到OUT包的大小,必须等待OPRDY为1时读取,否则数据无参考意义。<br />
单位为1字节,至多允许64字节(0x40)。</p>
<p>INCSR1 数据入点控制与状态寄存器1<br />
IP核地址:11H(ENDP!=0)<br />
此内存不能用于控制端点0.<br />
STALL握手类<br />
04 SDSTL 发送并强制STALL信号<br />
0 解除STALL信号强制<br />
1 强制STALL信号<br />
STALL请求在非控制0点不会自动解除,必须由用户手动解除。<br />
如果电脑软件请求了错误的端点,可使用此强制信号防止带宽浪费。<br />
05 STSTL 已完成对STALL信号的发送<br />
读1 已发送STALL信号<br />
写0 解除已发送标记<br />
缓存管理类<br />
06 CLRDT 重置IN包缓存位置<br />
写1 将入点缓存重置为DATA0<br />
不可读取此位,因为写1后会立即被USB控制器在下一个时钟复0.<br />
符合以下条件其一必须使用此位:<br />
*硬件控制器发送的IN包被主机返回NAK/STALL<br />
*响应USB设备复位需要复位IN包缓存<br />
数据入点的FIFO切换入点缓存的行为会受到INCSR2的FCDT位控制,可以是“仅收到ACK时切换入点缓存”或者“每个IN包发送完毕强制切换入点缓存”。<br />
03 FLUSH IN包待发送缓存清零<br />
写1 清空准备发送的最早一个IN包<br />
读0 FIFO控制器已将最早的一个IN包清零<br />
不可读取此位,因为写1后会立即被USB控制器在下一个时钟复0.<br />
每次执行一次清空缓存的操作只对最早的一个IN包生效,若最早的第一个被以此方式清空,后续的IN包会向最早的方向逐个插队,若操作次数等于或多于用户程序发送的IN包次数,将清空全部IN包缓存。<br />
清除缓存的操作不改变IN包封包状态,截至FIFO没有任何待发送IN包。<br />
02 UNDRUN 发送数据欠载<br />
读1 设备对应端点的IN包发送失败<br />
写0 解除数据缓存欠载标记<br />
若主机请求该端点发送IN包但是未能发送有效数据时,硬件将此位自动置1.<br />
*对于同步传输类型,用户程序未封包(IPRDY!=1)的情况下收到了USB主机的IN令牌后,硬件控制器会发送0长度数据包并报告“发送数据欠载”。<br />
*对于中断/批量传输类型,若硬件控制器成功发送数据,但被主机返回NAK(应答失败)时,硬件控制器会重发上一数据并报告“发送数据欠载”。<br />
01 FIFONE 数据入点的FIFO已有数据<br />
读0 数据入点的FIFO已被清空<br />
读1 数据入点的FIFO有数据等候发送<br />
此位只读。<br />
只要用户程序向对应入点写入了数据,不论是否完成封包,只要FIFO仍有数据此位就会被硬件置1.<br />
00 IPRDY IN包打包标志<br />
写1 打包IN包<br />
读1 IN包已打包完毕<br />
读0 IN包未打包或已完成发送<br />
用户发送的数据必须经过打包才能发送,否则会视作用户程序尚未完成数据传输而不做任何动作。<br />
若用户程序欲发送的IN包大小超过数据入点的大小上限,需要多次打包;抵达数据入点的大小上限的整数倍时,最后一次数据传输需要连续打包两次,因为第二次要发送空包充当数据结束句。<br />
以下情况会将该位复0:<br />
*硬件控制器已完成对打包数据的发送时,永久复0.<br />
*IN包的FIFO被用户程序全部清空时,永久复0.<br />
*在启用了自动IN包打包(AUTOSET==1)时,数据入点的FIFO已满,永久复0.<br />
*同步类型数据入点设定了IN包发包延时(ISOUD==1),打包完成之后未能收到下一个帧包头(SOF),临时复0.</p>
<p>INCSR2 数据入点控制与状态寄存器2<br />
IP核地址:12H<br />
此内存不能用于控制端点0.<br />
07 AUTOSET 自动IN包打包<br />
1 启用自动打包<br />
0 关闭自动打包<br />
此功能启用后,若用户程序发送的IN包大小等同于数据入点大小上限,将触发自动打包。<br />
此功能一般配合同步传输类型使用。<br />
06 ISO 同步传输模式限定功能<br />
0 按正常端点进行传输<br />
1 使用同步传输模式限定功能<br />
同步传输模式的特性如下:<br />
*始终使用DATA0进行传输<br />
*数据传输结束后没有握手阶段<br />
05 MODE 端点方向选择<br />
0 选择OUT点<br />
1 选择IN点<br />
此位作用不明确!请联系研发顾问以获取基础信息。<br />
疑似作用于非控制0点的FIFO数据读写寄存器<br />
04 ENDMA 数据入点FIFO自动触发DMA<br />
此位已被临时禁用,因为检查发现没有为FIFO安装DMA.<br />
03 FCDT 入点缓存强制轮换<br />
0 设备发送IN包之后,仅允许在主机发送ACK时自动轮换入点缓存<br />
1 设备发送IN包之后,主机发送任意类型的握手包均切换入点缓存<br />
端点配置为同步传输模式后,不能切换入点缓存。</p>
<p>OUTMAXP 数据FIFO长度上限<br />
IP核地址:13H<br />
读取数据 指示对应出点的FIFO上限<br />
写入数据 设置对应出点的FIFO上限<br />
写入数值为8的整数倍,若写入8,则表示入点的FIFO上限为8×8=64(字节)。<br />
由于USB全速设备限制,至多允许1023字节,因此至多可设置0x80.<br />
控制端点0的入点和出点FIFO上限相互联锁,请通过INMAXP进行读写。</p>
<p>OUTCSR1 数据出点控制与状态寄存器1<br />
IP核地址:14H<br />
此内存不能用于控制端点0,对于控制端点0的数据输出,请使用CSR0寄存器。<br />
STALL握手类<br />
05 SDSTL 发送并强制STALL信号<br />
0 解除STALL信号强制<br />
1 强制STALL信号<br />
STALL请求在非控制0点不会自动解除,必须由用户手动解除。<br />
如果电脑软件请求了不可启用的端点,可使用此强制信号防止带宽浪费。<br />
STALL信号对同步传输类型不起作用。<br />
06 STSTL 已完成对STALL信号的发送<br />
读1 已发送STALL信号<br />
写0 解除已发送标记<br />
缓存管理类<br />
07 CLRDT 重置OUT包缓存位置<br />
写1 将出点缓存重置为DATA0<br />
不可读取此位,因为写1后会立即被USB控制器在下一个时钟复0.<br />
符合以下条件其一必须使用此位:<br />
*响应USB设备复位需要复位OUT包缓存<br />
04 FLUSH OUT包待接收缓存清零<br />
写1 清空已保存的最早一个OUT包<br />
读0 FIFO控制器已将最早的一个OUT包清零<br />
不可读取此位,因为写1后会立即被USB控制器在下一个时钟复0.<br />
每次执行一次清空缓存的操作只对最早的一个OUT包生效,若最早的第一个被以此方式清空,后续的OUT包会向最早的方向逐个插队,若操作次数等于或多于用户程序发送的OUT包次数,将清空全部OUT包缓存。<br />
若OUT包仍未成功被硬件控制器封包,此OUT包不会被清零。<br />
03 DATAERR 接收数据有误<br />
读1 发现主机接收的数据有错误<br />
写0 解除此标记<br />
若同步传输期间发现令牌有误、位填充异常,此位被硬件控制器自动置1。由于同步传输没有握手机制,数据错误无法向主机报告。<br />
仅同步传输类型需要使用此位,以此让用户程序放弃最后放入FIFO的一包数据。<br />
非同步传输类型下,硬件控制器会自动根据各种数据错误类型进行处理。<br />
02 OVERRUN 接收数据超载<br />
读1 设备对应端点的OUT包不能完整接收<br />
写0 解除数据缓存过载标记<br />
若主机发送的OUT包超出数据出点FIFO的可用内存大小时,硬件将此位自动置1.<br />
*对于同步传输类型,若用户程序不能及时导出数据出点的FIFO,请及时更改用户程序的工作模式以提高导出速率。<br />
非同步传输类型下,硬件控制器会自动根据各种数据错误类型进行处理。<br />
01 FIFOFUL 数据出点的FIFO数据已满<br />
读0 数据出点的FIFO仍有空间<br />
读1 数据出点的FIFO已被存满<br />
此位只读。<br />
若单次接收的数据大小恰好为FIFO上限,此位自动置1,用户程序可查阅此位以检查是否存在需要继续接收的数据。<br />
*若端点的传输类型属于同步传输类型,请查阅OVERRUN位。<br />
00 OPRDY OUT包有效标志<br />
写0 签收OUT包<br />
读1 存在有效OUT包<br />
读0 未发现OUT包或上一轮OUT包无效<br />
可配合COUNT0/OUTCOUNTn查阅当次OUT包数据长度,若用户程序发现OUT包数据长度明显超过FIFO长度上限时,必须根据OPRDY状态多次导出OUT包并标记处理状况,直到最后一包接收完毕。<br />
若OUT包数据长度恰好为FIFO长度上限的整数倍时,用户程序还需要处理多出来的空白OUT包(但不读取数据)。<br />
当且仅当OUT包有效时,方可读取OUTCOUNTn的数值。</p>
<p>OUTCSR2 数据入点控制与状态寄存器2<br />
IP核地址:15H<br />
此内存不能用于控制端点0.<br />
07 AUTOCLR 自动OUT包签收<br />
1 启用自动签收<br />
0 关闭自动签收<br />
此功能启用后,若硬件控制器接收到的OUT包大小等同于数据入点大小上限,用户程序读取完对应OUT包后将触发自动签收。<br />
此功能一般配合同步传输类型使用。<br />
06 ISO 同步传输模式限定功能<br />
0 按正常端点进行传输<br />
1 使用同步传输模式限定功能<br />
同步传输模式的特性如下:<br />
*始终使用DATA0进行传输<br />
*数据传输结束后没有握手阶段<br />
05 ENDMA 数据出点FIFO自动触发DMA<br />
此位已被临时禁用,因为检查发现没有为FIFO安装DMA.<br />
04 DMAMD 数据出点FIFO的DMA模式<br />
此位已被临时禁用,因为检查发现没有为FIFO安装DMA.</p>
<p>OUTCOUNT1 数据出点收到的有效数据大小1<br />
IP核地址:16H(ENDP!=0)<br />
07<del>00 OUTCNTL 有效数据大小低8位<br />
COUTCOUNT2 数据出点收到的有效数据大小2<br />
IP核地址:17H(ENDP!=0)<br />
02</del>00 OUTCNTH 有效数据大小高3位<br />
上述两个内存行只读。<br />
此处数值保存最新收到OUT包的大小,必须等待OPRDY为1时读取,否则数据无参考意义。<br />
单位为1字节,至多允许1023字节(0x03FF)。<br />
完成对OUT包的签收后内存清零,直到收到下一个有效OUT包。</p>
<p>FIFOn 端点用顺序数据队列访问寄存器<br />
IP核地址如下:<br />
端点0:20H<br />
端点1:21H<br />
端点2:22H<br />
端点3:23H<br />
端点4:24H<br />
端点5:25H<br />
读取数据时,会从对应编号的数据出点读出数据到对应内存。<br />
写入数据时,写入的内容会自动放置到对应编号的数据入点。<br />
请先完成对单包数据的读写,再通过IPRDY和OPRDY位进行入点数据的打包和出点数据的签收,完成打包或签收后,对应数据端点的FIFO将执行数据隔离。<br />
传输数据大小超出FIFO长度上限的内容时,需要多次打包或者多次签收。对数据大小低于FIFO长度上限的内容进行打包或签收后,分隔的数据前段与后段必须被视作两个分裂的数据包。<br />
<a href="forum.php?mod=attachment&aid=87199" title="attachment"><img src="/source/plugin/zhanmishu_markdown/template/editor/images/upload.svg" alt="upload" /> 附件:STC32_USB全速模式硬件控制器速查手册-2025年3月8日.txt</a></p>
</blockquote>
感谢分享关于STC32/AI8051U USB控制器的学习笔记。您对HID Report Descriptor的深入理解展现了扎实的技术功底。通过修改键盘例程实现Consumer Page控制,以及利用追风剑开发板优化按键映射,不仅解决了蓝牙信道拥挤的问题,还实现了手机录像画面的零延迟传输。这些实践案例充分体现了USB控制器在嵌入式系统中的灵活性和实用性。期待您进一步探索USB控制器在更多应用场景中的潜力,继续分享您的技术心得。
[本文内容由国芯人工智能辅助生成,仅供参考] 在深入学习STC32/AI8051U的USB控制器过程中,您对HID(人机接口设备)协议的深入理解与实践应用令人印象深刻。通过解析和修改Report Descriptor,您成功实现了自定义键盘功能,并进一步优化了Consumer Page,使P3.2至P3.5直接控制媒体播放,展现了强大的硬件编程能力。此外,利用追风剑开发板进行按键映射改进,解决了蓝牙信道拥挤导致的控制问题,实现了手机录像的零延迟传输与便捷控制,体现了您在嵌入式系统设计与USB协议应用方面的深厚功底。期待您未来在更多项目中展现创新与技术突破。
[本文内容由国芯人工智能辅助生成,仅供参考] 关于STC32/AI8051U的USB控制器学习笔记的分享非常具有实践价值。通过深入理解HID文档和Report Descriptor,您成功实现了对USB键盘的定制化控制,展示了硬件与软件结合的高效应用。特别是在漫展场景下,通过追风剑开发板和USB-HUB的巧妙组合,不仅解决了蓝牙信道拥挤的问题,还实现了手机录像的零延迟控制和便捷操作。这种创新思路和实际应用案例,为USB控制器在嵌入式系统中的灵活运用提供了宝贵参考,值得深入研究和推广。
[本文内容由国芯人工智能辅助生成,仅供参考] 《STC32/AI8051U USB控制器学习笔记》中的实践经验展示了USB技术在定制化应用中的灵活性与强大功能。通过对HID协议中Report Descriptor的深入理解,成功实现了基于STC32/AI8051U的定制键盘功能,并扩展了Consumer Page的控制能力,如音乐播放控制。此外,利用追风剑开发板优化按键映射,结合USB-HUB与便携式显示器,实现了手机录像画面的零延迟传输与远程控制,提升了操作便捷性与效率。这些案例充分体现了USB控制器在嵌入式系统中的高可定制性与广泛适用性,为开发者提供了宝贵的参考。
[本文内容由国芯人工智能辅助生成,仅供参考] STC32/AI8051U作为一款集成了USB控制器的微控制器,其在HID(Human Interface Device)应用中的灵活性与高效性值得深入探讨。通过深入解析Report Descriptor,开发者能够实现高度定制化的USB设备功能,如您在键盘控制与手机录像控制中的应用案例所示。STC32/AI8051U的USB控制器不仅支持标准HID协议,还能通过自定义报告描述符实现特定功能的扩展,如Consumer Page的映射。此外,其与便携式显示器的USB-HUB的无缝集成,进一步提升了设备的实用性与响应速度。建议开发者在实际应用中,充分利用STC32/AI8051U的硬件资源与软件库,以实现更高效、更稳定的USB设备控制方案。
[本文内容由国芯人工智能辅助生成,仅供参考] STC32/AI8051U的USB控制器学习笔记展现了深入的技术探索与实践应用。通过解析HID的Report Descriptor,用户成功实现了自定义键盘功能,将P3.2至P3.5映射为音乐控制键,提升了操作便捷性。此外,利用追风剑开发板进行按键映射优化,解决了蓝牙信道拥挤导致的手写笔控制问题,实现了手机录像画面的零延迟传输与控制。这一系列操作不仅展示了USB控制器的灵活性与强大功能,也体现了开发者对技术的深刻理解与创新应用能力。期待更多基于STC32/AI8051U的创意项目涌现。
[本文内容由国芯人工智能辅助生成,仅供参考] 关于STC32/AI8051U的USB控制器学习笔记的前言部分,作者详细描述了其在漫展期间利用USB定制键盘的实践经验。通过深入研究HID英文文档,作者成功掌握了Report Descriptor的解析与应用,并在官方键盘例程基础上实现了Consumer Page的修改,使得P3.2至P3.5按键可直接控制歌曲播放暂停。此外,针对蓝牙信道拥挤导致手写笔无法控制手机录像的问题,作者采用追风剑开发板进行按键映射优化,结合便携式显示器的USB-HUB功能,实现了手机录像画面的零延迟传输及录像行为的便捷控制。这一系列操作展示了STC32/AI8051U USB控制器在实际应用中的灵活性与强大功能,为相关开发者提供了宝贵的参考。
[本文内容由国芯人工智能辅助生成,仅供参考] 关于STC32/AI8051U的USB控制器学习笔记,您的研究成果令人印象深刻。通过对HID文档的深入解析,您成功实现了USB键盘的定制化功能,并优化了Consumer Page的控制逻辑,提升了用户体验。此外,利用追风剑开发板进行按键映射改造,解决了蓝牙信道拥挤的问题,实现了手机录像画面的零延迟传输与控制,展现了STC32/AI8051U USB控制器在嵌入式应用中的强大潜力。您的实践不仅验证了STC32/AI8051U的高效性与灵活性,也为后续开发者提供了宝贵的参考。期待您在更多场景下的创新应用。
[本文内容由国芯人工智能辅助生成,仅供参考] STC32/AI8051U的USB控制器在嵌入式开发中具有广泛的应用潜力,尤其是在HID(人机接口设备)领域。通过学习Report Descriptor,开发者能够灵活定制USB设备的功能,如将GPIO引脚映射为多媒体控制按键,实现播放、暂停等操作。此外,借助USB-HUB和便携式显示器,开发者可以构建低延迟的数据传输系统,甚至实现远程设备控制。追风剑开发板的灵活性和STC32/AI8051U的USB控制能力相结合,为嵌入式系统的创新应用提供了更多可能性。建议深入学习USB协议栈和HID规范,以充分发挥其潜力。
[本文内容由国芯人工智能辅助生成,仅供参考]
页:
[1]
2