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.

[参考译文] TMS320F280040-Q1:示例 i2c_ex4_EEPROM_POLLING 中的 I2C 驱动器

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1189851/tms320f280040-q1-i2c-driver-from-example-i2c_ex4_eeprom_polling

器件型号:TMS320F280040-Q1
主题中讨论的其他器件:C2000WARE

您好!

我正在使用函数 I2CBusScan() 扫描 I2C 器件 FRAM MB85RC1MT。

我得到的从器件地址是0x52、0x53、0x7C。 但是、根据这个存储器 IC 的技术规格、从器件地址应该是0xA4、0xA6和0xf8。 有一个位移位。  

我正在检查规格中的信息是否有任何错误。 同时、我想知道该驱动器是否专门针对该示例而设计、是否需要针对其他 I2C 器件进行调整?

谢谢!

起重机

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

    Crane、您好!

    更确切地说、您使用 F28004x 作为控制器、 使用 MB85RC1MT 作为 I2C 协议的目标、因此您提供的地址应该来自 MB85RC1MT、对吧? 您能否提供用于 F28004x 的 I2C 配置?

    您使用的 I2CBusScan 函数来自哪里? 我无法将其作为 C2000Ware driverlib 的一部分找到、这是 MB85RC1MT 器件特定的函数吗?

    此致、

    Omer Amir

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

    您好 Omer、

    是的、 我 使用 F28004x 作为控制器、 使用 MB85RC1MT 作为 I2C 协议的目标。 根据该存储器 IC 的规范、从器件地址应为0xA4、0xA6和0xf8。

    I2C 配置:

    //
    // I2CA -> myI2C0 Pinmux
    //
    GPIO_setPinConfig (GPIO_10_I2CA_SDA);
    GPIO_setPadConfig (myI2C0_I2CSDA_GPIO、GPIO_PIN_TYPE_STD | GPIO_PIN_TYPE_PULLUP);
    GPIO_setQualificationMode (myI2C0_I2CSDA_GPIO、GPIO_QUAL_异 步);

    GPIO_setPinConfig (GPIO_8_I2CA_SCL);
    GPIO_setPadConfig (myI2C0_I2CSCL_GPIO、GPIO_PIN_TYPE_STD | GPIO_PIN_TYPE_PULLUP);
    GPIO_setQualificationMode (myI2C0_I2CSCL_GPIO、GPIO_QUAL_异 步);

    void myI2C0_init(){
    I2C_DisableModule (myI2C0_BASE);
    I2C_initMaster (myI2C0_BASE、DEVICE_SYSCLK_FREQ、400000、I2C_DUTYCYCLE _33);
    I2C_setConfig (myI2C0_BASE、I2C_MASTER_SEND_MODE);
    I2C_setSlaveAddress (myI2C0_BASE、13);
    I2C_DisableLoopback (myI2C0_BASE);
    I2C_setBitCount (myI2C0_BASE、I2C_BITCOUNT_8);
    I2C_setDataCount (myI2C0_BASE、1);
    I2C_setAddressMode (myI2C0_BASE、I2C_ADDR_MODE_7BITS);
    I2C_enableFIFO (myI2C0_BASE);
    I2C_setEmulationMode (myI2C0_BASE、I2C_emulation_stop_SCL_low);
    I2C_enableModule (myI2C0_BASE);

    I2CBusScan()不是 C2000Ware driverlib 的一部分,它来自 I2C 、i2c_ex4_EEPROM_POLLING 的 C2000Ware 示例。

    谢谢!

    起重机

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

    Crane、您好!

    我将了解此示例是否适用于您提到的器件。 您能否提供目标 FRAM 器件所需的 I2C 配置要求? 我将使用您配置的设置对其进行双重检查。

    此致、

    Omer Amir

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

    您好 Omer、

    谢谢!

    只需让您知道、我只使用 i2cLib_FIFO_POLLING 中的函数、主文件中没有任何内容可用于读取和写入 FRAM 器件的 EEPROM。 特别是函数 I2CBusScan(),如果它适用于 FRAM 器件的话。

    根据 FRAM 器件的规范、其协议如下:

    现在、读取和写入都可以正常工作。 不起作用的是读取器件 ID。 其内容如下:

    我不确定其规格中的其他任何内容是否会有所帮助。 只是在此处附加了整个规格、以防万一。

    e2e.ti.com/.../MB85RC1MT_5F00_DS501_5F00_00027_5F00_4v0_5F00_E_2D00_2329088.pdf

    谢谢!

    起重机

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

    Crane、您好!

    我将会详细介绍这一点、并在明天返回给您。

    此致、

    Omer Amir

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

    您好、Crane、

    我 建议获取两个器件之间使用的引脚的输出、以检查其是否符合您的预期规格。 我还建议您使用 I2CBusScan 函数来确保设置与您期望的一致、因为这是 EEPROM 的通用示例的一部分。 FRAM 的地址大小可能不正确、或者作为协议的一部分错误地读取了一个额外的位等 如果您仍然遇到问题或需要帮助通过 I2C 输出进行读取、请告诉我。

    此致、

    Omer Amir

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="515979" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1189851/tms320f280040-q1-i2c-driver-from-example-i2c_ex4_eeprom_polling/4484557 #4484557"]获取引脚输出[/quot]

    您好 Omer、

    您是指波形、对吧?

    此致、

    起重机

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

    是的、无论线路上的数字输出是什么。

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

    您好 Omer、

    该 FRAM 使用8位从器件地址。 C2000 MCU 使用7位从器件地址。 这会导致问题。

    那么、我们如何使用 F280040在 I2C 总线上生成该数据。 此命令用于读取三字节器件 ID。

    您是否认为它会这样工作:

    1.用 R/W 位0发送从地址0x7C

    2.通过发送从地址0x52读取地址0xF9来读取三个字节

    如果不是、我们如何实现这一点?

    谢谢!

    起重机

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

    Crane、您好!

    您可以使用自由数据格式(请参阅手册24.3.5.3中的"自由数据格式"部分)。 这允许您发送大量数据字节、其中8位地址可用作包含后续数据字节的第一个项目。 我看到的唯一问题是 FRAM 需要第二个起始位、这需要额外的位来完成。 但是、F28004x 的最大数据字节大小为8位、因此这会带来另一个问题。 您可能只需进行位拆裂操作、以避免不得不解决此问题、尽管这可能需要一些时间进行编程。 我将请另一位专家查看他们的意见、以防我遗漏任何内容。

    此致、

    Omer Amir

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

    您好、Crane、

    我与另一位专家确认、如图所示、生成另一个起始位的唯一方法是进行位拆裂并使用 I2CMDR.STT 位。 但是、这似乎只是读取器件 ID 时的问题、似乎 FRAM 的其他 I2C 命令不会导致任何问题。

    此致、

    Omer Amir

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

    谢谢 Omer!

    [引用 userid="515979" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1189851/tms320f280040-q1-i2c-driver-from-example-i2c_ex4_eeprom_polling/4488584 #4488584"]但是、这似乎只是读取器件 ID 时出现的问题、似乎 FRAM 的其他 I2C 命令不会导致任何问题。

    您的意思是、这是唯一读取器件 ID 的方法、而使用7位寻址格式读取/写入等其他命令不会导致任何问题、对吧?

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

    是的、如果它们需要8位地址、那么使用自由数据格式应该足以处理这个问题。 我查看了其他命令、没有任何看起来超过8位的命令、或者有一个额外的起始位、例如用于获取器件 ID 的命令。

    此致、

    Omer Amir

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

    好的、这很好。 这就是我所经历的。 到目前为止、读取和读取器件没有问题。

    另一个问题是 、假设我可以使用自由数据格式来生成数据帧、从器件将器件 ID 提交给主器件、如何读取接收到的数据? 是否有任何使用自由数据帧的示例代码?

    谢谢!

    起重机

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

    您好、Crane、

    如果这与 FRAM 上的器件 ID 命令有关、 最好只使用位拆裂或手动切换引脚/检查状态位、因为这是第二个起始位。 您不能使用空闲数据格式来解决这一问题、因为它是一个额外的位、会使 F28004x 的数据字节大于 I2C 格式上的最大8位。 我查看了我们的现有示例、我认为其中任何一个示例都不使用免费数据格式。

    此致、

    Omer Amir

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

    好的、明白了。 很抱歉耽误你的时间。 现在我知道你是说位拆裂是唯一的方法。

    谢谢 Omer!

    起重机

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

    您的欢迎。 如果您还有任何问题、请随时再次回复此主题。 现在、我将关闭它。

    此致、

    Omer Amir