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.

[参考译文] RTOS/LAUNCHXL-CC2640R2:在 I2C 通信完成后、无法将 SCL 引脚配置和用作 GPIO 引脚。

Guru**** 2782445 points

Other Parts Discussed in Thread: TMP102

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/713963/rtos-launchxl-cc2640r2-scl-pin-can-t-be-configured-and-used-as-gpio-pin-after-i2c-communication-finishes

器件型号:LAUNCHXL-CC2640R2
主题中讨论的其他器件:TMP102

工具/软件:TI-RTOS

在 I2C 传输后、我们无法将 SCL 引脚配置为 GPIO 引脚。

已执行的步骤:

  1. 使用 I2C_init()和 I2C_params_init()初始化 I2C
  2. 通过调用 I2C_open()获取 I2C 句柄
  3. 通过调用 I2C_transfer ()执行 I2C 传输
  4. 使用 I2C_CLOSE ()取消初始化 I2C
  5. 使用 GPIO_setConfig()将 SCL 引脚配置为 GPIO 引脚
  6. 尝试通过切换此 GPIO 引脚来生成方波
  7. 已使用逻辑分析仪检查输出

我们使用了 i2ctmp007示例项目、请找到以下代码。

/*

*==== mainThread ====

*

void * mainThread (void * arg0)

  unsigned int  i;

  uint16_t      温度;

  uint8_t        txBuffer[1];

  uint8_t        rxBuffer[2];

  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、"启动 i2ctmp007示例\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]= TMP007_obj_TEMP;

  i2cTransaction.slaveAddress = Board_TMP_ADDR;

  i2cTransaction.writeBuf = txBuffer;

  i2cTransaction.writeCount = 1;

  i2cTransaction.readBuf = rxBuffer;

  i2cTransaction.ReadCount = 2;

 

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

  对于(i = 0;i < 20;i++){

      if (I2C_transfer (i2c、&i2cTransaction)){

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

          温度=(rxBuffer[0]<< 6)|(rxBuffer[1]>> 2);

 

          /*

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

            *需要符号扩展的负值

            *

          if (rxBuffer[0]& 0x80){

              温度|= 0xF000;

          }

          /*

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

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

          *

          温度/= 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"\});

 

 

  //将 SCL 引脚配置为 GPIO

  GPIO_setConfig (CC2640R2_LAUNCHXL_I2C0_SCL0、GPIO_CFG_OUT_STD | GPIO_CFG_OUT_LOW);

 

  Task_disable();

  INT 计数= 0;

  int j = 0;

 

  用于生成方波的//逻辑

  for (;;){

      GPIO_WRITE (CC2640R2_LAUNCHXL_I2C0_SCL0、j 和1);

      J++;

      while (count < 10){

          count++;

      }

      计数= 0;

  }

 

  返回(空);

请注意、我们目前使用以下工具和 API 版本:

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

    我不希望您能够将 SCL 引脚添加到 GPIO 表中、然后打开 I2C 驱动器、因为这会导致引脚所有权冲突(在这种情况下、I2C 将无法打开)。

    在您的情况下、由于 SCL 引脚未添加到板级配置文件中的 GPIO 驱动程序表中、因此您未看到此问题(请查看 gpioPinConfigs)。 GPIO 配置表包含您可以使用 GPIO 驱动程序寻址的引脚。 从您执行 GPIO_init()的那一点开始,GPIO 驱动程序将获得这些驱动程序的所有权,并且不允许任何其他驱动程序或应用程序的一部分分配对这些驱动程序的访问权限(在内部使用 PIN 驱动程序完成)。

    使用 GPIO API 时、您始终通过该表中的索引引用引脚、因此、如果您检入板级文件头、您可以找到与该表中的条目匹配的 GPIO 枚举(查找 CC2640R2_LAUNCHXL_GPIOName)。 在 Board.h 中将它们重新定义为 Board_GPIO_*。

    在尝试配置 SCL 引脚时、您要做的是将实际的引脚编号传递给 GPIO 驱动程序、这不受支持、因为您应该传递一个索引。 为了执行您想要执行的操作、最好直接使用 PIN 驱动程序(GPIO 将此驱动程序包含在内)、因为它在动态引脚配置方面更灵活。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在几次错误启动后、Vishal 使用 TI 的原始 i2c 示例代码使逻辑在 Launchpad 上正常工作。
    奇怪的是、这种做法在我们的分支机构中没有采用同样的方法。
    我们知道的电流增量:
    我们的工具支持 BLE 堆栈、并在 BLE 应用线程上下文中运行(I2C 信标和其他函数是否无法在该上下文中使用?)
    2、我们的东西是在 IAR 而不是 CCS 中编译的(我们没有在 CCS 中尝试过相同的示例)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    约书亚、您好!

    您可以在 BLE 应用线程中运行 I2C、您只需小心、因为插入任何阻塞延迟都会以负面方式影响 BLE 连接(例如、在回调模式下运行 I2C 会很好、但在信标上挂起可能是一个坏主意)。

    在这种情况下、使用 IAR 或 CCS 编译无关紧要。 是否可以分享 Vishal 提出的方法、以及您如何实施它?