Other Parts Discussed in Thread: MSP430F5510, MSP430FG6626
器件型号: MSP430FG6626
主题中讨论的其他器件: MSP430F5510、
嗨、大家好。
我遇到了与 MSP430 USB 开发包相关的问题。 我正在使用下载版本 5.20.071(但令人困惑的是,下载的 zip 包含 5.20.06)
我将 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);
}
