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.

[参考译文] RM48L952:对于 MSC 设备模式、我是否可以获得 USB 内部 DMA 的任何参考代码?

Guru**** 2609285 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/738209/rm48l952-may-i-get-any-reference-code-for-internal-dma-of-usb-for-msc-device-mode

器件型号:RM48L952

尊敬的 TI:

我正在开发 USB MSC 器件类、以参考 TI 和 Tivaware 代码的 MSC 部分提供的 CDC 示例代码。

在将 RM48连接到主机 PC 时、我已经完成了在不使用内部 DMA 的情况下查看"格式弹出窗口"的操作。

此时、我想应该 执行内部 DMA、因为批量传输可能也需要 DMA 中断源。

为了在参考代码结构中开发 MSC 类、似乎只有使用 USB 中断存在限制。

让我附加显示当前状态的 USB 日志。

设备从主机接收 MBR 数据并将其写入文件系统后、将不再有进展。  

正如我分析其他 USB 参考条时所说的那样,应该在数据中断中发生。  

总之、我的结论是、如果不使用 DMA、代码序列可能会出错。  

Tivaware 参考代码也使用 DMA、无论是内部还是外部。

那么、您能否为 USB 的内部 DMA 提供任何示例代码?

谢谢你

此致。

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

    TM4C129器件具有 OTG,但 RM48上的 USB 主机基于 OHCI 规范。 它们是不同的。 OTG 集成了 DAM。 RM48上的 OHCI 没有 DMA、但是 USB1.1主机控制器在没有处理器直接干预(用作 DMA)的情况下访问数据结构。 数据结构可以位于内部 SRAM 或外部 SDRAM 中。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的王先生:

    感谢您的友好回答。

    虽然我的问题很特别、但请注意我。 因为这是我第一次处理 USB 驱动程序。

    我想您提到的是 RM48上的 USB 主机。 但是、我正在使用"USB 器件控制器"开发 MSC 类。  

    然后有一些 DMA 配置、如下所示。

    为了开发器件 MSC 类、我应该使用 RM48和以下 DMA 配置的主 DMA。

    我找到了一个名为"example_mibspiDma.c"的示例。 它似乎同时使用 RM48的主 DMA 和 SPI 的 DMA 配置。

    那么、我是否可以获得 USB 器件控制器的这种示例(mibspiDma)?

    谢谢你

    此致。

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

    很抱歉我稍后的回答。 我的理解是、您正在开发 USB MSC 驱动程序、使主机(例如 RM48)可以访问 USB 设备(例如 USB 闪存)、并实现主机和 USB 设备之间的文件传输。 如果您使用 RM48器件控制器、主机是谁?

    如果使用 RM48 USB 设备控制器、可以使用 DMA 传输输入端点和输出端点的数据。 我在以下线程中发布了我的 MibSPI + DMA samp 代码:

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

    尊敬的王先生:

    感谢您的回答。

    首先、我已经完成了 DMA RX 功能的实现、请参阅下面的设置指南。

    因此、我可以看到输出端点的数据从端点传输到 SDRAM 存储器(RAMDISK)中。

    端点:0x01

    USB DMA 通道:0

    主 DMA 通道:15.

    函数名称: USBDMAChannelRxSet()

    但是、DMA TX 功能仍然不起作用。

    尽管我已经尝试为 DMA 输入各种参数、 但 TXN_DONE 中断从未被置为有效。

    此函数的目的是将 SDRAM 存储数据(RAMDISK)传输到 IN 端点。

    端点:0x02

    USB DMA 通道:1.

    主 DMA 通道:14.

    函数名称: USBDMAChannelTxSet()

    为了进行测试、我添加了一个 testBuffer 作为源。

    您能否检查我使用过的附加代码?

    我需要有关 USBDMAChannelTxSet()函数的帮助。

    e2e.ti.com/.../7065.usb_5F00_device_5F00_dma.c

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

    请参阅此链接:

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

    尊敬的王先生:

    首先、感谢您的回复。  

    我将使用您建议的参考代码。

    总之、我成功地使用 TX-DMA 将 TXN_DONE 中断置为有效。

    但是、我遇到了一个我无法理解的异常情况。

    如果 TXN_DONE 中断被置位、我的代码将启动非 ISO TX DMA 完成处理程序。

    假设 EOTn 为0 (不再有剩余的数据包要发送)、我将进行以下两项操作。

    1.禁用 DMA

    2.通过 IN 端点发送 SCSI 状态

    2的目的是在附加文件中以红色圆圈覆盖的数据包中发送 SCSI 状态彻底。

    但此时(发送 SCSI 状态),Out 的 ACK (用蓝色覆盖)也会通过 OUT 端点进行传输。 (异常1.png)

    此症状导致跳过下一个正在进行的过程、因为 Out ACK 传输异常。 (异常2.png)

    因此、我想知道为什么传输输出数据包的 ACK、即使 EP_NUM.EP_DIR 为"1"也是如此。

    我刚刚使用了 TI 的 USBEndpointDataPut()和 USBEndpointDataSend()。

    请参阅我的评论下方的代码。

    /*当我发送 SCSI 状态时,我使用以下函数*/

    静态空
    USBDSCSISendStatus (tUSBDMSCDevice * psMSCDevice)

    tMSCInstance * psInst;

    //
    //获取我们的实例数据指针。
    //
    psInst =&psMSCDevice->sPrivateData;

    //
    //以请求的状态进行响应。
    //
    USBEndpointDataPut (USB0_BASE、psInst->ui8INEndpoint、
    (uint8 *)&g_sSCSICSW、13);
    USBEndpointDataSend (USB0_BASE、psInst->ui8INEndpoint、USB_TRANS_IN);

    //
    //将状态移动到发送的状态,以便下一个中断移动
    //雕像怠速运转。
    //
    psInst->ui8SCSIState = State_SCSI_SENT_STATUS;

    /* USBDSCSISendStatus()由以下两个函数组成*/

    uint32.
    USBEndpointDataPut (uint32 ulBase、uint16 usEndpoint、
    uint8 * puData、uint32 ulSize)

    uint16 epNum;
    uint32 txSize = ulSize;
    uint32 i;
    uint8 * buff = puData;

    /*检查参数。 *
    断言(ulBase =USBD_0_BASE);
    Assert ((usEndpoint =USB_EP_0)||(usEndpoint =USB_EP_1)||
    (usEndpoint =USB_EP_2)||(usEndpoint =USB_EP_3)||
    (usEndpoint =USB_EP_4)||(usEndpoint =USB_EP_5)||
    (usEndpoint =USB_EP_6)||(usEndpoint =USB_EP_7)||
    (usEndpoint =USB_EP_8)||(usEndpoint =USB_EP_9)||
    (usEndpoint =USB_EP_10)||(usEndpoint =USB_EP_11)||
    (usEndpoint =USB_EP_12)||(usEndpoint =USB_EP_13)||
    (usEndpoint =USB_EP_14)||(usEndpoint =USB_EP_15));

    usEndpoint = usEndpoint >> 4;

    /*备份 EP 编号以稍后恢复*/
    /*SAFETYMCUSW 45 D MR:21.1 "静态定义的非空硬件寄存器地址"*/
    epNum = usbd0Regs->epNum & USBD_EP_NUM_EP_NUM_MASK;

    /*启用对端点 FIFO 的访问*/
    if (txSize > 64U){
    txSize = 64U;


    /*为 OUT EP 设置 epnum 寄存器*/
    usbd0Regs->epnum = USBD_EP_NUM_EP_SEL | USBD_EP_DIR_IN |(USEndpoint & USBD_EP_NUM_EP_NUM_MASK);

    /*转储数据*/
    对于(i=0i;<txSize; i++) {
    /*SAFETYMCUSW 45 D MR:21.1 "静态定义的非空硬件寄存器地址"*/
    /*SAFETYMCUSW 95 S MR:11.4. "原因-可接受的偏差。"*/
    /*SAFETYMCUSW 94 S MR:11.4. "原因-可接受的偏差。"*/
    *((volatile uint8 *)(/usbd0Regs->data)=*缓冲区;
    缓冲器++;


    /*恢复 epnum 寄存器*/
    /* usbd0Regs->epnum = USBD_EP_NUM_EP_SEL | USBD_EP_DIR_IN | epNum;###*

    usEndpoint = usEndpoint << 4;

    返回(0);

    uint32 USBEndpointDataSend (uint32 ulBase、uint16 usEndpoint、uint32 ulTransType)

    /*检查参数。 *
    断言(ulBase =USBD_0_BASE);
    Assert ((usEndpoint =USB_EP_0)||(usEndpoint =USB_EP_1)||
    (usEndpoint =USB_EP_2)||(usEndpoint =USB_EP_3)||
    (usEndpoint =USB_EP_4)||(usEndpoint =USB_EP_5)||
    (usEndpoint =USB_EP_6)||(usEndpoint =USB_EP_7)||
    (usEndpoint =USB_EP_8)||(usEndpoint =USB_EP_9)||
    (usEndpoint =USB_EP_10)||(usEndpoint =USB_EP_11)||
    (usEndpoint =USB_EP_12)||(usEndpoint =USB_EP_13)||
    (usEndpoint =USB_EP_14)||(usEndpoint =USB_EP_15));

    usEndpoint = usEndpoint >> 4;

    /*设置 EP FIFO */
    usbd0Regs->epnum = USBD_EP_NUM_EP_SEL | USBD_EP_DIR_IN |(USEndpoint & USBD_EP_NUM_EP_NUM_MASK);

    /*启用 FIFO */
    /*SAFETYMCUSW 184 S "原因- LDRA 工具问题。"*/
    USBD_REG_SET_ONE (usbd0Regs->Ctrl、USBD_CTRL_SET_FIFO_EN);

    /*删除 FIFO 访问*/
    /*SAFETYMCUSW 45 D MR:21.1 "静态定义的非空硬件寄存器地址"*/
    /*SAFETYMCUSW 184 S "原因- LDRA 工具问题。"*/
    /*SAFETYMCUSW 185 S "原因- LDRA 工具问题。"*/
    USBD_REG_BIT_CLR (usbd0Regs->epnum、USBD_EP_NUM_EP_SEL);<-此时、状态消息(输入数据包)和输出 ACK 同时传输。

    usEndpoint = usEndpoint << 4;

    返回(0);

    /* abnormal1.png */

    /* abnormal2.png */

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

    您对 USB 编程的了解比我更丰富。 我无法调试您的代码。