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.

[参考译文] LAUNCHXL-CC2640R2:连接 I2C LIS3DH 加速计、悬挂在 I2C_TRANSFH ()?

Guru**** 2562970 points
Other Parts Discussed in Thread: CC2650

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/586492/launchxl-cc2640r2-interfacing-i2c-lis3dh-accelerometer-hanging-at-i2c_transfer

器件型号:LAUNCHXL-CC2640R2
Thread 中讨论的其他器件:CC2650

您好!

  我正在尝试将 LIS3DH 加速计连接到 TI CC2640R2 Launchpad。 起初、我使用在 CC2640R2 Launchpad 上运行的 Sensortag 程序与 I2C LIS3DH 加速计进行通信、但我无法读取 I2C 寄存器值。 因此、我在空 TI-RTOS CCS 项目中尝试相同的操作、但也会发生相同的操作。 我将 SCL 线路连接到 TIO4、将 SDA 线路连接到 TI CC2640R2 Launchpad 的 DIO5。 下面是我的代码。 什么可能导致它在 I2C_TRANSF()挂起?

/*
=== empty.c ======
//

//* for usleep()*/
#include 
#include 
#include 

#include 

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

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

//寄存器定义
#define LIS3DH_WHO _AM_I_register 0x0F //器件标识寄存
器#define LIS3DH_ADDRESS 0x32 //LIS3DH 地址
#define LIS3DH_WHO _AM_I_VALUE 0x33

/*
=== mainThread ====
//
void * mainThread (void * arg0)
{
/* 1秒延迟*/
uint8_t txBuffer[4];
uint8_t rxBuffer[4];
I2C_Handle I2C;
I2C_Params i2cParams;
I2C_Transaction i2cTransaction;

/*调用驱动程序初始化函数*/
I2C_init();
// spi_init();
// uart_init();
// Watchdog_init();

/*创建 I2C 以供使用*/
I2C_Params_init (&i2cParams);
i2cParams.bitrate = I2C_400kHz;
I2C = I2C_open (Board_I2C0、&i2cParams);
if (i2c == NULL){
System_abort ("初始化 I2C\n 时出错");
}
否则{
system_printf ("I2C 已初始化!\n");
}

//读取 LIS3DH,谁是 I 寄存器值。 读取的值应为0x33
txBuffer[0]= LIS3DH_WHO _AM_I_register;//0x0F
i2cTransaction.slaveAddress = LIS3DH_ADDRESS;//0x32
i2cTransaction.writeBuf = txBuffer;
i2cTransaction.writeCount = 1;
i2cTransaction.readBuf = rxBuffer;
i2cTransaction.ReadCount = 2;
if (I2C_transfer (i2c、&i2cTransaction)){
System_printf ("谁是我的值%x%x\n"、rxBuffer[0]、rxBuffer[1]);
} 否则{
System_printf ("谁是我的值读取失败!\n");
}

/*已取消初始化 I2C */
I2C_Close (i2c);
System_printf ("I2C 已关闭!\n"\});

system_flush();


} 

-kel

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在运行 I2C 传输之前、您是否为 SDA 和 SCL 线路添加了上拉电阻? 如果不是、您能否尝试添加外部上拉电阻、然后再次尝试运行代码?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Christin:

       我使用的是具有 I2C LIS3DH 加速计 IC 的原型 PCB 板。 我检查了、SDA 和 SCL 线路上有10K 欧姆上拉电阻器。

       关于 LIS3DH 加速计、我注意到 CS 和 SDO 引脚需要具有逻辑1输入。 因此、我明天要将 LIS3DH 加速计引脚 CS 和 SDO 连接到3.3V、看看我是否能够通过 I2C 与其通信。

    -克尔

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

    我将 CS 和 SDO 引脚连接到3.3V。 但是,我仍然无法阅读《谁是我注册》。 它不会在 I2C_Transfer 处挂起。 它涉及到"谁是我的价值观、读不出错误!" 条件。 我将示波器连接到 SCL 和 SDA、看看是否确实有 I2C 传输。

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

    您好!

      我找到了问题。 DIO4 SCL 和 DIO5 SDA 中没有 I2C 信号。 请参见下图。

    但是、为什么 DIO4和 DIO5 默认设置为 I2C 引脚? 请参阅下面的 I2C 引脚设置。

    文件名:CC2640R2_LAUNCHXL.h

    /* I2C */
    #define CC2640R2_LAUNCHXL_I2C0_SCL0 ioID_4
    #define CC2640R2_LAUNCHXL_I2C0_SDA0 ioID_5 

    文件名: CC2640R2_LAUNCHXL.c

    #include 
    #include 
    
    I2CCC26XX_Object i2cCC26xxObjects[CC2640R2_LAUNCHXL_I2CCOUNT;
    
    const I2CCC26XX_HWAttrsV1 i2cCC26xxHWAttrs[CC2640R2_LAUNCHXL_I2CCOUNT ={
    {
    baseAddr = I2C0_BASE、
    powerMngrId = PowerCC26XX_Periph_I2C0、
    .intNum = INT_I2C_IRQ、
    .intPriority =~0、
    .wiPriority = 0、
    sdaPin = CC2640R2_LAUNCHXL_I2C0_SDA0、
    .sclPin = CC2640R2_LAUNCHXL_I2C0_SCL0
    、}
    }; 

    -克尔

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

    您好!

      我切换到 Agilent 示波器、只是为了查看是否获得相同的结果。 我将下面的代码行添加到 BoardGpioInitTable[]中、但结果仍然相同、SCL 和 SDA 行上没有输出。 两个 I2C 引脚上都有10k 上拉电阻器。

    CC2640R2_LAUNCHXL_I2C0_SDA0 | PIN_GPIO_OUTP_EN | PIN_GPIO_LOW | PIN_PushPull | PIN_DRVSTR_MAX、 /* SDA0 */
    CC2640R2_LAUNCHXL_I2C0_SCL0 | PIN_GPIO_OUTP_EN | PIN_GPIO_LOW | PIN_PushPull | PIN_DRVSTR_MAX、 /* SCL0 */ 

    -克尔

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

    之前、我使用了 SimpleLink Academy 中的 TI-RTOS 示例程序并将其清空、该程序在示波器上不输出 I2C 信号。 我所做的是使用 CC2640R2 SDK 中的 PWM LED TI-RTOS 示例程序、然后将 PWM 代码替换为我在这里发布的 I2C 代码。 现在、我可以在示波器上看到 I2C 信号。 解决该问题的方法。

    接下来、我要将 LIS3DH 加速计连接到 TI CC2640R2 Launchpad、并查看我是否能够读取器件标识寄存器。

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

    您好!

      我使它生效了。 问题是我之前使用的 I2C LI3DH 从地址进行 I2C 通信、即0x32或0011 0010。 根据数据表、正确的 I2C LI3DH 从地址为0x19或0001 1001。  LI3DH 从地址0x32用于我们基于 ST 微电子的产品中、它起作用。 如您所见、与0x19相比、0x32以下的差异被右移1位。 我们基于 ST 微电子的产品使用0x32的 I2C LI3DH 从地址的原因可能是什么?

    0x32 - 0011 0010  

    0x19 - 0001 1001

      另一个问题。 是否确实需要像下面这样设置 I2C 引脚属性? 为什么在 CC2650 SensorTag 项目中、I2C 引脚属性未设置但仍然有效?

    CC2640R2_LAUNCHXL_I2C0_SDA0 | PIN_GPIO_OUTP_EN | PIN_GPIO_LOW | PIN_PushPull | PIN_DRVSTR_MAX、/* SDA0 *
    CC2640R2_LAUNCHXL_I2C0_SCL0 | PIN_GPIO_OUTP_EN | PIN_GPIO_LOW | PIN_PushPull | PIN_DRVSTR_MAX、/* SCL0 *

    -克尔

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我不知道 ST 基址为什么多移一位、他们在 I2C 驱动器中可以做些什么。 您必须询问他们。

    至于第二个问题:不、您无需在引脚表中初始化引脚。 I2C_open 函数将为您执行初始化。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

      对于遇到相同问题的其他人、下面是我的最终测试代码。

    #include 
    #include 
    #include 
    
    #include 
    
    /*驱动程序头文件*/
    #include 
    #include 
    #include 
    
    /*示例/板头文件*/
    #include "Board.h"
    
    //寄存器定义
    #define LIS3DH_WHO _AM_I_register 0x0F //器件标识寄存
    器#define LIS3DH_ADDRESS 0x19 //0x32 //LIS3DH 地址
    #define LIS3DH_WHO _AM_I_VALUE 0x33
    
    #define TMP006_O_DEV_ID 0xFF // TMP006器件标识
    #define TMP006_I2C_ADDRESS 0x41 // TMP006 I2C 基址
    
    //
    *=== mainThread ====
    *任务会定期增加板载 LED 的 PWM 占空比。
    //
    void * mainThread (void * arg0)
    {
    
    uint8_t txBuffer[4];
    uint8_t rxBuffer[4];
    I2C_Handle I2C;
    I2C_Params i2cParams;
    I2C_Transaction i2cTransaction;
    
    /*调用驱动程序初始化函数*/
    I2C_init();
    // spi_init();
    // uart_init();
    // Watchdog_init();
    
    /*创建 I2C 以供使用*/
    I2C_Params_init (&i2cParams);
    i2cParams.bitrate = I2C_400kHz;
    I2C = I2C_open (Board_I2C0、&i2cParams);
    if (i2c == NULL){
    System_abort ("初始化 I2C\n 时出错");
    }
    否则{
    system_printf ("I2C 已初始化!\n");
    }
    
    //读取 LIS3DH,谁是 I 寄存器值。 读取的值应为0x33
    txBuffer[0]= LIS3DH_WHO _AM_I_register;//0x0F
    i2cTransaction.slaveAddress = LIS3DH_ADDRESS;//0x32
    //txBuffer[0]= TMP006_O_DEV_ID;
    //i2cTransaction.slaveAddress = TMP006_I2C_address;
    i2cTransaction.writeBuf = txBuffer;
    i2cTransaction.writeCount = 1;
    i2cTransaction.readBuf = rxBuffer;
    i2cTransaction.ReadCount = 2;
    while (1)
    {
    IF (I2C_transfer (i2c、&i2cTransaction))
    {
    System_printf ("谁是我的值%x%x\n"、rxBuffer[0]、rxBuffer[1]);
    system_flush();
    }
    其他
    {
    System_printf ("谁是我的值读取失败!\n");
    system_flush();
    }
    }
    

    使用 SensorI2C C 函数。

    #include 
    #include 
    #include 
    
    #include 
    
    /*驱动程序头文件*/
    #include 
    #include 
    #include 
    
    /*示例/板头文件*/
    #include "Board.h"
    
    #include "SensorI2C.h"/* TI CC2640R2F 传感器 I2C 库*/
    #include "SensorUtil.h"/* TI CC2640R2F 传感器 Util 库*/
    #include "lis3dh.h"
    
    //寄存器定义
    #define LIS3DH_世卫 组织寄存器 0x0F //器件标识寄存器
    //#define LIS3DH_ADDRESS 0x19 //0x32 //LIS3DH 地址
    #define LIS3DH_WHO _AM_I_VALUE 0x33
    
    #define TMP006_O_DEV_ID 0xFF // TMP006器件标识
    #define TMP006_I2C_ADDRESS 0x41 // TMP006 I2C 基址
    
    //
    *=== mainThread ====
    *任务会定期增加板载 LED 的 PWM 占空比。
    //
    void * mainThread (void * arg0)
    {
    
    uint8_t rxBuffer[4];
    uint8_t whoami = 0;
    
    SensorI2C_open ();
    sensor_select();
    while (1)
    {
    if (SensorI2C_readReg (LIS3DH_WHO_AM_I_register、&whoami、1))
    {
    if (whoami == LIS3DH_WHO_AM_I_VALUE)
    {
    System_printf ("谁是我的值%d\n"、whoami);
    system_flush();
    }
    其他
    {
    System_printf ("谁是我的值读取失败!\n");
    system_flush();
    }
    }
    
    } 

    -克尔