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.

[参考译文] MSP432P401R:MSP432 I2C 主设备读取操作。

Guru**** 2535750 points
Other Parts Discussed in Thread: TCA6408A

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/772895/msp432p401r-msp432-i2c-master-read-operation

器件型号:MSP432P401R
主题中讨论的其他器件:TCA6408A

使用 TCA6408A 时、我将尝试执行 I2C 读取、并且 EUSCI_B 外设的运行状态似乎很糟糕、如此处所报告的那样:  

e2e.ti.com/.../544429 并标记为已解决(但海报声称解决方案不足、我的结尾似乎不足

在执行一系列写入来配置 I2C 外设之后、我尝试执行如下所示的读取操作:

使用以下代码:

I2C_setMode (EUSCI_B0_BASE、EUSCI_B_I2C_Transmit 模式);
I2C_masterSendMultiByteStart (EUSCI_B0_BASE、0x00);
I2C_setMode (EUSCI_B0_BASE、EUSCI_B_I2C_Receive_mode);
buttonState = I2C_masterReceiveSingleByte (EUSCI_B0_BASE);

在总线上、我可以观察到:0x42、0xFF、0x43、0x7F、因此我担心、除非插入延迟、否则它无法正确传输寄存器地址。

I2C_setMode (EUSCI_B0_BASE、EUSCI_B_I2C_Transmit 模式);
I2C_masterSendMultiByteStart (EUSCI_B0_BASE、INPUTMANAGERINPUTPORTREG);
for (volatile unsigned long i = 500;i;i-){}
I2C_setMode (EUSCI_B0_BASE、EUSCI_B_I2C_Receive_mode);
buttonState = I2C_masterReceiveSingleByte (EUSCI_B0_BASE);

我打算清理该延迟、并在将来生成某个中断驱动的内容。 但现在我可以让它发送具有上述代码的寄存器地址:0x42、0x00、0x43、0xDF、0xDF

因此、在暂停并完成传输后、我发现 I2C_ReceivmasterSingleByte 实际上不发送 NACK 或 STOP。 为什么它接收的内容远不止一个字节?

为什么 在 I2C_masterReceiveSingleByte 之后它会使总线处于繁忙状态?

是否有一个使用此驱动程序进行 I2C 读取的良好示例?

谢谢

 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    噢、当我处于这种状态时、从它剩下的忙状态中恢复的最佳方式是什么?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我认为这些示例最接近您要做的事情:

    我认为您正确、需要延迟。  请注意、在示例和 TRM 中、正在传输两个字节、具体而言、 在图26-12中的 TRM 中。 I2C 主发送器模式、即在第2个字节传输期间或之后、没有发送重复启动的机制。   

    此致、

    Chris

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢您向我提供该资源。 我希望在驾驶员中使用更高级别的代码来控制它、但这已经修复了它、对此我很感激。 最后、我的读取结果显示为:

    while (MAP_I2C_masterIsStopSent (EUSCI_B0_BASE));

    I2C_setMode (EUSCI_B0_BASE、EUSCI_B_I2C_Transmit 模式);
    I2C_masterSendMultiByteStart (EUSCI_B0_BASE、INPUTMANAGERINPUTPORTREG);

    while (!(EUSCI_B0->IFG 和 EUSCI_B_IFG_TXIFG0));

    //发送重启条件,读取一个字节,立即发送停止条件
    EUSCI_B0->CTLW0 &=~(EUSCI_B_CTLW0_TR);
    EUSCI_B0->CTLW0 |= EUSCI_B_CTLW0_TXSTT;
    while (MAP_I2C_masterIsStartSent (EUSCI_B0_BASE));
    EUSCI_B0->CTLW0 |= EUSCI_B_CTLW0_TXSTP;
    while (!(EUSCI_B0->IFG 和 EUSCI_B_IFG_RXIFG0));
    输出= EUSCI_B0->RXBUF;

    它似乎起作用、在末尾发送 NACK 并发出 STOP 信号。