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.

[参考译文] TMS320F2.8377万D:USB_DEV_SERIAL示例代码问题

Guru**** 2587345 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/656288/tms320f28377d-usb_dev_serial-example-code-question

部件号:TMS320F2.8377万D

您好,Champs:

我的一位客户正在使用USB_DEP_SERIAL示例代码来实现USB通信,但存在问题。

他们只是修改了示例文件中的一些配置,如以下项目所附:

1.注释UART配置和while ()内容;

2.增加1毫秒计时器中断以发送168字节;

3.添加RxLengthFromHost以指示收到的消息。

客户的目标是每隔1毫秒从主机接收一次命令,然后 回复168字节内容6万次。

他们使用主机程序来接收回复并计算是否正确通信,而 问题是,他们总是收到错过的消息,每500毫秒,40~50毫秒就会没有传输数据, 通过进一步确认,即使在FIFO写入后启用Tx,它似乎仍无法发送F2.8377万D。

有人能帮您检查代码,并告知我们是否遗漏了任何内容,或者指出问题所在吗?

e2e.ti.com/.../usb_5F00_dev_5F00_serial.c

 

此致,

张卫健

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

    首先,主机是否在40ms-50毫秒后再次开始接收数据?

    其次,您是否已通过USB分析仪确认,当主机未从设备接收数据时,主机已实际以数据包形式发送数据,请求设备发送数据,并且数据包中的数据已通过NAK从设备返回?

    第三,在写入USBBuffer之前,应检查是否有可用空间。 请参阅下文。
    //
    //缓冲区中有多少空间?
    //
    ui32Space = USBBufferSpaceAvailable((tUSBBuffer *)&g_sTxBuffer);
    IF (ui32Space >= 168)

    ui32TxCountNum += USBBufferWrite(tUSBBuffer *)&g_sTxBuffer,(uint8_t *)&USBTxBuf,168);
    }

    第四,USBBufferWrite()返回的值是否超过168。 这一点很重要。 您可以执行如下操作。

    //
    //缓冲区中有多少空间?
    //
    ui32Space = USBBufferSpaceAvailable((tUSBBuffer *)&g_sTxBuffer);
    IF (ui32Space >= 168)

    ui32TxCount = USBBufferWrite(tUSBBuffer *)&g_sTxBuffer,(uint8_t *)&USBTxBuf,168);
    ui32TxCountNum += ui32TxCount;

    IF (ui32TxCount < 168)

    ESTOP0;//调试
    }
    }

    第五,设备从主机接收什么?从主机接收时,设备似乎没有执行任何操作。

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

    Sal,

    感谢您的回复,对我的延迟回复表示抱歉。 以下是客户反馈,请帮助我们告知应检查的内容。

    [报价用户="Sal Pezzino"]
     
    首先,主机是否在40ms-50毫秒后再次开始接收数据?

    [/引述]

    主机是一种通用串行端口工具,它始终在整个过程中打开。 在 40ms-50毫秒后,它可以再次接收数据,但不接收数据。

    [报价用户="Sal Pezzino"]
     
    其次,您是否已通过USB分析仪确认,当主机未从设备接收数据时,主机已实际以数据包形式发送数据,请求设备发送数据,并且数据包中的数据已通过NAK从设备返回?

    [/引述]

    客户使用总线集线器监控USB帧,仅传输数据,采集IRP-I/O请求块和STAK-IRP堆栈位置三个相位。 他们 不确定是否发生NAK,所以您是否有任何建议进行检查?

    [报价用户="Sal Pezzino"]
     第三,在写入USBBuffer之前,应检查是否有可用空间。 请参阅下文。
    //
    //缓冲区中有多少空间?
    //
    ui32Space = USBBufferSpaceAvailable((tUSBBuffer *)&g_sTxBuffer);
    IF (ui32Space >= 168)

    ui32TxCountNum += USBBufferWrite(tUSBBuffer *)&g_sTxBuffer,(uint8_t *)&USBTxBuf,168);
    }

    [/引述]

    如果在检查后缓冲区写入的空间超过168,那么ui32TxCountNum就是正确的数字168*6万,在这种情况下,串行端口工具接收的字节号与  发送的MCU相同,因此看起来不错。 但如果我们检查示波器,我们发现每500毫秒,就会有40-50毫秒的时间,没有像下图1所示的数据传输,当空间超过168时,黄色信号为GPIO92,绿色信号为USB数据。

    图2 -缩放时间间隔为40-50毫秒,USB数据信号中只有SOF数据包。

    图3 -间隔开始时,有2次将数据写入FIFO, USB数据信号中没有日期,g_sTxBuffer缓冲区大小UART_BUFFER_SIZE设置为512,在usbdcde.c FIFO大小DATA_in_EP_FIFO_SIZE设置为 USB_FIFF_SZ_256,通常 需要 3次才能填充,因为168*3=504<512字节,而 在这种情况下,它看起来只填充两次。

    图 4 -这是间隔结束,它看起来USB数据信号发生3帧,然后最后两个GPIO92填充Txbuffer和USB数据信号看起来正常。

    从这些图片看,这个问题似乎是MCU将数据填充到FIFO中,40-50毫秒后,数据发送到 USB数据信号,但花了很长时间。

     

    ui32Space = USBBufferSpaceAvailable((tUSBBuffer *)&g_sTxBuffer);

    IF (ui32Space >= 168)

    GpioDataRegs.GPCSET.bit.GPIO92  = 1;

    ui32TxCountNum += USBBufferWrite(tUSBBuffer *)&g_sTxBuffer,(uint8_t *)&USBTxBuf,168);

    UsbTxTest2 ++;

    GpioDataRegs.GPCCLEAR.bit.GPIO92  = 1;

    }

    [报价用户="Sal Pezzino"]
     第四,USBBufferWrite()返回的值是否超过168。 这一点很重要。 您可以执行如下操作。

    //
    //缓冲区中有多少空间?
    //
    ui32Space = USBBufferSpaceAvailable((tUSBBuffer *)&g_sTxBuffer);
    IF (ui32Space >= 168)

    ui32TxCount = USBBufferWrite(tUSBBuffer *)&g_sTxBuffer,(uint8_t *)&USBTxBuf,168);
    ui32TxCountNum += ui32TxCount;

    IF (ui32TxCount < 168)

    ESTOP0;//调试
    }
    }

    [/引述]

    如果空间足够,则不会出现问题。

    [报价用户="Sal Pezzino"]
     
    第五,设备从主机接收什么?从主机接收时,设备似乎没有执行任何操作。

    [/引述]

    客户刚首先测试了TX通道,因此 当他们从串行端口工具收到任何信息时,他们每隔1毫秒发送168字节,在TX正常后,他们将 测试Rx通道。

    对于软件结构,客户需要 将 USB通信修改为循环模式而不是中断模式,因此他们 将禁用所有USB中断,只需检查循环中断状态位 ,查看MCU是否接收数据 ,并在不中断TX的情况下发送数据。

    为了验证这一点,客户禁用了中断,然后进行连接,但他们发现在以下代码之后,TX和Rx中断将恢复,并且无法禁用,所以您是否有任何建议,说明他们应该如何执行循环模式?

    HWREGB (ui32Base + USB_O_POWER)|=USB_POWER_SOFTCONN;

    USBIntDisableEndpoint (USB0_BASE,USB_INTEP_ALL);

     


     


     


     


    此致,

    张卫健

     

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

    如果您在40ms-50毫秒内只看到SOF数据包,这让我认为问题在于主机串行端口工具。 在该时间间隔内,它可能不会在请求数据包中发送数据。 如果是这种情况,则设备将无法向主机发送数据,因为它不会以数据包的形式发送数据。

    由于您正在尝试使用阻止/循环来消除中断,因此您需要深入研究USB库,特别是USB驱动程序,以查看何时重新启用中断。 您使USB库中的中断看起来是重新启用的。 这可能发生在USB驱动器级别(USB.c / USB.h)设置一个断点,在该断点处重新启用它们,您可以看到发生了什么以及应该如何修改它。

    希望这有所帮助。

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

    Sal,

    非常感谢您的建议,客户问题现已确定并得到解决。

    在尝试其他几个主机串行端口工具后,客户现在可以按预期进行通信,并且已确认早期工具在该时间间隔内发送请求数据时出现问题。

    要禁用中断并使用轮询模式进行通信,已确认总线中有重置信号以重新启用中断,现在客户可以在软件中处理该中断以使其正常工作。

    再次感谢您的帮助和有用的建议,帮助您解决这些问题。

    此致,

    张卫健

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

    很棒! 谢谢。

    是,当USB与主机枚举时,设备将重置USB。 这很奇怪,但它只是标准USB枚举过程的一部分。 这可能是在中断重新启用时。

    很高兴您发现了问题并解决了问题。 如果您有任何其他问题,请告诉我。

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

    Sal,

    再次感谢您提供更多信息。

    我认为客户现在可以在您的帮助下推进他们的项目,以解决这些问题,因此我们来看看是否有新问题,然后我们会寻求您的帮助。

    此致,

    张卫健