圈圈.学习进度_笔记
ZC:(20180930)书P91,PDF(104 / 416) [ 3.7节 结束,下一页 就是 3.8节 ]
ZC:(20180831)PDF.297 / 416
ZC:今天发现(20180912),程序的代码段如果太大了的话(代码多,编译出来的代码段就大),Keil 就会出现 链接不成功的情况。具体看下来,代码段 大小 超过 8200 就不行了,测试的项目是 UsbMouse__ZC__Code8200。
1、20181010
PDF.P123/416 书.P110、PDF.P129/416 书.P116 讲到这里 3.13节,本章中只用到了3个 端点:端点0输入、端点0输出、端点1输入,各个端点 各有分工?具体都是负责干什么的?
PDF.P123/416 书.P110 请求是 发送到 接口的。请求 发送到 接口、设备 到底是什么意思,有什么区别 ??
1、20180917:
PDF.P87(书P76),书中这样说:“...,从bmRequestType的第7位可以看出,它是请求数据输入的。” 我的分析:请求的方向是“设备到主机” & 说是“请求数据输入”,可以感觉到 貌似 本书中 提及的 “输入”/“输出” 都是 从“主机”的角度出发的。
包括 提及的 "输入缓冲区"/"输出缓冲区" 貌似都不是 USB芯片模块的 输入输出缓冲区,而是 PC的USB总线控制器的。然而 从代码来看 应该是 USB芯片模块的输入输出缓冲区,∴ 这里一直感觉是 反着的,很难受...
难道是这样理解??:输入输出缓冲区 是 PC的USB总线控制器的,USB芯片模块 并没有 输入输出缓冲区,USB芯片模块 只是在 接收到相应的中断(或者别的种类的信号后)去操作输入输出缓冲区 而已... (真实的情况是这样子的吗???)
1.1、PDF.P103(书P90),这里 最后一段的文字解说,不太明白... (关于 端点0输入中断 和 下一个SETUP包 的)
不解的地方:
剩余部分 发送完毕之后 不会有 端点0输入中断 产生吗?
“D12 在收到下一个SETUP包之后,会自动将端点0输入缓冲的数据置为无效,” 这里我明白的,但是 “也就说是第二次加进去的数据实际上并没有起作用。”是什么意思?什么叫“并没起作用”?“第二次加进去的数据” 主机实际上是不需要的?不会吧... “实际上并没有起作用”作者想表达的意思是 没有产生 端点0输入中断 也是没关系的?
看代码中,端点0输入中断 的处理函数是 UsbEp0In(void),所做的工作就是 清楚中断标志+发送未发完的数据,难道 确实是 “第二次加进去的数据” 不会产生 端点0输入中断 ?这个 需要在 后面通过代码来看一下...待测试。
1、20180309:
Pdf.P124 ZC:(1)删减代码,形成3.3节的代码,(2)修改代码:(A)清中断标志 (B)不清中断标志 看看它们的现象区别 (ZC:main(...)里面的 while循环中没有延时函数,应该会 非常快速的打印出 不清中断标志的中断信息*N。)
Pdf.P98(书P85)
2、第2章
2.1、书P43(56 / 416),编译:
3、第3章
(1)、3.3节 的代码中,没有加入 断开/连接USB的代码,导致 "串口调试助手"没有信息显示,也没有 气泡"无法识别的USB设备" 出现。
(2)、3.4中,疑问:"读取从主机发送到端点0的数据",消息发送过来-->硬件接收到消息-->硬件中断-->如果没有及时的处理,会不会 主机又发新的数据?会不会像TCP一样 以为上次的数据丢失了 而重发上一次的数据?如果 主机又发来了数据(不管是重发还是发来新的数据),此时 上次被调用的中断函数还没有退出,会不会引发新的中断(再次调用中断函数)?
同一时间点 一个中断有多个中断例程在执行的话 肯定是不行的(估计是使用 打开/关闭 中断的方式来人为的控制 [ 应该是 D12ClrRd() 和 D12SetRd() ])。
(3)、Pdf.P81(书P68) 中说的 数据格式,只是 XP发来的是这样,还是 我们就应该按照这个格式来通讯?
ZC:第一个字节保留;第二个字节 接收到数据的字节数;第三个字节开始 真正的USB数据
读到的字节数 会不会 超过 传入的形参Len?
(4)、Pdf.P82(书P69) "//这里不直接调用读1字节的函数,而直接在这里模拟时序,可以节省时间",这句话 类似的话,在前面的章节/代码注释(where?)中也出现过,这里哪里“模拟时序”了?为什么这样“节省时间”?
ZC:难道 “模拟时序”,指的是 "D12ClrRd();"和"D12SetRd();"?? 不会吧??...(ZC: (20180322)肯定不是说的这个)
ZC:(20180322) 应该说的只是点 和 PDIUSBD12的时序图 有关,具体 不懂,以后再说...
Pdf.P96(书P.83) 发送数据的函数中 也有这样的注释
(5)、3.3节(Pdf.P79) 说到,现在的 中断处理方式是无限循环方式 而非 中断方式,尝试将 中断的处理方式 改成 中断方式 不要使用无限循环的方式
ZC:改成 中断方式 的话,main(...)里面的 无限循环while 怎么处理?依旧需要保留?不保留的话,main(...)就会退出 程序就结束了?还是别的什么结果?第2章代码main(...)里面也有一个无限循环。
(6)、ZC:居然是这样的,和我理解的不一样...:
输出中断 --> 主机有数据传输到板子
输入中断 --> 成功将数据发送到主机
(7)、Pdf.P77 注意这里,中断模式 是 正确传输才产生中断(成功发送出数据或者成功接收到数据才产生中断)。
"端点配置选择为模式0,即端点1和2都为普通端点,因为这里不需要使用等时传输。" ZC:"等时传输" 是啥?
(8)、Pdf.P78 这里的延时函数 实现的原理 居然是 使用循环来消耗CPU的时间。
ZC:从main(...)函数 和 这里的DelayXms(...)函数 可以看出,本单片机 从开机开始 MCU都是100%的使用率在工作 直到关机?(即使 它什么都不做,main(...)中的死循环依旧会100%的使用MCU)
ZC:没有像OS那样的sleep(...)函数?∵是单任务的模式?OS底层的 任务调度 应该也不是不停歇的循环吧?这样CPU的使用率不是会很高?即使在所有进程都不忙的情况下,OS底层也是在无间隙无休止的循环调用所有进程?
(9)、Pdf.P80 从打印的信息和作者的讲解看出,"USB总线挂起"和"USB总线复位" 貌似应该这样理解:主机对设备进行挂起和复位操作(ZC:貌似不是通过发送数据来操作的,∵后面才收到数据的,难道是直接的 指令操作?就像烧录的程序操作板子的方式一样?51单片机的特性?)
(10)、Pdf.P84 试试看NAK是什么样子的
(11)、Pdf.P86 "D12 一直在回答NAK,即没有数据准备好",如何能观察到这个 NAK?这是个什么样子的数据结构 什么样子的信息?
Pdf.P87/P88 过程:
{ 主机发送8字节数据-->主机等待(这段时间主机一直在请求输入)--> 程序没有返回数据,∴D12一直在回答NAK(即没有数据准备好)--> 主机等待了一段时间后发送一次总线复位 } * 3次 --> 三次都失败了,(主机)没有读到数据,主机只好很无奈的放弃了操作。这是该USB端口上不再有数据活动,从而D12进入了挂起状态
ZC:"主机一直在请求输入",∴ 板子里的程序称为 输入中断?这样理解?
ZC:"D12进入了挂起状态",是D12自己进入挂起?还是主机让D12挂起?按照 数据传输的那个理解套路的话,应该是这样的过程:主机让D12挂起-->D12变为挂起状态-->D12挂起中断发生
(12)、老是提到的 "USB总线复位" / "USB总线挂起",这个“USB总线” 到底是指什么,是指 主机中的USB总线,还是指 整个USB板子? "复位" 和 "挂起" 又是指 什么样的动作,"复位" 是指 重置,"挂起"是指 不工作并等待命令?这些是哪里的术语名词,51单片机里面的吗?
(13)、Pdf.P104 设备描述符 总长 18字节,D12的端点0的输入缓冲区长度是16字节(不知道 是否 输入缓冲区就是输出缓冲区?或者 两者长度一样?),∴ 在发送了16字节之后,在 输入中断中 将剩余的2字节数据再次发送出去了
(14)、Pdf.P105 主机发给设备的 ACK应答 又是什么样子的东西?
(15)、Pdf.P106 这里提到的 "0x04"是图3.7.1中的信息。图3.8.1 中 在设置了新的地址之后,"获取描述符——设备描述符" 和 "获取描述符——配置描述符" 的后面 怎么没有 "USB总线复位"的信息 打印出来了??
Pdf.P106 这里也有一段关于 复位总线 的话:"说明设置地址操作已经成功了,∵主机已经使用新的地址来发送请求了,若不成功 主机会检测到超时从而复位总线",这里是复位哪里的总线?主机里面的?还是 主机通过 USB端口来操作D12 复位了D12里面的总线?
(16)、Pdf.P106 "这次获取设备描述符将会完整的获取" 什么意思?这次和第一次获取有什么不同?第一次获取 为啥是不完整的?
(17)、Pdf.P115 (http://computer00.21ic.org/user1/2198/archives/2007/42769.html)貌似失效了(20180320),baidu搜"圈圈 java 字符串描述符" 也没有搜到...
(18)、Pdf.P76 D12设置模式命令 D12内部上拉电阻断开 模拟USB拔下动作
(19)、Pdf.P79 3.3节 第一段文字,说明:USB总线复位 是指 D12芯片里面的操作,D12里面有CPU,USB总线复位 之后 会产生中断 那主机是如何通知D12 让它去做复位操作的呢?直接向对应的USB端口写命令?
(20)、Pdf.P84-85 3.4节 这里的讲解 给我印象最深的就是:一些操作(这一节主要是 D12WriteCommand、D12ReadByte、发送D12_ACKNOWLEDGE_SETUP、D12ClearBuffer(实际上也是调用D12WriteCommand)) 必须注意选择好对应的端口,不能搞乱掉。
(21)、Pdf.P95 3.7节,“在主机下一次发送 IN 令牌后,D12 将会自动将端点0 输入缓冲区中数据返回给主机,这样就实现了获取设备描述符的请求。” 这里看出,主机和设备之间 还有 令牌 这种东西在传递 那就肯定可以通过它来通信和控制了。
(22)、Pdf.P95 这里讲到 “写入的数据第一个字节必须为0,第二个字节为需要发送的数据的长度。后面写入的才是真正需要发送的数据。” 联想到,前面 读取数据的时候,有这样的规定:第一个字节无效,第二个字节是数据的长度,后面是真正的数据。这样的结构是 USB协议规定的吗?
貌似 函数D12WriteEndpointBuffer(...) 没有管发送数据的长度,能可以发送随意长度的数据?
Pdf.P103 发不完的,在中断处理中 继续发,直到发完
(23)、Pdf.P97 理解代码中 变量NeedZeroPacket(g_NeedZeroPacket)的含义
ZC:个人理解:PDIUSBD12的端点0(的缓冲区的)大小为16字节,这个值存放在 DeviceDescriptor[7] 中,g_Buffer的长度也是 16字节,是∵D12就是这几成这样的?还是 作者自己规定的?我感觉应该是前者。
ZC:在设备发送数据的时候,当最后一条数据的长度正好等于16时,主机无法判断后面是否还会有数据,于是需要发送一个0长度的数据包 用以表示数据发送结束了。在 输入中断 调用 函数UsbEp0SendData(...)时 会判断 NeedZeroPacket(g_NeedZeroPacket)是否为1,为1则发送 0长度的数据包 用以表示数据发送结束了。
(24)、Pdf.P98 说还要对 接收者进行散转。接收者在 bmRequestType 的 D4~D0 位中定义。我在 3.7节 的代码中添加打印接收者的语句。
Pdf.P88 3.5.1节 表3.5.1,接收者的讲解
(25)、Pdf.P103 本页最后一段话 不是很明白:“前面提到过,主机第一次获取设备描述符时,只会读一个数据包的设备描述符,...。这会不会有问题呢?...。因为在 D12 在收到下一个 SETUP包之后,会自动关机将端点 0 输入缓冲区的数据置为无效,也就是说第二次加进去的数据实际上并没有起到作用。...”
ZC:哪来的 下一个“SETUP包”?明明是一个包的后半部分吧?
ZC:“也就是说第二次加进去的数据实际上并没有起到作用” 后半段数据没有起到作用?扯淡吧?
(26)、Pdf.P105 具体的过程是这样的么?:主机发送 SET_ADDRESS的请求包--> 设备接收到请求包,设置新的地址(此时新的地址还未被启用),返回 0长度的状态数据包 --> 主机返回ACK应答--> 设备收到ACK应答后 新地址才生效
(27)、Pdf.P125 “HID 协议以及用途表文档”在哪里?附录吗?光盘中提供的? ZC:我在网上搜到了,是官网上面的:"D:\eBook\WindowsDriver\圈圈教你玩USB\HID_ZC\HID1_11.pdf 和 Hut1_12v2.pdf"
Pdf.P125 "...官方网站提供的 HID 描述符工具..." 这个工具 貌似没有在官网找到... 在哪里?
(28)、Pdf.P129 最后面的一段文字中 “在设备复位处理中,...” 说明 "USB总线复位" 应该指的是 设备而非主机
(29)、Pdf.P126 没注意 代码中的 "中断输入端点 1" 是在哪里?怎么使用的?就是 端点1 吗?
4、
5、第5章
5.1、书P162(175 / 416),有一句话:“然后编译工程,并下载到学习板中运行,就会发现新硬件。”,这里的 "编译工程"、"下载到学习板" 完全不记得是怎么弄了...还是得将这些东西 整理一下 不然再隔一段时间不弄的话 又会不记得了...
6、
7、
8、
9、
10、