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.

[参考译文] TMS320F28062:读取 GPADAT 似乎读取输出锁存器而不是引脚状态

Guru**** 2535750 points
Other Parts Discussed in Thread: TMS320F28062

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/875419/tms320f28062-reading-gpadat-seems-to-read-output-latch-and-not-pin-state

器件型号:TMS320F28062

应用在驱动三相无刷直流电机的应用中使用 TMS320F28062。
应用程序已经很好地运行了很长时间。
GPIO0至 GPIO5用作 EPWM1至 EPWM3来驱动电机 FET。
在引导期间、GPIO0-5被设定为高电平和低电平、并且每个状态被检查以验证它们是否都工作正常。
这由以下函数 MotorTest()执行。

问题出在这里。

在软件验证期间必须证明,如果任何 GPIO0-5短路为低电平或高电平,MotorTest()将失败。

为此、GPIO0-5中的每一个都由一个100欧姆电阻器一次加载到 GND 或+3.3V。  这使得 GPIO 上的高电平仅达到0.3V、而低电平仅达到3.1V。  因此、当 GPIO0-5中的任何一个设置为高电平并加载100欧姆至 GND 时、引脚仅达到0.3V、但读取 GPADAT 返回1。  当 GPIO0-5中的任何一个设置为低电平并加载100欧姆至+3.3V 时、引脚仅达到3.1V、但读取 GPADAT 返回0。

MotorTest()始终通过。

因此、读取 GPADAT 似乎不会读取引脚状态、而是读取输出锁存器。  此器件的所有文档都明确指出、读取 GPADAT 将始终返回引脚状态、而不是锁存器。


有人能告诉我为什么会发生这种情况吗?


以下是函数:

//此函数测试 GPIO0到 GPIO5的所有值都可以设置为高电平和低电平
//通过设置为高电平、读取以验证、每次测试一个 GPIO0到 GPIO5
//然后设置低电平并读取以进行验证。
uint16_t MotorTest (void)

uint16_t ERROR = 0;
uint32_t val32;
uint32_t mask32;

volatile uint16_t i;

EALLOW;                            //启用 EALLOW 受保护寄存器访问
GpioDataRegs.GPACLEAR.ALL = 0x3F;  // GPIO0-5的输出锁存器全部设置为0
GpioCtrlRegs.GPAMUX1.ALL = 0x0000;// GPIO0-GPIO15上的 GPIO 功能
GpioCtrlRegs.GPADIR.ALL  = 0x003F;// GPIO0-5为输出、GPIO6-GPIO31为输入
GpioCtrlRegs.GPAQSEL1.ALL = 0x0000;// GPIO0-GPIO15同步到 SYSCLKOUT
GpioCtrlRegs.GPAPUD.ALL  = 0x003F;//在 GPIO0-5上禁用上拉并在上启用
                                   //  GPIO6-GPIO31
EDIS;                              //禁用 EALLOW 受保护寄存器访问

对于(i=0;i<10;i++);  //短延迟

//通过 GPIO0向 GPIO5传递一个位
对于(mask32=1UL;mask32<0x040UL;mask32<=1)

   //将 GPIO0-5的其中一个设置为高电平、仅验证它是否为高电平
   GpioDataRegs.GPASET.all = mask32;          //将 GPIO0-5的一个设置为 mask32指定的高电平
   对于(i=0;i<10;i++);                      //短延迟
   val32= GpioDataRegs.GPADAT.all 和 MOTOR_IO; //读取 GPADAT
   if (val32!= mask32)                        //测试只有 mask32设置的一个位为高电平
   {
       错误= 1;
       中断;
   }

   //清除所有 GPIO0-5,验证所有都是低电平
   GpioDataRegs.GPACLEAR.all = mask32;        //清除 mask32指定的 GPIO0-5中的一个
   对于(i=0;i<10;i++);                      //短延迟
   val32= GpioDataRegs.GPADAT.all 和 MOTOR_IO; //读取 GPADAT
   if (val32!= 0)                             //测试所有位都是低电平
   {
       错误= 1;
       中断;
   }


返回错误;


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

    下面是对问题的简单说明。

    注意:我使用的是 GPASET 和 GPACLEAR、而不是"位"结构、因此这与众所周知的 GPADAT 读-修改-写问题无关。  此外、我还在使用示波器、以便我可以准确地查看正在发生的情况。

    此器件的所有 T.I.文档都指示读取 GPADAT、无论输入或输出的 GPADIR 设置如何、都应始终读取引脚的状态。

    如果我将 GPIO0-5配置为输入、我可以将其上拉或下拉、并在读取 GPADAT 时查看正确的引脚状态。

    如果我将 GPIO0-5配置为输出、我可以将其切换为高电平和低电平、并通过 GPADAT 读回正确的引脚状态。

    如果我使用100欧姆下拉电阻器加载其中一个、并设置为逻辑高电平、我可以看到引脚上的电压从0.0V 变为0.3V。  读取 GPADAT 仍会返回我写入锁存器的逻辑高电平、而不是实际引脚上的逻辑低电平。

    如果我使用一个100 Ω 上拉至+3.3V 并将引脚设定为低电平、则恰好相反。  引脚上的电压从3.3V 变为3.1V、但读取 GPADAT 是我写入输出锁存器的逻辑低电平。

    因此、读取输入的 GPADAT 似乎会读取引脚状态、但读取输出的 GPADAT 会读取输出锁定值。

    是否有人可以确认或解释这种异常行为?

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

    您的想法和文档是正确的;GPxDAT 寄存器应反映引脚的状态、而不是输出缓冲器的状态。

    您之前是否测试过此代码?

    您最近是否进行过任何修改? 例如、您可能更改了声明 GPxDAT、需要将其声明为 volatile。  

    您发现此问题的器件数量是多少?

    如果只有一个、您使用该装置的时间有多长? 您是否有可能通过 EOS 或 ESD 造成损坏?

    此致、
    Cody  

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

    您好、Cody、

    已经过广泛测试。

    未对 GPxDAT 或任何其他寄存器进行任何修改。  所有这些都来自 CCS 库。

    两个单独的单元显示相同的行为。

    由于我可以在配置为输入时读取引脚状态、而在配置为输出时不读取引脚状态、因此我怀疑存在 EOS 或 ESD 损坏。

    此外、它在多个 GPIO 上的工作方式相同。

    我觉得很清楚、除非有一些未记录的设置、否则当配置为输出时读取 GPxDAT 会读取锁存器。

    标记

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

    Mark、

    我希望我隐藏一些使整个帖子有意义的未记录设置。 但不幸的是,这里的情况并非如此。

    是否可以尝试从内存浏览器中读取 GPxDAT 的值? 这有助于排除不可预见的软件错误。

    我也认为 ESD 和 EOS 可能不是原因、但很难立即排除 EOS。 如果您要将100欧姆分流器接地、则会从引脚中拉出过多电流、并超出数据表限制。

    您能描述测试顺序吗? 例如、运行代码、连接分流器、测试低电平、测试高电平。 断开分流器、测试低电平、测试高电平。  

    您是否曾尝试过在写入和读取 GPIO 之间的代码中添加任何延迟?

    或者、您尝试在该实验中实现什么? 这只是对测试软件的验证、是否可以说"是的、此软件可以捕捉到一个简短的内容。"? 您是否计划缩短您生产的每个器件的 GPIO?(我认为这是一个不好的主意)

    此致、
    Cody  

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

    Cody、

    原始帖子中给出了正在运行的代码。  函数名为 MotorTest()。  它是加电自检的一部分。

    是的、我们将检查 CCS 中的寄存器内容、它们与软件读取的内容相匹配。

    使用100欧姆电阻器是确认 SW 实际上可以短路的一部分。

    否、我们不打算在生产中执行此操作、仅用于验证软件。

    由于设置为高电平时、100欧姆两端仅产生0.3V 电压、因此仅消耗3mA 电流、因此应确保安全并处于4mA 的数据表限制范围内。

    请注意、在使用易失性变量读取测试之前存在延迟。  已经尝试了很长时间、结果没有变化。

    这不是一个实验!!!  这是针对大型公司的商业产品的生产代码。

    是否可以启动开发板并验证此操作?

    标记

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

    Mark、

    我连接到 F28069M LaunchPad 并运行了以下测试。

    输入模式下的 GPIO0"、使用100欧姆分流器将其连接到3.3V 和 GND。

    1. 如果没有分流器、GPADAT 寄存器指示"0"、示波器验证引脚电压为0V。
    2. 连接分流器 GPADAT 时、反映了引脚上强制的电压。

    输出模式下的 GPIO0、使用100欧姆分流器将其连接到3.3V 和 GND。  

    1. 确认 GPIO 输出模式、设置 GPASET 寄存器会在引脚上产生3.3V 电压、使用 GPACLEAR 寄存器会在引脚上产生0V 电压。
    2. GPIO0在 GPADAT 中设置为"0"。
      1. 将分流器接地:示波器显示0V、GPADAT 指示0。
      2. 将分流器连接到3.3V:示波器显示~0.9V、GPADAT 指示0。
    3. GPIO0在 GPADAT 中设置为"1":
      1. 将分流器接地:示波器显示2.25V、GPADAT 显示1。
      2. 将分流器连接到3.3V:示波器显示3.3V、GPADAT 显示1。

    输入模式测试是有道理的。 指示正确的值。

    如果您考虑了输出缓冲器的电阻、输出模式测试对我来说也很有意义。 使用100欧姆分流器并看到0.9V 表示输入缓冲器的低侧为~39欧姆。 看一下驱动器的高侧:同样、100欧姆的分流电阻和2.25V 的电压表示缓冲器的上拉部分为~49欧姆。  

    要点:

    • 我们不能忽略输出缓冲器电阻。
    • 输出缓冲器电阻因器件而异。
    • 如果您确实将引脚接地/VDD 短路、则应验证您的代码、但会损坏器件。
      • 仅供参考、当输出缓冲器驱动0V 时、我确实将器件引脚直接连接到3.3V、并且我能够在 GPADAT 中看到"1"

    此致、
    Cody