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/CC3220SF-LAUNCHXL:CC3220 SF I2C 接口

Guru**** 2775925 points

Other Parts Discussed in Thread: TMP006, TMP102, CC3220SF

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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/752812/ccs-cc3220sf-launchxl-cc3220-sf-i2c-interfacing

器件型号:CC3220SF-LAUNCHXL
主题中讨论的其他器件:TMP102CC3220SF

工具/软件:Code Composer Studio

嗨、大家好、

我尝试通过 I2C 通信将 AM2315温度传感器与 cc3220 SF 连接。 该传感器在5V 逻辑电平下工作、而电路板在3.3V 逻辑电平下工作、因此我将在电路板和传感器之间使用电平转换器。 在固件中、我使用 I2c006tmp 示例:

//#define TMP006_ADDR     0x41

//#define TMP006_DIE_TEMP  0x0001 //*裸片温度结果寄存器*/

//#ifndef Board_TMP_ADDR

//#define Board_TMP_ADDR   TMP006_ADDR

//#endif

静态 Display_Handle 显示;

/*

 * ==== mainThread ====

 *

void * mainThread (void * arg0)

  unsigned int  i;

  uint16_t     温度;

  uint16_t     湿度;

  uint8_t     txBuffer[3];

  uint8_t     rxBuffer[10];

  I2C_Handle   i2c;

  I2C_Params   i2cParams;

  I2C_Transaction i2cTransaction;

  /*调用驱动程序初始化函数*/

  display_init();

  GPIO_init();

  I2C_init();

  /*配置 LED 引脚*/

  GPIO_setConfig (Board_GPIO_LED0、GPIO_CFG_OUT_STD | GPIO_CFG_OUT_LOW);

  /*打开主机显示屏以输出*/

  Display = Display_open (Display_Type_UART、NULL);

  if (display =NULL){

    while (1);

  }

  /*打开用户 LED */

  GPIO_WRITE (Board_GPIO_LED0、Board_GPIO_LED_ON);

  display_printf (display、0、0、"启动 i2ctmp006示例\n");

  /*创建 I2C 以供使用*/

  I2C_Params_init (&i2cParams);

  i2cParams.bitrate = I2C_100kHz;

  I2C = I2C_open (Board_I2C_TMP、&i2cParams);

  if (i2c == NULL){

    Display_printf (display、0、0、"Error Initializing I2C\n");

    while (1);

  }

  否则{

    display_printf (display、0、0、"I2C initialized!\n"\});

  }

/*指向 T 环境寄存器并读取其2个字节*/

  TxBuffer[0]= 0x03;

  TxBuffer[1]= 0x00;

  txBuffer[2]= 4;

  i2cTransaction.slaveAddress = 0x5C;

  i2cTransaction.writeBuf = txBuffer;

  i2cTransaction.writeCount = 3;

  i2cTransaction.readBuf = rxBuffer;

  i2cTransaction.ReadCount = 2;

  /*采集5个样本并将其打印到控制台*/

  对于(I = 0;I < 5;I++)

  {

    IF (I2C_transfer (i2c、&i2cTransaction))

    {

      /*从接收到的数据中提取°C;请参阅 TMP102数据表*/

      湿度= rxBuffer[2];

      湿度=湿度* 256;

      湿度=湿度+ rxBuffer[3];

      湿度=湿度/10;

      温度= rxBuffer[4]和0x7F;

      温度=温度* 256;

      温度=温度+ rxBuffer[5];

      温度=温度/10;

      if (rxBuffer[4]>> 7)

      {

        温度=-温度;

      }

      /*

//       if (rxBuffer[0]& 0x80){

//         温度|= 0xF000;

//      }

//      /*

//       *为简单起见、将温度值除以32即可摆脱

//       *十进制精度;请参阅 TI 的 TMP006数据表

//       *

//       温度/= 32;

      display_printf (display、0、0、"Sample %u:%d (C)\n"、i、temperature);

    }

    否则{

      display_printf (display、0、0、"I2C 总线故障\n"\});

    }

    /*睡眠1秒*/

    睡眠(1);

  }

  /*已取消初始化 I2C */

  I2C_Close (i2c);

  display_printf (display、0、0、"I2C closed!\n"\});

我在控制台上得到的只是"I2C 总线故障"。 请告诉我出错了什么。

 

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

    您好 Saksham、

    您会看到、由于 I2C_transfer 返回 false、表示出错。 您是否有任何逻辑分析仪捕获、以便您可以看到发生了什么错误? 乍一看、您的实现方案似乎是基于我们的 I2C 示例、因此、假设您对特定传感器进行了适当的修改、它应该能够正常工作。

    Jesu

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

    主席先生,

    我没有逻辑分析仪。 我根据 AM 2315数据表更改了库。 但我不确定我做出了正确的更改。

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

    您好 Saksham、

    根据 数据表、您正在使用的器件的从器件地址为0xB8。 您将其设置为0x56、如果错误、请确保更正。

    此外,您还可以将 rxBuff 大小设置为10,并将 i2cTransaction.ReadCount 设置为2。 我认为这不会给您带来错误、但 I2C 外设不会使用您创建的 Rx 缓冲器的完整范围。  

    确保在 SDA 和 SCL 线路上有上拉电阻器。 我知道您正在使用电平转换器、因此请查看电平转换器数据表、检查它是否已集成了上拉电阻器。 如果不是这样、你就不会在 shfiter 的两侧添加一些内容。 可接受介于3kOhm 和10kOhm 之间的值。  

    如果 您想了解有关 I2C 驱动器的更多信息、请参阅我们的 I2C API 文档。  

    如果您的器件仍然存在问题、我建议您进一步查看数据表。

    Jesu

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

    主席先生,

    我将使用 github.com/.../Adafruit_AM2315此处提供的库 、并 将其与 CC3220SF 提供的 I2C 温度库合并。 此处提供的地址为0x5C、这是0xB8的1位右移。 我仍然不知道我做了什么错。

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

    i2c 库和示例按原样工作。 除非您能准确描述您的问题、否则我无法为您提供帮助。

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

    主席先生,

    我在电路板和传感器之间使用了电平转换器。 我使用此示例从 AM2315传感器读取温度/湿度。 我无法从传感器读取数据。

    我编辑了传感器的基本 I2C 程序:

    /*

     *版权所有(c) 2015-2017、德州仪器(TI)公司

     *保留所有权利。

     *

     *以源代码和二进制形式重新分发和使用、有无

     *如果满足以下条件、则允许进行修改

     符合*:

     *

     ** 源代码的重新分发必须保留上述版权

     *  注意、此条件列表和以下免责声明。

     *

     * *二进制形式的再发行必须复制上述版权

     *  请注意、中的此条件列表和以下免责声明

     *  随分发提供的文档和/或其他材料。

     *

     * *德州仪器公司的名称和名称均不相同

     *  其贡献者可用于认可或推广衍生产品

     *  未经特定的事先书面许可。

     *

     *本软件由版权所有者和贡献者"按原样"提供

     *以及任何明示或暗示的保证、包括但不限于:

     *特定适销性和适用性的隐含保证

     *不承认目的。 在任何情况下、版权所有者不得或

     *派遣国应对任何直接、间接、偶然、特殊、

     *典型或必然的损害(包括但不限于

     *采购替代货物或服务;丧失使用、数据或利润;

     *或业务中断)、无论原因是什么以及任何责任理论、

     *无论是合同、严格责任还是侵权行为(包括疏忽或)

     *否则)因使用本软件而以任何方式产生、

     *即使被告知可能会发生此类损坏。

     *

    /*

     *  ==== i2ctmp006.c ===

     *

    #include

    #include

    #include

    /*驱动程序头文件*/

    #include

    #include

    #include

    /*示例/板头文件*/

    #include "Board.h"

    //#define TMP006_ADDR     0x41

    //#define TMP006_DIE_TEMP  0x0001 //*裸片温度结果寄存器*/

    //#ifndef Board_TMP_ADDR

    //#define Board_TMP_ADDR   TMP006_ADDR

    //#endif

    静态 Display_Handle 显示;

    /*

     * ==== mainThread ====

     *

    void * mainThread (void * arg0)

      unsigned int  i;

      uint16_t     温度;

      uint16_t     湿度;

      uint8_t     txBuffer[3];

      uint8_t     rxBuffer[10];

      I2C_Handle   i2c;

      I2C_Params   i2cParams;

      I2C_Transaction i2cTransaction;

      /*调用驱动程序初始化函数*/

      display_init();

      GPIO_init();

      I2C_init();

      /*配置 LED 引脚*/

      GPIO_setConfig (Board_GPIO_LED0、GPIO_CFG_OUT_STD | GPIO_CFG_OUT_LOW);

      /*打开主机显示屏以输出*/

      Display = Display_open (Display_Type_UART、NULL);

      if (display =NULL){

        while (1);

      }

      /*打开用户 LED */

      GPIO_WRITE (Board_GPIO_LED0、Board_GPIO_LED_ON);

      display_printf (display、0、0、"启动 i2ctmp006示例\n");

      /*创建 I2C 以供使用*/

      I2C_Params_init (&i2cParams);

      i2cParams.bitrate = I2C_100kHz;

      I2C = I2C_open (Board_I2C_TMP、&i2cParams);

      if (i2c == NULL){

        Display_printf (display、0、0、"Error Initializing I2C\n");

        while (1);

      }

      否则{

        display_printf (display、0、0、"I2C initialized!\n"\});

      }

    /*指向 T 环境寄存器并读取其2个字节*/

      TxBuffer[0]= 0x03;

      TxBuffer[1]= 0x00;

      txBuffer[2]= 4;

      i2cTransaction.slaveAddress = 0xB8;

      i2cTransaction.writeBuf = txBuffer;

      i2cTransaction.writeCount = 3;

      i2cTransaction.readBuf = rxBuffer;

      i2cTransaction.ReadCount = 1;

      /*采集20个样本并将其打印到控制台*/

      对于(I = 0;I < 5;I++)

      {

        IF (I2C_transfer (i2c、&i2cTransaction))

        {

          /*从接收到的数据中提取°C;请参阅 TMP102数据表*/

          湿度= rxBuffer[2];

          湿度=湿度* 256;

          湿度=湿度+ rxBuffer[3];

          湿度=湿度/10;

          温度= rxBuffer[4]和0x7F;

          温度=温度* 256;

          温度=温度+ rxBuffer[5];

          温度=温度/10;

          if (rxBuffer[4]>> 7)

          {

            温度=-温度;

          }

          /*

           *如果 MSB 设置为"1"、则我们有二进制补码

           *需要符号扩展的负值

           *

    //       if (rxBuffer[0]& 0x80){

    //         温度|= 0xF000;

    //      }

    //      /*

    //       *为简单起见、将温度值除以32即可摆脱

    //       *十进制精度;请参阅 TI 的 TMP006数据表

    //       *

    //       温度/= 32;

          display_printf (display、0、0、"Sample %u:%d (C)\n"、i、temperature);

        }

        否则{

          display_printf (display、0、0、"I2C 总线故障\n"\});

        }

        /*睡眠1秒*/

        睡眠(1);

      }

      /*已取消初始化 I2C */

      I2C_Close (i2c);

      display_printf (display、0、0、"I2C closed!\n"\});

      返回(0);

    请帮助我解决此问题。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我稍微更改了程序。 此外、我仅在传感器侧使用上拉电阻(4.7K)、电平转换器剂量具有内部上拉电阻。 输出仍然没有变化。 正在打印总线故障。
    /*
    *版权所有(c) 2015-2017、德州仪器(TI)公司
    *保留所有权利。
    *
    *以源代码和二进制形式重新分发和使用、有无
    *如果满足以下条件、则允许进行修改
    符合*:
    *
    **源代码的重新分发必须保留上述版权
    *注意、此条件列表和以下免责声明。
    *
    **二进制形式的再发行必须复制上述版权
    *请注意、中的此条件列表和以下免责声明
    *随分发提供的文档和/或其他材料。
    *
    **德州仪器公司的名称和名称均不相同
    *其贡献者可用于认可或推广衍生产品
    *未经特定的事先书面许可。
    *
    *本软件由版权所有者和贡献者"按原样"提供
    *以及任何明示或暗示的保证、包括但不限于:
    *特定适销性和适用性的隐含保证
    *不承认目的。 在任何情况下、版权所有者不得或
    *派遣国应对任何直接、间接、偶然、特殊、
    *典型或必然的损害(包括但不限于
    *采购替代货物或服务;丧失使用、数据或利润;
    *或业务中断)、无论原因是什么以及任何责任理论、
    *无论是合同、严格责任还是侵权行为(包括疏忽或)
    *否则)因使用本软件而以任何方式产生、
    *即使被告知可能会发生此类损坏。
    *

    /*
    *==== i2ctmp006.c ===
    *
    #include
    #include
    #include

    /*驱动程序头文件*/
    #include
    #include
    #include

    /*示例/板头文件*/
    #include "Board.h"

    //#define TMP006_ADDR 0x41
    //#define TMP006_DIE_TEMP 0x0001 /*芯片温度结果寄存器*/

    //#ifndef Board_TMP_ADDR
    //#define Board_TMP_ADDR TMP006_ADDR
    //#endif

    静态 Display_Handle 显示;

    /*
    *==== mainThread ====
    *
    void * mainThread (void * arg0)

    unsigned int i;
    uint16_t 温度;
    uint16_t 湿度;
    uint8_t txBuffer[3];
    uint8_t rxBuffer[10];
    I2C_Handle I2C;
    I2C_Params i2cParams;
    I2C_Transaction i2cTransaction;

    /*调用驱动程序初始化函数*/
    display_init();
    GPIO_init();
    I2C_init();

    /*配置 LED 引脚*/
    GPIO_setConfig (Board_GPIO_LED0、GPIO_CFG_OUT_STD | GPIO_CFG_OUT_LOW);

    /*打开主机显示屏以输出*/
    Display = Display_open (Display_Type_UART、NULL);
    if (display =NULL){
    while (1);


    /*打开用户 LED */
    GPIO_WRITE (Board_GPIO_LED0、Board_GPIO_LED_ON);
    display_printf (display、0、0、"启动 i2ctmp006示例\n");

    /*创建 I2C 以供使用*/
    I2C_Params_init (&i2cParams);
    i2cParams.bitrate = I2C_100kHz;
    I2C = I2C_open (Board_I2C_TMP、&i2cParams);
    if (i2c == NULL){
    Display_printf (display、0、0、"Error Initializing I2C\n");
    while (1);

    否则{
    display_printf (display、0、0、"I2C initialized!\n"\});

    /*指向 T 环境寄存器并读取其2个字节*/

    TxBuffer[0]= 0x03;
    TxBuffer[1]= 0x00;
    txBuffer[2]= 4;
    i2cTransaction.slaveAddress = 0xB8;
    i2cTransaction.writeBuf = txBuffer;
    i2cTransaction.writeCount = 3;
    i2cTransaction.readBuf = rxBuffer;
    i2cTransaction.ReadCount = 10;

    /*采集20个样本并将其打印到控制台*/
    对于(I = 0;I < 5;I++)

    IF (I2C_transfer (i2c、&i2cTransaction))

    /*从接收到的数据中提取°C;请参阅 TMP102数据表*/
    湿度= rxBuffer[2];
    湿度=湿度* 256;
    湿度=湿度+ rxBuffer[3];
    湿度=湿度/10;


    温度= rxBuffer[4]和0x7F;
    温度=温度* 256;
    温度=温度+ rxBuffer[5];
    温度=温度/10;

    if (rxBuffer[4]>> 7)

    温度=-温度;



    /*
    *如果 MSB 设置为"1"、则我们有二进制补码
    *需要符号扩展的负值
    *
    // if (rxBuffer[0]& 0x80){
    // 温度|= 0xF000;
    //}
    // /*
    // *为简单起见、将温度值除以32即可摆脱
    // *十进制精度;请参阅 TI 的 TMP006数据表
    // *
    // 温度/= 32;

    display_printf (display、0、0、"Sample %u:%d (C)\n"、i、temperature);

    否则{
    display_printf (display、0、0、"I2C 总线故障\n"\});


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


    /*已取消初始化 I2C */
    I2C_Close (i2c);
    display_printf (display、0、0、"I2C closed!\n"\});

    返回(0);
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    将 I2CCC332XX.c 文件粘贴到您的项目中、您可以在 SDK_root/source/ti/i2c 中找到该文件。

    在调试模式下运行项目并在 I2CCC32XX_transfer()中设置断点以调试问题。

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

    主席先生,

    我能够从默认 I2C 引脚(GPIO 10和 GPIO 11)读取数据。 但是、当我将 GPIO12声明为 CLK、将 GPIO13声明为 SDA 时、它们不会进行数据传输。 原因可能是什么?

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

    甚至在 CC3220SF_LAUNCHPADXL_C 配置文件中注释掉了 GPIO 12和 GPIO 13
    // GPIOCC32XX_GPIO_12 | GPIO_DO_NOT _CONFIG
    //GPIOCC32XX_GPIO_13 | GPIO_CFG_INPUT| GPIO_CFG_IN_INT_INT_RISING、
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    请确保您的 I2C 线路上有适当的上拉电阻。 ALE 您应该检查 GPIO_13上的10k 下拉电阻器(R141)是否不会导致您的问题。

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


    我有一个电平转换器 IC。 我不使用上拉电阻器。 如何移除下拉电阻器(10k)?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    您应该检查引脚 GPIO_13上的电压电平的外观。 如果液位不正确、您可以从 LunchPad 板上移除 R141。

    您确定不需要3.3V 侧的上拉电阻器吗? 如果您在 GPIO_10/11上有 I2C、但尚未移除跳线 J15、J16、则已有3.3K 上拉电阻(R118、R119)。

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

    当我连接 GPIO10和 GPIO 11时、我移除了 J15、J16和 J24。 此外、如何从 launchpad 中移除 R141。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    或热空气。 在移除 R141之前、您应该检查 I2C 引脚(3.3V 侧)上的电压电平。

    另一个选项是 I2C 驱动器未正确配置。 对于 TI-Drivers 配置、您可以使用 www.ti.com/.../PINMUXTOOL

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

    PIN4的电压为2.7V、SCL 为3.3
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    我不明白。 您在哪里测量电压?

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

    引脚03 (SCL)具有3.3V 电压、引脚04 (SDA)具有相对于接地的2.7电压。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    是的、2.7V 绝对不是 I2C 总线的良好电压电平。

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

    那么、我应该继续向右移除下拉电阻(R141)吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    是的、我认为应该是这个。 在移除电阻器之前,您应该查看 LaunchPad 的原理图( www.ti.com/.../getliterature.tsp )。 请确保您选择了正确的 LP 类型。

    1月