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.

[参考译文] CCS/MSP430F5505:MSP430F5505 i2c 主器件、MSP430G2553从器件忙故障

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/931728/ccs-msp430f5505-msp430f5505-i2c-master-with-msp430g2553-slave-busy-failure

器件型号:MSP430F5505
主题中讨论的其他器件: MSP430G2553

工具/软件:Code Composer Studio

您好!

i2c 主器件卡在连接到 MSP430G2553 i2c 从器件的 MSP430F5505 i2c 主器件之间的总线忙线上。

如何重现问题:  

  1. 关闭两块板的电源。
  2. 为 MSP430G2553 I2C 从器件加电。
  3. 为 MSP430F5505 i2c 主器件加电。
  4. 复位 MSP430G2553、或者有时使其保持运行、一段时间后、它将失败。

 MSP430F5505仅传输单字节、它使用 MSP430_driverlib_2_91_13_01。

请参阅下面的良好数据包:

当发生故障时、会发生以下情况:

最后一个数据包:

此时、时钟保持低电平、器件卡在总线忙状态。

在文档中、它指定了总线忙位在 START 条件下设置为 START 条件、在 END 条件下删除。 我已经尝试过超时并再次发送、但时钟保持低电平、并且将再次失败。

请参阅 以下 MSP430F5505硬件设计:

从器件使用 MSP-EXP43-G2、同时断开调试器贴片引脚并移除 LED2贴片引脚。 我已经测试了3.3V 和0v 两端的电压。

我的另一个问题是时钟有时会执行以下操作:

主控 i2c 代码:

uint8_t transmitData = 0x01;

void hw_i2c_master_init (void)
{
//为 I2C 配置引脚
//将 P4.1和 P4.2设置为辅助模块功能输入。

receiveBufferPointer =&receiveBuffer;

//
*选择端口4
*设置引脚1、2以输入辅助模块函数
*/
GPIO_setAsModuleFunctionInputPin (
GPIO_PORT_P4、
GPIO_PIN1 + GPIO_PIN2
);

//初始化主
USCI_B_I2C_USCI_USCI_USCI_USCI_USCI_CLB ={0_USCI_USCI_param_USCI_USCI_param_param_u_u_u_param_param_u_u_u_u_clk_param_u_u_u_clk_u_param_param_u_u_u_u_u_u_clk_clk_u_u_u_param_u_u_u_
param.selectClockSource


1)&param;

//指定从地址
USCI_B_I2C_setSlaveAddress (USCI_B1_BASE、
SLAVE_ADDRESS
);

//设置接收模式
USCI_B_I2C_setMode (USCI_B1_BASE、USCI_B2_I2C_Transmit);

//启用 I2C 模块以启动操作
USCI_B1_USCI_USCI_USCI_USCI_DB1

(USCI_USCI_USCI_USCI_USCI_USCI_USCI_UST_B1_BASE








)、USC_USCI_USCI_USCI_USCI_USCI_USCI_USCI_UST_SEND (USCI_USCI_USCI_UST_USCI_UST_USCI_USCI_USCI_USCI_USCI_USCI_USCI_UST_USCI_USCI_USCI_UST_UST_UST_UST_USCI_UST_UST_USCI_USCI_USCI_USCI_UST_USCI_UST_UST_UST_UST_USCI_UST_UST_USCI_



USCI_B_I2C_masterSendSingleByteWithTimeout (USCI_B1_base、
transmitData、timeout
);
}
//在
传输完成(timeout--){
if (!USCI_B_I2C_isBusBusBusy (USCI_B1_base)){
break;
}
}
}} 

i2c 从设备代码:

e2e.ti.com/.../2844.main.c

1) 1)恢复应如何工作?

2) 2)导致此故障的原因是什么?如何避免此故障?

非常感谢、

Jon

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

    您是否相当确定正在挂起总线的是从器件? 如果您断开从器件连接、它是否会清除?

    您正在启用 TXIE (USCI_B_I2C_Transmit _interrupt)、但我看不到它的 ISR。 如果您使用的是 SingleByte 套件、则不需要 TXIE、并且可能不应该使用它。

    timeout=10非常短。 这是一个自旋环路的计数、因此估计值可能为5-10uC/计数。 超时退出看起来不是很正常。 我建议可能改为100-1000。

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

    我们认为主器件在主总线忙状态寄存器中卡住时正在挂起总线。 通过添加一些串联的电阻器、我们证明这是主器件将线路下拉。

    至于主器件上的发送中断、它从未进入中断、当我测试发送多个字节时、代码就在那里。 我现在已经注释了启用 中断、但仍然有相同的问题。

    我已将超时时间增加到1000,但仍然是同一个问题。

    void hw_i2c_master_init (void)
    {
    //为 I2C 配置引脚
    //将 P4.1和 P4.2设置为辅助模块功能输入。
    
    receiveBufferPointer = receiveBuffer;
    
    /*
    *选择端口4
    *将引脚1、2设置为输入次级模块功能
    *
    GPIO_setPeripheralModuleFunctionInputPin (
    GPIO_PORT_P4、
    GPIO_PIN1 + GPIO_PIN2
    );
    
    //初始化主设备
    USCI_B_I2C_initMasterParam param ={0};
    param.selectClockSource = USCI_B_I2C_CLOCKSOURCE_SMCLK;
    param.i2cClk = UCS_getSMCLK ();
    param.datarate = USCI_B_I2C_SET_DATA_RATE_100KBPS;
    USCI_B_I2C_initMaster (USCI_B1_base、&param);
    }
    
    void i2c_send_Byte (uint8_t txData)
    {
    无符号超时= 1000;
    
    //指定从器件地址
    USCI_B_I2C_setSlaveAddress (USCI_B1_BASE、
    从器件地址
    );
    
    USCI_B_I2C_setMode (USCI_B1_BASE、USCI_B_I2C_Transmit 模式);
    
    //启用 I2C 模块以启动操作
    USCI_B_I2C_ENABLE (USCI_B1_BASE);
    
    //USCI_B_I2C_clearInterrupt (USCI_B1_base、USCI_B_I2C_Transmit _interrupt);
    //USCI_B_I2C_enableInterrupt (USCI_B1_base、USCI_B_I2C_Transmit _interrupt);
    
    if (!USCI_B_I2C_isBusy (USCI_B1_BASE)){
    //发送单字节数据。
    USCI_B_I2C_masterSendSingleByteWithTimeout (USCI_B1_BASE、
    transmitData、超时
    );
    }
    //延迟直到传输完成
    while (timeout---){
    if (!USCI_B_I2C_isBusy (USCI_B1_BASE)){
    中断;
    }
    }
    
    USCI_B_I2C_setMode (USCI_B1_base、USCI_B_I2C_Receive_mode);
    
    //USCI_B_I2C_clearInterrupt (USCI_B1_base、USCI_B_I2C_receive_interrupt);
    //USCI_B_I2C_enableInterrupt (USCI_B1_base、USCI_B_I2C_receive_interrupt);
    } 

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

    我刚刚为主器件加载了我的开发套件。 与使用相同的 i2c 端口不同、我决定使用您的示例中的端口、并注意到示例中的引脚与数据表中的引脚不匹配。

    #define GPIO_PIN0 (0x0001)
    #define GPIO_PIN1 (0x0002)
    #define GPIO_PIN2 (0x0004)
    
    
    GPIO_setPeripheralModuleFunctionInputPin (
    GPIO_PORT_P3、
    GPIO_PIN1 + GPIO_PIN2
    );
    

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

    为了消除我们的硬件、我使用 TI MSP-TS430RGC64USB 开发套件设置了相同的测试、结果是相同的。 根据我之前的帖子、我确实必须将端口引脚更正为0和1、这证明了提供的示例不正确。

    e2e.ti.com/.../2781.i2c_5F00_slave.c

    e2e.ti.com/.../3157.i2c_5F00_master.c

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

    我已经向主器件添加了一个 i2c RTC、这是预期的工作方式。 当我添加 MSP430G2553从器件时、它将运行几次、然后中断。

    从属方回复

    从器件中断

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

    它可以确保从器件(G2553)正在挂起总线、而不是主器件(F5505)。 它运行的代码是什么?

    [编辑:回答您原来的问题:如果从机挂起总线、主机没有太多的追索权。 I2C 规范(UM10204、版本6)第3.1.16节几乎说:"Uh、我们希望您能够控制从复位引脚"。]