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.

[参考译文] TMS320F28374D:如何通过 USB 以50us 的数据一次传输256个字节的数据?

Guru**** 2419530 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1297133/tms320f28374d-how-can-i-data-256-bytes-of-data-at-a-time-in-50-usec-over-usb

器件型号:TMS320F28374D

您好!

我的要求是从计时器中断以每50us 发送一次256kB 数据。

我将使用 USB_DEV_SERIAL 示例代码通过 USB 将数据从控制器传输到 PC 应用。  

但在 PC 应用程序中,我观察到一些数据丢失,而且数据不是来自一组。

如果与之类似、我在后台仅发送一次数据而不是从计时器中断发送数据、我能够根据需要以正确的格式和单组方式接收所有数据。

请注意:在这两种情况下、定时器 ISR 的执行时间均为40usec。

您能不能给我们介绍一下如何使用计时器  ISR

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

    您好 Akash、

    是否已验证每次通过 ISR 发送数据时计时器 ISR 是否正确执行? 关于哪些数据/未正确发送多少数据、这是一个一致的问题、还是每次都是随机的问题?

    此致、

    阿米尔·奥马尔

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

    您好,Omer Amir,

    感谢您的回复。

    我在示波器的帮助下验证了计时器 ISR 是否正确执行。

    是的、我尝试在计时器 ISR、main while 循环中发送数据、也尝试过循环。

    它是恒定的字节数(256字节)

    但我将使用 USBCDC 通信虚拟 Com 端口。  

    我一次只能发送32个字节。 我将获得32个字节、我也将按顺序在50微秒内应用。

    如果我将字节数增加到256、它将开始发送数据包大小4096数据、这没问题、但数据丢失。

    我的问题是可以以50usec 的速度发送256字节的单个数据包。 如果是、请向我建议需要修改的地方。

    谢谢。

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

    您好!

    USB CDC 基于批量传输端点、因此全速 USB CDC 的最大数据包大小为64字节。  您将必须发送256个字节的多个数据包。  您是否能够发送数据但不在指定时间内?  

    您能否共享要传输数据的代码片段?

    此致

    西达尔特

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

    //########################################################################出################################出
    //
    //文件:usb_dev_serial.c
    //
    //标题:USB CDC 串行示例的主要例程。
    //
    //########################################################################出################################出
    //$TI 版本:F2837xD 支持库 V210美元
    //$Release Date:TUE Nov 1:46:15 CDT 2016 $
    //$Copyright:版权所有(C) 2013-2016 Texas Instruments Incorporated -
    // http://www.ti.com/ 保留所有权利$
    //########################################################################出################################出

    //
    //包含的文件
    //
    #include "F28x_Project.h"
    #包含
    #包含
    #include "inc/hw_ints.h"
    #include "inc/hw_memmap.h"
    #include "inc/hw_types.h"
    #include "inc/hw_uart.h"
    #include "driverlib/debug.h"
    #include "driverlib/interrupt.h"
    #include "driverlib/sysctl.h"
    #include "driverlib/SysTick。h"
    #include "driverlib/uart.h"
    #include "driverlib/usb.h"
    #include "driverlib/usb_hal.h"
    #include "driverlib/rom.h"
    #include "usblib/usblib.h"
    #include "usblib/usbcdc.h"
    #include "usblib/usb-ids.h"
    #include "usblib/usblibpriv.h"
    #include "usblib/device/usbdevice.h"
    #include "usblib/device/usbdcdc.h"
    #include "utils/ustdlib.h"
    #include "usb_serial_structs.h"
    //#include "USBDMA.h"

    __interrupt void cpu_timer0_isr (void);
    //*****
    //
    //! \addtogroup cpu01_example_list
    //!

    USB 串行设备(USB_DEV_SERIAL)


    //!
    //! 此示例应用将评估套件转换为虚拟串行
    //! USB 主机系统时选择该 I2C 端口。 此应用支持
    //! USB 通信器件类、用于重定向 UART0的抽象控制模型
    //! 与 USB 主机系统之间的流量。
    //!
    //! 将 USB 电缆从 PC 连接到 PC 上的 mini 和 microUSB 连接器
    //! controlCARD。确定 controlCARD 正在枚举哪些 COM 端口
    //! (通常使用 Windows 中的设备管理器完成)并打开串行终端
    //! 设置115200 Baud 8-N-1的每个引脚。 键入一个字符
    //! 应相互回显终端、反之亦然。
    //!
    //! 一个驱动程序信息(INF)文件,用于 Windows XP 和
    //! Windows 7可在 windows_drivers 目录下找到。
    //
    //*****
    //*****
    //
    //配置和调整参数。
    //
    //*****

    //*****
    //
    //系统节拍率,以每秒和1毫秒的节拍率表示
    //周期。
    //
    //*****
    #define SYSTICK _每秒100
    #define SysTick 周期_MS (1000 / SYSTICK 每秒)

    //*****
    //
    //变量跟踪发送和接收计数。
    //
    //*****
    Volatile uint32_t g_ui32UARTTxCount = 0;
    Volatile uint32_t g_ui32UARTRxCount = 0;

    uint32_t TX_flag = 0;

    #ifdef 调试
    uint32_t g_ui32UARTRxErrors = 0;
    #endif

    //*****
    //
    //要存储的 UART 的基地址、外设 ID 以及中断 ID
    //重定向。
    //
    //*****

    //*****
    //
    //定义通过 USB 重定向 UART0所需的定义。
    //
    //*****
    #define USB_UART_BASE UARTA_BASE
    #define USB_UART_Periph SYSCTL_Periph_SCI1
    #define USB_UART_INT INT_SCIRXINTA

    //*****
    //
    //重定向 UART 的默认线路编码设置。
    //
    //*****
    #define DEFAULT_BIT_RATE 115200
    #define DEFAULT_UART_CONFIG (UART_CONFIG_WLEN_8 | UART_CONFIG_PAR_NONE |\
    UART_CONFIG_STOP_ONE)

    //*****
    //
    //指示当前是否正在发送中断条件的标志。
    //
    //*****
    静态 bool g_bSendingBreak = false;

    //*****
    //
    //全局系统节拍计数器
    //
    //*****
    Volatile uint32_t g_ui32SysTickCount = 0;

    //*****
    //
    //用于将命令从中断上下文传递到主循环的标志。
    //
    //*****
    #define COMMAND_packet_RECEIVED 0x00000001
    #define COMMAND_STATUS_UPDATE 0x00000002

    Volatile uint32_t g_ui32Flags = 0;
    char *g_pcStatus;

    //*****
    //
    //表示已设置 USB 配置的全局标志。
    //
    //*****
    静态易失性 bool g_bUSBConfigured = false;

    //*****
    //
    //用于处理来自应用端的数据的 Rx 和 Tx 缓冲器
    //
    //*****

    uint8_t USBRxBuffer[100];
    uint8_t USBTxBuffer[256]=
    {

    0xAA、0x55
    ,0x00、1、0x00、2、0x00、3、0x00、4、0x00、5
    ,0x00、6、0x00、7、0x00、8、0x00、9、0x00、10
    ,0x00,11,0x00,12,0x00,13,0x00,14,0x00,15
    //、0x00、16、0x00、17、0x00、18、0x00、19、0x00、20
    //、0x00、21、0x00、22、0x00、23、0x00、24、0x00、25、0x00、26、
    /*0x01,0x02,0x03,0x04,0x05,0x06,0x07
    0x00、0x01、0x00、0x02、0x00、0x03、0x00、0x04、0x00*/

    };

    uint8_t peranum = 32;
    uint8_t peranum1= 64;

    uint8_t USB_remain_data = 0;
    //绩效指标问题
    //
    //下面的其它变量
    //
    //*****

    void sciaRxFifoIsr();
    void Load_Rx_Paremeters ();

    //*****
    //
    //内部函数原型。
    //
    //*****

    静态空 SetControlLineState (uint16_t ui16State);
    静态 bool SetLineCoding (tLineCoding *psLineCoding);
    静态空 GetLineCoding (tLineCoding *psLineCoding);
    静态空 SendBreak (bool bSend);

    //*****
    //
    //驱动程序库遇到错误时调用的错误例程。
    //
    //*****
    #ifdef 调试

    __error__(char *pcFilename,uint32_t ui32Line)
    {
    while (1)
    {


    #endif
    //*****
    //
    //系统时钟计数器的中断处理程序。
    //
    //*****

    __中断无效
    SysTickIntHandler (void)
    {
    //
    //更新系统时间。
    //
    G_ui32SysTickCount++;
    PieCtrlRegs.PIEACK.all |= 1;

    //*****
    //
    //设置 RS232 RTS 和 DTR 信号的状态。
    //
    //*****

    静态空
    SetControlLineState (uint16_t ui16State)
    {
    //
    // TODO:如果配置了 GPIO 来控制握手线,
    //根据在 wValue 中传递的标志进行适当的设置
    //请求结构的字段已传递。
    //

    //*****
    //
    //设置要在 UART 上使用的通信参数。
    //
    //*****
    静态 bool
    SetLineCoding (tLineCoding *psLineCoding)
    {
    uint32_t ui32Config;
    bool bRetcode;

    //
    //假设一切正常,直到我们检测到任何问题。
    //
    bRetcode = true;

    //
    //字长。 对于无效值、默认设置为每帧8个位、
    //字符并返回错误。
    //
    switch (psLineCode->ui8Databits)
    {
    情形5:
    {
    ui32Config = UART_CONFIG_WLEN_5;
    中断;

    情况6:
    {
    ui32Config = UART_CONFIG_WLEN_6;
    中断;

    情形7:
    {
    ui32Config = UART_CONFIG_WLEN_7;
    中断;

    情形8:
    {
    ui32Config = UART_CONFIG_WLEN_8;
    中断;

    默认值:
    {
    ui32Config = UART_CONFIG_WLEN_8;
    bRetcode = false;
    中断;

    //
    //奇偶校验。 对于任何无效的值、我们将不设置奇偶校验并返回错误。
    //
    switch (psLineCoding->ui8Parity)
    {
    案例 USB_CDC_PARITY_NONE:
    {
    ui32Config |= uart_config_PAR_NONE;
    中断;

    情况 USB_CDC_quitance_odd:
    {
    ui32Config |= uart_config_PAR_ODD;
    中断;

    案例 USB_CDC_quitance_even:
    {
    ui32Config |= uart_config_par_even;
    中断;

    案例 USB_CDC_PARITY_MARK:
    {
    ui32Config |= uart_config_par_one;
    中断;

    案例 USB_CDC_PARITY_SPACE:
    {
    ui32Config |= uart_config_par_zero;
    中断;

    默认值:
    {
    ui32Config |= uart_config_PAR_NONE;
    bRetcode = false;
    中断;

    //
    //停止位。 我们的硬件仅支持1或2个停止位、而 CDC
    //允许主机选择1.5个停止位。 如果通过1.5 (或任何其他
    // ui8Stop 的值无效或不受支持,我们设置为1个停止位,但
    //返回错误,如果调用方需要停止或以其他方式报告
    //返回到主机。
    //
    switch (psLineCoding->ui8Stop)(开关(psLineCoding->ui8Stop))
    {
    //
    //请求一个停止位。
    //
    案例 USB_CDC_STOP_BITS_1:
    {
    ui32Config |= uart_config_stop_one;
    中断;

    //
    //请求两个停止位。
    //
    案例 USB_CDC_STOP_BITS_2:
    {
    ui32Config |= uart_config_stop_two;
    中断;

    //
    //其他情况是 ui8Stop 的无效值或我们使用的值
    //无法支持如此设置1个停止位,但返回错误。
    //
    默认值:
    {
    ui32Config = UART_CONFIG_STOP_ONE;
    bRetcode |= false;
    中断;

    //
    //适当地设置 UART 模式。
    //
    UARTConfigSetExpClk (USB_UART_BASE、SysCtlLowSpeedClockGet (SYSTEM_CLOCK_SPEED)、
    readusb32_t (&(psLineCoding->ui32Rate)、ui32Config);

    //
    //让呼叫者知道我们是否有问题。
    //
    返回(bRetcode);

    //*****
    //
    //获取 UART 上使用的通信参数。
    //
    //*****
    静态空
    GetLineCoding (tLineCoding *psLineCoding)
    {
    uint32_t ui32Config;
    uint32_t ui32Rate;

    //
    //在 UART 中设置当前行编码。
    //
    UARTConfigGetExpClk (USB_UART_BASE、SysCtlLowSpeedClockGet (SYSTEM_CLOCK_SPEED)、
    &ui32Rate、&ui32Config);
    writeusb32_t (&(psLineCoding->ui32Rate)、ui32Rate);

    //
    //将配置字长字段转换为预期格式
    //通过主机。
    //
    开关(ui32Config 和 UART_CONFIG_WLEN_MASK)
    {
    案例 UART_CONFIG_WLEN_8:
    {
    psLineCode->ui8Databits = 8;
    中断;

    案例 UART_CONFIG_WLEN_7:
    {
    psLineCoding ->ui8Databits = 7;
    中断;

    案例 UART_CONFIG_WLEN_6:
    {
    psLineCoding ->ui8Databits = 6;
    中断;

    案例 UART_CONFIG_WLEN_5:
    {
    psLineCoding ->ui8Databits = 5;
    中断;

    //
    //将配置奇偶校验字段转换为预期的格式
    //通过主机。
    //
    开关(ui32Config 和 uart_config_PAR_MASK)
    {
    案例 UART_CONFIG_PAR_NONE:
    {
    psLineCoding->ui8Parity = USB_CDC_Parite_none;
    中断;

    案例 UART_CONFIG_PAR_ODD:
    {
    psLineCoding->ui8Parity = USB_CDC_page_odd;
    中断;

    案例 UART_CONFIG_PAR_EVEN:
    {
    psLineCoding->ui8Parity = USB_CDC_page_even;
    中断;

    //
    //将配置停止位字段转换为预期的格式
    //通过主机。
    //
    开关(ui32Config 和 uart_config_stop_mask)
    {
    案例 UART_CONFIG_STOP_ONE:
    {
    psLineCoding->ui8Stop = USB_CDC_STOP_BITS_1;
    中断;

    案例 UART_CONFIG_STOP_TWO:
    {
    psLineCoding->ui8Stop = USB_CDC_STOP_BITS_2;
    中断;


    //*****
    //
    //此函数设置或清除重定向 UART RX 上的中断条件
    //行。 当调用函数且\ e bSend 设置为
    //\b true 并持续,直到使用\e bSend Set 重新调用函数为止
    //以\b 为假。
    //
    //*****
    静态空
    SendBreak (bool bSend)
    {
    //
    // C28x SCI 无法发送中断条件
    //
    返回;

    //*****
    //
    //处理与器件控制和设置相关的 CDC 驱动程序通知。
    //
    //\param pvCBData 是此通道由客户端提供的回调指针。
    //\param ui32Event 标识我们收到通知的事件。
    //\param ui32MsgValue 是特定于事件的值。
    //\param pvMsgData 是特定于事件的指针。
    //
    //此函数由 CDC 驱动程序调用以执行与控制相关的
    //代表 USB 主机执行操作。 这些功能包括设置
    //以及查询串行通信参数,设置握手线
    //状态和发送中断条件。
    //
    //返回的返回值是特定于事件的值。
    //
    //*****

    //调用

    uint32_t
    ControlHandler (void * pvCBData、uint32_t ui32Event、
    uint32_t ui32MsgValue、void * pvMsgData)
    {
    uint32_t ui32IntsOff;

    //
    //要求我们处理哪个事件?
    //
    开关(ui32Event)
    {
    //
    //我们已连接到主机,现在可以进行通信。
    //
    案例 USB_EVENT_CONNECTED:
    g_bUSBConfigured = true;

    //
    //清空缓冲区。
    //
    USBBufferFlush (&g_sTxBuffer);
    USBBufferFlush (&g_sRxBuffer);

    //
    //指示主循环更新显示。
    //
    ui32IntsOff = IntMasterDisable ();
    G_pcStatus ="connected";
    G_ui32Flags |= COMMAND_STATUS_UPDATE;
    if (!ui32IntsOff)
    {
    IntMasterEnable();

    中断;

    //
    //主机已断开连接。
    //
    案例 USB_EVENT_DISCONNECTED:
    g_bUSBConfigured = false;
    ui32IntsOff = IntMasterDisable ();
    G_pcStatus ="disconnected";
    G_ui32Flags |= COMMAND_STATUS_UPDATE;
    if (!ui32IntsOff)
    {
    IntMasterEnable();

    中断;

    //
    //返回当前的串行通信参数。
    //
    案例 USBD_CDC_EVENT_GET_LINE_CODED:
    GetLineCoding (pvMsgData);
    中断;

    //
    //设置当前串行通信参数。
    //
    案例 USBD_CDC_EVENT_SET_LINE_CODED:
    SetLineCoding (pvMsgData);
    中断;

    //
    //设置当前串行通信参数。
    //
    案例 USBD_CDC_EVENT_SET_CONTROL_LINE_STATE:
    SetControlLineState ((uint16_t) ui32MsgValue);
    中断;

    //
    //在串行线上发送中断条件。
    //
    案例 USBD_CDC_EVENT_SEND_BREAK:
    SendBreak (真);
    中断;

    //
    //清除串行线上的中断条件。
    //
    案例 USBD_CDC_EVENT_CLEAR_BREAK:
    SendBreak (假);
    中断;

    //
    //暂时忽略挂起和恢复。
    //
    案例 USB_EVENT_SUSPEND:
    案例 USB_EVENT_RESUME:
    中断;

    //
    //我们不希望收到任何其他事件。 忽略任何显示的内容
    //在版本编译中向上或在调试编译中挂起。
    //
    默认值:
    #ifdef 调试
    while (1);
    #else
    中断;
    #endif


    返回0;


    //*****
    //
    //处理与传输通道相关的 CDC 驱动程序通知(向
    // USB 主机)。
    //
    //\param pvCBData 是此通道由客户端提供的回调指针。
    //\param ui32Event 标识我们收到通知的事件。
    //\param ui32MsgValue 是特定于事件的值。
    //\param pvMsgData 是特定于事件的指针。
    //
    // CDC 驱动程序调用此函数以将任何事件通知我们
    //与传输数据通道(内通道承载
    //发送数据到 USB 主机)。
    //
    //返回的返回值是特定于事件的值。
    //
    //*****
    uint32_t
    TxHandler (void * pvCBData、uint32_t ui32Event、uint32_t ui32MsgValue、
    void *pvMsgData)
    {
    //
    //我们发送了哪个事件?
    //

    开关(ui32Event)
    {


    案例 USB_EVENT_TX_COMPLETE:
    //
    //由于我们使用的是 USBBuffer,因此我们不需要执行任何操作
    //此处。
    //
    TX_FLAG = 0;
    GpioDataRegs.GPATOGGLE.bit.GPIO31 = 1;

    中断;

    //
    //我们不希望收到任何其他事件。 忽略任何显示的内容
    //在版本编译中向上或在调试编译中挂起。
    //
    默认值:
    #ifdef 调试
    while (1);
    #else
    中断;
    #endif


    返回(0);

    //*****
    //
    //处理与接收通道相关的 CDC 驱动程序通知(来自
    // USB 主机)。
    //
    //\param pvCBData 是此通道由客户端提供的回调数据值。
    //\param ui32Event 标识我们收到通知的事件。
    //\param ui32MsgValue 是特定于事件的值。
    //\param pvMsgData 是特定于事件的指针。
    //
    // CDC 驱动程序调用此函数以将任何事件通知我们
    //与接收数据通道(输出通道承载
    //来自 USB 主机的数据)。
    //
    //返回的返回值是特定于事件的值。
    //
    //*****

    //呼叫

    uint32_t
    RxHandler (void * pvCBData、uint32_t ui32Event、uint32_t ui32MsgValue、
    void *pvMsgData)
    {
    uint32_t ui32Count;
    uint32_t ui32Read;
    uint8_t ui8Char;

    //
    //我们要发送什么事件?
    //
    开关(ui32Event)
    {
    //
    //接收到新的数据包。
    //
    案例 USB_EVENT_RX_AVAILABLE:
    {
    //
    //将一些字符输入到 UART TX FIFO 中并启用
    //中断,当有更多空间时,我们会被告知。
    //
    //如果我们正在发送中断条件,则不会收到任何
    //更多数据。 我们将在中断关闭后恢复传输。
    //
    if (g_bSendingBreak)
    {
    返回(0);

    //
    //如果 UART FIFO 中有空间,请尝试读取一些字符
    //从接收缓冲区再次将其填充。
    //
    while (UARTSpaceAvail (USB_uart_BASE))
    {
    //
    //从缓冲区中获取一个字符。
    //
    ui32Read = USBBufferRead ((tUSBBuffer *)&g_sRxBuffer、&ui8Char、1);

    //
    //我们得到了一个字符吗?
    //
    if (ui32Read)
    {

    //
    //更新通过 UART 传输的字节数。
    //
    USBRxBuffer [g_ui32UARTTxCount]= ui8Char;
    G_ui32UARTTxCount++;

    if (g_ui32UARTTxCount > 99)
    G_ui32UARTTxCount=0;

    否则
    {
    //
    //我们将字符用完,因此退出该函数。
    //
    返回(0);

    // USBUARTPrimeTransmit (USB_UART_BASE);
    UARTIntEnable (USB_UART_BASE、UART_INT_TXRDY);//调用
    // USBBufferDataWritten (&g_sTxBuffer、215);
    中断;

    //
    //我们被问及我们还有多少未经处理的数据
    //处理。 如果 UART 当前处于空闲状态、则返回0;如果 UART 处于空闲状态、
    //在传输某物的过程中。 实际的
    // UART FIFO 中的字节在这里并不重要,只是需要
    //不是先前发送给我们的所有内容都已传输。
    //

    案例 USB_EVENT_DATA_REMAINING:
    {
    //
    //获取缓冲区中的字节数,如果某些数据,则添加1
    //仍需要清除发送器。
    //
    ui32Count = UARTBusy (USB_UART_BASE)? 1:0;
    返回(ui32Count);

    //
    //我们需要提供一个缓冲区,以便将下一个数据包
    //可以读取。 我们不支持这种数据接收模式、
    //驱动程序通过返回0来知道。 CDC 驱动程序不应通过
    //此消息仅用于说明和
    //完整性。
    //
    案例 USB_EVENT_Request_BUFFER:
    {
    返回(0);

    //
    //我们不希望收到任何其他事件。 忽略任何显示的内容
    //在版本编译中向上或在调试编译中挂起。
    //
    默认值:
    #ifdef 调试
    while (1);
    #else
    中断;
    #endif

    返回(0);

    //*****
    //
    //这是主应用程序进入函数。
    //
    //*****

    uint16_t tmr_inex= 0;
    uint32_t datleight = 32;

    __interrupt void cpu_timer0_isr (void)
    {
    /CpuTimer0.InterruptCount++;
    //GpioDataRegs.GPBSET.bit.GPIO34 = 1;
    DELAY_US (35);

    tmr_inex++;
    USBTxBuffer[8]= tmr_inex >> 8;
    USBTxBuffer[9]= tmr_inex;

    //if (TX_FLAG = 1)

    USBBufferWrite (((tUSBBuffer *)&g_sTxBuffer、(uint8_t *)&USBTxBuffer[0]、peranum);


    //GpioDataRegs.GPBCLEAR .BIT.GPIO34 = 1;
    PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;

    内部
    主函数(空)
    {

    uint32_t ui32RxCount;
    Volatile uint32_t ui32Fullness;


    InitSysCtrl();
    Dint;
    InitPieCtrl();
    IER = 0x0000;
    IFR = 0x0000;

    #ifdef _flash
    //将时间关键代码和闪存设置代码复制到 RAM
    //这包括以下函数: InitFlash();
    // RamfuncsLoadStart、RamfuncsLoadSize 和 RamfuncsRunStart
    //符号是由链接器创建的。 请参阅器件.cmd 文件。
    memcpy (&RamfuncsRunStart、&RamfuncsLoadStart、(size_t)&RamfuncsLoadSize);
    #endif

    //
    //将时钟设置为从50MHz 的 PLL 运行
    //
    SysCtlClockSet (SYSCTL_OSCSRC_XTAL | SYSCTL_PLL_ENABLE | SYSCTL_IMULT (20)|
    SYSCTL_SYSDIV (2);
    SysCtlAuxClockSet (SYSCTL_OSCSRC_XTAL | SYSCTL_PLL_ENABLE |
    SYSCTL_IMULT (12)| SYSCTL_SYSDIV (4);

    #ifdef _flash
    //调用闪存初始化以设置闪存等待状态
    //该函数必须驻留在 RAM 中
    InitFlash();
    #endif

    //
    //初始化中断控制器和矢量表
    //
    InitPieVectTable();

    EALLOW;
    GpioCtrlRegs.GPBMUX1.bit.GPIO34 = 0;
    GpioCtrlRegs.GPBDIR.bit.GPIO34 = 1;
    GpioCtrlRegs.GPAMUX2.bit.GPIO31 = 0;
    GpioCtrlRegs.GPADIR.bit.GPIO31 = 1;
    EDIS;

    //
    //初始未配置。
    //
    g_bUSBConfigured = false;

    //
    //配置 USB 操作所需的引脚。
    //
    USBGPIOEnable();
    USBIntRegister (USB0_BASE、F28x_USB0DeviceIntHandler);
    //
    //启用我们将重定向的 UART。
    //
    SysCtlPeripheralEnable (USB_UART_Periph);

    //
    //针对 UART 模式配置 GPIO 引脚。
    //
    EALLOW;
    GpioCtrlRegs.GPAMUX2.bit.GPIO28 = 1;
    GpioCtrlRegs.GPAPUD.bit.GPIO28 = 0;
    GpioCtrlRegs.GPAQSEL2.bit.GPIO28 = 3;
    GpioCtrlRegs.GPADIR.bit.GPIO28 = 0;

    GpioCtrlRegs.GPAMUX2.bit.GPIO29 = 1;
    GpioCtrlRegs.GPAPUD.bit.GPIO29 = 0;
    GpioCtrlRegs.GPADIR.bit.GPIO29 = 1;
    EDIS;

    //
    // TODO:如果需要,请添加用于配置握手 GPIO 的代码。
    //

    //
    //设置默认的 UART 配置。
    //
    /* UARTConfigSetExpClk (USB_UART_BASE、SysCtlLowSpeedClockGet (SYSTEM_CLOCK_SPEED)、
    DEFAULT_BIT_RATE、DEFAULT_UART_CONFIG);
    UARTFIFOIntLevelSet (USB_UART_BASE、UART_FIFO_TX4_8、UART_FIFO_RX4_8);*/

    //
    //配置并启用 UART 中断。
    //
    /* UARTIntClear (USB_UART_BASE、UARTIntStatus (USB_UART_BASE、FALSE);
    UARTIntEnable (USB_UART_BASE、(UART_INT_RXERR | UART_INT_RXRDY_BRKDT |
    UART_INT_TXRDY);*/
    //
    //启用系统刻度。
    //
    /* SysTickInit ();
    SysTickPeriodSet (SysCtlClockGet (system_clock_speed)/ SYSTICKS_PER_second);
    SysTickIntRegister (SysTickIntHandler);
    SysTickIntEnable ();
    SysTickEnable ();
    */
    //
    //初始化传输和接收缓冲区。
    //
    USBBufferInit (&g_sTxBuffer);
    USBBufferInit (&g_sRxBuffer);


    //
    //将 USB 堆栈模式设置为设备模式并进行 VBUS 监控。
    //
    USBStackModeSet (0、eUSBModeForceDevice、0);

    //
    //将器件信息传递到 USB 库并放置器件
    //在总线上。
    //
    USBDCDCInit (0、&g_sCDCDevice);

    //
    //清除我们的本地字节计数器。
    //
    ui32RxCount = 0;//
    //现在启用中断,因为应用程序已准备好启动。
    //
    IntEnable (USB_UART_INT);
    IntMasterEnable();

    EALLOW;//需要执行此操作才能写入 EALLOW 保护的寄存器
    PieVectTable.TIMER0_INT =&CPU_timer0_ISR;
    InitCpuTimers ();
    ConfigCpuTimer (&CpuTimer0200、50);
    CpuTimer0Regs.tcr.all = 0x4001;
    IER |= M_INT1;
    PieCtrlRegs.PIEIER1.bit.INTx7 = 1;
    CpuTimer0Regs.tcr.bit.free = 1;
    TSS = 0;

    EDIS;
    EINT;//启用全局_interrupt INTM
    ERTM;

    / /
    // DMA 初始化
    / /
    //tUSBDMAInstance * psUSBDMAInst = USBLibDMAInit (USB0_BASE);
    USBFIFOConfigSet (USB0_BASE、USB_EP_2、0x00000028、USB_FIFO_SZ_32_DB、USB_EP_DEV_IN);
    //USBDevEndpointConfigSet (USB0_BASE、USB_EP_2、USB_FIFO_SZ_32_DB、USB_EP_SPEED_FULL);
    // USBEndpointDMAConfigSet (USB0_BASE、USB_EP_1、USB_EP_AUTO_SET);
    // USBEndpointDMAEnable (USB0_BASE、USB_EP_1、USB_EP_DEV_IN);

    / /

    //
    //主应用程序循环。
    //
    while (1)
    {

    /* if (g_ui32Flags 和 COMMAND_STATUS_UPDATE)
    {
    //
    //清除命令标志
    //
    IntMasterDisable();
    G_ui32Flags 并且=~COMMAND_STATUS_UPDATE;
    IntMasterEnable();

    //
    //自上次检查以来是否有任何接收流量?
    //

    if (ui32RxCount!= g_ui32UARTRxCount)
    //中频(1)
    {
    //
    //快照最新的接收计数。
    //
    ui32RxCount = g_ui32UARTRxCount;
    //
    //更新 TX 缓冲区填满。 请记住、缓冲器
    //相对于 USB 命名,而状态显示来自
    // UART 的视角。 USB 的发送缓冲区是 UART 的
    //接收缓冲器。
    //
    ui32Fullness =((USBBufferDataAvailable (&g_sTxBuffer)* 100)/
    uart_Buffer_size);

    */
    //
    //自上次检查以来是否存在传输流量?
    //

    /*
    如果(TX_FLAG =1)
    {
    //USBBufferDataWritten (&USBTxBuffer[0]、8);
    //USBTxBuffer[8]= tmr_inex >> 8;
    //USBTxBuffer[9]= tmr_inex;
    TX_FLAG = 0;
    USBBufferWrite (((tUSBBuffer *)&g_sTxBuffer、(uint8_t *)&USBTxBuffer[0]、peranum1);

    // USBBufferDataWritten ((tUSBBuffer *)&g_sTxBuffer、peranum);

    //USBEndpointDataPut (USB0_BASE、USB_EP_2、&USBTxBuffer[0]、USB_FIFO_SZ_256_DB);
    //USBEndpointDataSend (USB0_BASE、USB_EP_2、USB_TRANS_OUT);
    }*/


    //
    //文件结尾
    //

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

    尊敬的 Siddharth:

    这是我的主文件完整代码、我在 PC 应用程序上发送的任何数据长度都缺少数据。

    我的要求是以50us 发送256字节的数据。

    请提出任何解决方案。

    提前感谢。

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

    Akash、  

    今天我不在办公室、我们将介绍一下大家分享的代码、下周早些时候就回来。

    此致

    西达尔特

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

    尊敬的 Siddharth:

    感谢您的答复。

    请在下一周与我联系。

    感谢您的观看、

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

    尊敬的 Siddharth:

    如果我的问题有任何解决方案、请提供。

    我们正在等待您的回复。

    谢谢!

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

    您好!  

    您是否看到 USB 环形缓冲区中的所有数据?  

    是否由于数据丢失而被覆盖?

    此致

    西达尔特

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

    尊敬的 Siddharth:

    您能说明一下环形缓冲区的名称吗?

    如果我增加环形缓冲器的大小、我的问题将会解决、或者是否有任何解决方案来避免它。

    谢谢!

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

    尊敬的 Akash:

    "G_pi8USBTxBuffer"和"g_pi8USBRxBuffer"是示例中使用的环形缓冲区。

    此致

    西达尔特

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

    尊敬的 Siddharth:

    对于数据传输、1位需要84ns、54字节带帧的数据变为81字节。 因此、大约需要54us。

    现在、我的问题是、是否可以选择缩短此持续时间。

    谢谢你。

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

    Akash、  

    您如何测量时间?  可以在 CCS 中使用分析时钟进行检查(计数 CPU 周期)。  

    如果您有一个 USB 分析器、您可以看到主机是否以足够快的速度请求数据以获得您需要的吞吐量。使用 Windows PC 上的 Visual Studio 项目和 USB BULK 示例、我们已经能够实现7-8 Mbps。

    此致

    西达尔特