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.

[参考译文] MSP430FG6626:MSP430 USB 开发软件包中存在错误。 使用 HID 数据管道时的备用消息超时

Guru**** 2928900 points

Other Parts Discussed in Thread: MSP430F5510, MSP430FG6626

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1645753/msp430fg6626-bug-in-msp430-usb-dev-package-alternate-msg-timeout-using-hid-datapipe

器件型号: MSP430FG6626
主题中讨论的其他器件: MSP430F5510

嗨、大家好。

我遇到了与 MSP430 USB 开发包相关的问题。 我正在使用下载版本 5.20.071(但令人困惑的是,下载的 zip 包含 5.20.06)

www.ti.com/.../5.20.07.01

我将 HID 数据管道与标准 VID 和 TI 提供的 PID 配合使用。

此问题会导致每条其他消息超时。  我没有注意到一段时间,因为我的 PC 正在重试。  

我注意到、我使用 Wireshark 进行检查、发现每次发送的 HID 数据包都正常。

我将问题追溯到 usbhid.c 中的函数“usbhid_getBytesInUSBBuffer“

 

下面是原始函数

/*
* Returns how many bytes are in the buffer are received and ready to be read.
*/
uint8_t USBHID_getBytesInUSBBuffer (uint8_t intfNum)
{
uint8_t bTmp1 = 0;
uint8_t bTmp2;
uint8_t edbIndex;
uint16_t state;
edbIndex = stUsbHandle[intfNum].edb_Index;
//interrupts disable
state = usbDisableOutEndpointInterrupt(edbIndex);
if ((bFunctionSuspended) || (bEnumerationStatus != ENUMERATION_COMPLETE))
{
//if suspended or not enumerated - report 0 bytes available
usbRestoreOutEndpointInterrupt(state);
return (0);
}
if (HidReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesInEp > 0)
{
//If a RX operation is underway, part of data may
//was read of the OEP buffer
bTmp1 = HidReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesInEp;
if (*HidReadCtrl[INTFNUM_OFFSET(intfNum)].pCT2 & EPBCNT_NAK)
{
//the next buffer has a valid data packet
//holds how many valid bytes in the EP buffer
bTmp2 = *(HidReadCtrl[INTFNUM_OFFSET(intfNum)].pEP2 + 1);
if (bTmp2 > (*HidReadCtrl[INTFNUM_OFFSET(intfNum)].pCT2 & 0x7F) - 2)
{
//check if all data received correctly
bTmp1 += (*HidReadCtrl[INTFNUM_OFFSET(intfNum)].pCT2 & 0x7F) - 2;
}
else
{
bTmp1 += bTmp2;
}
}
}
else
{
if (tOutputEndPointDescriptorBlock[edbIndex].bEPBCTX & EPBCNT_NAK)
{
//this buffer has a valid data packet
bTmp2 = tOutputEndPointDescriptorBlock[edbIndex].bEPBCTX & 0x7F;
bTmp1 = *((uint8_t*)stUsbHandle[intfNum].oep_X_Buffer + 1);
if (bTmp2 - 2 < bTmp1)
{
//check if the count (second byte) is valid
bTmp1 = bTmp2 - 2;
}
}
if (tOutputEndPointDescriptorBlock[edbIndex].bEPBCTY & EPBCNT_NAK)
{
//this buffer has a valid data packet
bTmp2 = tOutputEndPointDescriptorBlock[edbIndex].bEPBCTY & 0x7F;
if (bTmp2 - 2 > *((uint8_t*)stUsbHandle[intfNum].oep_Y_Buffer + 1))
{
//check if the count (second byte) is valid
bTmp1 += *((uint8_t*)stUsbHandle[intfNum].oep_Y_Buffer + 1);
}
else
{
bTmp1 += bTmp2 - 2;
}
}
}
// Restore interrupt
usbRestoreOutEndpointInterrupt(state);
return (bTmp1);
}

这是下面经过修改的函数。  

我不是 USB 方面的专家、但可以满足我的需求。

 

//----------------------------------------------------------------------------
/* Returns how many bytes are in the buffer are received and ready to be read. */
BYTE USBHID_bytesInUSBBuffer(BYTE intfNum)
{
BYTE bTmp1 = 0;
BYTE bTmp2;
BYTE bTmp3;
BYTE edbIndex;
WORD state;

edbIndex = stUsbHandle[intfNum].edb_Index;
//interrupts disable
state = usbDisableOutEndpointInterrupt(edbIndex);
if ((bFunctionSuspended) || (bEnumerationStatus != ENUMERATION_COMPLETE))
{
//if suspended or not enumerated - report 0 bytes available
usbRestoreOutEndpointInterrupt(state);
return (0);
}
if (HidReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesInEp > 0)
{
//If a RX operation is underway, part of data may
//was read of the OEP buffer
bTmp1 = HidReadCtrl[INTFNUM_OFFSET(intfNum)].nBytesInEp;
if (*HidReadCtrl[INTFNUM_OFFSET(intfNum)].pCT2 & EPBCNT_NAK)
{
//the next buffer has a valid data packet
//holds how many valid bytes in the EP buffer
bTmp2 = *(HidReadCtrl[INTFNUM_OFFSET(intfNum)].pEP2 + 1);
if (bTmp2 > (*HidReadCtrl[INTFNUM_OFFSET(intfNum)].pCT2 & 0x7F) - 2)
{
//check if all data received correctly
bTmp1 += (*HidReadCtrl[INTFNUM_OFFSET(intfNum)].pCT2 & 0x7F) - 2;
}
else
{
bTmp1 += bTmp2;
}
}
}
else
{
if (tOutputEndPointDescriptorBlock[edbIndex].bEPBCTX & EPBCNT_NAK)
{
//this buffer has a valid data packet
bTmp2 = tOutputEndPointDescriptorBlock[edbIndex].bEPBCTX & 0x7F;
bTmp1 = *((BYTE *)stUsbHandle[intfNum].oep_X_Buffer + 1);
if (bTmp2 - 2 < bTmp1)
{
//check if the count (second byte) is valid
bTmp1 = bTmp2 - 2;
}
}
if (tOutputEndPointDescriptorBlock[edbIndex].bEPBCTY & EPBCNT_NAK)
{
//this buffer has a valid data packet
bTmp2 = tOutputEndPointDescriptorBlock[edbIndex].bEPBCTY & 0x7F;
bTmp3 = *((BYTE *)stUsbHandle[intfNum].oep_Y_Buffer + 1);
if (bTmp2 - 2 < bTmp3)
{
//check if the count (second byte) is valid
bTmp1 = bTmp3 - 2;
}
else
{
bTmp1 = bTmp3;
}
}
}
// Restore interrupt
usbRestoreOutEndpointInterrupt(state);
return (bTmp1);
}
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、

    是否可以尝试在接收后重新布防 usbhid_receiveData()?

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

    你(们)好

    USB 代码最初用于另一个使用 MSP430F5510 的项目。 MSP430F5510 不受该问题的影响。

    根据之前的 TI 错误修复、函数“hidReceiverveDataInBuffer“已经插入了一个额外的 usbhid_receiveData 调用、只是添加另一个 receivedData 不是仅仅掩盖了这个问题吗?

    下面是接收到 HID 数据包时固件中调用的函数的调试打印输出。 这是由固定代码生成的、如上所示。 这就是我跟踪问题到“usbhid_bytesInUSBBuffer“的方法。

    //这是一个正常接收的 HID 数据包、并且 100%成功。

    HidIsReceiveInProgress [UserBuf == NULL]
    iUsbInterruptHandler [无 HidIsReceiveInProgress]
    iUsbInterruptHandler [dataReceivedEvent]
    hidReceiveDataInBuffer [添加= 2c94][大小= 64]
    usbhid_bytesInUSBBuffer
    usbhid_bytesInUSBBuffer [nBytesInEp = 0][A][B][C][D]
    usbhid_bytesInUSBBuffer [字节= 62]
    usbhid_receiveData [大小= 62]
    HidCopyUsbToBuff [字节= 62]
    HidCopyUsbToBuff [INEP = 62]
    usbhid_bytesInUSBBuffer
    usbhid_bytesInUSBBuffer [nBytesInEp = 0][A][D]
    usbhid_bytesInUSBBuffer [字节= 0]
    好的


    //这是我对原始代码的调试;只有第 1 个和第 3 个数据包被正确接收,并且它继续在这个交替的好/坏数据包序列。 误差响应可能会有所不同。  


    HidIsReceiveInProgress [UserBuf == NULL]
    iUsbInterruptHandler [无 HidIsReceiveInProgress]
    iUsbInterruptHandler [dataReceivedEvent]
    hidReceiveDataInBuffer [添加= 2c94][大小= 64]
    usbhid_bytesInUSBBuffer
    usbhid_bytesInUSBBuffer [nBytesInEp = 0][A][B][C][D]
    usbhid_bytesInUSBBuffer [字节= 62]
    usbhid_receiveData [大小= 62]
    HidCopyUsbToBuff [字节= 62]
    HidCopyUsbToBuff [INEP = 62]
    usbhid_bytesInUSBBuffer
    usbhid_bytesInUSBBuffer [nBytesInEp = 0][A][D]
    usbhid_bytesInUSBBuffer [字节= 0]
    好的


    HidIsReceiveInProgress [UserBuf == NULL]
    iUsbInterruptHandler [无 HidIsReceiveInProgress]
    iUsbInterruptHandler [dataReceivedEvent]
    hidReceiveDataInBuffer [添加= 2c94][大小= 64]
    usbhid_bytesInUSBBuffer
    usbhid_bytesInUSBBuffer [nBytesInEp = 0][A][D][E]
    usbhid_bytesInUSBBuffer [字节= 0]
    RX 错误


    HidIsReceiveInProgress [UserBuf == NULL]
    iUsbInterruptHandler [无 HidIsReceiveInProgress]
    iUsbInterruptHandler [dataReceivedEvent]
    hidReceiveDataInBuffer [添加= 2c94][大小= 64]
    usbhid_bytesInUSBBuffer
    usbhid_bytesInUSBBuffer [nBytesInEp = 0][A][B][C][D][E][E]
    usbhid_bytesInUSBBuffer [字节= 62]
    usbhid_receiveData [大小= 62]
    HidCopyUsbToBuff [字节= 62]
    HidCopyUsbToBuff [INEP = 62]
    usbhid_bytesInUSBBuffer
    usbhid_bytesInUSBBuffer [nBytesInEp = 0][A][B][C][D]
    usbhid_bytesInUSBBuffer [字节= 62]
    usbhid_receiveData [大小= 2]
    HidCopyUsbToBuff [字节= 2]
    HidCopyUsbToBuff [INEP = 62]
    好的


    HidIsReceiveInProgress [UserBuf == NULL]
    iUsbInterruptHandler [无 HidIsReceiveInProgress]
    iUsbInterruptHandler [dataReceivedEvent]
    hidReceiveDataInBuffer [添加= 2c94][大小= 64]
    usbhid_bytesInUSBBuffer
    usbhid_bytesInUSBBuffer [nBytesInEp = 60]
    usbhid_bytesInUSBBuffer [字节= 60]
    usbhid_receiveData [大小= 60]
    HidCopyUsbToBuff [字节= 60]
    HidCopyUsbToBuff [INEP = 60]
    usbhid_bytesInUSBBuffer
    usbhid_bytesInUSBBuffer [nBytesInEp = 0][A][D][E]
    usbhid_bytesInUSBBuffer [字节= 0]
    RX 错误

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

    您好、

    我来看一下。 在我找到这个问题的专家后、我会立即回复您。  

    马修

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

    有任何更新 Matthew 吗?  已经 6 天了。  

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

    您好、Nick、

    很抱歉耽误你的时间!

    我*认为*您遇到的情况是、数据包大小逻辑存在问题、您似乎已通过您的修复解决了该问题。

    1) 您能详细说明您的设置和发送的数据吗?

    2) 是否会在相同器件型号的其他器件上发生这种情况?

    不清楚你的问题是什么。 听起来您的编辑解决了您的问题、您要求我们调查库代码在该设备上似乎被破坏的原因?

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

    我们每次发送完整的数据管道大小(62 字节)。 我有 2 种产品类型。 旧产品使用的是 MSP430F5510、没有问题;只有 MSP430FG6626 存在此问题。 该数据会在所有 MSP430FG6626 上发生而未发生故障。  目前、我的所有 MSP430FG6626 都是 REV A

    如果您向我发送您的电子邮件、我会向您发送我的源代码。 我的源代码可能遇到的问题是它是使用 Rowley CrossStudio for MSP430 编译的。 但差异非常小。 我的所有产品都使用 Rowley CrossStudio。

    我知道我的编辑解决了我的设备上的问题,但因为我不是专家,我想检查我没有做什么会咬我以后. 我不希望进行详细的调查;只是一个不好的问题、那就是它还可以、或者我应该做别的事情。 请记住、这是 TI 代码、而不是我的工程代码。

    我想您想继续支持 MSP430FG6626、其他客户也可能遇到同样的问题? 再次使用 TI 代码、而不是我的代码。

    您没有回答关于 USB 开发软件包的问题、为什么下载 5.20.071 zip 文件包含 5.20.06 (初始发布)。

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

    您好、

    我已经联系 TI 销售代表。 将其发送到电子邮件。 它将需要更深刻的对话来得出一个明确的答案。

    马修

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

    您好、Nick、

    从我们的角度来看,它看起来还可以,但一定要告诉我们,如果以后出现任何问题。 这些类型的问题可能是特定于应用的。

    然而,没有什么突出的危险信号对我们。

    至于版本号 difference....it's、可能是因为 zip 文件包含多个子文件夹、这些子文件夹有自己的版本控制、因此它并不总是对齐。 然而,我不能为近 10 年前从事这项工作的开发人员说话。

    马修