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.

[参考译文] MSP430F5338:I2C 从器件不响应 ACLK。

Guru**** 2391415 points
Other Parts Discussed in Thread: MSP430F5338, TMP75

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/747620/msp430f5338-i2c-slave-not-responding-to-aclk

器件型号:MSP430F5338
主题中讨论的其他器件: TMP75

我们将 TMP75温度传感器用作 MSP430F5338的从器件。 我已使用给出的示例代码进行配置、以将 ACLK 配置为 I2C 线路的输入。 使用时钟从高电平切换到低电平的不同行为来探测 SCL 和 SDA 线时、我们面临着一个问题、或者根本没有响应。 已尝试使用 FLL 和不使用 FLL 进行配置。 XT1中给出的输入时钟是通过一个运行频率为32kHz 的晶体振荡器提供的。  

配置 ACLK

空 ConfigXT1 (空)


P7SEL |= BIT0 + BIT1;//XT1IN、XT1OUT
UCSCTL4 |= SELA_XT1CLK;
UCSCTL6 &=~(XT1OFF);
UCSCTL6 |=(XT1DRIVE0_L | XT1DRIVE1_L);
UCSCTL6 &=~(XT1BYPASS |XTS);
执行{
UCSCTL7 &=~(XT1LFOFFG);
//清除 XT2、XT1、DCO 故障标志
SFRIFG1 &=~OFIFG;//清除故障标志
} while (UCSCTL7 & XT1LFOFFG);

配置 I2C 从设备

P2SEL |= BIT1 + BIT2;

UCB0CTL1 |= UCSWRST;//启用 SW 复位

UCB0CTL0 = 0x00;

UCB0CTL0 |= UCMST + UCMODE_3 + UCSYNC;

UCB0CTL1 |= UCSSEL_1;
//UCB0BR0 = 80;
//UCB0BR1 = 0;//清除 SW 复位
UCB0CTL0 &=~UCSLA10;
UCB0CTL1 &=~UCSWRST;
UCB0I2CSA |= 0x4f;
UCB0IE |=(UCTXIE | UCRXIE);//启用 TX 中断
_bis_SR_register (GIE);

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我不太确定您所描述的内容。 您是否看到了启动脉冲、而没有更多内容? 或者根本没有活动? 是否有示波器跟踪?

    如果您对 ACLK 有疑问、我建议:
    1) 1)尝试使用 SMCLK (具有合适的 br0值)运行 I2C、并查看它是否不同。
    2) 2)配置 P1.0以输出 ACLK 并在示波器上进行检查

    如何配置 TMP75地址引脚(A0-A2)?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Mohammed Zakariya、
    我完成了您的配置、我找不到任何不合理的东西。
    您可以跳过"UCB0CTL0 &=~UCSLA10;"、因为您要在几行之前清除 UCB0CTL0、但只要这不是时间关键、就不会影响将其保留。
    您仅在上面的代码段中显示初始化、因此我希望您在代码中的其他位置写入 TX 缓冲区、以便实际启动 I2C 传输。
    我同意 Bruce 的观点、即有必要检查 ACLK 时钟源是否正常工作。

    请告诉我这是否有助于找出根本原因。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的回复、  

    1) 1)尝试使用 SMCLK (具有合适的 br0值)运行 I2C、并查看它是否不同。

    在使用 SMCLK 时、晶体振荡器的工作频率为16MHz、并使用 DCO 以8MHz 的频率输出时、观察到以下波形、

    给出的 br0值为80、以获得100kHz 的时钟

    在提供8MHz 频率时、在不提供任何预分频值的情况下、我会遇到如下时钟异常行为、在 SCL 中获得的频率为125Hz

    这是使用 SMCLK 配置时获得的行为。   

    2) 2)配置 P1.0以输出 ACLK 并在示波器上进行检查

    很抱歉、这将无法实现、当前使用的模块没有引脚输出、并且 ACLK 和 SMCLK 引脚上分别没有测试点。

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

    谢谢您的回复、很抱歉我没有附加 I2C 功能、我将随此回复附上。 此函数发出起始位、其作用是接收两个字节


    void receive_i2c (unsigned char byteCount、unsigned char data){

    * TI_Transmit 字段=数据;
    unsigned char RX_Data[2];
    byteCtr = byteCount;

    UCB0CTL1 |= UCTR | UCTXSTT;

    while (!(UCB0IFG & UCTXIFG));

    UCB0TXBUF =数据;

    while (!(UCB0IFG & UCTXIFG));//等待 Tx 标志被置位

    UCB0CTLW0 &=~UCTR; //重复起始条件
    UCB0CTLW0 |= UCTXSTT;

    while (!(UCB0IFG & UCRXIFG));//等待 Rx 标志被置位

    RX_Data[0]= UCB0RXBUF;
    while (!(UCB0IFG & UCRXIFG));

    RX_Data[1]= UCB0RXBUF;
    UCB0CTLW0 |= UCTXNACK;
    UCB0CTLW0 |= UCTXSTP;

    while (!(UCB0IFG & UCSTPIFG));//等待停止标志被置位


    我在回复 Bruce 时解释说、我们目前没有看到 ACLK 或 SMCLK 的规定。 请在审核后提交您的意见。 提前感谢。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Mohammed Zakariya、

    您能否确认您已在 SCL 和 SDA 线路上应用了上拉电阻器? 因为似乎没有比125Hz 更快的时钟、这可能表示端口在时钟脉冲之间没有被拉至高电平。

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

    > UCB0IE |=(UCTXIE | UCRXIE);//启用 TX 中断
    您正在启用这些中断、但我看不到 ISR。 您的 receive_i2c 函数似乎不希望设置它们。

    我猜您的程序会在发送地址字节(TXIFG)后复位(或更糟)、这就是 SCL 将"死区"的原因。 我建议您删除该行。

    [编辑:实际上、如果您使用的是最新版本的 CCS、您的程序可能在 ISR_FAULT 中旋转、即不会重新启动。]

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

    我们还没有收到您的回复、您是否能够解决该问题? 如果是、您可以与我们分享解决方案将会很好。

    谢谢、此致、
    最大