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.

[参考译文] MCF8329A:I2C 读写操作

Guru**** 2399305 points
Other Parts Discussed in Thread: MCF8329A

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

https://e2e.ti.com/support/motor-drivers-group/motor-drivers/f/motor-drivers-forum/1433120/mcf8329a-i2c-read-write-operation

器件型号:MCF8329A

工具与软件:

"您好、

我有几个问题。

  1. 目前、我使用 I2C 来控制电机。 我知道、如果我在影子寄存器中输入值、则会将这些值写入 RAM 区域、然后通过写入0x8A5000000xEA寄存器、从0x000080到的影子寄存器中的值0x0000AE会写入 EEPROM。 是这样吗?

  2. 这里提到、在写入影子寄存器后允许大约100µs 的稳定时间。 然而、正确写入值大约需要1ms。 要实现稳定写入、实际需要这个大约1ms 的延迟吗? 该100µs 延迟究竟指的是什么?

  3. 对于读取选项、如果我写入0x400000000xEA寄存器、则来自 EEPROM 的数据将加载到影子寄存器中(从0x0000800x0000AE)。 是这样吗? 我将任意值放入影子寄存器并执行了读取操作、但影子寄存器中的值未发生变化、这就是我提出问题的原因。

  4. 最后、在其他一些 EEPROM 中、我注意到可以连续读取多个寄存器。 MCF8329A 是否支持此功能? 如果没有、当我要从 EEPROM 读取值时、是否需要在启动后逐个读取每个影子寄存器值?

谢谢你。"

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

    你(们)好  

    快速澄清第一个问题、是的、您的理解是正确的。

    明天、我将提供有关 EEPROM 读取和写入过程的简要文档(步骤)。

    谢谢、此致

    Venkatadri S.

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    "感谢您的大力支持。 我将确保在我的其他问题回答完毕后单击"已解决"按钮。"
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你(们)好

    1. 目前、我使用 I2C 来控制电机。 我知道、如果我在影子寄存器中输入值、则会将这些值写入 RAM 区域、然后通过写入 0x8A500000  0xEA 寄存器、从 0x000080 到的影子寄存器中的值 0x0000AE 会写入 EEPROM。 是这样吗?

      [ANS]正确、同时监控0xEA 将在成功完成 EEPROM 写入后变为零。
    2. 这里提到、在写入影子寄存器后允许大约100µs 的稳定时间。 然而、正确写入值大约需要1ms。 要实现稳定写入、实际需要这个大约1ms 的延迟吗? 该100µs 延迟究竟指的是什么?

      [ANS]在 I2C 通信期间需要延迟。 在发送的每个字节之间的 I2C 事务期间、需要100us 的等待时间。  
    3. 对于读取选项、如果我写入 0x40000000  0xEA 寄存器、则来自 EEPROM 的数据将加载到影子寄存器中(从 0x000080  0x0000AE)。 是这样吗? 我将任意值放入影子寄存器并执行了读取操作、但影子寄存器中的值未发生变化、这就是我提出问题的原因。

      [ANS]影子寄存器值在 EEPROM 上电时更新一次、在该用户可能为了调优目的而进行更改之后、因此 EEPROM 将仅针对用户不更新的寄存器进行更新。
    4. 最后、在其他一些 EEPROM 中、我注意到可以连续读取多个寄存器。 MCF8329A 是否支持此功能? 如果没有、当我要从 EEPROM 读取值时、是否需要在启动后逐个读取每个影子寄存器值?

      [问题]我们必须对每个寄存器分别进行寻址并进行读取。

    请确保按照以下列出的过程成功对 EEPROM 进行编程

    1. 上电时上电、将0x80000000字值写入寄存器0xEC (ALGO_DEBUG1)。 这将启用速度命令覆盖(第31位)。 该字还可确保写入零速命令、从而使电机处于电机空闲状态。 在此状态下、EEPROM 写入将成功。
    2. 在步骤1之后、开始通过 I2C 发送其余调优寄存器。 保持100us 的字节间延迟
    3. 通过 I2C 向器件传输的所有寄存器数据完成后、读回数据并进行验证
    4. 现在向寄存器0xEA (ALGO_CTRL1)发出 EEPROM 写入命令0x8A500000
    5. 等待750ms
    6. 成功完成 EEPROM 编程后、读回0xEA 并确保0xEA 中的值自动清除。
    7. 在0xEA 值变为零之前、不要断电。
    8. 一旦清除0xEA、对电路板进行下电上电、并通过读取内容进行重新检查

    在 I2C 上进行通信时使用字节间延迟的示例

    • 每个帧以4字节开始

    –第1字节[目标地址[7:1]:R/W[0]

    • 等待100us

    –控制字0 [OP_R/W[7]:CRC_EN[6]:DLEN[5:4]:MEM_SEC[3:0]] ->总共8位

    • 等待100us

    –控制字1 [MEM_PAGE[8:5]:MEM_ADDR[3:0]]

    • 等待100us

    –控制字2 [MEM_ADDR[7:0]] //  如果我们要对0x80 ISD_CONFIG 进行寻址、请在此处写入0x80

    • 等待100us

    谢谢、此致

    Venkatadri S.

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

    "感谢您的答复。 检查后、似乎正确实现了驱动器部分中的100µs 延迟。 目前、我是通过一次发送32位来访问影子寄存器。 我用于将数据写入0x80地址的协议如下所示: {0x10, 0x00, 0x80, 0x00, 0x00, 0x00, 0x44}此后、当将数据写入0x82地址时、似乎需要在0x80和0x82之间包含约1ms 的延迟、以确保正常运行。 您能更详细地解释一下吗? 我需要在10ms 的任务内读取3个影子寄存器的值、我想知道在每次请求之间包含1ms 的延迟是否正确。

    示例:我用于编写的协议:I send{0x10, 0x00, 0x80, 0x00, 0x00, 0x00, 0x44}、等待1ms
            然后发送 {0x10, 0x00, 0x82, 0x02, 0x18, 0x94, 0x19}

            我用于读取的协议:我发送{0x90, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00},等待1ms
            然后接收4个字节到{0x00, 0x00, 0x00, 0x00}。"

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

    你(们)好

    发送帧器件必须解析 R/W 的数据、验证是否启用了 CRC、然后必须计算 CRC 等 因此每一帧之间都需要延迟。

    您需要调整调度程序以适应所需的延迟。  

    谢谢、此致

    Venkatadri S.