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.

[参考译文] CCS/MSP430F5659:当我在 MSP430F5659中将 DCO 设置为25MHz 时出现 I2C 通信问题

Guru**** 2390755 points
Other Parts Discussed in Thread: HDC1080, MSP430F5659

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/833671/ccs-msp430f5659-i2c-communication-problem-when-i-set-the-dco-at-25-mhz-in-msp430f5659

器件型号:MSP430F5659
主题中讨论的其他器件:HDC1080

工具/软件:Code Composer Studio

大家好、

这是 Vikas、我在 MSP430F5659上执行一个项目、我  通过 I2C 连接 HDC1080和 DS3231、它工作正常、但当我将 DCO 设置为25MHz 以通过 SPI 运行 LCD 时、会发生问题。 它不会从该 IC 读取任何值

因此、我想说、请帮我、这样我就可以从 IC 中读取值、

在 i2c 中,是否有任何方法可以将数据速度降低到25MHz 到1.04MHz (控制器),因为当我们设置 DCO 时,所有问题都会发生,因此我们将决定降低 I2C 的速度,但我们如何降低速度, 或任何建议、以便我们在设置 DCO 后从该 IC 读取值。

等待积极响应

Vikash

COMCON 工业

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

    你好 Vikash

    我们建议遵循高达20MHz 的规格。 在25MHz 时可能会出现问题。

    您可以将频率降低至20MHz、以查看它是否可以正常工作。

    尽管 I2C 可以设置为大约600kHz,但规格中的 I2C 速度最大为400kHz

    建议 在400kHz 时使用。

    如果您要设置 I2C 的速度、请参阅以下链接:

    http://dev.ti.com/tirex/explore/node?compilers=ccs&devices=MSP430F5659&node=AKq9lM2TKZdDkf4SQilT2Q__IOGqZri__LATEST&search=F5659

    此致

    Junkai

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

    Junkai 您好!

    感谢您的建议。

    我已将 DCO 设置为16MHz、现在它的工作数据正在从 DS3231读取

    但我通过 I2C 连接了另一个器件、并且我没有从 HDC1080获取数据。但是、当我使用1.04 MHz 的控制器时钟频率时、I2C 都可以正常工作。

    因此、我恳请您 帮助、为什么在我将 DCO 设置为16MHz 时无法获取数据、背后有什么问题。

    等待积极响应

    Vikash Chandra Raman

    COMCON 工业

    印度

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

    你好 Vikash

     DS3231可以在16MHz (控制器)下工作、但 HDC1080不能工作。

    它可能是由 HDC1080 I2C 设置的配置故障引起的

    您能不能显示您的代码。

    谢谢

    此致

    Junkai

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

    Junkai 您好!

    我将附上 i2c 的代码、如果我写了错误、请看一下并纠正我的错误。


    void I2C_init1 (void)

    OUT1 &=~(sda1 | SCL1);
    dir1 &=~(sda1 | SCL1);

    空 I2C_Start1 (空)

    //将 SDA 和 SCL 的方向设置为输入、通过上拉电阻器将其驱动为高电平
    dir1 &=~(sda1 | SCL1);
    dir1 |= sda1;//开始条件。 在 SCL 为高电平时将 SDA 驱动为低电平
    DIR1 |= SCL1;//然后将 SCL 驱动为低电平

    void I2C_Restorart1 (void)

    unsigned int i=0;
    dir1 &=~sda1;//设置为输入分辨率拉高
    DIR1 &=~SCL1;//设置为输入分辨率拉高

    i<<=1;
    dir1 |= sda1;//设置为输出驱动低电平
    _DELAY_CYCLES (75);
    i<<=1;
    DIR1 |= SCL1;//设置为输出驱动低电平

    void I2C_stop1 (void)

    unsigned int i=0;
    dir1 |= sda1;//设置为输出驱动低电平

    i<<=1;
    DIR1 &=~SCL1;//设置为输入分辨率拉高
    _DELAY_CYCLES (75);
    i<<=1;
    dir1 &=~sda1;//设置为输入分辨率拉高

    void I2C_TX_BYTE1 (char byte1)//主器件通过 I2C 向从器件发送一个字节

    unsigned char n、mask=0x80;
    extern unsigned int 菜单;

    for (n=0;n<8;n++)//处理8位

    if ((byte1 & mask)!= 0)//位为高电平

    dir1 &=~sda1;//设置 SDA

    //make 时钟周期
    DIR1 &=~SCL1;//设置 SCL
    DIR1 |= SCL1;//重置 SCL

    否则//位为低电平

    dir1 |= sda1;//重置 SDA

    //make 时钟周期
    DIR1 &=~SCL1;//设置 SCL
    DIR1 |= SCL1;//重置 SCL

    掩码>=1;//将掩码右移一位

    //确认
    DIR1 &=~sda1;//将 SDA 设置为输入(高电平)
    N = 0;

    while ((IN1 & sda1)!= 0)//等待 I2C 器件将 SDA 拉至低电平

    // P1OUT&=~BIT0;
    N++;
    如果(n == 100)
    中断;

    //__delay_cycles (2000);
    //最后一个时钟周期
    OUT1 |= SCL1;//设置 SCL

    OUT1 &=~SCL1;//复位 SCL
    _DELAY_CYCLES (75);
    dir1 |= sda1;//将 SDA 设置为输出(低电平)
    返回;

    ///----------------------------------
    //主设备通过 I2C 从从从设备接收一个字节
    unsigned long int I2C_RX_Byte1 (int ACK1)

    unsigned int mask;
    unsigned char retval=0、retval1=0;
    unsigned int i=0;
    unsigned long int mask1=0;
    dir1 &=~sda1;//set 至 input to read

    for (mask=0x80;mask;mask >=1)

    //I2C_Wait (I2C_CLK_DELAY);
    i<<=1;
    DIR1 &=~SCL1;//设置为输入分辨率拉高

    IF (IN1和 SDA1)

    RetVal |= MASK;//将 MASK 位设置为高电平
    }//if else 已经为零

    //I2C_Wait (I2C_CLK_DELAY);
    i<<=1;
    DIR1 |= SCL1;//设置为输出驱动低电平
    }//for

    // ACK
    IF (ACK1)

    dir1 |= sda1;//设置为输出到 ACK 读取字节
    }//if
    //I2C_Wait (I2C_CLK_DELAY);
    i<<=1;
    DIR1 &=~SCL1;//设置为输入分辨率拉高
    //I2C_Wait (I2C_CLK_DELAY);
    i<<=1;
    DIR1 |= SCL1;//设置为输出驱动低电平
    dir1 &=~sda1;//设置回输入
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    dir1 &=~sda1;//set 至 input to read

    for (mask=0x80;mask;mask >=1)

    //I2C_Wait (I2C_CLK_DELAY);
    i<<=1;
    DIR1 &=~SCL1;//设置为输入分辨率拉高

    IF (IN1和 SDA1)

    retval1 |= MASK;//将 MASK 位设置为高电平
    }//if else 已经为零

    //I2C_Wait (I2C_CLK_DELAY);
    i<<=1;
    DIR1 |= SCL1;//设置为输出驱动低电平
    }//for

    // ACK
    IF (ACK1)

    dir1 |= sda1;//设置为输出到 ACK 读取字节
    }//if
    //I2C_Wait (I2C_CLK_DELAY);
    i<<=1;
    DIR1 &=~SCL1;//设置为输入分辨率拉高
    //I2C_Wait (I2C_CLK_DELAY);
    i<<=1;
    DIR1 |= SCL1;//设置为输出驱动低电平
    dir1 &=~sda1;//设置回输入
    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    dir1 &=~sda1;//set 至 input to read


    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    //I2C_stop1 ();
    mask1|=retval;
    mask1=mask1<<8;
    mask1|=retval1;

    返回 mask1;

    unsigned long int I2C_Read1 (char addr1、unsigned int reg_addr1)

    unsigned int retval=0x0000;
    ADDR1 <<=1;
    ADDR1 &= 0xFE;//LSB 为0进行写入
    _DELAY_CYCLES (90000);
    I2C_Start1 ();
    I2C_TX_BYTE1 (addr1);
    _DELAY_CYCLES (90000);

    I2C_TX_BYTE1 (reg_addr1);
    _DELAY_CYCLES (90000);

    I2C_Restorart1 ();
    ADDR1 |= 0x01;//LSB 为1表示读取
    I2C_TX_BYTE1 (addr1);
    _DELAY_CYCLES (90000);

    RetVal = I2C_RX_BYTE1 (1);
    I2C_stop1 ();
    返回评估;

    空 I2C_Write1 (char addr1、char reg_addr1、char txdata1)

    ADDR1 <<=1;
    ADDR1 &= 0xFE;//LSB 为0进行写入

    I2C_Start1 ();//启动 I2C 事务
    I2C_TX_BYTE1 (addr1);//
    I2C_TX_BYTE1 (reg_addr1);//
    I2C_TX_BYTE1 (txdata1);//数据
    I2C_stop1 ();//停止 I2C 事务


    void i2c_writeReg1 (unsigned char addr1、unsigned char reg_addr1、unsigned char * ptr、unsigned int n)

    unsigned int i;
    ADDR1 <<=1;
    ADDR1 &= 0xFE;//LSB 为0进行写入
    I2C_Start1 ();//开始 I2C 事务
    I2C_TX_BYTE1 (addr1);
    I2C_TX_BYTE1 (reg_addr1);
    for (i=0;<n;i++))

    I2C_TX_BYTE1 (* PTR);
    ++PTR;

    I2C_stop1 ();//停止 I2C 事务

    unsigned char i2c_readReg1 (int addr1、unsigned char * ptr、int n)

    unsigned char retval=0x00;
    unsigned int i;
    ADDR1 <<=1;
    ADDR1 &= 0xFE;//LSB 为0进行写入

    I2C_Start1 ();
    I2C_TX_BYTE1 (addr1);
    I2C_Restorart1 ();
    ADDR1 |= 0x01;//LSB 为1表示读取
    I2C_TX_BYTE1 (addr1);
    RetVal = I2C_RX_BYTE1 (1);
    for (i=0;<n;i++))

    I2C_RX_BYTE1 (* PTR);
    ++PTR;

    I2C_stop1 ();
    返回评估;

    和 HDC1080的代码  ;

    空 HumidityAndTemp()

    I2C_writeReg1 (HDC、0x02、conf1、2);

    t =I2C_Read1 (HDC、0x00);////////////////////////// t 表示温度////////////////////////////////////////////

    //__delay_cycles (40000);

    H=I2C_Read1 (HDC、0x01);////////////////////// h 表示湿度////////////////////////////////////////////////////////////////////////////

    temp=(t/(pow (2、16)));//////////////// 温度公式转换的温度////////////////////////////////////////////

    temp=(temp*165)-40;

    hum=(h/(pow (2、16)));//////////// 湿度公式转换的 hum ////////////////////////////////////////////////////////////////////////

    hum=hum*100;

    trmp=temp;//////////////////////////////// 趋势温度变量//////////////////////////////////////////////////////////////////////////////////

    tmp=hum;////////////////////////// tmp 湿度变量////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    我请求您核对并建议我回答。

    谢谢、此致

    Vikash Chandra Raman

    COMCON 工业

    印度

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

    你好 Vikash

    您可以使用 GPIO 模拟 硬件 I2C。

    MSP430F5659支持由 USCI_B0、USCI_B1、USCI_B2提供的硬件 I2C。

    您可以使用它进行通信。

    当您将 CPU 频率加速至16MHz 时,这意味着每项推荐的速度是1MHz 的16倍。

    HDC1080的 I2C 速度快于400kHz。

    HDC1080 I2C 速度仅支持高达400k 的电流。

    如果您要使用硬件 I2C、请参阅以下链接:

    http://dev.ti.com/tirex/explore/node?compilers=ccs&devices=MSP430F5659&node=AKq9lM2TKZdDkf4SQilT2Q__IOGqZri__LATEST&search=F5659

    希望它对您有所帮助。

    此致

    Junkai

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

    Junkai 您好!

    感谢您的回复和支持。

    谢谢、此致

    Vikash Chandra Raman

    COMCON 工业

    新德里

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

    您好 Vikash,

    我很高兴在 E2E 社区中与您讨论此问题。 我也非常荣幸地帮助您解决问题。

    如果您稍后有任何问题、请直接在 E2E 上发帖。

    谢谢。

    此致

    Junkai