TI E2E 英文论坛海量技术问答的中文版全新上线,可点击相关论坛查看,或在站内搜索 “参考译文” 获取。

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.

[参考译文] MSP430FR2433:I2C 作为从属设备不工作

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1078793/msp430fr2433-i2c-as-a-slave-is-not-working

部件号:MSP430FR2433
“线程”中讨论的其它部件: CC2642R测试

您好,

我 使用 EXP430FR2433开发套件,将 MSP430FR2433配置为从属设备,将 p1.2配置为 SDA,将 p1.3配置为 SCL,同时还启用 了 I2C 中断从主设备接收数据...... 但 I2C 中断甚至不会触发一次以接收数据。在将 SDA 和 SCL 引脚与主中继器连接时,MSP430 EVK 正在向下拉 SDA 线....ca,您可以为此提供解决方案。

在主端,我收到“I2C 总线已在使用”之类的错误

MSP430FR2433代码中的从属模式配置如下  

/*------------- GPIO 配置------------------------------------------------------- *

无效 GPIO 配置()

GPIO 设置外围模块功能输入引脚(
GPIO 端口 P1,
MSP_I2C_SDA | MSP_I2C_SCL,
GPIO 主模块功能
);

PM5CTL0和=~LOCKLPM5;

}

/*------------- 唾液模式--------------------------- *

void set_i2c_Slive_mode ()

PARAM_i2c_SLAVE .slaveAddress =从属地址;  //从属 地址= 0x44
PARAM_i2c_SLAVE .slaveAddressOffset = EUSCI_B_I2C_OFFSET0; // EUSCI_B_I2C_OW_ADDREST_OFFSET0 =  0x00
PARAM_i2c_SLAVE .slaveOwnAddressEnable = EUSCI_B_I2C_OW_ADDREST_ENABLE;// EUSCI_B_I2C_OW_ADDREST_ENABLE = UCOAEN
EUSCI_B_I2C_initSlave_寄存 器(EUSCI_B0_BASE,&param_i2c_Slave);

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

EUSCI_B_I2C_ClearInterrupt (EUSCI_B0_BASE,
EUSCI_B_I2C_Transmit INTERRUPT0 |
EUSCI_B_I2C_receive_INTERRUPT0 |
EUSCI_B_I2C_CLOCK_LOW_TIMEOUT_INTERRUPT |
EUSCI_B_I2C_STOP_INTERRUPT
);

EUSCI_B_I2C_enableInterrupt (EUSCI_B0_BASE,
EUSCI_B_I2C_receive_INTERRUPT0 |
EUSCI_B_I2C_CLOCK_LOW_TIMEOUT_INTERRUPT |
EUSCI_B_I2C_STOP_INTERRUPT
);

UCB0CTLW1 |= UCCLTO_3;//(clk 低超时约34毫秒)

}

/*------------- 中断----------------------- *

#pragma vector=USCI_B0_vector

_interrupt void USCIB0_ISR(void)// ISR 内禁用的所有中断

}

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

    您是否可以使用逻辑分析仪捕获波形? 就像莎拉

    建议使用此演示代码 https://dev.ti.com/tirex/explore/node?node=ACgjYchX9i5RkshXLLcisA__IOGqZri__LATEST 

    您可以根据应用程序修改此演示代码。

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

    没有我已经尝试过的代码,它没有工作,MSP430仍在拉低 SDA。您可以提供其他解决方案吗?

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

    演示代码应该能够正常工作,我们已经多次验证。 主方是什么? 为什么要确认此问题与 MSP430相关,而不是主机设备相关?

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

    不是,它不起作用,这里 CC2642R TI 控制器是主控制器,MSP4302433 TI 控制器是从控制器......我们正在向从控制器传输1字节数据,但是

    在从端代码中,I2C 接口不调用.....

    #pragma vector = USCI_B0_vector

    __中断无效 USCI_B0_ISR (无效)

    }

    主端,我们收到的错误是“I2C 从地址0x48未被确认!”......

    主 I2C 配置代码:

    /*创建 I2C 以供使用*/
    I2C_Params_init (&i2cParams);
    i2cParams.bitrate = I2C_100kHz;
    I2C = I2C_OPEN (CONFIG_I2C_TMP,&i2cParams);
    如果(i2c == NULL)为{
    DISPLAY_printf (DISPLAY,0,0,“正在初始化 I2C 时出错\n”);
    同时(1);
    }
    否则{
    display_printf (display,0,0,"I2C initialized!\n");
    }

    /*通用 I2C 事务设置*/
    i2cTransaction.writeBuf = txBuffer;
    i2cTransaction.writeCount = 1;
    i2cTransaction.readbuf = rxBuffer;
    i2cTransaction.ReadCount = 0;

    i2cTransaction.slaveAddress = 0x48;
    txBuffer[0]= 0x03;

    While (1)(同时)

    如果(I2C_TRANSFER (i2c,&i2cTransaction))为{

    display_printf (display,0,0,"检测到从属地址");
    }
    否则{
    i2cErrorHandler (&i2cTransaction,显示);
    }

    睡眠(1);
    }

    /*睡眠1秒*/
    睡眠(1);


    I2C_CLOSE (i2c);

    从 I2C 配置代码:

    使 initI2I()无效

    UCB0CTLW0 = UCSWRST;//软件重置已启用
    UCB0CTLW0 |= UCMODE_3 | UCSYNC;// I2C 模式,同步模式
    UCB0I2COA0 =从_ADDR | UCOAEN;//自有地址并启用
    UCB0CTLW0 &=~UCSWRST;//清除重置寄存器
    UCB0IE |= UCRXIE + UCSTPIE;
    }  

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

    你的方面肯定有一些问题。 您是否使用了没有任何代码更改的演示代码? 如果您更改了,请向我展示您更改的位置。

    在进行测试时,请帮助捕获 SCL 和 SDA 波。

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

    我没有更改从属代码上的任何内容...根据从属代码,我更改了从属地址,并在主代码中注册了地址。

    但  下面提到的 I2C 中断调用不是在 MSP 端调用...

    #pragma vector = USCI_B0_vector

    __中断无效 USCI_B0_ISR (无效)

    }

    在主要功能中,我启用了 interupt,如下所示

    __bis_SR_register (LPM0_bits + GIE);

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

    同时,我还尝试了 MSP430控制器作为主控制器,同时按照以下函数编写了内容..... 它在“__bis_sr_register (LPM0_bits + GIE)”;“ 此行...”处阻塞  

    I2C_Mode I2C_Master_WriteReg (uint8_t dev_addr,uint8_t reg_addr,uint8_t *reg_data,uint8_t 计数)

    /*初始化状态机*/
    MasterMode = TX_REG_ADDRESS_MODE;
    TransmitRegAddr = REG_ADDR;

    //将寄存器数据复制到 TransmitBuffer
    CopyArray(reg_data, TransmitBuffer, count);

    TXByteCtr =计数;
    RXByteCtr =0;
    接收索引=0;
    TransmitIndex = 0;

    /*初始化从属地址和中断*/
    UCB0I2CSA = dev_addr;
    UCB0IFG &=~(UCTXIFG + UCRXIFG);//清除任何待处理中断
    UCB0IE &=~UCRXIE;//禁用 RX 中断
    UCB0IE |= UCTXIE;//启用 TX 中断

    UCB0CTLW0 |= UCTR + UCTXSTT;// I2C TX,启动条件
    __bis_SR_register (LPM0_bits + GIE);//输入 LPM0,带中断   --- >此处已阻止  

    返回主模式;
    }

     在传输下面提到的数据时,中断处理程序也没有调用...

    #pragma vector = USCI_B0_vector


    __中断无效 USCI_B0_ISR (无效)

    }

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

    大家好,我已经测试了演示代码,没有问题。 我使用 FR2355启动板作为主机,使用 FR2433启动板作为从属设备,效果很好。 我使用逻辑分析仪 Saleaa 捕获以下波形

    e2e.ti.com/.../Session-0.sal

    你能在这里捕捉一些波浪吗?