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.

[参考译文] MSP430FR2633:I2C 数据线问题

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/831269/msp430fr2633-problem-with-i2c-data-line

器件型号:MSP430FR2633
主题中讨论的其他器件:HDC2010

我正在使用驱动程序库的 I2C 主 Tx 单个示例在我们的 I2C 总线上进行传输。  我已修改示例以删除时钟初始化(因为已经在 CAPT_BSP 中确认它们正确)、并将 GPIO_setPeripheralModuleFunctionInputPin ()切换到2633的正确端口。  在 将调用发送到 EUSCI_B_I2C_isBusBusy 之前,我还添加了对 EUSCI_B_I2C_SendmasterSingleByte ()的调用。

看一下总线、我会看到传输开始时的时钟。  但是、SDA 保持低电平、因此我们不会获得启动条件、也不会看到任何数据。

我已经确认我们的上拉电阻(3.3k)被放置、并将他连接到其中一个从器件。

代码:

WDT_A_HOLD (WDT_A_base);

//////设置比率和所需的 MCLK 频率并初始化 DCO
// CS_initFLSettle (
// CS_SMCLK_REVed_frequency in_kHz、
// CS_SMCLK_FLLREF_Ratio
// );
//
//////设置 SMCLK = DCO,分频器为1
// CS_initClockSignal (
//CS_SMCLK、
//CS_DCOCLKDIV_SELECT、
//CS_Clock_divider _1
//);
//
//////设置 MCLK = DCO,分频器为1
// CS_initClockSignal (
//CS_MCLK、
//CS_DCOCLKDIV_SELECT、
//CS_Clock_divider _1
//);
//
//为 I2C 配置引脚
/*
*选择端口5
*将引脚2、3设置为具有功能的输入、(UCB0SIMO/UCB0SDA、UCB0SOMI/UCB.S)。
*
GPIO_setPeripheralModuleFunctionInputPin (
GPIO_PORT_P1、
GPIO_PIN2 + GPIO_PIN3、
GPIO_PRIMARY_MODULE_FUNCTION
);

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

//初始化传输数据包
transmitData = 0x01;

//初始化主设备
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 = 1;
param.autoSTOPGeneration = EUSCI_B_I2C_NO_AUTO_STOP;
EUSCI_B_I2C_initMaster (EUSCI_B0_BASE、param);

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

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

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

while (1)
{
while (EUSCI_B_I2C_isBusBusy (EUSCI_B0_BASE));

//发送单字节数据。
EUSCI_B_I2C_masterSendSingleByte (EUSCI_B0_BASE、
传输数据
);

//延迟直到传输完成
while (EUSCI_B_I2C_isBusBusy (EUSCI_B0_BASE));

//每次传输之间的延迟
_DELAY_CYCLES (50);

//递增发送数据计数器
transmitData++;
}

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

    您好 Jason、

    根据您的时序图、我看到您缺少从器件"ACK"(第九个时钟位被从器件保持在低电平)、因此我猜您没有将"从器件"连接到总线、如果是、您知道它的从器件地址是什么?

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

    我尝试通过此测试解决的问题是 TI HDC2010。  它的 ADDR 信号接地、因此我希望其地址为0x40。  您完全正确、我在地址上犯了错误。  我一直使用正确的地址、但已恢复到示例中的地址、这是不正确的。  更复杂的是、我测量 SDA 时所处的测试点存在问题。  我在另一个点切换到读取 SDA (在更正地址后)并确认功能正确。  谢谢。