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.

[参考译文] AM3358:无法写入 PWM 寄存器

Guru**** 2941480 points

Other Parts Discussed in Thread: SYSCONFIG, AM3358

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/670544/am3358-unable-to-write-pwm-registers

器件型号:AM3358
Thread 中讨论的其他器件:SysConfig

您好!

我无法为 PWM1写入 TBPRD 和 CMPA 寄存器。 以下陈述正确:

PBPRD 寄存器固定为0x0、不能写入。

TBCNT 寄存器经过功耗验证、并在初始化为非零值时(例如0x1)进行计数配置。

TBCNT 寄存器将递增计数至0xFFFF、然后回滚至0x0并在此处停止。

已验证寄存器 CMPB 的功率。

SHDWBFULL 位准确地反映了对 CMPB 的写入。

验证寄存器 CMPA 不可写。

SHDWAFULL 位不反映对 CMPA 的写操作。

下面是相关运行代码的调试列表以及相关的寄存器内容。

   ->**** IMU_10DOF::Fire TBCNT = f501h
   ->**** IMU_10DOF::Fire TBPRD =   0h
   ->**** IMU_10DOF::Fire TBCTL = d030h
   ->**** IMU_10DOF::Fire CMPCTL = 200h
   ->**** IMU_10DOF::Fire CM_PER_EPWMSS0_CLKCTRL 2.
   ->**** IMU_10DOF::Fire CM_PER_EPWMSS1_CLKCTRL 2.
   ->**** IMU_10DOF::Fire CM_PER_EPWMSS2_CLKCTRL 2.
   ->**** IMU_10DOF::Fire PWMSS_IDVER    47400001h
   ->**** IMU_10DOF::Fire PWMSS_SysConfig       通道
   ->**** IMU_10DOF::Fire PWMSS_CLKCONFIG     111h
   ->**** IMU_10DOF::Fire PWMSS_CLKSTATUS     111h
   ->**** IMU_10DOF::火警将 TBPRD 寄存器设置为7800h
   ->**** IMU_10DOF::Fire TBPRD = 0h
   ->**** IMU_10DOF::火警将 TBCNT reg 设置为1h
   ->**** IMU_10DOF::Fire TBCNT =   3h
   ->**** IMU_10DOF::用于4001GHz 时钟的火线旋转
   ->**** IMU_10DOF::Fire TBCNT = 2b
   ->**** IMU_10DOF::Fire TBCTL = d030
   ->**** IMU_10DOF::Fire TBPRD = 0h
   ->**** IMU_10DOF:ePWM_WR_CMP 写入 CMPA (伺服_DATA[7])= 19bh
   ->**** IMU_10DOF::ePWM_WR_CMP 写入 CMPB (伺服_DATA[9])= 174H
   ->**** IMU_10DOF:ePWM_WR_CMP CMPA = 0h
   ->**** IMU_10DOF:ePWM_WR_CMP CMPB = 174H
   ->**** IMU_10DOF:ePWM_WR_CMP 写入 CMPA = 1234h
   ->**** IMU_10DOF:ePWM_WR_CMP CMPA = 0h
   ->**** IMU_10DOF::Fire CMPCTL = 200h
   ->**** IMU_10DOF::火警验证 TBCNT 正在递增计数
   ->**** IMU_10DOF::Fire TBCNT = E6
   ->**** IMU_10DOF::Fire TBCNT = ef
   ->**** IMU_10DOF::Fire TBCNT = F8
   ->**** IMU_10DOF::Fire TBCNT = 101
   ->**** IMU_10DOF::Fire TBCNT = 10a
   ->**** IMU_10DOF::Fire TBCNT = 114
   ->**** IMU_10DOF::Fire TBCNT = 11d
   ->**** IMU_10DOF::Fire TBCNT = 126
   ->**** IMU_10DOF::Fire TBCNT = 12F
   ->**** IMU_10DOF::Fire TBCNT = 138
   ->**** IMU_10DOF::Fire TBCNT = 141


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

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

    在 Linux-Xenomai 上自定义用户空间应用程序。 我已经开发了多个定制外设接口、包括简单 GPIO、通过 PRU 的 I2C 和通过 RAM 的 ARM-PRU 通信、这些接口现已运行一年多。 最近、我希望实现片上 PWM 功能。 我对 AM3358内部信息有相当大的了解、但担心当前的功能会使我感到意外。 我预期通常会有一些小的遗漏、但我无法解释在写入部分但并非所有 PWMSS 寄存器、尤其是 TBPRD 和 CMPA 时的差异。 可能还有其他差异、但我没有给整个 reg 文件添加 W/R 的时间。

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

    "通过 TBCTL[PRDLD]位启用和禁用该寄存器的重影功能。 默认情况下、该寄存器被影子化。
    (a)如果 TBCTL[PRDLD]= 0、则启用影子、任何写入或读取都将自动进入影子寄存器。 在这种情况下、当时基计数器等于零时、活动寄存器将从影子寄存器加载。
    (b)如果 TBCTL[PRDLD]= 1、则影子将被禁用、任何写入或读取都将直接进入活动寄存器、即主动控制硬件的寄存器。
    (c)活动寄存器和影子寄存器共享相同的存储器映射地址。"

    CMPA 寄存器也是如此:

    "默认情况下、该寄存器被影子化。
    (a)如果 CMPCTL[SHDWAMODE]= 0、则启用影子寄存器、任何写入或读取都将自动进入影子寄存器。 在这种情况下、CMPCTL[LOADAMODE]位域决定哪个事件将从影子寄存器加载活动寄存器。
    (b)在写入之前、可以读取 CMPCTL[SHDWAFULL]位以确定影子寄存器当前是否已满。
    (C)如果 CMPCTL[SHDWAMODE]= 1、则影子寄存器被禁用、任何写入或读取都将直接进入活动寄存器、即主动控制硬件的寄存器。
    (D)在这两种模式中、活动和影子寄存器共享相同的存储器映射地址。"
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Biser、

    感谢您的回复、但我在阅读并重新阅读了数十次 TRM 后、非常清楚上述重报要求。 注意此类要求似乎对当前的硬件行为没有任何影响、这显然是无法解释的。 下面的调试段指示 CMPA 和 TBPRD 寄存器的错误行为。 我已经验证了无论这些寄存器的影子模式如何、都不允许写入这些寄存器。

       ->**** IMU_10DOF::Fire CMPCTL =   0h
       ->**** IMU_10DOF::向 PWM1通道 A/B 写入 SERVO_DATA
       ->**** IMU_10DOF::ePWM_WR_CMP 写入 CMPA (伺服_DATA[7])= 1a3h
       ->**** IMU_10DOF::ePWM_WR_CMP 写入 CMPB (伺服_DATA[9])= 169h
       ->**** IMU_10DOF::Fire SHDWxFULL 位8、9应为1、即 CMPCTL = 030xh

       请注意 CMPCTL 寄存器中的 SHDWAFULL 位是如何更新的。 这是另一个症状。


       ->**** IMU_10DOF::Fire CMPCTL = 200h
       ->**** IMU_10DOF:ePWM_WR_CMP CMPA = 0h
       ->**** IMU_10DOF:ePWM_WR_CMP CMPB = 169h
       ->**** IMU_10DOF:ePWM_WR_CMP 写入 CMPA = 1234h
       ->**** IMU_10DOF:ePWM_WR_CMP CMPA = 0h
       ->**** IMU_10DOF::Fire CMPCTL = 200h

       ->**** IMU_10DOF::火警将 TBPRD reg 设置为7fffh
       ->**** IMU_10DOF::Fire TBPRD = 0h

    此外、我仔细查看了以下主题:

    https://e2e.ti.com/support/arm/sitara_arm/f/791/t/294909#pi316653=2

    根据 上述主题中的 Matthijs van Duin、我还查看了 CONTRAL_MODULE pwmss_ctrl 寄存器、该寄存器读数为7h、正确。

    https://e2e.ti.com/support/embedded/starterware/f/790/t/408065

    https://android.googlesource.com/kernel/lk/+/upstream-master/platform/am335x/ti/drivers/ehrpwm.c

    现在 TBPRD 和 CMPA 寄存器表现出错误的行为、这是绝对肯定的。

    问题:

    PWMSS_IDVER = 47400001h 是否发布了任何勘误表??

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

    TI 是否有人跟踪这种情况、或者我是否是短暂真空中的单独声音的所有者、而这种声音永远出现在所有人都看不到的大规模物体的事件地平线上?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我最近在使用 PWM1时遇到问题。 我不使用 Linux、因此我不确定这是否是您的根本原因、但 PWM1是否已配置和启用? 在为芯片提供的 Sys/BIOS 环境中、PWM1未配置:只有0和2。 我必须修改我的代码以完成 TI 驱动程序/示例代码未完成的芯片设置。 这解决了我的问题。

    您是否能够通过寄存器或存储器查看器查看 PWM1寄存器、或者数据是否全部显示为"?????????? "

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

    Timothy、
    正如我目前使用的,Linux-Xenomai 用户空间环境在功能上等同于裸机寄存器级别。 直接为 AM3358寄存器供电、不依赖于任何预先存在的 Linux 器件驱动程序。 就我确定的那样、TBPRD 和 CMPA 寄存器是不可写的。 在写入它们之后、它们的内容一直被读取为0。 此外、在写入 CMPA 后、CMPCTL 寄存器中的 CMPA 寄存器 SHDWAFULL 位不会更新。 然而、对 CMPB 寄存器的写入似乎正确反映在 CMPCTL 寄存器的 HDWBFULL 位中。

    我目前在 PWM2上运行相同的测试台、到目前为止、结果与 PWM1相同。


    顺便说一下、我的芯片中的 PWMSS 版本是 PWMS_IDVER = 47400001h。 您使用的是哪个版本?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    进一步验证表明寄存器 AQCTLA 也不可写。
    经验证的不可写寄存器当前为 TBPRD、CMPA 和 AQCTLA。 好了,现在有了一个巧合!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Brendan、

    PWM 寄存器为16位宽(而不是标准的32位宽)。 请确保您仅在写入/读取 CMPA 和 TBPRD 寄存器时访问该大小。

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

    RMW 还可以。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    仔细检查代码后、我肯定没有覆盖16位寄存器。
    问题仍然存在。
    经验证的不可写寄存器当前为 TBPRD、CMPA 和 AQCTLA。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    跨域寄存器时钟是否有故障、可能是我序列号为 BBG115080120的 AM3358上的时钟?

    TBPRD、CMPA 和 AQCTLA 的特点是什么?

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

    您好、Brendan、

    您是否能够写入 CMPCTL?  我看到您正在调试列表中访问此寄存器,但我无法判断您是在读还是写。

    除了它们的偏移不在典型的32位边界上(即它们的偏移为 Ah、12h、16h、而不是典型的 Ch、10h、14h、18h)之外、TBPRD、CMPA 和 AQCTLA 不应该有任何特殊的东西。 CMPCTL 寄存器(EH offset)属于这种模式,这就是我想知道是否可以写入该寄存器的原因。

    您的问题听起来与我在 eCAP 外设中遇到的问题非常相似,该外设也具有16位宽的寄存器。 我无法写入 ECCTL2 [CAP_APWM]、根本原因是16位寄存器大小。

    此致、

    Melissa

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

    我可以为 CMPCTL 供电。

    让我明白一点。 我正在对16位寄存器执行 RMW 操作、因此32位写入事务的高16位不会覆盖下一个较高地址寄存器。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    梅丽莎
    在 ePWM 寄存器中、有3个寄存器不需要读-修改-写(RMW)事务。 这些是 TBPRD、TZSEL 和 PCCTL。 其他器件都需要以下原型32位 RMW 事务之一:

    绝对(非位字段保留)数据写入:
    reg32 =(reg32 & 0xFFFFFF0000)| data16

    位字段保留、位集:
    reg32 =(reg32 &(0xFFFFFF0000 |~data16))| data16

    关于您之前遇到的寄存器位字段问题、位 ECCTL2 [CAP_APWM]、我确信您已经确定上述原型 RMW 解决方案可以解决您的16位字段写入问题。 实际上、在 ECAP 寄存器中、有5个需要 RMW 事务。 这些当然是:

    28h ECCTL1
    2Ah ECCTL2
    2通道 ECEINT
    2Eh ECFLG
    30h ECCLR

    我用特定 ePWM 寄存器 TBPRD、CMPA 和 AQCTLA 描述的明显错误的写入行为是不同的。 使用上面概述的 RMW 事务、这些寄存器是不可写的。 写后的读操作不会反映写入的数据。 此外、写入这些寄存器中的任何一个都不会反映在 ePWM 模块可观察到的运行功能中的任何变化中。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Brendan、

    感谢您提供额外的背景信息。 让我咨询一些同事、然后再与您交流。

    此外、我之前没有提到过、但昨天我尝试通过手动将调试列表中看到的设置写入 CCS 中的寄存器来重现您的问题。 我能够成功写入 TBPRD 和 CMPA 寄存器。

    此致、
    Melissa
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    梅丽莎
    虽然我确信您所拥有的 AM3358可以正常运行、但我一直建议、我所拥有的设备似乎没有按照规范运行。 我必须承认,我经常会犯一些疏忽,有时甚至是愚蠢的编码错误。 在这种特殊情况下、由于我试图错误地证明自己和测试台、我完全无法这样做。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Brendan、

    我已经与一位同事讨论过这一点,下面是他的意见/建议:

    首先、TI 在支持方面没有 Linux 和 Xenomai 的背景。 如果发现此类设置有问题、我们将无法完全支持。 既然我们知道两个操作系统同时运行,那么您是否在这里禁用了 Linux 和 Xemomai 内核之间针对此外设的任何冲突?

    此外、您是否曾尝试使用 TI EVM 上预构建的 TI SDK 访问所需的寄存器、以确保接口首先按预期工作? 完成此操作后,返回 Linux/Xenomai 以继续调试。

    禁用代码中的所有 CMPB 函数也是值得的。  这将简化环境、因此您可以专注于 CMPA 的工作。  

    此致、

    Melissa

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

    梅丽莎
    下面是另一种方法的结果;对寄存器 CMPB 的简单(非 RMW 操作) 32位写入(偏移14h)。 数据的高16位由将被写入寄存器 AQCTLA 的建议值(偏移16h)填充。

    ->**** IMU_10DOF::执行(AQCTLA <<0x10)| CMPB) 32位写入测试
    ->**** IMU_10DOF::Fire CMPB = 169h
    ->**** IMU_10DOF:AQCTLA 的消防建议值=(AQ_SET << ZRO | AQ_CLEAR << CAD)= 42h
    ->**** IMU_10DOF::Fire Simple 32位写入(((AQCTLA << 0x10)| CMPB)= 00420169h
    ->**** IMU_10DOF::Fire CMPB = 169h
    ->**** IMU_10DOF::Fire AQCTLA = 0h
    ->**** IMU_10DOF::Fire AQCTLA = 04020000h
    ->**** IMU_10DOF::消防 CBD = 0
    ->**** IMU_10DOF::Fire CBU = 0
    ->**** IMU_10DOF::消防 CAD = 0
    ->**** IMU_10DOF::Fire CBU = 0
    ->**** IMU_10DOF::Fire PRD = 0
    ->**** IMU_10DOF::Fire ZRO = 0
    ->**** IMU_10DOF::Fire AQCTLB = 00000402h
    ->**** IMU_10DOF:火灾 CBD = 1.
    ->**** IMU_10DOF::Fire CBU = 0
    ->**** IMU_10DOF::消防 CAD = 0
    ->**** IMU_10DOF::Fire CBU = 0
    ->**** IMU_10DOF::Fire PRD = 0
    ->**** IMU_10DOF::Fire ZRO = 2

    从上面可以看出、寄存器 CMPB 中的值被正确保留、但是再次没有任何值被写入寄存器 AQCTLA。
    另外、当我的应用程序在 Linux-Xenomai 上运行时、DTS 文件包含引脚 ehrpwm0A、ehrpwm0B、ehrpwm1A、ehrpwm1B、ehrpwm2A 和 ehrpwm2B 的 pinmux 关联。 如果我使用不正确的关联来遵守 DTB 文件、我将收到内核紧急情况。 如果我尝试从用户空间写入 pinmux 寄存器、我将收到一个分段故障、因为我假定 pinmux 寄存器的地址空间被锁定到内核空间的 ring0。 我已经验证了 DTB 文件中的 pinmux 关联确实是正确的。 大家可以看到、我已经全面地完成了该规范、找不到任何缺陷。 此外、我还没有提到 ehrpwm1A 和 ehrpwm2A 引脚都像示波器那样一直处于低电平。 然而、ehrpwm1B 和 ehrpwm2B 引脚都保持高电平。 我尚未测试 ehrpwm0、但不会期望任何不同的行为。

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

    梅丽莎
    我现在还没有拥有 TI EVM 平台。 根据 Linux-Xenomai 冲突,我以前从未见过这种情况。 我在这个特定环境测试台中执行的代码是真正简单的东西。 我在这个平台上执行了大量非常复杂的代码、直到现在、所有代码都按照书中的逻辑工作。 我还可以告诉您 AM3358 ADC 外设不符合 TRM。 我被迫否定这件事,但遗憾的是,它可以被要求履行其义务。 这个 EHRPWM 外设在我的芯片中出现了缺陷、并且可能还有其他外设也出现了缺陷。 您可能需要检查 BBG 板或 AM3358一般报告的其他故障的勘误表。 我的 BBG 板的序列号是 BBG115080120。 我相信我不可能是唯一有这个问题的人,或因为可能会发生什么,也许我是! 谁知道。

    我知道 TI 无法支持所有环境。 我不是要寻求支持、而是要寻求了解如何思考的个人的支持。

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

    只为了踢脚、您是否可以尝试将"reg32"访问更改为"reg16"?

    此致、
    Melissa
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    更改为:整个发展社区。

    梅丽莎
    我们都是致力于取得成功的开发人员。 请在下面找到解决方案。

    /*
    *注意:参数"reg"必须为偶数
    *
    void IMU_10DOF:::wr_16bit (long unsigned int* addr_ptr、int reg、uint16_t 数据)

    if (reg%4=0)//偶数32位字边界,RMW
    * get_mem (addr_ptr、reg)=(* get_mem (addr_ptr、reg)& 0xFFFFFF0000)| data;
    否则、如果(reg%2=0)//偶数32位字边界上没有边界、但偶数16位字边界上没有边界
    //通过将低16位寄存器和交换数据保存到高16位来使用低32位字边界 RMW
    * get_mem (addr_ptr、reg-2)=(* get_mem (addr_ptr、reg-2)& 0x0000FFFF)|(data << 0x10);
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Brendan、

    感谢您分享您的解决方案。  很高兴问题现已解决。

    此致、

    Melissa

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

    梅丽莎

               感谢您在这一问题上的合作。

    Brendan