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.

[参考译文] MSP430FR2433:EUSCI_B_I2C_masterSendMultiByteStart (I2C_0_BASE、cmd);库调用有时会挂起。

Guru**** 2618835 points

Other Parts Discussed in Thread: MSP-EXP430FR2433, MSP430F5329, MSP430FR2433

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/670279/msp430fr2433-eusci_b_i2c_mastersendmultibytestart-i2c_0_base-cmd-library-call-sometimes-hangs

器件型号:MSP430FR2433
主题中讨论的其他器件:MSP-EXP430FR2433MSP430F5329MSP430WARE

我使用 MSP-EXP430FR2433作为 USB 串行转 I2C 主设备。  

有时当我启动时,它会在 EUSCI_B_I2C_masterSendMultiByteStart()库函数中挂起。  

void EUSCI_B_I2C_masterSendMultiByteStart (uint16_t baseAddress、
uint8_t txData
)
{
//存储当前发送中断使能
uint16_t txieStatus = HWREG16 (baseAddress + OFS_UCBxIE)& UCTXIE;

//禁用发送中断使能
HWREG16 (baseAddress + OFS_UCBxIE)&=~(UCTXIE);

//发送启动条件。
HWREG16 (baseAddress + OFS_UCBxCTLW0)|= UCTR + UCTXSTT;

//轮询发送中断标志。
POLL_LOOP = 0;
masterSendMultiByteStart_Fail = false;

while (!(HWREG16 (baseAddress + OFS_UCBxIFG)& UCTXIFG))
{
POLL_LOOP++;
如果(POLL_LOOP > POLL_LOOP_Lest) POLL_LOOP_Lest = POLL_LOOP;
if (POLL_LOOP > POLL_LOOP_ABORT)
{
masterSendMultiByteStart_FAIL = true;
中断;
}
}

//发送单字节数据。
HWREG16 (baseAddress + OFS_UCBxTXBUF)= txData;

//恢复发送中断使能
HWREG16 (baseAddress + OFS_UCBxIE)|= txieStatus;
}

原始的 while  

while (!(HWREG16 (baseAddress + OFS_UCBxIFG)& UCTXIFG)); 

我添加了计数、让我了解它将会挂起多长时间。 当 pool_loop 号达到4、000、000时、我放弃了。

有时、这将运行数小时、而不会出现任何问题。

然而,我把它分开,把它放在一起,然后它就在那段时间里。 我还没有完全弄清楚该模式以使其再次工作、但在从机、主机和 PC 上的串行程序重新启动足够多时间后、它将开始工作。

我开始认为、从器件不响应带有 ACK 的起始和地址。

如何进行调试?

是否有一些序列可将 I2C 线路置于已知状态、如复位状态?

不幸的是、它在办公室工作、当我走到200英里外的客户那里时、尝试启动它时、它不会启动。 我在这里没有我在办公室拥有的所有工具。

有什么建议吗?

基普

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我添加了计数、让我了解它将会挂起多长时间。 当 pool_loop 号达到4、000、000时、我放弃了。

    有时这会运行数小时,没有问题。但是我把它分开了,把它放在一起,然后它在那段时间里挂起。 我还没有完全弄清楚该模式以使其再次工作、但在从机、主机和 PC 上的串行程序重新启动足够多时间后、它将开始工作。

    我开始认为、从器件不响应带有 ACK 的起始和地址。

    如何进行调试? 是否有一些序列可将 I2C 线路置于已知状态、如复位状态?

    不幸的是、它在办公室工作、当我走到200英里外的客户那里时、尝试启动它时、它不会启动。 我在这里没有我在办公室拥有的所有工具。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我有一个提示:

    uint16 t eUSCI B I2C isBusy (uint16 t baseAddress)
    指示 I2C 总线是否繁忙。
    此函数返回 I2C 总线是否繁忙的指示。 此函数检查
    通过 UCBxSTAT 寄存器中的 UCBBUSY 位的总线状态。

    参数
    baseAddress 是 I2C 模块的基址。
    返回
    以下其中一项:
    EUSCI B I2C 总线忙
    EUSCI B I2C 总线不忙
    指示总线是否繁忙

    因此它返回16、这意味着总线正忙。

    该总线上有两个器件。 主设备和从设备。 由于我是 MSP430FM2433主器件和 MSP430F5329从器件、我必须发出什么命令才能释放总线? 还是使总线不忙? 我猜这是我必须在硕士上做的事情。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    从器件 MSP430F5329似乎是使 I2C 线路忙的从器件。 它仅使用 USCI_B_I2C_slavePutData ()和 USCI_B_I2C_slaveGetData ()(在设置后)。 我是否需要执行其他操作来从从从器件中释放 I2C 总线?

    如果我重新启动主器件(MSP430FR2433)、EUSCI_B_I2C_isBusBusy (I2C_0_BASE);或 UCBBUSY 位仍然置位。

    如果我重新引导从设备、然后重新引导主设备、则会将其清除。

    它必须是一个简单的修复程序、但我无法确定正在发生什么。

    当它运行时、它运行了几个小时、而它运行缓慢。 (因为我有2个 IAR 调试器和 Microsoft Express C 编译器同时运行。)

    我摆脱了调试器、运行速度明显更快、但在大约20-30次交易后挂起。

    因此、我通过 USB 串行端口发送器件型号和命令。 主器件使用它来生成 I2C 命令。
    它会检查器件是否忙(当它发生故障时、这里是它发生故障时的忙)、然后执行 I2C 协议。 看起来数据包始终正确、包括 PEC (CRC)。 然后、我将整个事务发送到 USB 串行端口。 在 PC 获取数据后、它会显示该数据。 此时、它会发送一个新的器件型号和命令。

    重点是、它不应是重叠命令。 命令之间始终存在时间间隔。 慢速可能是每秒10条命令、而快速大约是每秒20条命令。

    但我仍然不明白从器件为什么会使它处于忙碌状态。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    观察了从器件的跟踪之后、它似乎在发送字(2个字节)和 PEC (1个字节)后等待从未获得的停止中断。

    这是我感到困惑的地方。 将 PEC 与 USCI_B_I2C_slavePutData (I2C_HOST_BASE_ADDRESS、PEC)一起发送之后;

    我不再获得中断。

    我认为应该得到一个 USCI_I2C_UCTXIFG (发送中断)来表示我的字符已成功发送。 这应该与主器件的功能无关。

    然后、我应该得到一个 USCI_I2C_UCSTPIFG (停止中断)来表示我从主器件获得了一个停止。 我也不知道、但这可能是主器件的问题。

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

     我在它上面有一个逻辑分析仪。

    逻辑分析仪与从器件的说明不匹配。 或师父说的话。

    事务应为2C 08 2D 0F 01 16 (全为十六进制)

    器件地址为0x16

    请求命令0x08

    然后是器件0x16的重新启动

    数据0F 01 (LSB 优先)

    PEC 为16

    逻辑分析仪显示有一个写入2C、 08+ack、读取2D+ACK、0f+ack、然后是0x0000000 (7个零位)、然后 SDA 为高电平、SCL 为低电平。

    主器件说它没有响应(甚至不是0F)、没有读取中断

    从器件表明它发送了全部三个字节。

    这起作用了...

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

    e2e.ti.com/.../MSP430FR2xx_5F00_4xx_5F00_DriverLib_5F00_Users_5F00_Guide_2D00_2_5F00_91_5F00_05_5F00_02.pdf

    嘿、Kipton、

    感谢您提供信息。 我有几个问题/我想了解的内容。

    您是否遵循 driverlib 用户指南(随附)? 似乎有一个 API 列表需要按特定顺序调用:

    如果这个过程未被执行、它可以解释为什么您没有获得预期的中断。

    还应提供可在 CCS 中访问的 driverlib 示例。 如果您不知道这些内容、请打开 CCS 并转至 View -> Resource Explorer。 然后、在左栏中转到"Software"->"MSP430Ware"->"Libraries"->"Driver Library"->"MSP430FR2xx_4xx"->"Example Projects"->"EUSCI_B_I2C_I2C_I2C_I2C_"、您应该会看到一个主 TXMultiple-example 示例。 将其导入到 CCS 中。 如果您尚未发现该问题、这可能会很有帮助。

    如果您仍有问题、能否向我发送逻辑分析仪屏幕截图的图像? 我想确切地了解 I2C 线路上发生的情况。 我很想了解 ACK 信号发生了什么。

    谢谢、

    Mitch

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你打败了我! 感谢您的屏幕截图。 请告诉我用户指南和代码示例是否无法解决问题。

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

    问题是否已解决? 如果是、您可以单击 Resolved 按钮吗?

    谢谢!

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

    我将在最后解决该问题 如果您仍需要此方面的帮助、请告诉我。

    谢谢!

    Mitch