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.

[参考译文] MSP430FG6426:传输后 I2C 被拉至低电平-使总线处于繁忙状态

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1265956/msp430fg6426-i2c-pulled-low-after-transmission---making-the-bus-busy

器件型号:MSP430FG6426

您好!

我正在尝试 以 从模式(BeagleBoneBlack - BBB 为主设备)启动 MSP430FG6426上的 I2C 外设。

我知道:

1.我可以 在 BBB 上使用"i2cdetect -y 1"来检测 MSP 和总线上的其他器件。

2.我可以 在同一 I2C 总线上将数据从另一个器件传输到 BBB。

3.当我执行读操作时,我会得到 下面的字符。 "`abcdpqrst"是我期望的字符、我再一次像预期的那样得到正好为64字节的字符。

Address: 0x55
rx_len: 64
Data:
`abcdpqrst`abcdpqrst`abcdpqrst`abcdpqrst`abcdpqrst`abcdpqrst`abc
omap_i2c 4802a000.i2c: controller timed out
Error: Connection timed out (os error 110)
omap_i2c 4802a000.i2c: timeout waiting for bus ready
Error: Connection timed out (os error 110)

4.从示波器上 可以清楚地看到 SCL 和 SDA 都被拉低。  我将 MSP SCL & SDA 复位至3.29V 的这一刻、表明实际上 MSP 使 它保持在低电平。

5.我将对 TI 编译器 v21.6 LTS 使用稍作修改的 driverlib 示例代码(USCI_B_i2c_ex4_slaveTxMultiple.c)。 最大的修改:1. 它并不是单独的(while 循环不在这里)、2. 我正在使用 USCI_B1。 为清楚起见、此处是此演示文稿中

#define SLAVE_ADDRESS 0x55

#define TXLENGTH 0x09

uint8_t transmitData[] = { 0x60, 0x61, 0x62, 0x63, 0x64,
                           0x70, 0x71, 0x72, 0x73, 0x74};
uint8_t *transmitDataPointer;
uint8_t transmitLength = TXLENGTH;

//38.3.4.1.1 I2C Slave Transmitter Mode
void i2c_init(void)
{
    //Assign I2C pins to USCI_B1
    GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P8, GPIO_PIN5 + GPIO_PIN6);

    //Initialize I2C as a slave device
    USCI_B_I2C_initSlave(USCI_B1_BASE, SLAVE_ADDRESS);

    //Set in transmit mode
    USCI_B_I2C_setMode(USCI_B1_BASE, USCI_B_I2C_TRANSMIT_MODE);

    //Enable I2C Module to start operations
    USCI_B_I2C_enable(USCI_B1_BASE);

    //Enable master transmit interrupt
    USCI_B_I2C_clearInterrupt(USCI_B1_BASE, USCI_B_I2C_TRANSMIT_INTERRUPT + USCI_B_I2C_STOP_INTERRUPT);
    USCI_B_I2C_enableInterrupt(USCI_B1_BASE, USCI_B_I2C_TRANSMIT_INTERRUPT + USCI_B_I2C_STOP_INTERRUPT);

    transmitDataPointer = transmitData;
    transmitLength = TXLENGTH;

    //Enter low power mode 0 with interrupts enabled.
//        __bis_SR_register(LPM0_bits + GIE);
//        __no_operation();
}

//******************************************************************************
//
//This is the USCI_B1 interrupt vector service routine.
//
//******************************************************************************
#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
#pragma vector=USCI_B1_VECTOR
__interrupt
#elif defined(__GNUC__)
__attribute__((interrupt(USCI_B1_VECTOR)))
#endif
void USCI_B1_ISR(void)
{
    uint16_t iv = UCB1IV;
    USCI_A_UART_transmitData(USCI_A0_BASE, iv + 0x61);

    switch (__even_in_range(iv, 12))
    {
    case USCI_I2C_UCSTPIFG:
        //Exit LPM0 if data was transmitted
        __bic_SR_register_on_exit(LPM0_bits);
        break;
    case USCI_I2C_UCTXIFG:
        //Transmit data
        //if (transmitLength > 0x00)
        {
            USCI_B_I2C_slavePutData(USCI_B1_BASE, *transmitDataPointer++);
            //transmitLength--;
            if (transmitDataPointer >= (transmitData+10))
            {
                transmitDataPointer = transmitData;
            }
        }

        break;
    default:
        break;
    }
}

Question:

 SCL 和 SDA 为何都被拉至低电平?

2.我怎么能分别向师父指出我没有什么可发送的? 我是只 发送0x0还是0x20、是否在另一端发送、这应该意味着我不应该再询问?

3.是否有办法强制 MSP 释放 I2C 总线?

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

    以下是该事件的示波器图:

    100ms 的分辨率。 似乎传输完成、然后 在大约30ms 后 MSP 将其拉低。

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

    尊敬的 Peter:

    我会在下周一给你一些反馈,感谢你的耐心!

    B.R.

    萨尔

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

    大家好、

    我很期待这件事。

    我一直在阅读该主题、并发现当总线停止时出现一些情况、例如当我收到一个字符但没有从缓冲区中读取。 但我现在甚至不知道这怎么可能、因为我不像这样设置 i2c。

    另外可能相关的还有、如何调试 ISR_TRAP? 是否有办法确定触发了什么中断? 我只启用了 i2c 中断和 ctsd16。

    谢谢、

    彼得

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    '我们一直在阅读这一主题,发现总线可能停止时出现一些情况,例如当我收到一个字符但没有从缓冲区中读取。 但我现在不知道这是怎么可能的,因为我不像这样设置 i2c。

    由于您将其配置为从站、因此您最好准备好接收数据、因为数据由主站决定。 如果它发送、并且您没有用于处理这种情况的代码、则会出现问题。

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

    尊敬的 Peter:

    很抱歉回复延迟。

    我一直在阅读这一主题,发现总线可能停止时出现一些情况,例如当我收到一个字符但不从缓冲区读取时。

    David 给出了澄清内容、并在用户指南中进行了说明:

    1. 为什么 SCL 和 SDA 都被拉至低电平?

    是否主器件已生成停止信号? 如果不是这样、从器件会将它们拉低:

    2. 我如何分别向主控表明我没有要发送的内容? [/报价]

    我认为生成停止信号可以做到这一点。

    3. 是否有办法强制 MSP 释放 I2C 总线?

    我的建议-您可以使用对强制总线的时间进行计数的计时器、如果 MSP 强制 I2C 总线的时间长于指定的时间、则使用计时器中断 ISR 复位 I2C 总线并重新配置它。 或者类似的东西。

    B.R.

    萨尔

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

    感谢您提供信息。 是的、它正在 接收字符、但我的代码没有处理这些字符。 我认为将这些内容包含在示例代码中是有意义的。

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

    尊敬的 Peter:

    我将关闭此主题、如果您有任何其他问题、可以随时在论坛中发布新主题。

    祝你度过美好的一天!

    B.R.

    萨尔