Microchip PIC 16F1455 USB 堆栈






4.85/5 (27投票s)
本文介绍 Microchip PIC 16F1455 的 HID USB 堆栈,以及在 Windows 平台上与之通信的方式。
引言
本文介绍 Microchip PIC 16F1455 的 HID USB 堆栈,以及在 Windows 平台上与之通信的方式。
背景
这是我第一篇文章的扩展:C# USB HID 接口,对 USB 堆栈和 C# USB HID 设备类都进行了少量改进。
此文的灵感主要来自于 Codewrite 上的这篇文章:使用 PIC16F1455 进行 USB 接口,它让使用 16F1455 进行 USB 操作的问题看起来很简单。但是,它基于 Microchip 提供的堆栈,众所周知,该堆栈不是免费的,阅读起来很麻烦,并且占用内存太多(几乎占用了设备的一半)。
这个堆栈是免费使用的,因为它主要是为教育目的编写的,而且绝不完整。它只包含实现本文后续示例通信所必需的内容,并且为了提高代码的可读性,移除了许多回调和其他不必要的冗余代码,以便那些愿意学习 USB 的人能够理解。
堆栈的主要改进之处在于,USB 管理的全部功能已转移到通过中断工作,将实际的程序空间留给程序员,无需担心 USB。换句话说,你只需对设备进行你需要的操作,USB 操作会在后台完成。
本文涵盖以下内容:
- 创建基于 PIC 16f1455 的 USB HID 设备
- 通过 C# 从 Windows 连接到设备
- 向设备发送命令
- 设备解析这些命令并对其做出响应
- 设备将状态或状态更改发送回主机
- 主机解析这些状态并在 C# 窗体中反映出来
本质上,我们将创建一个设备,一个在 Visual Studio 中用 C# 编写的程序,并让它们相互通信。
该堆栈是在 MPLAB-X 2.10 和 Compiler XC8 v1.30 下编写的,这在当时是最新版本。
废话不多说,请下载以下文件:
- 16F1455GenericHid.zip -> 这是你可以自己构建的 MPLABX 项目
- 16F1455GenericHidHex.zip -> 如果上述构建因某种原因失败,这是一个已构建的 Hex 文件
- USB16F1455HidTest.zip -> 这是 Windows 端对应的 Visual Studio 项目。
- 下载 16F1455GenericHid.zip - 23.5 KB
- 下载 16F1455GenericHidHex.zip - 3.6 KB
- 下载 USB16F1455HidTest.zip - 45.7 KB
使用代码
首先,我们需要一个设备来工作,所以我将从原理图开始。
以及构建的原型。
显然,RA3 和 VCC 之间应该有一个用于编程的电阻,但我发现使用 PICKIT3 时,没有它反而效果更好。
一旦制作完成,就可以构建我们的堆栈并将其编程到芯片中。
这时我想指出,与 Microchip 提供的相比,此堆栈占用的芯片资源非常少。
我第一次用 Microchip 的产品构建时,两个内存使用指示器都几乎达到了容量的一半...
编程完成后,将 USB 线连接到计算机。
这是我设备上发生情况的一些屏幕截图。
查看设备管理器中的属性后,我发现了这个。
此时我知道我们可以开始与其通信了。
现在,在主机端,启动 visual studio(免费版就足够了),加载项目并构建。它只需要 .net 2.0,所以可以假定你的机器上已经安装了该框架,并且可以顺利构建。构建完成后,启动它。
窗体左上角的两个指示器显示按钮和 LED 的当前状态。按下按钮后,状态几乎立即更新。“Get Status”按钮将第一个命令发送到设备,以便它重新发送其当前状态,就像手动刷新一样。窗体上的第二个按钮会根据当前状态打开或关闭 LED。“Clear”按钮会清除原始数据框。
我想指出的一点是,此窗体上的任何按钮都无法控制这些指示器。这些指示器完全由 PIC 控制。
当你点击第一个按钮时,一个“Get Status”命令消息被发送到芯片,芯片通过发送状态消息来执行该命令,并将其当前状态报告回主机。主机在收到状态消息后,会根据消息中的第三和第四个字节相应地更新左上角的两个指示器。
第二个按钮将“Toggle Led”命令消息发送到 PIC,PIC 以与上述类似的方式处理它,区别在于它在将状态报告回主机之前会改变 LED 的状态。
至此,我们已经完成了我们的设备和计算机之间的一次完整通信周期。
这只是一个通用设备,而且由于 HID 的存在,这个芯片几乎可以变成我们想要的任何东西,比如键盘或鼠标。我编写堆栈时就考虑到了这一点,所以现在是时候演示如何在单个芯片上构建混合设备,例如 HID、鼠标和键盘,并在双方进行适当的实现。
关注点
一个小技巧...
众所周知,在当今的环境下,单个 8 字节消息可能不足以满足我们一次发送的需求,所以这里有一个技巧:
在 MPLABX 中打开文件 "UsbDescriptors.h" 并修改以下行:
改为
这将把消息长度从 8 字节增加到 64 字节。请记住,消息越长,缓冲区就越大,因此内存消耗也越多。
重新构建 MPLAB 项目并将其烧录到芯片中。在 Visual Studio 端不需要做任何事情,因为消息长度是从设备获取的,Windows 端会自动调整以适应接收到的内容。
烧录完成后,重新启动所有程序,这是我看到的结果:
从现在开始,通信的消息将是 64 字节长,我们通过更改代码中的一个变量就实现了这一点。
总而言之,我希望你能从中受益,也许能学到一些东西,谁知道之后会发生什么……你的想象力是唯一的限制 :)
历史
历史不长,但这已经是第二次发表此类文章了。要查看第一篇,请点击此处:
谢谢。