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.

[参考译文] LP-MSP430FR2476:通过 I2C 与 LP5569进行通信时出现问题

Guru**** 2535150 points
Other Parts Discussed in Thread: LP5569, MSP430FR2476

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/980577/lp-msp430fr2476-trouble-communicating-via-i2c-with-lp5569

器件型号:LP-MSP430FR2476
主题中讨论的其他器件:LP5569MSP430FR2476

我无法建立从 MSP430FR2476 (主器件)到 LP5569 (从器件) LED 驱动器的多字节中断驱动 I2C 通信。 我已经按照这些示例设置了一些框架代码、我只想向 LP5569写入两个字节。 也就是、我需要向其发送一个控制寄存器地址、以及要写入该控制寄存器的数据。 我将0x40用作从器件地址的值。

下面是我尝试执行的操作的大致草图:

#include "driverlib.h"
#include 

#define SLAVE_ADDRESS 0x40


//指向 TX 数据的指针
uint8_t TXData = 0;
uint8_t TXByteCtr;

void main (void)
{
WDT_A_HOLD (WDT_A_base);

//为 I2C 配置引脚
GPIO_setPeripheralModuleFunctionInputPin (
GPIO_PORT_P1、
GPIO_PIN2 + GPIO_PIN3、
GPIO_PRIMARY_MODULE_FUNCTION
);

/*
*禁用 GPIO 上电默认高阻抗模式以激活
*先前配置的端口设置
*
PMM_unlockLPM5 ();

EUSCI_B_I2C_initMasterParam param ={0};
param.selectClockSource = EUSCI_B_I2C_CLOCKSOURCE_SMCLK;
param.i2cClk = CS_getSMCLK ();
param.datarate = EUSCI_B_I2C_SET_DATA_RATE_400KBPS;
param.byteCounterThreshold = 0;
param.autoSTOPGeneration = EUSCI_B_I2C_NO_AUTO_STOP;
EUSCI_B_I2C_initMaster (EUSCI_B0_BASE、param);

//指定从器件地址
EUSCI_B_I2C_setSlaveAddress (EUSCI_B0_BASE、
从器件地址
);

//将主设备设置为接收模式
EUSCI_B_I2C_setMode (EUSCI_B0_BASE、
EUSCI_B_I2C_Transmit 模式
);

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

EUSCI_B_I2C_clearInterrupt (EUSCI_B0_BASE、
EUSCI_B_I2C_Transmit INTERRUPT0 +
EUSCI_B_I2C_NAK_INTERRUPT
);
//启用主机接收中断
EUSCI_B_I2C_enableInterrupt (EUSCI_B0_BASE、
EUSCI_B_I2C_Transmit INTERRUPT0 +
EUSCI_B_I2C_NAK_INTERRUPT
);
EUSCI_B_I2C_masterSendMultiByteStart (EUSCI_B0_BASE、0x40);
for (;;;))}//------------------



// USCIAB0TX_ISR 的结构使其可用于通过
预加载带有字节计数的 TXByteCtr 来发送任何//字节数。 此外、TXData
//指向要发送的下一个字节。
///----------------------------------
#pragma vector=USCI_B0_vector
__interrupt void USCIB0_ISR (void)
{
switch (__evo_in_range (UCB0IV、USCI_I2C_UCBIT9IFG)
){
USCI_NONE 案例: //无中断中断中断;
中断;
USCI_I2C_UCALIFG 案例: //仲裁丢失
中断;
案例 USCI_I2C_UCNACKIFG://接收到 NAK (仅限主器件)
//重新发送启动(如果 NACK)
EUSCI_B_I2C_masterSendStart (EUSCI_B0_BASE);
中断;
USCI_I2C_UCTXIFG0案例: // TXIFG0
//检查 TX 字节计数器
//未达到此点
EUSCI_B_I2C_masterSendNextByte (EUSCI_B0_BASE、0x40);
中断;
默认值:
中断;
}


代码在到达任何中断代码之前挂起。 在 eusci_b_i2c.c 中的多字节开始调用中,程序在 EUSCI_B_I2C_masterSendMultiByteStart()中的以下行上挂起:

//轮询发送中断标志。
while (!(HWREG16 (baseAddress + OFS_UCBxIFG)& UCTXIFG));

我还想知道解决此问题的最佳方法是什么。 我按照 driverlib 的用户指南来配置 I2C 模块、GPIO 引脚肯定设置正确。 我已经浏览过该程序、看起来所有中断标志都已正确设置。 非常感谢您的任何建议! 提前感谢。

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

    您好、Sourabh、

    在启用全局中断 GIE 之前、您不会获得任何中断。

    请尝试此操作

       _bis_SR_register (GIE);

    调用 masterSendMultiByteStart()之前

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

    尊敬的 Dennis:

    感谢您的及时响应。 不幸的是、即使启用了 GIE 位、我仍会在同一代码行挂起。 当我通过调试器进入程序时、我还可以看到 NACK 和发送中断0使能位也被置位。

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

    您好、Sourabh、

    您是否有逻辑探头或示波器、可在这段时间内对 I2C 总线进行快照?

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

    大家好、Dennis、感谢您的回复。 我现在正在获取示波器。

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

    您好、Sourabh、

    您是否能够获得示波器?

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

    我从您那里听说过几天,因此我假设您能够解决您的问题。
    如果情况并非如此,请单击“这无法解决我的问题”按钮,并使用更多信息回复此主题。
    如果此主题锁定、请单击"提出相关问题"按钮、然后在新主题中描述您的问题的当前状态以及您可能需要帮助我们帮助解决您的问题的任何其他详细信息。

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

    嘿 Dennis、我无法获得振荡、但我设法找到了解决问题的方法。 通过关闭 TX 中断并使用驱动程序库中的超时函数、我能够与 LP5569器件进行通信。