使用 PIC16F1455/1459 的 USB 上的多个端点

发布于 2025-01-15 04:28:54 字数 2930 浏览 3 评论 0原文

我正在使用 PIC16F1455 收集数据并发送给计算机。

我使用现有代码进行简单测试,仅使用一个端点。 Szymons 代码是我的基础,我对其进行了一些扩展。 我想为我的应用程序使用 3 个端点。

我尝试将系统设置为具有 2 个端点,但我的第二个端点无法工作。

我可以补充一点,

  • 我的配置描述符如下所示
  • 主机将要求报告描述符 1,但
  • 在尝试从端点 2 发送某些内容时不会要求第二个,我只能看到 UEP2 归 SIE(串行接口引擎)所有)
  • 当我尝试更改代码以使 UEP1 应使用 UEP2 硬件时,它不起作用。我通过将地址从 01 更改为 02、将 81 更改为 82 来做到这一点。仅使用一个地址即可使其仅以一种方式工作。
  • 在我的代码下面,我有两个端点,没有给出错误。只是UEP2不行。缺少接口计数和消息大小将给出错误。注释将告诉您可以进行哪些更改,

我想如果通道应该相同,那么两个端点的相同配置应该没问题,只有端点编号和地址需要更改。我说得对吗?

我还了解到,UEP0 由系统使用,不能用于自定义消息。

我需要一些可能出问题的想法 - 如何让第二个端点发挥作用。我没有想法,我发现很难在谷歌上搜索太多。当使用 2 个端点时,它应该要求提供两个报告,对吗?

// Configuration descriptor
const ConfigStruct ConfigurationDescriptor =
{
    {
        // Configuration descriptor
    0x09,   // Size of this descriptor in bytes
    0x02,   // CONFIGURATION descriptor type
    0x29,   // Total length of data for this cfg LSB  // was 29 // 49 for 2 end points
    0x00,   // Total length of data for this cfg MSB
    1,//INTF,   // Number of interfaces in this cfg
    0x01,   // Index value of this configuration
    SCON,   // Configuration string index
    0xA0,   // Attributes (USB powered, wake-up))
    0x32,   // Max power consumption (in 2 mA steps)
    },
    {
        // Generic HID Interface descriptor
    0x09,   // Size of this descriptor in bytes
    0x04,   // INTERFACE descriptor type
    IHID,   // Interface Number       //<- I assume that it stays 1 just using UEP2. Cannot start from 2
    0x00,   // Alternate Setting Number
    0x02,   // Number of endpoints in this interface
    0x03,   // Class code (HID)
    0x00,   // Subclass code
    0x00,   // Protocol code 0-none, 1-Keyboard, 2- Mouse
    0x00,   // Interface string index

        // Generic Hid Class-Specific descriptor
    0x09,   // Size of this descriptor in bytes
    0x21,   // HID descriptor type
    0x11,   // HID Spec Release Number in BCD format (1.11) LSB
    0x01,   // HID Spec Release Number in BCD format (1.11) MSB
    0x00,   // Country Code (0x00 for Not supported)
    0x01,   // Number of class descriptors
    0x22,   // Report descriptor type
    0x2F,   // Report Size LSB  (47 bytes)
    0x00,   // Report Size MSB

        // Generic HID Endpoint 1 In
    0x07,   // Size of this descriptor in bytes
    0x05,   // ENDPOINT descriptor type
    0x81,   // Endpoint Address     //<----- changing to 82 will not work
    0x03,   // Attributes (Interrupt)
    HRBC,   // Max Packet Size LSB
    0x00,   // Max Packet Size MSB
    0x01,   // Interval (1 millisecond)

        // Generic HID Endpoint 1 Out
    0x07,   // Size of this descriptor in bytes
    0x05,   // ENDPOINT descriptor type
    0x01,   // Endpoint Address  //<--------changing on 02 will not work
    0x03,   // Attributes (Interrupt)
    HRBC,   // Max Packet Size LSB
    0x00,   // Max Packet Size MSB
    0x01,   // Interval (1 millisecond)

I am using a PIC16F1455 to collect data and send to a computer.

I used existing code for simple testing, which uses one end point only. Szymons code is my base, which I have expanded a bit.
I would like to use 3 endpoints for my application.

I have tried to set up the system to have 2 endpoints, but my second endpoint is not working.

I can add that

  • I have my configuration descriptor as below
  • The host will ask for Report Descriptor 1, but not for the 2nd one
  • when trying to send something from Endpoint 2, I can only see that UEP2 is owned by the SIE (Serial Interface Engine)
  • When I try to alter code so UEP1 should use UEP2 hardware, then it does not work. I did this by changing addresses from 01 to 02 and 81 to 82. Doing this with just one will make it work one way only.
  • Below my code, which I had with 2 endpoints, which gave no error. Just UEP2 does not work. Missing up interface count and message size will give an error. The comments will tell what changes can be done

I guess that if but channels should be the same, then the same configurations for both end points should be fine, only the endpoint number and addresses need change. Am I right?

I also understand, that UEP0 is used by the system and cannot be used for custom messages.

I need some ideas what could be wrong - how to get a second end point to work. I am out of ideas and I find it hard to google much on this. It should ask for both reports when using 2 end points, right?

// Configuration descriptor
const ConfigStruct ConfigurationDescriptor =
{
    {
        // Configuration descriptor
    0x09,   // Size of this descriptor in bytes
    0x02,   // CONFIGURATION descriptor type
    0x29,   // Total length of data for this cfg LSB  // was 29 // 49 for 2 end points
    0x00,   // Total length of data for this cfg MSB
    1,//INTF,   // Number of interfaces in this cfg
    0x01,   // Index value of this configuration
    SCON,   // Configuration string index
    0xA0,   // Attributes (USB powered, wake-up))
    0x32,   // Max power consumption (in 2 mA steps)
    },
    {
        // Generic HID Interface descriptor
    0x09,   // Size of this descriptor in bytes
    0x04,   // INTERFACE descriptor type
    IHID,   // Interface Number       //<- I assume that it stays 1 just using UEP2. Cannot start from 2
    0x00,   // Alternate Setting Number
    0x02,   // Number of endpoints in this interface
    0x03,   // Class code (HID)
    0x00,   // Subclass code
    0x00,   // Protocol code 0-none, 1-Keyboard, 2- Mouse
    0x00,   // Interface string index

        // Generic Hid Class-Specific descriptor
    0x09,   // Size of this descriptor in bytes
    0x21,   // HID descriptor type
    0x11,   // HID Spec Release Number in BCD format (1.11) LSB
    0x01,   // HID Spec Release Number in BCD format (1.11) MSB
    0x00,   // Country Code (0x00 for Not supported)
    0x01,   // Number of class descriptors
    0x22,   // Report descriptor type
    0x2F,   // Report Size LSB  (47 bytes)
    0x00,   // Report Size MSB

        // Generic HID Endpoint 1 In
    0x07,   // Size of this descriptor in bytes
    0x05,   // ENDPOINT descriptor type
    0x81,   // Endpoint Address     //<----- changing to 82 will not work
    0x03,   // Attributes (Interrupt)
    HRBC,   // Max Packet Size LSB
    0x00,   // Max Packet Size MSB
    0x01,   // Interval (1 millisecond)

        // Generic HID Endpoint 1 Out
    0x07,   // Size of this descriptor in bytes
    0x05,   // ENDPOINT descriptor type
    0x01,   // Endpoint Address  //<--------changing on 02 will not work
    0x03,   // Attributes (Interrupt)
    HRBC,   // Max Packet Size LSB
    0x00,   // Max Packet Size MSB
    0x01,   // Interval (1 millisecond)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

国粹 2025-01-22 04:28:54

我发现错误出现在报告或描述符的回复中。它只允许回复端点 0(硬件中的端点 1),这意味着当主机请求下一个描述符时,它不会得到答案。

  if((SetupPacket.bmRequestType & 0x1F) != 0x01 || (SetupPacket.wIndex0 != 0x00)) return;

需要

if((SetupPacket.bmRequestType & 0x1F) != 0x01 || (SetupPacket.wIndex0 > (InterfaceCount - 1))) return;

然后它就可以工作
下一步是在PC主机端,每个端点本身就是一个连接

I found the mistake to be in the reply of reports - or descriptors. It would only allow to reply for endpoint 0 (endpoint 1 in hw), meaning when the host would ask for next descriptor, it would not get answer.

  if((SetupPacket.bmRequestType & 0x1F) != 0x01 || (SetupPacket.wIndex0 != 0x00)) return;

needs to be

if((SetupPacket.bmRequestType & 0x1F) != 0x01 || (SetupPacket.wIndex0 > (InterfaceCount - 1))) return;

Then it works
Next step is that in PC host side, every end point is a connection by itself

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文