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.

[参考译文] EVM430-FR6043:通过 I2C 连接和连接外部传感器时出现问题

Guru**** 2463330 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1396999/evm430-fr6043-issue-connecting-and-interfacing-with-external-sensor-via-i2c

器件型号:EVM430-FR6043

工具与软件:

尊敬的 TI 支持部门

我正在尝试使用 I2C 通信通过 GPIO 引脚将外部温度传感器连接到电路板。  

在完全集成之前、我想简单地测试连接和发送/接收数据。 为此、我将传感器连接到 SDA 的3.3V、GND、P1.7 (在 BoosterPack 引脚上)和 SCL 的 P1.6。 下面您可找到用于此测试的代码。 绝不会发送启动条件、并且代码会卡在第一个 while 循环上。 我将一个逻辑分析仪连接到上述引脚、但未读取传输的任何数据、也无法看到时钟周期。 引脚开始便处于高电平状态并保持不变。

您能向我指出遗漏的正确方向吗?

此致、

1月

#include <msp430.h>

void main(void) {
    WDTCTL = WDTPW | WDTHOLD;    // Stop watchdog timer
    initI2C();

    // Example I2C communication code
    UCB0CTLW0 |= UCTXSTT;        // Generate a start condition

    while (UCB0CTLW0 & UCTXSTT); // Wait for start condition to be sent

    // Continue with I2C communication
    UCB0TXBUF = 0x55;            // Send a byte of data (example: 0x55)
    while (!(UCB0IFG & UCTXIFG)); // Wait for data to be transmitted
    UCB0CTLW0 |= UCTXSTP;        // Generate STOP condition
    while (UCB0CTLW0 & UCTXSTP); // Wait for STOP condition to complete

    while (1); // Main loop
}

void initI2C(void) {

    // Initialize eUSCI_B0 (I2C)
    UCB0CTLW0 = UCSWRST;         // Put eUSCI_B0 in reset

    // Configure I2C pins (example for P1.6 and P1.7)
    P1SEL1 |= BIT6 | BIT7;       // Set Pins to I2C function
    P1SEL0 &= ~(BIT6 | BIT7);

    // Configure eUSCI_B0 for I2C master mode
    UCB0CTLW0 |= UCMODE_3 | UCMST | UCSSEL_2;  // I2C mode, Master mode, use SMCLK
    UCB0BRW = 0xA;                // Set baud rate (example: SMCLK at 1MHz for 100kHz SCL)
    UCB0I2CSA = 0x28;            // Set slave address (example: 0x48)

    UCB0CTLW0 &= ~UCSWRST;       // Release eUSCI_B0 from reset
}

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

    > UCB0CTLW0 = UCSWRST;//将 eUSCI_B0复位

    这会设置 UCSYNC=0、但 I2C 需要 UCSYNC。 (它也会清除 UCSSEL、但稍后将其置回。) 您可以稍后设置 UCSYNC=1或

    > UCB0CTLW0 |= UCSWRST;//将 eUSCI_B0复位

    ---

    > UCB0CTLW0 |= UCTXSTT;//生成起始条件

    您似乎正在尝试进行写入(主发送器)、因此您需要:

    > UCB0CTLW0 |= UCTR | UCTXSTT;//生成 R/W=0的启动条件

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

    你好、Bruce

    感谢您抽出宝贵时间回答!  

    我根据您的建议修改了代码、但在逻辑分析仪上没有看到任何明显的差异。 我将在此处附上一张装置的照片。 我是否至少可以通过逻辑分析仪看到时钟信号? (黄色和黑色(大)连接器接地、在电路板上连接 SCL 引脚。 我知道这张照片的针脚上没有黑色。 测试时它是打开的)

    此致!

    1月

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

    您还需要添加以下命令(在调用 initI2C 时的某处):

    > PM5CTL0并且=~μ A LOCKLPM5;//启用 GPIO

    如果您的目标器件未连接、我想您会得到一个 NACK (UCNACKIFG)、因此最终会卡在 UCTXIFG 环路中。

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

    非常感谢!!! 它正在工作。

    令人惊叹的支持