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:I2C 主器件写入 NACK 和 STOP 不起作用

Guru**** 2551110 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/978529/msp430fr2433-i2c-master-write-nack-and-stop-not-working

器件型号:MSP430FR2433
主题中讨论的其他器件:MSPWARE

大家好、我正在尝试处理一个情况、即 I2C 写入一个可能不在总线上的地址。 我目前遇到两个问题:

  1. NACK 检测不起作用(UCB0IFG 中的 UCNACKIFG 始终为0)
  2. 停止条件永远不会被发送、从而使总线 SCL 保持在低电平。 我已经验证这是主器件提供的

我当前尝试使用 i2c 写入方法的方法如下所示:

bool i2c_write (uint8_t addr、uint8_t *数据、int len)
{
UCB0I2CSA = addr;
UCB0CTL1 |= UCTXSTT | UCTR;
UCB0TXBUF =*数据;
while ((UCB0IFG & UCTXIFG)=0);

while (UCB0CTL1 & UCTXSTT);//等待开始条件+ addr 完成(Nack/ack)

IF (UCB0IFG 和 UCNACKIFG)
{
/*注1 */
UCB0CTL1 |= UCTXSTP;
while (UCB0CTL1 & UCTXSTP);
返回 false;
}

for (int i = 1;i < len;i++)
{
UCB0TXBUF =*(DATA + I);
while (!(UCB0IFG & UCTXIFG));
IF (UCB0IFG 和 UCNACKIFG)
{
UCB0CTL1 |= UCTXSTP;
while (UCB0CTL1 & UCTXSTP);
返回 false;
}
}

UCB0CTL1 |= UCTXSTP;
while (UCB0CTL1 & UCTXSTP);
/*注2 */
返回 true;
} 

如果我放置一个断点、或者、例如在注释1中设置一个 LED、则它永远不会命中。

在注释2中、如果我放置一个断点或单步执行它、则会通过导线发送一个停止条件。 如果我正常运行、则永远不会发送停止条件、因此似乎是计时问题、但我不清楚我还能做什么。

最后一点、尝试使用 mspware driverlib 会出现相同的问题。

感谢您的澄清

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

    您好!

    您是否在 Resource Explorer 中查看了 FR2433的 I2C 示例?

    BR、
    Leo

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

    Howdy、

    很抱歉、我应该提到我已经尝试了所有外设示例-在 Resource Explorer 中针对器件的寄存器级 C 主控 i2c 示例-我是在很久以前从 msp430fr243x_eusci_i2c_standard_master.c 开始的。 它表现出同样的问题、但由于由中断驱动、它甚至从未尝试设置 UCTXSTP、因为 USCI_I2C_UCTXIFG0 ISR 从未触发。 我假设它仅在按照示例注释连接的两个器件的情况下运行

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    >    UCB0TXBUF = *data;
    >    while((UCB0IFG & UCTXIFG) == 0);

    I suggest you reverse the order of these two statements. The Start condition takes a finite time, and if you write TXBUF too early it will be lost.

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

    您好、感谢您的建议。 我没有改变就尝试了。 我还遇到了 len 错误、其中实际数据字节未发送、修复了该错误、但原始问题仍然存在。 接下来、我将尝试较慢的时钟(当前为16MHz)和 i2c 波特率、以获取任何线索

    我忘记发布逻辑分析仪捕获、下面是一个示例