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:Eusc12B I2C 卡在 EUSCI_B_I2C_masterSendSingleByte 函数中

Guru**** 2529700 points
Other Parts Discussed in Thread: TMP102

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/929968/msp430fr2476-euscib-i2c-gets-stuck-in-eusci_b_i2c_mastersendsinglebyte-function

器件型号:MSP430FR2476
主题中讨论的其他器件:TMP102

因此、我修复了 I2C 上的第一个问题、我首先要获取的是在 while 环路中查看  

在我的逻辑分析仪上传输虚拟字节。 我的当前代码如下所示

#include "driverlib.h"
#include 
#include 

/*全局定义*/
#define CS_MCLK_NEVed_frequency in_kHz 16000 /**<以 kHz 为单位的 MCLK 目标频率*/
#define CS_MCLK_FLLREF_Ratio 488/**< MCLK/FLLRef 比率*/

int main (void)
{
volatile uint32_t i;
uint8_t transmitData;
WDT_A_HOLD (WDT_A_base);

GPIO_setAsInputPinWithPullUp电 阻(GPIO_PORT_P3、GPIO_PIN2 | GPIO_PIN6);
GPIO_setPeripheralModuleFunctionInputPin (
GPIO_PORT_P3、
GPIO_PIN2 + GPIO_PIN6、
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_B1_base、&param);
//指定从器件地址
EUSCI_B_I2C_setSlaveAddress (EUSCI_B1_BASE、
0x48
);

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

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


while (1)
{
EUSCI_B_I2C_masterSendSingleByte (EUSCI_B1_BASE、
0xAA //首先发送地址的 MSB
);

for (i=100000;i>0; i--);
}
} 



通常希望在逻辑分析仪上看到一个试图寻址0x48的传输序列、由于外设未连接、所有这些都以一个 NAK 结束。 
我得到的是单次传输、如下面的屏幕截图所示

然后 SCL 线路保持低电平。
通过调试代码、我发现程序卡在 eusci_b_i2c.c 文件的第192行、函数 EUSCI_B_I2C_masterSendSingleByte ()的以下指令

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

这是因为未连接外设吗? 如何解决此问题? 提前感谢!

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

    我不知道为什么上面的帖子如此混乱… 请在图片下方找到、

    我所期望的是看到一系列 NAK、而不仅仅是一个 NAK。

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

    EUSCI_B_I2C_masterSendSingleByte 不会检查 NACK、因此在这种情况下它将挂起。 如果您认为 NACK 是可能的/可能的、请改用 EUSCI_B_I2C_masterSendSingleByteWithTimeout (我认为您需要在发生故障时发送 Stop)。

    您是否相当确定您的 I2C 地址正确? 请记住、R/W 位不是地址的一部分。 我在 Adafruit 列表中看到的唯一"主流"0x48器件是 TMP102。 您使用的是这种器件吗?

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

    Bruce、您好!

    感谢您的回复、这解决了我的问题。 实际上、目前我只是研究了 I2C 在 driverlib 上的工作原理、所以我没有将任何器件连接到 I2C 引脚。 0x48只是我在 TI 示例中找到的值、我没有更改它。

    您的解决方案工作得非常完美、现在我得到了 nack (如预期的那样)、但 MSP 不会挂起。

    非常感谢!