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.

[参考译文] MCF8316C-Q1:I2C 写入无效

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

https://e2e.ti.com/support/motor-drivers-group/motor-drivers/f/motor-drivers-forum/1497770/mcf8316c-q1-i2c-write-has-no-effect

器件型号:MCF8316C-Q1
Thread 中讨论的其他器件: MCF8316AEVMMOTORSTUDIO

工具/软件:

您好:  

我设计了一个使用与  MCU 连接的 MCF8316C-Q1驱动器的定制电路板。 我开发了一个驱动程序、无需 CRC 即可通过 I2C 写入和读取寄存器。

我成功地做了以下:  

  1. 读取寄存器内容
  2. 将新内容写入该寄存器
  3. 从寄存器读回该新值

因此、我相信我的实施是可以的。  但是、这种变化永远不会生效。  这意味着、它不会反映在芯片行为上。  

硬件引脚如下所示:  

  • DRVOFF:低电平
  • 速度:低(旨在用于 I2C 速度控制)
  • 制动器:低电平
  • DIR:低电平
  • 报警:低
  • 故障:高阻态

我手头有一个 MCF8316AEVM。 我将 I2C 线路连接到电路、并可以  通过 MotorStudio 按需控制驱动器。 因此、问题不在于硬件设计或焊接。 硬件引脚也设置正确。

对寄存器进行编程时是否缺少一些步骤? 我不打算写入 EEPROM、因此我不 使用 EEPROM 读取/写入位调用寄存器0x000000EA。 但是、是否有另一个位需要提出来才能应用该寄存器 ?

如果这样做有所帮助、下面是 我 I2C 写入函数的一个片段。 此处未显示地址字节的形式。  

谢谢!

// Build 24 bits Control Word : datasheet 7.6.2.1
// WRITE operation: OP_R/W = 0b0;
controlWord = 0b0 << 23;
// CRC Disabled: CRC_EN = 0b0;
controlWord |= 0b0 << 22;
// Data Length is 32 bits: DLEN = 0b01
controlWord |= 0b01 << 20;
// Memory Section: MEM_SEC = 0x0
// Memory Page: MEM_PAGE = 0x0
// Memory address : is casted on 12 bits
controlWord |= address & 0xFFF;

mfc8316c->i2cData.writeBuffer[0] = (controlWord >> 16) & 0xFF;
mfc8316c->i2cData.writeBuffer[1] = (controlWord >> 8) & 0xFF;
mfc8316c->i2cData.writeBuffer[2] = controlWord & 0xFF;

// Build Data Word
mfc8316c->i2cData.writeBuffer[3] = (data >> 24) & 0xFF;
mfc8316c->i2cData.writeBuffer[4] = (data >> 16) & 0xFF; 
mfc8316c->i2cData.writeBuffer[5] = (data >> 8) & 0xFF;
mfc8316c->i2cData.writeBuffer[6] = data & 0xFF;

// Write I2C output buffer on the bus
mfc8316c->i2cData.writeLength = 7;

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

    您好 Jean、  

    感谢您的联系。 您能否确认读取的寄存器是否与您尝试设置的值相匹配?

    [引述 userid="638244" url="~/support/motor-drivers-group/motor-drivers/f/motor-drivers-forum/1497770/mcf8316c-q1-i2c-write-has-no-effect

    我成功地做了以下:  

    1. 读取寄存器内容
    2. 将新内容写入该寄存器
    3. 从寄存器读回该新值
    [/报价]

    您在这里监控的行为是什么?

    Unknown 说:
    因此、我相信我的实施是可以的。  但是、这种变化永远不会生效。  这意味着、它不会反映在芯片行为上。  [/报价]

    此致、
    Sachin S.

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

    下面是一个尝试更改 ALGO_DEBUG1寄存器中 DIGITAL_SPEED_CTRL 位的示例。  

    1. 上电时、读取寄存器0x000000EC 、结果:0x00000000
    2. 当将 SPEED 引脚设置为高电平时、驱动器尝试使用默认配置以100%的频率驱动电机、这会产生误差。 这是这种情况下的预期行为、因为默认配置不允许正确驱动电机
    3. 出现故障
    4. 要清除故障、我尝试 设置寄存器  ALGO_CTRL1: 0x000000EA 中的 CLR_FLT 位设置为0x20000000 。
    5. 故障不会被清除。 因此、通过下电上电来消除故障。
    6.  DIGITAL_SPEED_CTRL 位在 ALGO_DEBUG1 寄存器中设置:值0x80000000在寄存器0x000000EC 中设置  
    7.  读回寄存器0x000000EC、 实际上找到了值0x80000000。
    8. 因此、应 通过 I2C 进行速度控制、而将 SPEED 引脚设置为高电平不应产生影响。  
    9. SPEED 引脚设置为高电平、行为与2相同。 阻抗。 因此、 ALGO_DEBUG1的变化 无效。  

    在整个电路板上可以观察到这种情况。 我使用 AEVM 板上的 Motor Studio 来调整参数、以使电机正常工作。 然后、我导出一个包含寄存器值的 json 文件、并使用它在定制板上设置所有可写寄存器。 没有任何影响、电机的行为与在启动时使用默认寄存器值的 AEVM 电路板上的行为类似。  

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

    尊敬的 Jean:

    看起来故障导致器件在这里的行为异常。 您能通过读取故障状态寄存器来告诉我故障代码吗?

    此致、

    Sachin S.

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

    我不确定这一点。 在步骤5中、我可以通过下电上电来清除故障。 然后、步骤6应确保步骤8不会导致故障、但会导致故障。 出现故障是因为步骤6没有 在寄存器 ALGO_DEBUG1中将 DIGITAL_SPEED_CTRL 成功设置为 I2C 、这应该使 SPEED 引脚对设置为高电平不敏感。  

    此外、假设我将 SPEED 引脚保持在低电平、避免触发任何故障。 在根据从 MotorStudio 导出的 JSON 文件设置所有寄存器并读回这些寄存器以确认它们包含正确的值后、我仍然无法通过 I2C 更改速度。  

    正如前面在主题中提到的、我能够通过在定制电路板中注入来自 AEVM 板的 I2C 信号来在定制电路板上对驱动器进行编程。 因此问题不是硬件。

    我测量了 AEVM 电路板的 I2C 信号、发现一个显著差异:CLK 频率约为350kHz、而我的频率为10kHz。 我使用了如此低的频率、因为我的 ATSAMD MCU 的 I2C 外设没有用于字节间延迟的参数。 我知道您需要100us 的字节间延迟、因此 我不是以350kHz 的频率发送位(字节之间延迟100us)、而是发送10kHz 位、内置100us 延迟。  

    这可能是问题吗?  

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

    尊敬的 Jean:

    感谢您的详细说明。 您能否告诉我、对于您所面临的问题、以下几点是否正确:

    1.插入定制电路板的 EVM 上的 I2C 运行正常、但您在电路板上自己的 I2C 实现无法正常工作。

    2.定制板上的 I2C 似乎能够写入寄存器(通过同一寄存器的 I2C 读回进行确认)。 但写入的值似乎没有生效(从您的实验中的第6点到第9点)

    请确认以上几点、  

    ----------------------------------------------------------------------------------------

    [引述 userid="638244" url="~/support/motor-drivers-group/motor-drivers/f/motor-drivers-forum/1497770/mcf8316c-q1-i2c-write-has-no-effect/5761385 #5761385"]

    我知道您需要100us 的字节间延迟、因此 我不是以350kHz 的频率发送位(字节之间延迟100us)、而是发送10kHz 位、内置100us 延迟。  

    这可能是问题吗?  

    [/报价]

    我需要与团队核实。 您是否可以尝试通过  ATSAMD MCU 进行写入并通过 EVM 的 I2C 读回寄存器? 想要检查通过 ATSAMD MCU 进行的写入是否不完整。

    此致、
    Sachin S.