Part Number: MSP430FG6626
Other Parts Discussed in Thread: MSP430F5510,
Hi Folks.
I have issues with the MSP430 USB DEV Package. I'm working with the download 5.20.071 (but confusingly, the downloaded zip contains 5.20.06)
I'm using the HID datapipe, with the standard VID, and a PID supplied by TI.
The issue causes every other message to timeout. I didn't notice for some time because my PC was retrying.
Once I noticed, I checked with Wireshark and saw good HID packets being sent each time.
I traced the problem to the function "USBHID_getBytesInUSBBuffer" in USBHid.c
Below is the original function
/*
* 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);
}
This is the modified function below.
I'm no expert in USB, this is working for me.
//----------------------------------------------------------------------------
/* 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);
}
