This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CC2540:CC2540 USB 外设出现问题

Guru**** 2529560 points
Other Parts Discussed in Thread: CC2540

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/702936/cc2540-problem-with-cc2540-usb-peripheral

器件型号:CC2540

大家好!

我正在开发基于 CC2540的器件、我想创建一个类似的桥、将所有接收到的数据包从蓝牙转发到 USB、但我的 CC2540 USB 有问题。 在数据传输过程中,某些数据包丢失,当我监听 USB analeyzer 时,它会向我提供以下日志:

35.2  英寸       00 00 00 01 00 08 39 00 00 00 00 00 00 00 00 00 00 00 00 6… 4663.1.0
             00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 4663.1.16.  
             00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 4663.1.32.

35.2  UST   c0000004失速 pid 4664.1.0  
35    复位                 4665.1.0  
34    复位                 4666.1.0  
34    正常                     4666.2.0
35   还可以                      4665.2.0
35.2  复位                  4667.1.0
35.2  英寸       00 00 00 01 00 08 36 00 00 00 00 00 00 00 00 00 00 00 00 6… 4668.1.0
             00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 4668.1.16.
             00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 4668.1.32.

您可以在此日志中看到、在主机尝试重置端点之后、我从该返回数据包发送数据的端点、在这些过程中、我丢失了一些数据包。

下面是我将数据写入端点的代码的一部分:

uint8 usbfwVancFOBWrite (uint8 * data)
{
uint32 stopPoint = 100;
uint8 oldEndpoint;
//保存旧的索引设置,然后选择端点0并获取控制寄存
器 oldEndpoint = USBFW_GET_SELECTED_END终结 点();


USBFW_SELECT_终结 点(USB_HID_VFOB_EP);
IF (USBCSOL 和 USBCSOL_OUTPKT_RDY)//缓冲区已满

//读取 FIFO
if (usbReadLocked=0)
{
usbfwReadFifo (&USBF2、USBCNTL、_data);
USBCSOL &=~USBCSOL_OUTPKT_RDY;
}
USBFW_SELECT_终结 点(oldEndpoint);
//返回0;
}

USBFW_SELECT_端 点(USB_HID_VFOB_EP_WRITE);

//在
(((USBCSIL 和 USBCSIL_INPKT_RDY)&& stopPoint>0)期间发送数据包
stopPoint--;
if (stopPoint!=0)/*检查超时事件*/
{
usbfwWriteFifo (&USBF2、64、数据);
USBCSIL = USBCSIL_INPKT_RDY;
USBCSIL = USBCSIL_SEND_STALL;
while (((USBCSIL 和 USBCSIL_SENT_STALL)&& stopPoint>0)
stopPoint--;
}
USBCSIL = 0;
USBFW_SELECT_终结 点(oldEndpoint);

if (stopPoint=0)
返回0;/*超时事件*/
否则
返回1;/*成功发送*/
} 

知道有人能给我一个解决这个问题的建议吗???

谢谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Alireza、
    我不知道。

    使用哪种 SDK 作为基础?
    这是否在 USB 端点的初始化和枚举之后发生?
    您能否在开始通过 USB 发送数据包之前添加延迟?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、eirik、感谢您的回答。
    不、它的剂量不会发生在 USB 端点的枚举中、当我想用 usbfwVancFOBWrite 函数写入 USB 端点时会发生这种情况(大部分时间此函数工作正常、但有时发送 STALL)、 正如您在该函数中看到的、我首先尝试清空对应输出端点缓冲区(您知道端点2输入和输出共享相同的64字节缓冲区)、然后我尝试写入中的端点2。

    在 usbfwVancFOBWrite 函数“USBCSIL = USBCSIL_SEND_STALL;”代码存在时,此行是否会导致此问题?? (我没有编写此函数、因此我不知道它的确切含义)。

    感谢您的响应。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Alireza、

    批量传输将在以下链接中进行说明: www.beyondlogic.org/.../usb4.shtml

    • IN: 当主机准备好接收批量数据时、会发出 IN 令牌。 如果函数接收到 IN 类型的错误、它将忽略数据包。 如果正确接收到令牌、该函数可以使用包含待发送批量数据的数据包或指示端点出错的 STALL 数据包或指示端点正在工作的主机的 NAK 数据包进行应答、 但 Temporary 没有要发送的数据。

    在发送 STALL 数据包后、端点必须进入空闲状态。 在 CC2540 USB 的 BLE-CC254x-1.4.2.2 hostTest 示例中、USB 实现将循环

    空 HalUARTPollUSB (空)

    #if defined HAL_SB_BOOT_CODE

     while (USBIF) usbirqHandler();

    #endif

     halUartPollEvt();

     halUartPollrx();

     halUartPollTx();

    halUartPollEvt()->usbfwSetupHandler()将处理诸如 STALL、RESET 等事件。 必须在每个数据包之后检查事件。