大家好、
由于 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