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.

[参考译文] UCD3138064A:PMBus/I2C 主模式示例

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

https://e2e.ti.com/support/power-management-group/power-management/f/power-management-forum/1284923/ucd3138064a-pmbus-i2c-master-mode-example

器件型号:UCD3138064A
主题中讨论的其他器件:UCD3138A64OEVM-662

大家好、我正在查找 UCD31xx 的一些示例代码、以便能够与 EEPROM 进行通信。  技术参考手册介绍了 I2C 主模式所需的所有寄存器、并很好地将它们分解。  但是、我无法找到如何使用它的任何示例。  我一直在试验着为 PMBTXBUF 寄存器和 PMBCTRL1、PMBCTRL3编写各种东西。  特别是 SLAVE_EN 和 MASTER_EN。  我已将1k Ω 上拉电阻器连接到引脚35和36 (I2C_DATA、I2C_CLK)。  上拉电阻器正在工作(即信号是3.3V、连接这些信号)、但我没有看到在引脚上有任何活动。  可能我没有正确配置引脚或类似的东西?  也许我必须为 I2C 主器件配置某种类型的时钟源?  我不清楚具体需要初始化的内容或导致主器件开始为数据计时的特定步骤。

我看到有一个名为"UCD3138A64OEVM-662"的演示板、它显然具有可通过跳线(J50、J52)启用的板载 I2C EEPROM。  这似乎是为了提供一个演示、准确说明我正在尝试执行的操作。  但实际上我没有找到与此相关的任何文档或示例代码。  如果有人知道我在哪里可以找到这个,如果它存在,这将是一个很好的方法,我来处理这个。

现在、从我的角度来看、我只想发出一个地址写入字节、并使用示波器观察它的情况。  一旦我有了第一个基本的职能、像这样、我相信从那时起、我可能会取得很大的进步。

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

    尊敬的 Ben:

    感谢您选择 UCD!

    您可以通过下面的链接获取程序员手册。

    https://www.ti.com/product/UCD3138?keyMatch=UCD3138&tisearch=search-everything&usecase=GPN-ALT#tech-docs

    在第4章中、它介绍了 I2C EEPROM 通信。  

    希望此文档可以帮助您解决问题。 如果这个文档对您没有帮助、请告诉我进一步的更新、我将继续为您提供支持。

    此致!

    雅各布

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

    感谢雅各布,这正是我所寻找的,它是非常有帮助的。  我在使用 I2C 引脚时仍然遇到问题。  我会详细讲述我所做的事情,我真的很感激对我可能做了什么错的评论。

    首先、我要说的是、我们正在向使用 UCD3138064A 的现有产品添加一个 EEPROM 芯片、以在电源内部运行控制环路。  我从电源上取下了小控制卡、以便安全地对其进行实验。  我们以前没有使用 I2C_CLK (FAULT1)和 I2C_DATA (FAULT0)引脚、因此我能够将 EEPROM 芯片直接连接到这些引脚上进行原型设计。  我用示波器监视引脚。

    按照您分享的编程手册、我在现有的 Code Composer 项目中添加了一个新的源文件、到目前为止、该文件仅包含一个用于 EEPROM 的 init 函数、内容主要基于 EEPROM 示例代码:

    void bsp_eepromInit( void )
    {
        // Select I2C function for the FAULT0 and FAULT1 pins:
        MiscAnalogRegs.IOMUX.bit.FAULT_01_MUX_SEL = 2;
    
        // Set I2C peripheral into master mode:
        PMBusRegs.PMBCTRL3.bit.SLAVE_EN = 0;
        PMBusRegs.PMBCTRL3.bit.MASTER_EN = 1;
    
        // Disable the PMBus timeout.  This timeout is not applicable to I2C EEPROM interface.
        PMBusRegs.PMBCTRL3.bit.CLK_LO_DIS = 1;
    
        //@TODO - Set the I2C speed here.
    
        union I2CCTRL1_REG i2cctrl1_shadow;
    
        i2cctrl1_shadow.bit.SLAVE_ADDR = 0x50;  // 7-bit slave address of the EEPROM chip.
        i2cctrl1_shadow.bit.BYTE_COUNT = 4;//130;  // Send the 2-byte EEPROM offset plus 128 bytes.
        i2cctrl1_shadow.bit.RW = 0;  // Perform a write transaction.
    
        uint16_t eeprom_address = 0x1000;  // Address can't use the low 7 bits?
    
        uint32_t txbuf_shadow = ((eeprom_address & 0x80) << 8);  //low byte of page address in second byte
        txbuf_shadow = txbuf_shadow + ((eeprom_address & 0xff00) >> 8);  //high byte of page address in first byte.
        txbuf_shadow = txbuf_shadow + ((write_data[0x20]) << 16);  //first byte of data to write in third byte.
        txbuf_shadow = txbuf_shadow + ((write_data[0x21]) << 24);  //second byte of data to write in fourth byte.
    
    
        I2CRegs.I2CTXBUF.all = txbuf_shadow;
        I2CRegs.I2CCTRL1 = i2cctrl1_shadow; //start write
    
        while( 0 == I2CRegs.I2CST.bit.DATA_REQUEST );
    }

    我仍然得到两个引脚都直接上升到3.3V、当我加电时、微控制器不会尝试切换任一引脚。  我不打算在 init 函数中实际发送 I2C 消息、但这么做只是为了尝试在此时实现 I2C 消息的实用性。  我在现有代码中未找到任何应干扰的内容、但我们使用此芯片的模拟前端在电源中运行控制环路。  那么、理论上、它可能是在尝试以我不知道的方式使用 FAULT0/FAULT1函数?  这似乎值得怀疑。  我知道我们已在使用 fault2作为 GPIO 输入、并且该操作可正常执行。

    我注意到、在该芯片上有2对似乎具有 I2C 功能的引脚:

    我已经将 EEPROM 芯片连接到引脚35和36、并使用示波器来监视这些引脚。  我没有尝试使用引脚15/16。  编程人员的参考资料是指 FAULT0和 FAULT1、因此我认为我的设置与这是一致的。

    查看 UCD31xx 技术参考手册 D 版第9.8.4节、了解 IOMUX 寄存器。  我对这一部分感到困惑。  EEPROM 代码示例显示了一个名为"FAULT_01_MUX_SEL"的字段、但本节未显示该字段。  表9-11似乎与本节中的所有其他内容直接冲突。  我猜测表9-11可能是由于错误而来自其他某个微控制器、因此我目前暂时忽略该表。  查看定义了 IOMUX_REG 的头文件、它确实在位12:11中定义了 FAULT_01_MUX_SEL。  基本上、我只从 EEPROM 示例中复制/粘贴了其中的第2行内容、没有提及、也没有任何方法验证第2行的含义。  我想它应该是可以的。  关于此寄存器中的 PMBUS_MUX_SEL;我猜测它用于15/16引脚。  在我获得程序员的参考资料之前、我正在使用这个位。  我现在保持不变、因此它应该具有默认值、按照技术参考第9.8.4节的规定、默认值似乎是 I2C。  这是否会导致在 I2C 模式下设置两个对的冲突?

    我尝试了2种不同的 UCD3138064A 芯片、得到了相同的结果、只是为了确保没有损坏的芯片。  I2C 的引脚15/16与35/36之间如何选择?  我想确认我的操作是否正确。  您提出的任何想法都将不胜感激。  我很乐意尝试你能想出的任何实验。  我正在使用的设置可以轻松更换、而不是安装在电源中、因此不用担心实验代码造成的任何损坏。

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

    尊敬的 Ben:

    我会帮助您检查这一点、但 有时会需要。 我稍后会向您反馈。

    此致!

    雅各布

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

    尊敬的 Ben:

    以下是一些示例代码、您可以尝试一下。

    void init_i2c (void)
    {
      UINT32 temp = PMBus1Regs.PMBusst.all//清除状态位、因为测试函数并不总是执行此操作。

    // MiscueRegs.IOMUX.bit.FAULT_01_MUX_SEL = 2;
      temp=( EEPROM_ADDRESS & 0x30000 )>>(16)
      i2cctrl1.bit.slave_ADDR =(0x50)+temp // EEPROM 的默认地址
      //设置主机和 PMB 模式
      PMBus1Regs.PMBCTRL3.bit.MASTER_EN = 1
      PMBus1Regs.PMBCTRL3.bit.CLK_LO_DIS = 1
      PMBus1Regs.PMBCTRL3.bit.I2C_MODE_EN = 1
    void i2c_read_Byte (void)
    {
      init_i2c()

      i2cctrl1.bit.byte_count = 2//仅发送地址- 2个字节
      i2cctrl1.bit.rw = 0//写入

      PMBus1Regs.PMBCTRL1 = i2cctrl1//需要对 ctrl1进行单次写入。

      PMBus1Regs.PMBTXBUF.all =(((EEPROM_ADDRESS & 0xFF)<< 8)+((EEPROM_ADDRESS & 0xFF00)>> 8);//此写入开始

      while (PMBus1Regs.PMBST.bit.EOM = 0)
      {
        PMBus_handler ();//等待消息输出
      
      
      i2cctrl1.bit.byte_count =  1//仅读取一个字节
      i2cctrl1.bit.rw = 1//读取

      PMBus1Regs.PMBCTRL1 = i2cctrl1//通过读取,这将开始读取序列
        while (PMBus1Regs.PMBST.bit.DATA_READY == 0)
        {
        PMBus_handler ();//等待数据
        

      EEPROM_DATA=PMBus1Regs.PMMBRXBUF.all
      TEST_STATE = 0
    void i2c_write_byte (void)
    {
      init_i2c()

      i2cctrl1.bit.byte_count = 3//仅发送地址和1个字节- 3个字节
      i2cctrl1.bit.rw = 0//写入

      PMBus1Regs.PMBCTRL1 = i2cctrl1//需要对 ctrl1进行单次写入。
      PMBus1Regs.PMBTXBUF.all =(((EEPROM_ADDRESS & 0xFF)<< 8)+((EEPROM_ADDRESS & 0xFF00)>> 8)+(EEPROM_DATA << 16));//这将开始写入。

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

    谢谢雅各。  我仔细查看了您的示例代码、发现主要区别是:

    PMBus1Regs.PMBCTRL3.bit.I2C_MODE_EN = 1

    我以前没有这样做过。  我的现有器件头文件尚未定义该位。  我将其添加为位23。  不幸的是,它没有帮助。  仍然没有在 I2C 时钟或数据线上生成任何活动。

    我认为、我应该从一个更新鲜的起点开始、只是为了让事情顺利进行。  我将继续订购 UCD3138A64OEVM-662演示板。  然后、我将在 Code Composer 中启动一个全新的项目、该项目只尝试使用您的示例代码成为 I2C 主设备。  这将消除我们的许多变量和未知值。  如果我们能够做到这一点、将其集成到我现有的微控制器和硬件中应该会更容易。  当我收到该演示板并开始使用时、我会告诉您最新消息。

    谢谢。

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

    尊敬的 Ben:

    抱歉、示例代码无效。 如果您在演示板方面需要帮助、请联系 UCD 团队。

    此致!

    雅各布