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.

[参考译文] MSP430FR2476:Euscib-I2C -第一个字节不是从第二个传输开始传输

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/931045/msp430fr2476-euscib-i2c---first-byte-not-transmitted-starting-from-second-transmission

器件型号:MSP430FR2476

大家好、

由于 Bruce 的帮助、我正在项目中取得进展、但有时我仍然面临一些奇怪的问题。

现在、我此刻遇到的问题是、由于某种原因、我的 I2C 寄存器写入函数停止工作

如果我多次调用它、则会正确地执行该操作。  

详细介绍:为了与我使用的器件(ST25DV)通信、我需要在 I2C 上发送以下结构

I2CADDRESS | REG_MSB | REG_LSB | DATA_1 |... | DATA_n | STOP

实质上、我需要传输2个字节的寄存器地址和1...n 个字节的数据以写入寄存器。 到目前为止都很好。

为此、我根据 EUSCI_I2C driverlib 编写了此函数

int ST25DV_register_write (uint8_t * dataBytes、uint16_t memAddress、uint8_t numberOfBytes、uint8_t device_address)
{
//指定从器件地址
EUSCI_B_I2C_setSlaveAddress (EUSCI_B1_BASE、
DEVICE_ADDRESS
);

//设置为发送模式
EUSCI_B_I2C_setMode (EUSCI_B1_BASE、
EUSCI_B_I2C_Transmit 模式
);

//启用 I2C 模块以启动操作
EUSCI_B_I2C_ENABLE (EUSCI_B1_BASE);

_DELAY_CYCLES (1000);
//发送单字节数据。
EUSCI_B_I2C_masterSendMultiByteStart (EUSCI_B1_BASE、
memAddress >> 8);

EUSCI_B_I2C_masterSendMultiByteNext (EUSCI_B1_BASE、
memAddress 和0xFF
);
while (!eUSCI_B_I2C_getInterruptStatus (eUSCI_B1_base、eUSCI_B_I2C_Transmit _INTERRUPT0))/* empty*/;//等待移位寄存器完成

uint8_t totalSent = 0;
while (totalSent < numberOfBytes - 1)
{
EUSCI_B_I2C_masterSendMultiByteNext (EUSCI_B1_BASE、
dataBytes[totalSent]
);
totalSent++;
}
EUSCI_B_I2C_masterSendMultiByteNext (EUSCI_B1_BASE、
dataBytes[totalSent]
);

while (!EUSCI_B_I2C_getInterruptStatus (EUSCI_B1_BASE、EUSCI_B_I2C_Transmit、INTERRUPT0)))
EUSCI_B_I2C_masterSendMultiByteStop (EUSCI_B1_BASE);
while (!EUSCI_B_I2C_getInterruptStatus (EUSCI_B1_BASE、EUSCI_B_I2C_Transmit、INTERRUPT0)))

EUSCI_B_I2C_DISABLE (EUSCI_B1_BASE);

返回0;
} 

I2C (速度、引脚等)的初始设置在开始时完成一次。

现在、假设我要在寄存器0x0000中写入"0xA0"。 如果这是对 WRITE_REGISTER 函数的第一次调用、我将获得下面屏幕截图中报告的正确跟踪。

 

如果我想执行相同的操作、但在我已经调用 WRITE_REGISTER 函数来写入其他内容之后、这就是我得到的跟踪

如您所见、地址的第一个字节丢失。  

在这里的先前讨论中()

建议在发送下一个字节之前等待传输结束、正如您在代码中看到的那样、这就是我正在做的事情。

我尝试了不同的 driverlib 函数组合(例如、使用 sendNextByte、然后在传输结束时发送 Stop)、  

但我始终会得到相同的错误行为。 我还尝试在启动新的 I2C 传输之前插入 delay_cycles、但再次尝试、运气不佳。

提前感谢您的帮助、祝您愉快!

Lorenzo

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

    您好 Lorenzo、

    查看上一个主题、我看到没有人向您介绍我们的应用报告、该报告专门用于串行通信的调试。 我将向您发送其中的链接。 也许它不仅能帮助您完成 I2C 调试的这一实例。

    此致

    Peter