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**** 1688270 points
Other Parts Discussed in Thread: TLV320DAC3203, MSP430FR2633
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1269414/msp430fr2633-initializing-i2c

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

大家好,

我很抱歉用这个无聊的问题来打扰你,但我需要帮助。

我正在尝试在 MSP430FR2633上使用 I2C、将主器件配置数据发送到 TLV320DAC3203。
我看着我能得到的一切作为例子,但我仍然有疑问。

您是否愿意在此处查看我的代码片段并在此方面为我提供指导?

提前感谢您的参与!

古斯塔沃

#包含
#包含
#include "driverlib.h"
#include "eusci_b_i2c.h"

#define MCLK_FREQ_MHz 2.8224
#define SLAVE_ADDRESS 0x30


configureClocks_to2822400Hz ();                            // MCLK 调整为2.8224 MHz

空 I2C_masterInit ()
{
   _BIC_SR_register (GIE);
   UCB0CTLW0 = UCSWRST;                                      //启用软件复位
   UCB0CTLW0 |= UCMODE_3 | UCMST | UCSSEL__SMCLK | UCSYNC;   // I2C 主模式、SMCLK
   UCB0BRW = 28;                                      // fSCL = SMCLK/28 = 282200/28 = 100800Hz
   UCB0I2CSA = SLAVE_ADDRESS;                            //从地址
   UCB0CTL1 &=~μ H UCSWRST;                                // eUSCI_B 处于运行状态
   UCB0CTLW0 &=~μ H UCSWRST;                               //清除软件复位,恢复操作
   UCB0IE |= UCTXIE;                                    //启用 TX 中断
   UCB0IE |= UCNACKIE;
   __ bis_SR_register (GIE);                              //通用中断使能


EUSCI_B_I2C_masterSendMultiByteStart (slave_address、regAddress);
eUSCI_B_I2C_masterSendMultiByteNext (slave_address、dataValues [j]);
eUSCI_B_I2C_masterSendMultiByteFinish (slave_address、dataValues [ numDataValues - 1]);

int main (void){
   WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器

   //为 I2C 配置 I/O 引脚
   // P1.7-SMCLK

   P1SEL |= BIT6 + BIT7;
   P1SEL2 |= BIT6 + BIT7;

   I2C_masterInit ();                                  //初始化 I2C

   //发送 I2C 启动条件
   SendMyValues ()
   
   //在函数 SendMyValues ()内部,我正在使用以下函数:
   // eusci_b_i2c.c (驱动程序库- eusci_b_i2c 模块的驱动程序。):

   // eUSCI_B_I2C_masterSendMultiByteStart (slave_address、regAddress);
   // eUSCI_B_I2C_masterSendMultiByteNext (slave_address、dataValues [j]);
   // eUSCI_B_I2C_masterSendMultiByteFinish (slave_address、dataValues [ numDataValues - 1]);i2cccccc

   Free (dataValues);                                  //为 dataValues 释放动态分配的内存
   
   __ bis_SR_register (CPUOFF);                            //进入低功耗模式

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

    您似乎没有在"configureClocks_to2822400Hz ()"中添加任何内容。

    您能用振荡器同时捕捉波形吗?

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

    您好、Eason、

    我没有包括函数"configureClocks_to2822400Hz ()"、因为时钟2.8224 MHz (MCLK 和 SMCLK)已在 2.8224 MHz 的 propperly 工作。

    我要回答的问题涉及从 I2C 本身进行初始化。

    例如、我不确定我是否必须先清除 GIE 并在配置结束时再次将其设置。 这是在函数"I2C_masterInit ()"中做得很好吗,还是应该在"main ()"中设置这一点,就像我见过的一些例子吗?

    此外,关于这两行,我不知道:
    UCB0IE |= UCTXIE;                                    //启用 TX 中断
    UCB0IE |= UCNACKIE;

    到目前为止、我的代码中未使用任何中断例程。 一切都是从"main ()"和"SendMyValues ()"调用的。
    稍后我将使用 MSP 的触控功能、但现在我只需要让 TLV320DAC3203工作。

    我现在正在旅行、不在示波器附近、也没有放在我旁边的电路板。 不过、在我再次进行一些测试之前、最好确保代码正确无误。

    例如、我有一个问题、那就是在假设 I2C 发送数据时 SDA 不会改变状态(当通过软件将 SDA 引脚拉为高电平进行测试时、在没有激活 I2C 的情况下、硬件会正常工作)
    SCL 引脚也正常工作。

    但"eUSCI_B_I2C_masterSendMultiByteStart (slave_address、regAddress);"的行轮询中存在残桩、以查看发送中断标志。

    因此、如果可能的话、我决定从头开始、在 TI 的监督下重新配置所有内容。

    我希望你现在能更好地理解这种情况。

    感谢您的帮助!

    此致、

    古斯塔沃

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

    #define SLAVE_ADDRESS 0x30

    根据 TLV320DAC3203数据表(SLOS756B)第7.3.8.1节、其 I2C 地址为0x18、而不是0x30。 (R/W 位不是地址的一部分。)

    ----------------

    >  UCB0IE |= UCTXIE;                                    //启用 TX 中断
    >  UCB0IE |= UCNACKIE;

    如果你没有 ISR (我没有看到)、你不应该设定这些 IE 位。

    ----------------

    > EUSCI_B_I2C_masterSendMultiByteStart (slave_address、regAddress);

    第一个参数提供 EUSCI (寄存器)地址、而不是从器件地址、类似于:

    > EUSCI_B_I2C_masterSendMultiByteStart (EUSCI_B0_BASE、regAddress);

    类似地执行其他调用。

    ----------------

    如果您多次调用该写入序列、最好在每个序列之前添加以下内容:  

    > while (EUSCI_B_I2C_isBusBusy (EUSCI_B0_BASE))/* empty*/;

    确保之前的操作(特别是停止条件)已完成。

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

    Bruce、您好!

    感谢您的快速反应!

    关于从器件地址、我犯了一个错误、或者说更好的一点是、我在 Ivan Salazar 的回答中回答了为什么数据表中的地址与 EVM GUI 脚本中的地址不符。
    我知道我可以继续将地址设置为0x30。 抱歉。

    但是、我仍然无法获取从器件地址的信息。
    我看到的每一个例子都是不同的,因为做了一些特别的东西。
    我能找到的最简单的代码是"eusci_b_i2c_ex4_masterTxSingle"。
    定义了:

    //设置从模块的地址。 这是中发送的7位地址。
    //以下格式:
    //[ A6:A5:A4:A3:A2:A1:A0:RS ]
    //
    //第一个字节的 RS 位置处的零表示主机
    //发送(发送)数据到所选的从机,并且一个在这个位置
    //表示主设备接收从设备发送的数据。
    //
    //*****
    #define SLAVE_ADDRESS 0x48、

    01001000作为最后一个位"0"表示"发送"。 对吧?
    但是、在"eusci_b_i2c_ex2_masterRxSingle"示例中、从器件地址是相同的。 我预计这里为"0x49"(01001001)
    我不知道这一点吗?

    如果在本例中、TLV320DAC3203的地址为0x18、那么'DAC320' RS 位会在哪里?

    你看,我在这件事上有点失落。

    "我不想让你知道,我不想让你知道。" 我在这件事上一直在努力超越我的知识。 我最好先尝试"eusci_b_i2c_ex4_masterTxSingle"、然后查看应用情况。

    这样、我就能解释一下有关从器件地址的内容。

    此致、

    古斯塔沃

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

    包含从机地址和 R/W 位的8位(我不认为我听说过术语"SLA"位)通常被称为 RS 字节"。 I2C 单元根据 UCTR 设置插入 R/W 位。 我怀疑地址0x48的唯一意义在于、它与 ex4_slaveRxSingle 中选择的地址相匹配。 (它可以放入7个位。)

    可以肯定的是、许多数据表并未非常明确(您的数据表)说明这一区别。 第一个线索是、如果他们说读写有不同的"地址"、在这种情况下(可能)地址是那些右移1位的值中的任何一个。

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

    谢谢 Bruce、现在我明白了。
    正如我说过的、我将回到最后面、尝试一下示例(对我的硬件进行必要的修改)。
    我想、我们现在可以结束这个话题了。 "我不会介意的,我想要的只是要和你在一起。"
    和往常一样、TI 拥有最好的服务。 这是一个愉快的,再次感谢!
    此致、
    古斯塔沃