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.

[参考译文] RTOS/TM4C1294NCPDT:在 USBMSCHFatFs_waitForConnect 之后恢复

Guru**** 2439710 points
Other Parts Discussed in Thread: EK-TM4C1294XL

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/618316/rtos-tm4c1294ncpdt-recovering-after-usbmschfatfs_waitforconnect

器件型号:TM4C1294NCPDT
Thread 中讨论的其他器件:EK-TM4C1294XL

工具/软件:TI-RTOS

你好

我有一个使用 TI-RTOS 与 TM4C1294一起执行 USBSTICK 操作的应用 程序、它可以从 USB 闪存驱动器中写入和读取文件。 我正在使用 USBMSCHFatFS 驱动程序来执行操作。

在执行任何读取写入操作之前、USB 的程序检查已连接(使用 USBMSCHFatFs_waitForConnect)。 它在 USBMSCHFatFs_waitForConnect 中有10秒的延迟。

如果 USB 闪存盘未连接且延迟到期、它将停止运行。

问题是、下次连接 USB 闪存驱动器并尝试读取或写入时、它 从 USBMSCHFatFs_open 接收 NULL。

我尝试重新初始化 USB 驱动程序、但无法正常工作。 也尝试关闭 USBMSCHFatFs (USBMSCHFatFs_Close)没有帮助。  我唯一可以使其工作的方法是使用电源复位。

谢谢

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

    您好!

    [引用 USER="Tushar Patel40"> USMSCHFatFs_waitForConnect 中有10秒的延迟。 如果 USB 闪存盘未连接且延迟到期、则它将退出该操作。

    当您消除延迟或使其成为无限循环任务时会发生什么情况?

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

    您能否提供您正在使用的实际代码? 如果不可能、您可以通过修改 fatsdusbcopy 示例来复制它吗? 此外、您使用的是 TI-RTOS 的哪个版本?

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

    我使用的是 TI-RTOS 2.16.1.14。 这是检查 USB 连接的例程。

    uint8_t CheckUSB 连接(空)

       USBMSCHFatFs_handle usbmschfatfsHandle;
       USBMSCHFatFs_Params usbmschfatfsParams;

       /*安装并注册 USB 驱动器*/
       USBMSCHFatFs_Params_init (&usbmschfatfsParams);
       usbmschfatfsParams.serviceTaskStackPtr = usbServiceTaskStack;
       usbmschfatfsParams.serviceTaskStackSize = sizeof (usbServiceTaskStack);
       usbmschfatfsHandle = USBMSCHFatFs_open (Board_USBMSCHFatFs0、
                                              USB_DRIVE_NUM、
                                             usbmschfatfsParams (&U);
       if (usbmschfatfsHandle == NULL){
           //System_abort ("启动 USB 驱动器时出错\n");
           LCD_DisplayMessageFullScreen ("启动 USB  驱动器时出错");
           //USB_Init();

    //USBMSCHFatFs_Close (usbmschfatfsHandle);


           返回0;
       }

        /*需要阻止,直到枚举 USB 驱动器*/
       if (!USBMSCHFatFs_waitForConnect (usbmschfatfsHandle、10000)){
           //System_abort ("不存在 USB 驱动器、正在中止...\n");
          LCD_DisplayMessageFullScreen ("不存在 USB 驱动器、  正在中止...");
         // USB_Init();

    //USBMSCHFatFs_Close (usbmschfatfsHandle);
          返回0;



       /*停止 USB 驱动器*/
       USBMSCHFatFs_Close (usbmschfatfsHandle);
       System_printf ("驱动器%u 未安装\n"、USB_DRIVE_NUM);

       返回1;

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

    如果我增加延迟以使其成为无限循环、它只需永远等待、并且每当连接闪存时、它都会执行任务。 这就是我现在所做的,但是如果闪存驱动器未连接,我想退出操作,这样用户可以在以后再次执行操作。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    也许创建一个任务来调用一个 GPTM 定时器间隔、其中中断处理程序轮询[uint8_t CheckUSBConnected (void)]并删除阻止代码(WaitForConnect)和延迟指令。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    在 USBMSCHFatFs_open ()失败后、我能够调用 USBMSCHFatFs_Close、然后再次调用 USBMSCHFatFs_open、然后再次调用 USBMSCHFatFs_waitForConnect (在我插入 USB 驱动器之后)并使其正常工作。 我确实注意到、当我插入时、LP 有时会使用某些 USB 记忆棒进行复位。 它运行的是略微修改的 fatsdusbcopy_EK_TM4C1294XL_TI_TivaTM4C1294NCPDT 示例(已附)。

    e2e.ti.com/.../fatsdusbcopy.c

    我不确定某些 USB 驱动器的复位会发生什么情况。 如果您还看到它、我们应该向 TM4C 工程师发出 ping 命令。 我正在使用 EK-TM4C1294XL LaunchPad。

    Todd

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

    CAL 您详细说明了 LP 重置的含义是什么?

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

    我确实注意到、当我插入 LaunchPad 时、LaunchPad 有时会使用某些 USB 记忆棒进行重置。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您看到的问题可能是我遇到的问题的延伸。 我不使用 LuanchPad、但它是同一个微控制器(TM4C1294)。 我的 USB 驱动程序最初基于 Fatsdusbcopy、但经过修改、因为我不使用 PD6、PD7和 PQ4 (对于外部电源控制而言是可选的)、但我在子例程中有类似的任务、我根据用户输入调用了该任务。 system_abort 替换为返回状态。  这是我当前用于初始化和 USB 连接检查的代码。

    void USB_Init (void)

       SysCtlPeripheralEnable (SYSCTL_Periph_UDMA);
       uDMAEnable();
       uDMAControlBaseSet (dmaControlTable);

       /*启用 USB 外设和 PLL */
       SysCtlPeripheralEnable (SYSCTL_Periph_USB0);
       SysCtlUSBPLLEnable();

       /*用于 USB 操作的设置引脚*/
       GPIOPinTypeUSBAnalog (GPIO_PORTB_BASE、GPIO_PIN_0 | GPIO_PIN_1);
       GPIOPinTypeUSBAnalog (GPIO_PORTL_BASE、GPIO_PIN_6 | GPIO_PIN_7);

       USBMSCHFatFs_init();


    uint8_t CheckUSB 连接(空)

       USBMSCHFatFs_handle usbmschfatfsHandle;
       USBMSCHFatFs_Params usbmschfatfsParams;
       uint8_t status = 0;
       /*安装并注册 USB 驱动器*/
       USBMSCHFatFs_Params_init (&usbmschfatfsParams);
       usbmschfatfsParams.serviceTaskStackPtr = usbServiceTaskStack;
       usbmschfatfsParams.serviceTaskStackSize = sizeof (usbServiceTaskStack);
       usbmschfatfsHandle = USBMSCHFatFs_open (Board_USBMSCHFatFs0、
                                              USB_DRIVE_NUM、
                                             usbmschfatfsParams (&U);
       if (usbmschfatfsHandle ==空)
       {
           LCD_DisplayMessageFullScreen ("启动 USB  驱动器时出错");
           状态= 0;
       }
       其他
       {
           LCD_DisplayMessage ("正在连接到 USB 闪存驱动器.....。。 ");

           /*需要阻止,直到枚举 USB 驱动器*/
           if (!USBMSCHFatFs_waitForConnect (usbmschfatfsHandle、10000))
           {
              LCD_DisplayMessageFullScreen ("不存在 USB 驱动器、  正在中止...");
              状态= 0;
           }
           其他
           {
              状态= 1;
           }
       }
       /*停止 USB 驱动器*/
       USBMSCHFatFs_Close (usbmschfatfsHandle);
       退货状态;


    对我来说、现在的主要问题是 USB 驱动程序在更长的时间(10到15天)内停止工作。 当我的代码尝试检查 USB 记忆棒是否已连接并卡在其中时  

    if (!USBMSCHFatFs_waitForConnect (usbmschfatfsHandle、10000) )、并且在我卸下记忆棒之前从不退出。

    此外、我正在检查信号 USBD_N 和 USBD_P   在正常工作期间、USBD_P 保持高电平、但在我遇到此问题时降至低电平。

    我们尝试查找有关这两个信号的更多详细信息、但似乎 TM4C1294NCDPT 的数据表需要 NDA 才能获取有关 USB 部分的完整信息。