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-CC1310:通过 I2C 从传感器 BMP280读取数据

Guru**** 2747405 points

Other Parts Discussed in Thread: CC1310, CC1350STK, LAUNCHXL-CC1310

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

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/764558/rtos-launchxl-cc1310-read-data-from-sensor-bmp280-via-i2c

器件型号:LAUNCHXL-CC1310
主题中讨论的其他器件:CC1310CC1350STK

工具/软件:TI-RTOS

您好!

我尝试更改 CC1310示例 i2ctmp007代码以读取 bmp280数据。

我已经将 slaveAddress 从 tmp007 (0x40)更改为0x77、但仍然无法获取任何数据。

函数 i2c_transfer()返回 bool 始终为 false。

我需要做什么吗?

提前感谢您、

此致、

Youyun

以下是我的代码。

#define BMP280_ADDR 0x77
#define BMP280_REG_PRESSURE 0xf5 

/*创建 I2C 以供使用*/ I2C_Params_init (&i2cParams); i2cParams.bitrate = I2C_400kHz; /i2cParams.transferMode = I2C_MODE_callback;//I2C_MODE_callback I2C_MODE_Blocking //i2cParams.transferCallbackFxn = NULL; i2C_OPENO = NULL;i2C_OPENO //(0、&i2cParams) if (i2c = NULL){ PUT ("初始化 I2C"时出错); while (1); } else{ 将("i2c 打开"); } while (1){ //I2C 读取 //BMP280 //txBuffer[0]= BMP280_REG_ID; i2cTransaction.writeBuf =空; i2cTransaction.writeCount = 0; i2cTransaction.readBuf = rxBuffer; i2cTransaction.ReadCount = 1; i2cTransaction.slaveAddress = Board_BMP_ADDR; if (I2C_transfer (i2c、&i2cTransaction)){ //bmpValue = sensorBmp280Convert (rxBuffer); PUT ("I2C 函数工作"); //sprintf (bmpData、"%f"、bmpValue); //puts (bmpData); } 否则{ PUT ("I2C 函数失败。"); } }

这是 reslut。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您是否了解过此主题: e2e.ti.com/.../648729
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢您的回复。

    是的,但问题是函数 i2c_transfer()不起作用。
    我无法从 BMP280模块中获取任何内容。
    我认为我缺少通过 i2c 读取数据的相关操作、但我找不到它。
    而不是 BMP280模块数据如何计算。

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

    在使用 I2C 之前,是否调用“I2C_init();”?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢您的回复。
    是的、在使用 I2C 之前、我调用"I2C_init();"。
    很抱歉、我没有在图片中显示该内容。

    此致、
    Youyun
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您是否将 I2C SCL 和 SDA 引脚上拉为高电平? 为什么要设置 writeBuf=null 和 writeCount=0? 我假设应该有命令字节、即使您希望从 bmp280读取也是如此。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢您的回复。
    如何拉高 I2C SCL 和 SDA 引脚?
    是使用函数 i2c_init()还是使用函数 PIN_setOutputValue()?
    我使用函数 PIN_setOutputValue()将 SCL (pin4)和 SDA (pin5)设置为高电平,但这项工作使函数 i2c_open()失败。
    它是否有任何其他函数可供使用?

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

    我是说在您的等电位 I2C 引脚上执行上拉操作、正如以下 CC1350STK 原理图中所示。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢您的回复。
    我试了。 不管用。
    这是真的需要的吗?

    此致、
    Youyun
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    建议执行上拉。 为什么要设置 writeBuf=null 和 writeCount=0? 我假设应该有命令字节、即使您希望从 bmp280读取也是如此。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的回复。

    我更改我的代码、如下所示。

    txBuffer[0]= 0x0001;
    i2cTransaction.writeBuf = txBuffer;
    i2cTransaction.writeCount = 1;
    i2cTransaction.readBuf = rxBuffer;
    i2cTransaction.ReadCount = 1;
    i2cTransaction.slaveAddress = Board_BMP_ADDR; 

    但它仍然不起作用。

    此致、

    Youyun

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    测试时、请使用示波器检查 SCK 和 SDA 引脚上是否有信号。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您为何设置

    i2cTransaction.writeCount = 0;

    在我链接到的线程中,您会看到一个用户的代码片段,该用户启动并运行了通信。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的回复。

    我再次返回阅读 BMP280数据表。 以下是读取数据的方法。

    因此、我按如下方式更改我的代码。 我认为我的 BMP280 slaveaddress 是正确的。

    寄存器地址会发生变化、如图所示。

    但我仍然无法使函数 I2C_transfer()返回 true。

    void * mainThread (void * arg0)

    //I2C
    I2C_Handle i2c;
    I2C_Params i2cParams;
    I2C_Transaction i2cTransaction;
    //BMP280
    uint8_t txBuffer[1];
    uint8_t rxBuffer[2];

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

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

    /*创建 I2C 以供使用*/
    I2C_Params_init (&i2cParams);
    i2cParams.bitrate = I2C_400kHz;
    //i2cParams.transferMode = I2C_MODE_CALLACK;//I2C_MODE_CALLITE I2C_MODE_BLOCKING
    //i2cParams.transferCallbackFxn =空;
    I2C = I2C_open (0、&i2cParams);  
    if (i2c == NULL){
    PUT ("初始化 I2C"时出错);
    while (1);

    否则{
    ("i2c 开路");

    while (1){

    //I2C 读取(BMP280)

    txBuffer[0]= BMP280_REG_PRESSURE;//BMP280_REG_PRESSURE 值为0xF6
    i2cTransaction.slaveAddress = BMP280_ADDR;//BMP280_ADDR 值为0x77
    i2cTransaction.writeBuf = txBuffer;
    i2cTransaction.writeCount = 1;
    i2cTransaction.readBuf = rxBuffer;
    i2cTransaction.ReadCount = 2;

    if (I2C_transfer (i2c、&i2cTransaction)){
    PUT ("I2C 函数工作");

    否则{
    PUT ("I2C 函数失败。");

    我们非常感谢您的任何帮助!

    此致、

    Youyun

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您是否仍然看到"I2C 函数失败。"? 如果是、您是否使用示波器来检查 I2C SCK 和 SDA 引脚上是否有任何信号?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢您的回复。
    是的、我仍然看到"I2C 函数失败。"。
    因为我必须花一些时间借用示波器、所以我想先检查代码。
    我的代码是否有任何问题?

    此致、
    Youyun
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您的代码对我来说看起来很好。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的回复。

    使用示波器后、我发现 slaveaddress 在0x77中不起作用。

    我将 slaveaddress 更改为0x76、并且 i2c_transfer ()起作用。

    但波形与我将传感器连接到 Arduino 时的波形不同。

    下图是连接到 Arduino 和 CC1310的 bmp280。

    两个图片的波形不同。

    其中两个 SCL 器件非常不同。

    我该怎么做?

    有什么建议?

    BMP280连接到 Arduino。

    BMP280连接到 CC1310。

    此致、

    Youyun

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您是否在 CC1310和 BMP280之间添加了上拉电阻?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    它是 LaunchPad 还是与 CC1310一起使用的定制板?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢您的回复。
    我使用 launchpad-CC1310。
    使用 launchpad Uio4和 DIO5连接 bmp280。

    此致、
    Youyun
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您是否在 LAUNCHXL-CC1310 DIO_4/DIO_5和 BMP280之间添加了上拉电阻?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的回复。

    是的、我尝试在 LAUNCHXL-CC1310 DIO_4/DIO_5和 BMP280之间添加上拉电阻。

    但结果与图片中显示的波形相同。 有什么建议吗?

    现在我还有另一个问题。  

    读取 BMP280存储器映射我发现我只捕获复位状态。

    我应该怎么做?

    此致、

    Youyun

    下图是 BMP280时序图。

    下面是 BMP280存储器映射。

    以下是我的代码。

    void * mainThread (void * arg0)
    {
    unsigned int i;
    //I2C
    I2C_Handle I2C;
    I2C_Params i2cParams;
    I2C_Transaction i2cTransaction;
    //BMP280
    uint8_t txBuffer[1];
    uint8_t rxBuffer[2];
    float bmpValue;
    char bmpData[32];
    bool 测试;
    
    /*调用驱动程序初始化函数*/
    GPIO_init();
    I2C_init();
    
    /*配置 LED 引脚*/
    GPIO_setConfig (Board_GPIO_LED0、GPIO_CFG_OUT_STD | GPIO_CFG_OUT_LOW);
    
    /*创建 I2C 以供使用*/
    I2C_Params_init (&i2cParams);
    i2cParams.bitrate = I2C_400kHz;
    //i2cParams.transferMode = I2C_MODE_CALLACK;//I2C_MODE_CALLITE I2C_MODE_BLOCKING
    //i2cParams.transferCallbackFxn =空;
    I2C = I2C_open (0、&i2cParams); //(0、&i2cParams)
    if (i2c == NULL){
    PUT ("初始化 I2C"时出错);
    while (1);
    }
    否则{
    PUT ("i2c open");
    }
    
    while (1){
    //I2C 读取
    //BMP280
    //txBuffer[0]= BMP280_REG_ID;
    txBuffer[0]= BMP280_REG_PRESSURE; //BMP280_REG_PRESSURE 值为0xF6
    i2cTransaction.slaveAddress = BMP280_ADDR;//BMP280_ADDR 值为0x76
    i2cTransaction.writeBuf = txBuffer;
    i2cTransaction.writeCount = 1;
    i2cTransaction.readBuf = rxBuffer;
    i2cTransaction.ReadCount = 2;
    
    
    for (i=0;i<100;i++){
    if (I2C_transfer (i2c、&i2cTransaction)){
    //bmpValue = sensorBmp280Convert (rxBuffer);
    PUT ("I2C 函数工作");
    
    sprintf (bmpData、"%d"、rxBuffer[0]);//0xF6数据
    PUT (bmpData);
    sprintf (bmpData、"%d"、rxBuffer[1]);//0xF7数据
    PUT (bmpData);
    sprintf (bmpData、"%d"、rxBuffer[2]);//0xf8数据
    放置(bmpData);
    }
    否则{
    PUT ("I2C 函数失败。");
    }
    }
    
    

    结果如下。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我假设您在 PCB 上安装了 BMP280、是这样吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的回复。

    是的、我在 PCB 上安装了 BMP280。

    此致、

    Youyun

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    该板由 Adafruit 提供、具有稳压器、可进行大约5V <-> 3.3V 的转换。 从这个电路板的原理图中可以看到、引脚行位于5V 域上。 您是否查看了原理图并检查了电路板上的额外元件如何影响通信?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的回复。

    我再次阅读 Bmp280数据表、发现获取传感器数据需要首先使用 i2c 写入函数。

    我添加了与下图类似的代码、从传感器获取了成功的数据。

    但是、在 CC1310和 Arduino 之间、i2c 时序图仍然存在很大差异。

    在我读取 bmp280计算出布置链接的方法后、我仍然不知道如何操作。

    有什么建议吗?

    此致、

    Youyun

    这是我的代码。

    //BMP280
    #define BMP280_ADDR 0x76 // 0x76 & 0x77
    #define BMP280_REG_PRESSURE 0xF7
    #define BMP280_REG_CTRL 0xF4
    #define BMP280_REG_tempature 0xFA
    #define BMP280_WORKMODE 0x27 // 0x27 temp[2:0]=001 PRESS 0x2:ID=0
    
    
    
    * void 0[0:0 = 0 = BMP280_ID_ID]* 0 = 0 = 0 = 0 = 0 = 0 = 0 * 0 = 0 = 0 = 0 = 0 = 0 = 0 = 0 = 0 = 0 = 0 = 0 * BMP280 * 0 = 0 = 0 = 0 = 0 = 0 *
    
    //I2C
    I2C_Handle I2C;
    I2C_Params i2cParams;
    I2C_Transaction i2cTransaction;
    //BMP280
    uint8_t txBuffer[2];
    uint8_t rxBuffer[6];
    char bmpData[32];
    
    I2C_init();
    
    /*创建 I2C 以供使用*/
    I2C_Params_init (&i2cParams);
    i2cParams.bitrate = I2C_400kHz;
    //i2cParams.transferMode = I2C_MODE_CALLACK;//I2C_MODE_CALLITE I2C_MODE_BLOCKING
    //i2cParams.transferCallbackFxn =空;
    I2C = I2C_open (0、&i2cParams); //(0、&i2cParams)
    if (i2c == NULL){
    PUT ("初始化 I2C"时出错);
    while (1);
    }
    否则{
    PUT ("i2c open");
    }
    
    while (1){
    //I2C 写入
    //BMP280功率模式变化
    //控制寄存器0xF4
    txBuffer[0]= BMP280_REG_CTRL;
    txBuffer[1]= BMP280_WORKMODE;
    i2cTransaction.slaveAddress = BMP280_ADDR;
    i2cTransaction.writeBuf = txBuffer;
    i2cTransaction.writeCount = 2;
    i2cTransaction.readBuf = rxBuffer;
    i2cTransaction.ReadCount = 0;
    
    if (I2C_transfer (i2c、&i2cTransaction)){
    PUT ("I2C BMP280电源模式");
    }
    
    //I2C 读取
    //BMP280存储器压力与温度之间的关系图
    txBuffer[0]= BMP280_REG_PRESSURE; //BMP280_REG_PRESSURE 值为0xF6
    i2cTransaction.slaveAddress = BMP280_ADDR;//BMP280_ADDR 值为0x76
    i2cTransaction.writeBuf = txBuffer;
    i2cTransaction.writeCount = 1;
    i2cTransaction.readBuf = rxBuffer;
    i2cTransaction.ReadCount = 6;
    
    for (i=0;i<1000;i++){
    if (I2C_transfer (i2c、&i2cTransaction)){
    //bmpValue = sensorBmp280Convert (rxBuffer);
    PUT ("I2C 函数工作");
    
    sprintf (bmpData、"%d"、rxBuffer[0]);//0xF7数据印刷机_MSB
    PUT (bmpData);
    sprintf (bmpData、"%d"、rxBuffer[1]);//0xf8数据 press_lsb
    PUT (bmpData);
    sprintf (bmpData、"%d"、rxBuffer[2]);//0xF9数据 press_xlsb 过采样
    PUT (bmpData);
    sprintf (bmpData、"%d"、rxBuffer[3]);//0xFA data temperature_MSB
    PUT (bmpData);
    sprintf (bmpData、"%d"、rxBuffer[4]);//0xFB 数据 temperature_lsb
    PUT (bmpData);
    sprintf (bmpData、"%d"、rxBuffer[5]);//0xFC 数据 temperature_xlsb 过采样
    放置(bmpData);
    
    }
    否则{
    PUT ("I2C 函数失败。");
    }
    }
    
    

    从 bmp280捕获的数据。

    cc1310上的 bmp280时序图。

    Arduino 和 cc1310的时序图。

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

    据我所知、您没有回答我的问题:

    "此电路板由 Adafruit 提供、具有稳压器、可进行大约5V <-> 3.3V 的转换。 从这个电路板的原理图中可以看到、引脚行位于5V 域上。 您是否查看了原理图并检查了电路板上的额外元件如何影响通信?"

    在开始研究软件之前、您必须完全了解硬件。