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.

[参考译文] TM4C123GH6PM:对 USB 中断和 UDMA USB 有疑问。

Guru**** 2529590 points
Other Parts Discussed in Thread: BQ25890

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/892448/tm4c123gh6pm-doubt-about-usb-interrupt-and-udma-usb

器件型号:TM4C123GH6PM
主题中讨论的其他器件:BQ25890

您好!

我使用 TM4C123G 和加速计(ICM20689)制作了自己的器件。 该板具有 USB 连接器和 SD 卡、用于记录数据。
我使用加速计例程实现了 USB_DEV_msc 示例、该加速计例程通过 ACC 的中断(采样率1K)获取值。
我不知道为什么 Windows 永远不会检测和安装 SD、但是如果我禁用 ACC 的中断、Windows 会完美地检测到 SD 卡、我可以下载文件。


我将 ROM_GPIOPinWrite (上行/下行)放入处理程序中断例程中、以便使用逻辑分析仪查看它们。 但我没有发现任何专利人。

我n`t 非常了解 USB 中断和 USB UDMA 的工作原理。


有关这方面的提示是否说明?

提前感谢。

安德烈斯

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

    您好 Andres、

    可能是优先级问题。 如果加速计中断频繁触发且优先级更高、则可能会中断 USB 总线通信或速度太慢。

    这里没有很多信息可供我了解。

    USB 信息包含在 USB 库用户指南中、该指南 位于 TivaWare 的 docs 文件夹中的 SW-TM4C-USBL-UG-2.1.4.178.pdf。

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

    您好、Ralph、

    感谢您的回答。

    我用 ROM_IntPrioritySet (INT_USB0、0x00)更改了中断优先级 、但没有任何更改。 它是相同的。

    此致、

    安德烈斯

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

    您好 Andres、

    您是否曾尝试仅为 USB 初始化禁用加速计中断、然后将其重新打开? 这是一个有趣的测试、可以查看它只是枚举过程还是整个 USB 接口在为中断运行而挣扎。

    加速计的 ISR 也在做什么?

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

    您好!

    商定-提供的数据似乎不足以进行"深入"分析。

    您是否可以澄清:

    • 您的定制电路板/电路板包括:MCU、加速卡和 SD 卡/连接器-是这样吗?
    • 全部3个都包含在内、这样您的电路板/电路板就可以获得 Accel 数据、"从 PC 中免费"。   是这样吗?
    • 如果我正确描述了您的系统-这是否起作用?   (即未连接到 PC 时。)

    现在、在某些时候、您可以"将电路板连接到 PC "-这样您就可以通过 USB 将采集到的 Accel 数据(存储在 SD 卡中)传输到 PC。   再说一次-这是正确的吗?

    在以下情况下、您的系统是否会"中断":

    • 连接到 PC  
    • 定期(甚至连续)获取 Accel 数据
    • 以及在 MCU 和 SD 卡(甚至 PC)之间传输加速数据

    是否需要(两者)"将 Accel 数据存储到 SD 卡、同时(近)将数据同时传输到 PC?   作为替代方案- SD 卡可从电路板上移除(在数据采集后)-并且只需插入 PC 即可。   除了"独立"数据采集之外- SD 卡的作用似乎不确定...

    还应指出的是-在基本设计成功之前、µDMA 的早期使用明显违反了"kiss"-额外(通常不需要)复杂性-通常会干扰(否则)合理的设计工作...

    您的任务的"意图"不明确-通常在 MCU 设计/开发之前必须"锁定"...

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

    您好、Ralph、

    1 -是的、我这么做了、它起作用了、但我认为它有点"硬编码"

    2-我的系统通过 SPI 读取3个轴中的加速度并将其保存在缓冲器中。 对于该测试、在 while (1)内、我不执行任何操作、它是空的。

    您好 CB1、
       
    我的板具有 MCU、加速卡、SD 卡/USB 连接器、射频 Xbee (在代码中禁用)和 BQ25890 (独立工作)。
    我的系统通过 SPI 读取3个轴中的加速度、并将其保存在缓冲器中、如果它通过射频接收到信号、则缓冲器将写入 SD。
    是的、系统工作正常。 我可以完美地将数据保存到 SD 中。
    我的系统在通过射频接收信号之前连接 USB 时中断。 我在写入 SD 时没有尝试连接 USB、但我认为我不会允许该选项。

    提前感谢。

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

    您好 Andres、

    之后、您能够与 USB 设备进行良好的通信? 是否能够下载文件等? 如果是、那么至少我们知道枚举期间的中断是问题所在。

    在中断中读取 SPI 数据的重要性如何? 这听起来像是一个很好的处理量。 您能否简化 ISR 以设置需要读取数据的标志、然后在 while (1)循环中进行处理? 如果是、请查看这是否可以解决 USB 问题并为您提供准确的数据。

    我认为设置 USB 中断优先级足以避免 ISR 花费太长的问题、但可能是在该 ISR 内执行的 SPI 读取过程更难中断。 只是根据所介绍的内容进行一些猜测、对我来说、有一点奇怪的是、优先级没有帮助、但只是尝试提出一些更具潜在价值的想法、以便我们能够弄清正在发生的事情以及哪些事情最适合您的系统。

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

    您好 Andres、

    查看 D/S、我认为所有中断都是从优先级0x00开始的。

    也可以尝试设置:

    ROM_IntPrioritySet (INT_SSI0、0x40); 

    (请注意、我猜 SSI0是您的加速计中断、如果不是、请为此使用正确的 SSI 通道!)

    这会降低中断优先级、因此只有 USB 更高。

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

    谢谢您-我们必须注意、射频 Xbee 的存在是新的-即使在描述之后、它的使用是否准确对我/我的团队来说也是不清楚的。

    我们仍然不确定:

    • 您的电路板系统(通过 USB)连接到 PC 的时间和原因   
    • 该连接的频率和/或持续时间 (可能是启用"连接到 PC "的运行时间百分比)。

    此设计中似乎存在"许多活动部件"、关键操作的计时序列(&持续时间)(迄今为止)有点超出我们的理解范围。   (不要讨厌我们、但我们 通常会向"官方"客户要求一个清晰的"方框图"、即重叠且有凝聚力的系统时序图和描述(甚至详细说明)所有关键操作的叙述。   并且已经证明运行良好!)

    不要忘记-在"问题继续存在"的同时引入了 µDMA 的复杂性-这不是我们公司的建议...

    在这种(可能)"定时挑战设计"中、

    • 降低传输速率
    • 同时(如有可能)将单个操作限制在"离散时隙"(即使在最终设计中可能不"允许")

    始终为"首先识别(重要)、然后系统地"追求"真正的解决方案提供最好的服务。"

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

    您好、Ralph、

    ACC 的中断是 INT 引脚的 ACC (而不是 SSI 中断)、如果我在插入 USB 时禁用此 INT、一切都正常。

    当 int 引脚为 up 时->通过 SPI 读取并将值放入缓冲区->当缓冲区有100个值并且我通过射频接收到消息->写入 SD

    我同意改变优先次序应该起作用,但我不理解为什么它不起作用。 因为我还怀疑这取决于时间问题。


    这是我的 USB 处理程序中断:

    void USB0DeviceIntHandler_spiliba (void)
    {
    ROM_GPIOPinWrite (GPIO_PORTB_BASE、GPIO_PIN_3、GPIO_PIN_3);
    
    #warning
    GPIOIntDisable (GPIO_Porte _BASE、GPIO_PIN_5);
    
    USB0DeviceIntHandler();
    
    ROM_GPIOPinWrite (GPIO_PORTB_BASE、GPIO_PIN_3、0);
    } 

    中断优先级:

    // USB
    ROM_IntPrioritySet (INT_USB0、0x00);
    
    // ACCEL
    ROM_IntPrioritySet (INT_GPIOE、0x40); 

    您好 CB1、
       
    我将电路板连接到 PC 以下载获取的数据。 何时? 在记录数据之后或之前。
    射频模块作为外部使能标志工作、但未为此测试启用。

    我的测试顺序是(现在我不使用射频模块、全部引用了):

    main {
    init SSI
    init ACC
    init SD_CARD
    init USB
    init interrupts
    
    while (1)
    {
    }
    
    
    init interrupts
    {
    init int 引脚 ACC
    set interrupt priorities
    enable int
    }
    
    ACC int
    {
    通过 SSI 值读取并将其放入缓冲
    器}
    
    init USB
    {
    //
    ////设置 USB 堆栈模式更改为器件模式、无需 VBUS 监控。
    //
    USBStackModeSet (0、eUSBModeForceDevice、0);
    
    //
    将我们的器件信息传递到 USB 库并将器件
    //放置在总线上。
    //
    USBDMSCInit (0、(tUSBDMSCDevice*)&g_sMSCDevice);
    
    //注册 USB 中断处理程序
    USBIntRegister (USB0_BASE、USB0DeviceIntHandler_spilba);
    
    //
    //将状态初始化为空闲。
    //
    G_eMSCState = MSC_DEV_DISCONNECTED;
    
    
    //
    配置并启用 UDMA
    //
    ROM_SysCtlPeripheralEnable (SYSCTL_Periph_UDMA);
    ROM_SysCtlDelay (10);
    ROM_uDMAControlBaseSet (&sDMAControlTable[0]);
    ROM_uDMAEnable ();
    
    //
    //启用外设时钟
    //
    ROM_SysCtlPeripheralEnable (SYSCTL_Periph_USB0);
    ROM_SysCtlUSBPLLEnable();
    ROM_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOD);
    ROM_SysCtlDelay (10);
    
    //
    //为 USB0 USB0DP 启用引脚 PD5
    //
    ROM_GPIOPinTypeUSBAnalog (GPIO_PORTD_BASE、GPIO_PIN_5);
    
    //
    //针对 USB0 USB0DM 的使能引脚 PD4
    //
    ROM_GPIOPinTypeUSBAnalog (GPIO_PORTD_BASE、GPIO_PIN_4);
    
    } 

    提前感谢

    安德烈斯

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

    您好!

    我的团队赞赏您的耐心-请注意(两者)供应商代理和我的"外部人士/麻烦制造者"都希望您取得成功。

    我们在之前写下了"额外的纪律"(我们通常)客户的要求(长期证明我们能够提供最快、最好和最完整的诊断)、而您在回答问题时通常都做得很好-仍然存在严重的问题和疑虑。   请注意、这里有"没有真正的正确或错误"-但是、您、供应商代理和我的团队从不同的角度处理您的问题、有时采用不同的方法。

    我们怀疑、从我们的几个"一般目标和信仰"开始、证明是明智的。   如果这些冲突是你自己的冲突,我们将需要找到一些"共同点"。   请注意、供应商代理的"一般意义"和我所在团队的"一般意义"似乎已经融合在一起!   正如 Ralph Zero 在" MCU 代码设计"方面所说的那样、这是"告诉"、而我的团队攻击(更通用/更广泛)"设计:基础、意图和整体执行"。   因此、当我们的"建议重叠"时、我们通常会"接近!"

    Ralph 写道:"读取中断中的 SPI 数据有多重要?   这听起来像是一个很好的处理量。   您能否简化 ISR 以设置需要读取数据的标志、然后在 while (1)循环中进行处理?   我们写道:"您能否将主要功能限制在"独特的时隙?"   我们都担心、"职能重叠"很难完全正确地管理!

    我所在集团的计划成功一般规则:

    • 为您的计划(每一项)提供成功的机会!   避免潜在的"过度压力"-应用"kiss"(简化、单独分配职能、然后测量和验证-只有然后合并和集成-系统地进行...) -采用(减慢)保守的时序和在可能的情况下-"限制函数重叠" (至少在一般逻辑和程序流被证明之前)
    • 知道需求本身通常需要更深入的管理和灵活性(即经常必须针对未预料到的情况进行"调整")
    • 注意"过早优化"-这通常会引入"错误/延迟"、最终结果可能会证明"不如预期!"

    现在、了解一下您的计划的具体细节-请原谅我-但是各种计划任务的管理和意图似乎很好奇。   遵循"按时间顺序"(从您的第一个帖子开始)列出我所在团队的"不确定因素:"  (深呼吸)   

    • 您写道:"我不知道为什么 Windows 永远不会检测和安装 SD、但如果我禁用 ACC 的中断、Windows 将完美地检测到 SD 卡、我可以下载文件"。

    什么文件?   SD 卡处理(仅限)"传感器数据"是否不正确?   (为了完整、我们必须"调查"所有此类(原因不明)详细信息。)

    • "我将 ROM_GPIOPinWrite (上行/下行)放入处理程序中断例程中、以便使用逻辑分析仪查看它们。  但我没有识别任何模式。"    

    您应该拥有!  (已识别此类模式) 以下代码显示:

    void USB0DeviceIntHandler_spiliba (void)
    ROM_GPIOPinWrite (GPIO_PORTB_BASE、GPIO_PIN_3、8);  // "设置"PB_3 &放置在此函数之上
    ROM_GPIOPinWrite (GPIO_PORTB_BASE、GPIO_PIN_3、0);  // "清除"PB_3 -被放置在函数的末尾- 模式是肯定的

    • "ACC's interrupt is int pin is ACC (not SSI interrupt)、if I disable this int when I plug the USB、一切都正常。"   

    这促使拉尔夫写到:“你是否尝试禁用加速计的中断只是为了 USB 初始化,然后重新打开它们?”

    • "是的、我这么做了、它起作用了、但我认为它有点"硬编码"

    原谅-但这是"令人不安的!"   拉尔夫和我的团队都建议"时间档"(我、e、每次努力实现一项功能)、但您却提出"硬编码"-减去任何定义!   这是自给的——是不是吗?

    需要询问的是、"为什么您造成了 PC "通过 USB 连接"而加速计"正在进行机器扫描"中断的情况?   (即使观察到这会导致您的问题!)   注:-我的目的是(不)严格-但要强调(可疑)逻辑-通过启用"Acc 中断"来显示在 PC 连接时间范围内继续。   您(应该)拥有完全的控制权-我们无法理解、"为什么允许这种重叠?"

    最后一点-尽管它增加了复杂性-"uDMA 继续"-这肯定是"过早优化"-并且可能会引发问题-应该在"一切都证明很好"之后添加(仅限)。

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

    您好 CB1、

    首先、感谢您的理解和支持。 让我们一步一步。

    确实、这是大量不必要的处理。

    我将数据记录到文本文件中、并使用 USB 连接下载此文件。

    当我写"我没有识别任何模式"时、我意味着我希望在 USB 中断中有一个模式(越来越慢的时间)
    我附加图像:

    ACC 中断


    没有 ACC 中断



    也许这个解决方案就像 Ralph 写的那样、"只为 USB 初始化禁用加速计的中断、然后将它们重新打开"

    但"USB 初始化"意味着我何时连接 USB?


    您写道:"最后一点-尽管它增加了复杂性-"uDMA 继续"-这肯定是"过早优化"-可能会引发问题-应该(仅限于)添加到"一切都证明良好"之后。 "

    我不清楚这意味着什么

    提前感谢。

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

    我的朋友、  

    明白了-谢谢。   语言可能会起问题-我的团队认为您的语言相当好。   (远远超出我的(假定的)西班牙语...)   (我们出生的“北乐”有“如此轻松”——语言上的智慧。)

    [引用 user="Andres_dalmati"]确实需要大量的不必要处理。

    我不建议您的处理"不必要"、而是"不如最佳管理?"

    对我团队的(集体想法... 我们所有人)-您在"继续加速计数据采集!"的同时、"没有理由"允许 PC-USB 连接!   这证明了您"认识到这种"故障导致"的联系、但仍允许它继续运行、这尤其令人厌烦!   为什么是这样?   (从未解释过、也没有理由!)   

    我的公司还生产了一个"多通道、高速、数据采集板/箱" (通过2个 ARM Cortex M7)、用于(两个) SD 卡和 USB 记忆棒-但我们发现、在连接到 PC 时(即没有)几乎无需这样做  为了 增强操作、我们提供了一个紧凑型 OLED (显示屏)和"5向、微型、触觉的"Joy Stick!"  

    [引用 USER="Andres_dalmati"]也许该解决方案就像 Ralph 所说的那样,"仅为 USB 初始化禁用加速计的中断,然后将它们重新打开"

    的确,这有"合理"的成功机会 (但不是有保证的机会)。"   然而、更好的是、" PC-连接间隔期间停止加速计的运行!"   这 两种  方式比(仅)禁用中断更安全、更直接、更简单!   (然后、以某种方式、必须重新启用!)   并且是实现"独特的时隙"的一种方法(我的小组建议)-这意味 着不允许"在 USB 初始化期间"运行加速计!   同样、我们发现在"连接到 PC!"的同时继续进行加速计测量没有(合理)理由!   SD 卡的简单存在强烈表明您的采集板旨在"独立运行!" (在获取传感器数据的同时、不需要 PC!)

    [引用 USER="Andres_dalmati"]尽管它增加了复杂性-“uDMA 继续”-这肯定是“过早优化”-可能会引发问题[/引用]

    您添加了 μ µDMA 操作来(希望如此)加快数据传输过程。  (因此优化!)   然而-您之前承认是 n ü µDMA (非常)的新成员-您意识到其"设置、配置和使用"非常复杂-并且可能(自身)导致或导致程序问题!   这就是在早期设计/开发过程中应避免(任何)增加复杂性的原因。  

    µDMA µDMA 您或其他人、相信我对 T Ü V "过于苛刻"-这里(2天前)的一张沮丧海报指出:" T Ü V 的失败!"   (我不能... 制作这些东西! 证据每天都会通过这个论坛门-许多用户会被(魔鬼) µDMA!)"过度质疑"   不应该"警告程序员"-让程序员注意"标志上升?   (《拉丁美洲和加勒比法律》提供了拉丁文。)

    "当我在不配置 DMA 的情况下运行代码时、代码运行得非常好!。"
    e2e.ti.com/.../892221

     完善基础知识-确认(正确)操作-并"记录(实际)实现的性能"。    只有在"太早"(过早)阶段结束(即您的系统正在工作)后、您才应添加 n ü µDMA 功能。   

    通过这种方式(以这种方式真正单独使用)、您可以将性能(两者都有)与不含 µDMA 的性能进行比较、并查看添加的代码和开发时间/工作是否"值得!"   (对于(如此之小) SPI 缓冲器-我们认为 µDMA 的"增益"微不足道-如果有的话!   供应商在这里报告了这种情况!)

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

    您好 Andres、

    您的 USB 初始化序列非常糟糕。 很多事情都是不有序的。 可能发生的情况是、当加速计中断发生时、系统会有太多的时间尝试和处理一个不符合顺序的设置、这会触发一个问题。  

    如果您遇到 FaultISR -这几乎肯定是原因。

    您的订单应:

    1) 1)在系统控制中启用外设(SYSCTL 调用)

    2) 2)启用 GPIO 引脚

    3) 3)配置 USB 参数

    4) 4)调用 USBDMSCInit

    IntRegister 通常在3和4之间完成。 不过、您可以更早地完成、但配置参数->设置 ISR ->启用外设是典型的顺序、 USBDMSCInit 基本上相当于 SSIEnable 等效的调用。  

    查看更新 USB 配置序列是否解决了此问题。

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

    您好 CB1、

    非常感谢您的回答和建议、它们真的很有帮助。 我认为有另一个观点非常有用。

    您好、Ralph、

    这是我的(伪)代码、我的初始化是否非常糟糕?

    int main (void)
    
    {
    // se setea el clock del TM4C -> Clock 66.6MHz:400/2 /3
    ROM_SysCtlClockSet (SYSCTL_SYSDIV_3 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHz);
    SysCtlDelay (10);
    
    
    //*********
    //********* INIT_SSI *********
    //*********
    
    SysCtlPeripheralDisable (SYSCTL_Periph_SSI3);
    
    // se habilita el 引脚 de CLK (pin0) como GPIO y se simula un clock
    // manualmente para salir de cualquier Estado no deseado。
    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOD);
    
    // SysCtlPeripheralEnable tarda 5 ciclos de clock en convitar el Periferico。
    SysCtlDelay (2);
    
    GPIOPinTypeGPIOOutput (GPIO_PORTD_base、GPIO_PIN_0);
    
    对于(i=0;i<15;i++)
    {
    GPIOPinWrite (GPIO_PORTD_base、GPIO_PIN_0、GPIO_PIN_0);
    // SysCtlDelay ((SysCtlClockGet ()/(1000 * 3)));
    GPIOPinWrite (GPIO_PORTD_BASE、GPIO_PIN_0、0);
    // SysCtlDelay ((SysCtlClockGet ()/(1000 * 3)));
    }
    
    //
    //必须启用 SSI3外设才能使用。
    //
    
    SysCtlPeripheralEnable (SYSCTL_Periph_SSI3);
    
    //
    //为端口 D0、D1、D2和 D3上的 SSI3功能配置引脚复用。
    //
    
    GPIOPinConfigure (GPIO_PD0_SSI3CLK);
    GPIOPinConfigure (GPIO_PD1_SSI3FSS);
    GPIOPinConfigure (GPIO_PD2_SSI3RX);
    GPIOPinConfigure (GPIO_PD3_SSI3TX);
    
    //
    //配置 SSI 引脚的 GPIO 设置。 该函数也会提供
    将这些引脚的//控制到 SSI 硬件。
    //
    
    GPIOPinTypeSSI (GPIO_PORTD_base、GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3);
    
    //
    //为 SPI 主控模式配置和启用 SSI 端口。 使用 SSI3、
    //系统时钟电源,空闲时钟低电平和低电平有效时钟输入
    //飞思卡尔 SPI 模式、主控模式、1MHz SSI 频率和8位数据。
    //对于 SPI 模式,可以设置 SSI 时钟的极性
    //单元空闲。 您还可以配置所需的时钟边沿
    //在上捕获数据。 有关的更多信息、请参阅数据表
    //不同的 SPI 模式。
    //
    
    SSIConfigSetExpClk (SSI3_base、SysCtlClockGet ()、SSI_FRF_MOTO_MOTO_MODE_3、SSI_MODE_MASTER、1000000、 16);
    
    //
    //启用 SSI3模块。
    //
    SSIEnable (SSI3_base);
    
    //
    //从 SSI 端口读取任何残留数据。 这将确保接收
    // FIFO 为空,因此我们不会读取任何不需要的垃圾。 这在这里完成
    //因为 SPI SSI 模式为全双工模式,允许您发送和
    //同时接收。 SSIDataGetNonBlocking 函数返回
    //返回数据时为"true",未返回数据时为"false"。
    //“非阻塞”函数检查接收中是否有数据
    // FIFO、如果没有、则不会"挂起"。
    //
    while (SSIDataGetNonBlocking (SSI3_base、&pui32Data))
    {
    }
    
    //*********
    //********* INIT_ACC *********
    //*********
    
    /********* 加速设置********
    H3LIS331DL_setup();
    
    /********* Accel PIN 初始化********
    ROM_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOE);
    
    // SysCtlPeripheralEnable tarda 5 ciclos de clock en convitar el Periferico。
    ROM_SysCtlDelay (2);
    
    //此函数为引脚提供正确的配置。
    //使用位打包字节指定引脚、其中每个位都是
    // set 标识要访问的引脚、以及字节的位0的位置
    //代表 GPIO 端口引脚0、位1代表 GPIO 端口引脚1、依此类推。
    // atencion!!! ESTA función llama A:
    //- GPIODirModeSet (ui32Port、ui8引脚、GPIO_DIR_MODE_IN);使引脚成为输入。
    //- GPIOPadConfigSet (ui32端口、ui8引脚、GPIO_Strength _2mA、GPIO_PIN_TYPE_STD);
    //为标准推挽操作设置焊盘。
    ROM_GPIOPinTypeGPIOInput (GPIO_Porte _BASE、GPIO_PIN_5);
    
    //***************
    //********* INIT_SD_CARD
    //*********
    sdcard_Init ();
    
    //*********
    //********* INIT_USB *********
    //*********
    
    //
    //将状态初始化为空闲。
    //
    G_eMSCState = MSC_DEV_DISCONNECTED;
    
    
    //
    配置并启用 UDMA
    //
    ROM_SysCtlPeripheralEnable (SYSCTL_Periph_UDMA);
    ROM_SysCtlDelay (10);
    ROM_uDMAControlBaseSet (&sDMAControlTable[0]);
    ROM_uDMAEnable ();
    
    //
    //启用外设时钟
    //
    ROM_SysCtlPeripheralEnable (SYSCTL_Periph_USB0);
    ROM_SysCtlUSBPLLEnable();
    ROM_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOD);
    ROM_SysCtlDelay (10);
    
    //
    //为 USB0 USB0DP 启用引脚 PD5
    //
    ROM_GPIOPinTypeUSBAnalog (GPIO_PORTD_BASE、GPIO_PIN_5);
    
    //
    //针对 USB0 USB0DM 的使能引脚 PD4
    //
    ROM_GPIOPinTypeUSBAnalog (GPIO_PORTD_base、GPIO_PIN_4);
    
    //
    将 USB 堆栈模式设置为器件模式、而不进行 VBUS 监控。
    //
    USBStackModeSet (0、eUSBModeForceDevice、0);
    
    //
    将我们的器件信息传递到 USB 库并将器件
    //放置在总线上。
    //
    USBDMSCInit (0、(tUSBDMSCDevice*)&g_sMSCDevice);
    
    //注册 USB 中断处理程序
    USBIntRegister (USB0_BASE、USB0DeviceIntHandler_spiliba);
    
    //*********
    //********* INIT_INTERRUPTS *********
    //*********
    
    /********* ACCEL 中断引脚初始化*********
    GPIOIntClear (GPIO_Porte _BASE、GPIO_PIN_5);
    
    //此函数确保由 pfnIntHandler 指定的中断处理程序
    //在检测到所选中断时调用
    // GPIO 端口。 此函数还启用相应的 GPIO 中断
    //在中断控制器中;单个引脚中断和中断
    //源必须用 GPIOIntEnable()启用。
    // Como se explica、se llama A:
    //- ui32int =_UARTIntNumberGet (ui32Base)以确定中断编号
    //基于 UART 端口。
    //- IntRegister (ui32Int、pfnHandler)来注册中断处理程序。
    //- IntEnable (ui32Int)来启用 UART 中断。无 queda claro、pero
    //我可以在这家酒店住一个小酒店。 Lo Supongo
    //将 tiene 设置为"enable the general interrupt"。
    GPIOIntRegister (GPIO_Porte _BASE、ACCEL_Int_Handler);
    ROM_GPIOIntTypeSet (GPIO_Porte _BASE、GPIO_PIN_5、GPIO_HIGH_LEVEL);
    GPIOIntEnable (GPIO_Porte _BASE、GPIO_PIN_5);
    
    
    //******* 中断优先级********
    // USB
    ROM_IntPrioritySet (INT_USB0、0x20);
    // ACCEL
    ROM_IntPrioritySet (INT_GPIOE、0x80);
    
    ROM_IntMasterEnable ();
    
    while (1)
    {
    
    }
    
    
    

    提前感谢。

    安德烈斯

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

    您好 Andres、

    这看起来比您在此处展示的效果好得多: e2e.ti.com/.../3299717

    您是否能够使用此新发布的代码进行测试?

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

    您好、Ralph、

    代码始终如一。

    提前感谢

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

    根据您的建议、我禁用加速计中断、PC 可以安装 SD。 我还将回调函数 USBDMSCEventCallback 添加到初始化结构 g_sMSCDevice 中。 变量与示例中的名称相同。

    但我不明白 为什么在我断开 USB 连接时它不将变量 g_eMSCState 更改为 MSC_DEV_DISCONNECT。 它保持在 MSC_DEV_READ 或 MSC_DEV_WRITE 状态。

    如果我不禁用中断、当我连接 USB 时、g_eMSCState 保持在 MSC_DEV_IDLE 状态。

    谢谢

    安德烈斯

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

    您好 Andres、

    了解您的设置过程是正确的、因此、请记住、在您发布代码时、函数的顺序对我们来说很重要、以便将来参考。  

    [引用 USER="Andres_dalmati">但我不理解为什么 在我断开 USB 连接时它不将变量 g_eMSCState 更改为 MSC_DEV_DISCONNECT。 它保持在 MSC_DEV_READ 或 MSC_DEV_WRITE 状态。[/QUERP]

     MSC_DEV_DISCONNECTED 状态的定义:

    //! 注意:在设备模式下、如果发生这种情况、则不会报告 USB_EVENT_DISCONNECTED
    //! MCU 的 PB1/USB0VBUS 引脚被连接至一个固定的+5V 而非
    //! USB 连接器上的 VBUS 引脚。

    当您处于 eUSBModeForceDevice 模式时、将不会监控 VBUS 引脚。

    另一个有关 SD 安装的中断部件的问题。 您是在启动时安装 SD (即在运行时插入 SD)、还是在执行代码且程序已在 while (1)循环中之后尝试安装 SD 卡?

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

    您好、Ralph、

    非常感谢您的回答。

    在打开设备之前插入 SD。

    提前感谢

    安德烈斯

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

    我可以将 VBUS 的连接器连接到 USB0VBUS 引脚(我的 PCB 允许这样做)、然后更改为 eUSBModeDevice。
    正如 USB 库用户指南所说的"如果应用需要接收断开事件、则使用 eUSBModeDevice 设置、并且必须将 VBUS 引脚连接到 USB 连接器、并使 ID 引脚保持未连接状态。"

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

    您好 Andres、

    我在 SD 卡示例中做了一些进一步的探究、我在带有 SD 卡的 msc 的123G 示例中找到了以下代码:

    //
    //确定是否安装了 SDCard。 如果没有,请打印
    //警告并让用户安装并重新启动。
    //
    ui32Retcode = disk_initialize (0); 

    此处需要注意的关键是有关需要使用 SD 卡启动的注释-我提出这一点的原因是针对129X 的第二个示例的以下注释:

    //
    //初始化 SD 卡(如果存在)。 这可以防止它产生干扰
    //访问 SPI 闪存。
    //
    disk_initialize (0); 

    在我看来、这两种状态意味着 SD 卡安装是一个更敏感的应用。 所有这些都表示在启用加速计之前应完成 SD 卡安装。

    这里还有一个问题、 USB0DeviceIntHandler_spiliba 来自哪里? 我相信我们在 TivaWare 中没有这种功能。 TivaWare USB 处理程序是 USB0DeviceIntHandler、在 usbdhandler.c 中定义 您是否调整了该定义? 可能是另一个问题、但现在听起来好像 SD 卡安装过程不能中断。

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

    您好 Ralph、

    这是我的 USB 处理程序中断:

    void USB0DeviceIntHandler_spiliba (void)
    {
    ROM_GPIOPinWrite (GPIO_PORTB_BASE、GPIO_PIN_3、GPIO_PIN_3);
    
    #warning
    GPIOIntDisable (GPIO_Porte _BASE、GPIO_PIN_5);
    
    USB0DeviceIntHandler();
    
    ROM_GPIOPinWrite (GPIO_PORTB_BASE、GPIO_PIN_3、0);
    } 


    我将 ROM_GPIOPinWrite (上行/下行)放入处理程序中断例程中、以通过逻辑分析仪查看它们、并将 GPIOIntDisable 置为禁用 ACC 中断。

    SD 卡安装在我的应用程序上工作正常、我可以进行记录/写入、而不会出现任何问题。 无论如何、在我之前编写的伪代码中、我在初始化应用程序末尾安装 SD 之后、在 while (1)之前启用了中断。

    尽管如果我将 VBUS 的信号从 USB 连接器连接到 USB0VBUS 引脚(而我的 PCB 允许这样做)会更好 然后更改为 eUSBModeDevice、因为 USB 库用户指南显示"如果应用需要接收断开事件、则使用 eUSBModeDevice 设置、并且必须将 VBUS 引脚连接到 USB 连接器、并将 ID 引脚保持未连接状态。" 由于同一引脚也连接到 BQ25890中的相应引脚,我是否应特别注意任何其他“副作用 ”?

    提前感谢

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

    您好 Andres、

    好的、了解 USB 中断的变化-现在您介绍了 API 就像这样。 谢谢。

    [引用 user="Andres_dalmati"]由于同一引脚也连接 到 BQ25890中的相应引脚 ,因此,如果我要特别注意任何其他“副作用 ”?

    BQ25890的 VBUS 来自何处、SD 卡如何供电? 问题是、是否有任何电压源可能发生冲突。 TM4C VBUS 引脚不提供5V 电压、因此不会产生冲突。 只要 SD 卡是相同的、那就可以了。

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

    您好!

    我有另一个疑问。

    如何提高 USB 数据传输速度?

    我可以使用 ~330kb/s 进行下载

    据称微处理器具有 USB 2.0、但该速度与之不符。

    提前感谢。

    安德烈斯  

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

    您好 Andres、

    您希望使用 USB 高速还是 USB 全速?

    该器件的 USB 2.0规格仅适用于全速和低速:

    TM4C123GH6PM 微控制器支持 USB 2.0全速和低速模式的三种配置:
    USB 器
    件、USB 主机和 USB On-The-Go (连接到其他启用 USB 的系统时协商为主机或器件)。
    USB 模块具有以下特性:
    ■符合 USB-IF (实施者论坛)认证标准
    ■具有集成 PHY 的 USB 2.0全速(12Mbps)和低速(1.5Mbps)运行 

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

    您好!

    我希望至少达到全速

    安德烈斯

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

    您好 Andres、

    很抱歉、我们在最后进行了一些测试、以提供性能数据。

    您的器件是如何设置的? 使用什么 USB 模式以及如何传输数据和测量吞吐量?

    我们所做的一项测试是使用串行 COM 端口、该端口被限制为仅1kB 的传输总量、并且我们将看到8.9Mb/s 或 1.1125Mb/s 请注意、64字节数据包中断传输的预期最大带宽为 1.216Mb/s、因此我们非常接近正确设置的系统。