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.

[参考译文] LAUNCHXL2-RM57L:低输出电压

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/594988/launchxl2-rm57l-low-output-voltage

器件型号:LAUNCHXL2-RM57L
主题中讨论的其他器件:HALCOGEN

您好!

我正在使用 RM57Lx Launchpad 进行开发、并且在测试一些引脚的 GIO 功能时(在本例中为 I2C 引脚、但也有其他引脚、但我现在无法从我的头顶回忆起它们)、输出电压非常低。 我通常首先通过切换 GPIO 引脚来测试它、以确保它正常工作、在本例中、它正常工作、但峰值处的输出电压大约为200mV。 我应该正确调整引脚多路复用器(当我删除改变引脚功能的代码时、信号为0V)。 不确定我错过了什么...

我要采取的步骤是:

1.使模式寄存器(MDR)寄存器中的 I2C 模块复位

2.将引脚设置为引脚功能寄存器(PFNC)中的 GIO

3.在方向(DIR)寄存器中设置方向

4.切换 while 环路中的引脚。

我已经附上了我要获取的波形的图像。 我一直以180度的相位差运行 SDA 和 CLK 引脚、以查看差异、这只是我的习惯。 是的、我的探头为1倍(不是10倍)

任何帮助都是有用的、因为我不知道缺少什么。 我感觉自己可能会忽略一些愚蠢的事情... 如果它有助于附加我正在使用的代码、我也可以这样做。

谢谢!

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

    是否还可以探测 Launchpad 上的稳定3.3V 信号(Booster Pack 连接器上的引脚1应为3.3V)?

    此外、如果您可以提供您的代码、我也可以查看它、但代码不应像这样影响电压。 基本上、如果您看到引脚切换、代码按计划工作。 如果电压低至看起来的水平、则表示存在硬件问题。 唯一可能的影响可能来自错误的 PINMUX 配置、您会看到来自 I2C 多路复用器的引脚上出现重影/叠层、而这种现象在映射到引脚的另一个功能之后。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我最初以为这可能是问题(多路复用器未发生变化、但开关会在 Hercules 内部造成 EMC 问题、但我对此非常怀疑、但您永远不知道)。 因此、我更改了另一个引脚上的功能、将该外设用作 GIO、并翻转了引脚(与 I2C1引脚相同)、工作正常。 这是为了确保我正确地更改了引脚多路复用器。

    我还使用了 I2C1引脚中的一个(SCL 引脚)作为 MIBSPI3NCS[3]的默认功能(未更改多路复用器)、并对其进行切换以确保 Hercules 之外的硬件没有问题;它的切换正常、上升至3.3V。

    我附加了两个图像。 一种方法是比较 I2C1_SDA 引脚(由于某种原因、该引脚仅在大约150mV 时)和焊球 V7上的 N2HET2[16](更改了多路复用器中的引脚功能、焊球的默认值为 N2HET1[9]。 另一个示例显示了当我不使用 I2C1_SCL 但使用焊球作为其默认功能时的开关情况、显示了 Hercules 之外的硬件是良好的。

    我还复制了我在下面为此所做的代码,但只复制了 main()函数。  整个项目首先使用 HalCoGen 生成、用于系统初始化和填充、但是对于实际的外设函数、我一直在低级上执行寄存器更改、因为我喜欢构建自己的库。 这对我来说更有趣。

    黄色走线为 N2HET2[16]、蓝色走线为 I2C1_SDA

    黄色走线为 N2HET2[16]、蓝色走线为 MIBSPI3NCS[3]

    #include "hL_sys_common.h"
    #include "hL_reg_system.h"
    #include "hL_reg_pinmux.h"
    #include "reg_defs.h"
    #include "vim.h"
    
    int main (void){
    
    //启用多路复用器输出的更改
    PinMuxReg -> KICKER0 = 0x83E70B13U;
    PinMuxReg -> KICKER1 = 0x95A4F1E0U;
    
    //更改引脚以实现 I2C1功能
    //更改焊珠 B2上的输出
    pinMuxReg ->PINMUX[23]&=~(1 << 8);//清除引脚的默认功能
    pinMuxReg ->PINMUX[23]|=(1 << 9);//将函数设置为 I2C1_SDA
    
    //注释掉以测试并确保引脚在何时正确切换
    //使用默认函数(MIBSPI3NCS[3])
    //更改焊珠 C3上的输出
    //pinMuxReg ->PINMUX[23]&=~(1 << 16);//清除引脚的默认功能
    //pinMuxReg ->PINMUX[23]|=(1 << 17);//将函数设置为 I2C1_SCL
    
    //更改 N2HET1[27]的引脚
    //更改焊球 V7上的输出
    pinMuxReg ->PINMUX[30]&=~(1 << 8);//清除引脚的默认功能
    pinMuxReg ->PINMUX[30]|=(1 << 11);//将函数设置为 N2HET2[16]
    
    //再次锁定引脚多路复用器。
    PinMuxReg ->KICKER0 =(uint32_t) 0;
    PinMuxReg ->KICKER1 =(uint32_t) 0;
    
    //在引脚 J2[8](I2C1_SDA)和 J2[9](I2C1_SCL)上将 I2C1设置为 GIO 引脚
    I2C1->MDR |=(1 << 5);//使 I2C1退出复位状态
    I2C1->PFNC = 1;//将 I2C1设置为输出以确保它们设置为 GIO
    I2C1->DIR = 3;//设置为输出
    I2C1->DCLR = 1;//确保时钟引脚清零
    I2C1->DSET = 2;//确保设置了数据引脚
    
    //将 N2HET2[16]设置为 GIO 以与板载引脚 J1[10]上的 I2C1输出进行比较
    HET2REG->GCR |=(1 << 24);//使 N2HET2退出复位
    HET2REG->DIR |=(1 << 16);//将引脚的方向设置为输出
    HET2REG->DCLR =(1 << 16);//确保默认值为0
    
    //设置 MIBSPI3NCS[3]以确保电路板上的引脚在引脚 J2[9]处工作
    MIBSPI3->GCR[0]= 1;//使 SPI3退出复位状态
    MIBSPI3->PC[1]|=(1 << 3);//将方向设置为输出
    MIBSPI3->PC[5]=(1 << 3);//确保引脚上的数据被清除
    
    
    while (1){
    //切换 I2C1引脚
    I2C1->DOUT ^= 3;
    
    //切换 N2HET2[16]引脚
    HET2REG->DOUT ^=(1 << 16);
    
    //切换 MIBSPI3NCS[3]引脚
    MIBSPI3->PC[3]^=(1 << 3);
    }
    
    返回0;
    } 

    -最大值



  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢 Max 的详细工作。 您能否确保已配置为 GPIO 的 I2C 引脚也配置了上拉电阻器并且未处于开漏模式? 我很好奇、当选择 I2C 功能时、它是否默认为无拉电流和开漏电流、因为 I2C 通常是驱动低浮点高电平(依赖于外部拉电流)功能。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    好的、当我打开上拉电阻器时、引脚用作 GIO、但它具有非常低的带宽。 当我在 while (1)循环中进行切换时、它永远不会达到3.3V。 如果我在切换之间插入延迟、则它会达到~3.3V。 当用作开漏时、情况并非如此。 我附加了一个图片、其中显示了在启用漏极开路和无延迟开关的情况下进行的开关、以及一个延迟但禁用漏极开路和启用上拉功能的图片。 现在对我来说无关紧要、但如果你感兴趣的话。 我真正要做的就是确保正确更改引脚多路复用器、并且作为尝试实际开始编写 I2C 模块之前的第一步。

    最初认为它的工作方式与 GIO 或 N2HET 端口相同、因此我错过了需要设置的内容。 如果您对我所做的更改感兴趣、或者它能帮助其他人避免类似的情况、请发布代码。

    不过、不知道为什么 I2C 在禁用开漏的情况下具有如此慢的上升时间。 它处于相同的条件下(相同的探头)、因此电容或任何东西都没有变化...

    谢谢!

    蓝色线迹表示 I2C SDA 引脚、黄色线迹表示 N2HET2[16]引脚。 这是在开漏禁用、上拉电阻器启用的情况下完成的、并插入了延迟以使 I2C 引脚达到其稳定状态电压。

    蓝色线迹表示 I2C SDA 引脚、黄色线迹表示 N2HET2[16]引脚。 开漏开启时的情况。 与其他外设的上升时间没有差异。

    #include "hL_sys_common.h"
    #include "hL_reg_system.h"
    #include "hL_reg_pinmux.h"
    #include "reg_defs.h"
    #include "vim.h"
    
    int main (void){
    
    //启用多路复用器输出的更改
    PinMuxReg -> KICKER0 = 0x83E70B13U;
    PinMuxReg -> KICKER1 = 0x95A4F1E0U;
    
    //更改引脚以实现 I2C1功能
    //更改焊珠 B2上的输出
    pinMuxReg ->PINMUX[23]&=~(1 << 8);//清除引脚的默认功能
    pinMuxReg ->PINMUX[23]|=(1 << 9);//将函数设置为 I2C1_SDA
    
    //注释掉以测试并确保引脚在何时正确切换
    //使用默认函数(MIBSPI3NCS[3])
    //更改焊珠 C3上的输出
    //pinMuxReg ->PINMUX[23]&=~(1 << 16);//清除引脚的默认功能
    //pinMuxReg ->PINMUX[23]|=(1 << 17);//将函数设置为 I2C1_SCL
    
    //更改 N2HET1[27]的引脚
    //更改焊球 V7上的输出
    pinMuxReg ->PINMUX[30]&=~(1 << 8);//清除引脚的默认功能
    pinMuxReg ->PINMUX[30]|=(1 << 11);//将函数设置为 N2HET2[16]
    
    //再次锁定引脚多路复用器。
    PinMuxReg ->KICKER0 =(uint32_t) 0;
    PinMuxReg ->KICKER1 =(uint32_t) 0;
    
    //在引脚 J2[8](I2C1_SDA)和 J2[9](I2C1_SCL)上将 I2C1设置为 GIO 引脚
    I2C1->MDR |=(1 << 5);//使 I2C1退出复位状态
    I2C1->PFNC = 1;//将 I2C1设置为输出以确保它们设置为 GIO
    I2C1->DIR = 3;//设置为输出
    I2C1->PDR = 3;//如果0开漏被禁用
    I2C1->PSEL = 0;//如果0拉是下拉电阻
    I2C1->PD = 0;//如果为0,则启用拉电流功能
    I2C1->DCLR = 3;//确保时钟引脚清零
    
    //将 N2HET2[16]设置为 GIO 以与板载引脚 J1[10]上的 I2C1输出进行比较
    HET2REG->GCR |=(1 << 24);//使 N2HET2退出复位
    HET2REG->DIR |=(1 << 16);//将引脚的方向设置为输出
    HET2REG->DCLR =(1 << 16);//确保默认值为0
    
    //设置 MIBSPI3NCS[3]以确保电路板上的引脚在引脚 J2[9]处工作
    MIBSPI3->GCR[0]= 1;//使 SPI3退出复位状态
    MIBSPI3->PC[1]|=(1 << 3);//将方向设置为输出
    MIBSPI3->PC[5]=(1 << 3);//确保引脚上的数据被清除
    
    
    while (1){
    //切换 I2C1引脚
    I2C1->DOUT ^= 2;
    
    //切换 N2HET2[16]引脚
    HET2REG->DOUT ^=(1 << 16);
    //uint32_t i;
    //for (i=0;i < 5000;i++){}
    //切换 MIBSPI3NCS[3]引脚
    //MIBSPI3->PC[3]^=(1 << 3);
    }
    
    返回0;
    }
    

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

    再次感谢您详细分析此行为。 我想您已经证明了引脚多路复用配置是正确的、并且 I2C 功能是根据引脚选择的。 至于上升时间、请记住、I2C 属于特殊情况、不是您的典型 IO。 如前所述、I2C 通信规范依赖于外部拉电阻来满足 I2C 标准的上升时间特性、并且网络总线上的每个器件只将信号驱动为低电平。 鉴于此、我强烈建议您在引脚上添加一个强上拉电阻器、以获得一个急剧上升时间。 我已经看到应用程序只能通过内部拉电阻器正常工作、但我不会单独在其上进行继电器、以便用于投入生产/发布的设计。