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.

[参考译文] MSP430FR5994:LDC1312的 I2C 接口

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1220011/msp430fr5994-i2c-interface-to-ldc1312

器件型号:MSP430FR5994
主题中讨论的其他器件:LDC1312

大家好、MSP430网站上的

我有一个定制板上的项目。 我使用的是在 I2C 总线上带有 LDC1312 (电感数字转换器)的 MSP430FR5994 (实际上有四个 LDC、每个 LDC 在各自的 I2C 接口上)。 它是总线上的唯一器件。 MSP430是主设备。

过去、我已成功将此类代码"裸机"用于此类代码、但这次我决定使用 MSP430 Driverlub。 我想我现在要访问 LDC 寄存器来配置器件(写入寄存器、但在读取寄存器时遇到了相当大的问题。 读取寄存器时、Driverlib 返回0。 然而、从 CCS、UCBxRXBUF (对于此接口、x= 0)访问寄存器时、存储器映射寄存器中除了0。 我将范围扩大到 I2C 总线、看起来数据正在通过与 MSP430接收缓冲器相匹配的接口;但是、如前所述、Driverlib 只返回0。

该 LDC 的读取接口需要"I2C Restart"。 不确定使用 Driverlib 是否操作正确。 (setMode 语句似乎没有任何差异

MSP430的 I2C 接口在其他地方进行初始化并配置 LDC 寄存器。

我尝试了许多不同的代码、包括在收到 Driverlib 接收请求后立即读取寄存器、没有区别。 选项不足。 你怎么看?

LDC 位于 I2C 地址0x2A 处。 读取的数据为0。
BaseAddress = 0x0640 (I2C 接口 b0)、LDC1312Register = 0

简单代码:

   uint8_t RxMSB、RxLSB;

   EUSCI_B_I2C_setMode (BASEADDRESS_I2C2、EUSCI_B_I2C_TRANSMIT_MODE);

   EUSCI_B_I2C_masterSendMultiByteStart (BaseAddresss、LDC1312寄存器);   //在 I2C 总线上发送由"setSlaveAddress ()"提供的从器件地址
   EUSCI_B_I2C_masterSendMultiByteFinish (BaseAddresss、LDC1312寄存器);

   EUSCI_B_I2C_setMode (BASEADDRESS_I2C2、EUSCI_B_I2C_RECEIVE_MODE);

   EUSCI_B_I2C_masterReceiveStart (BaseAddresss);      //在 I2C 总线上发送从器件地址
   RxMSB = EUSCI_B_I2C_masterReceiveMultiByteNext (BaseAddresss);
   RxLSB = EUSCI_B_I2C_masterReceiveMultiByteFinish (BaseAddresss);

我已经尝试了几种不同的方法来读取接收缓冲区、但它始终为0。

我包含了示波器屏幕截图。

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

    查看数据表(SNOSCZ0A)的表14、寄存器0是 DATA0、我认为它=0000、直到您执行相应操作来启动器件。 寄存器0x7E (MANUFACTURER_ID)可能是更好的测试用例?

    您更正了 masterSendXX 和 masterReceiveXX 函数适当地设置 UCTR、因此 setMode 是多余的。

    为了获得一个重复启动、请省去对 EUSCI_B_I2C_masterSendMultiByteFinish ()的调用[我认为它尝试写入寄存器 DATA0=0所以无论如何你都不希望]。 也就是说、从阅读数据表来看、我不确定器件确实需要一个重复启动、即使显示这样也是如此; eUSCI_B_I2C_masterSendSingleByte ()[启动/写入/停止]可能足以设置寄存器编号。

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

    很抱歉、我之前错过了:

      RxMSB = EUSCI_B_I2C_masterReceiveMultiByteNext (BaseAddresss);

    从源来看,ReceiveMultiByteNext()不会在 RXIFG 上门控,而只是获取 RXBUF。 要在 RXIFG 上选通、您需要

      RxMSB = EUSCI_B_I2C_masterReceiveSingle (BaseAddresss);

    ReceiveMultiByteFinish()在 RXIFG 上执行门控,但到那时,您已经按1关了。

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

    谢谢 Bruce 的快速响应。 我尝试了你的建议,它确实有效。 我想如果其中一个要使用中断、就会使用"ReceiveNext"。 也尝试了您的建议来获取 DeviceID、确实成功。