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/CC2640R2F:使用 BLE5将传感器标签驱动程序移植到 CC2640R2

Guru**** 2587835 points


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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/598582/ccs-cc2640r2f-porting-sensor-tag-driver-to-cc2640r2-using-ble5

器件型号:CC2640R2F
Thread 中讨论的其他器件:SYSBIOS

工具/软件:Code Composer Studio

大家好、

我将 CC2640R2 Launchpad 与定制板和传感器搭配使用、并尝试将基于简单 BLE 外设和传感器标签从 BLE 2.2.1到 BLE5的项目移植到 BLE5。 我按照从 BLE 2.2.1到3.0.0以及从 BLE 3.0.0到 BLE5 1.0.0的移植指南进行了操作、但我无法移植存在于板文件夹下传感器标签开发项目中的 bsp_i2c 文件。 我不知道如何更改 Semaphore_post、Semaphore_pend 等、因为参数数量需要更改。

是否有人已经完成了传感器标签移植、以便与 CC2640R2 Launchpad 配合使用或知道修改 bsp_i2c 文件的方法?

感谢你的帮助。

SEB

下面是 bsp_i2c.c 文件的一部分:

/*********
*文件名:bsp_i2c.c
*已修订:$Date:$
*修订版:$Revision:$
*
*说明:在 RTOS 驱动程序之上添加了向后的层
*与非 RTOS I2C 驱动程序的兼容性。
*用于简化 i2C.h 和 i2c/I2CCC26XX.h 中的函数
*
*
秘书长的报告 /


/*********
*包括
*
#include
#include
#include
#include
#include
#include

#include

#include "Board.h"
#include "sensor.h"

#include "bsp_i2c.h"

/*********
*常量
*
#define I2C_TIMEOUT 2500


/*********
*全局变量
*
extern I2CCC26XX_HWAttrs i2cCC26xxHWAttrs[];

/*********
*局部变量
*
静态易失性 uint8_t slaveAddr;
静态易失性 uint8_t 接口;
静态 I2C_Handle i2cHandle;
静态 I2C_Params i2cParams;
静态信号量结构互斥量;
静态常量 I2CCC26XX_I2CPinCfg pinCfg0 =

// I2C 接口0的引脚配置
.pinSDA = Board_I2C0_SDA0、
.pinSCL = Board_I2C0_SCL0
};




/*********
*@fn bspI2cSelect
*
*@简短选择 I2C 接口和从器件
*
*@param newInterface -所选接口
*@param address -从器件地址
*
*@如果成功则返回 true
*
bool bspI2cSelect (uint8_t newInterface、uint8_t 地址)

//获取 I2C 资源
if (!Semaphore_pend (Semaphore_handle (&mutex)、MS_2_ticks (I2C_TIMEOUT))))

返回 false;

//存储新的从地址
slaveAddr =地址;

//接口已更改?
if (newInterface!=接口)

//存储新接口
接口= newInterface;

//关闭 RTOS 驱动程序
I2C_Close (i2cHandle);

//将定制设置为 NULL,选择 I2C 接口0
I2C_Params_init (&i2cParams);

//根据所选的 I2C 接口0分配 I2C 数据/时钟引脚//接口为1
IF (接口= BSP_I2C_interface_0)

i2cParams.custom=(void*).pinCfg0;

//重新打开具有新总线引脚分配的 RTOS 驱动程序
i2cHandle = I2C_open (Board_I2C、&i2cParams);

返回 true;

/*********
*@fn bspI2cDeselect
*
*@brief 允许其他任务访问 I2C 驱动程序
*
*@param none
*
*@返回无
*
void bspI2cDeselect (void)

//释放 I2C 资源
Semaphore_post (Semaphore_handle (&mutex));


/*********
*@fn bspI2cInit
*
*@简要初始化 RTOS I2C 驱动程序(只能调用一次)
*
*@param none
*
*@返回无
*
void bspI2cInit (void)

#define I2C_initialized
Semaphore_Params semParamsMutex;

//创建保护信标
Semaphore_Params_init (&semParamsMutex);
SemParametersMutex.mode = Semaphore_Mode_binary;
Semaphore_construction (&mutex、1、&semParamsMutex);

//重置 I2C 控制器
HapiResetPeripheral (PRCM_Periph_I2C0);

I2C_init();
I2C_Params_init (&i2cParams);
i2cParams.bitrate = I2C_400kHz;
i2cHandle = I2C_open (Board_I2C、&i2cParams);

//初始化局部变量
slaveAddr = 0xFF;
接口= BSP_I2C_interface_0;

if (i2cHandle ==空)

Task_exit();

/*********
*@fn bspI2cReset
*
*@简要重置 RTOS I2C 驱动程序
*
*@param none
*
*@返回无
*
void bspI2cReset (void)(空)

//获取 I2C 资源*/
if (!Semaphore_pend (Semaphore_handle (&mutex)、MS_2_ticks (I2C_TIMEOUT))))

返回;

//关闭驱动程序
I2C_Close (i2cHandle);

//重置 I2C 控制器
HapiResetPeripheral (PRCM_Periph_I2C0);

//重置局部变量
slaveAddr = 0xFF;
接口= BSP_I2C_interface_0;

//打开驱动程序
i2cHandle = I2C_open (Board_I2C、&i2cParams);

//释放 I2C 资源
Semaphore_post (Semaphore_handle (&mutex));

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

    您好、Sebastien、

    假设您使用的是 TI-RTOS、则要使用的正确文件是 sensortag_i2c.c、而不是 bsp_i2c.c、因为该文件用于非 RTOS 应用程序。

    希望这能解决问题!

    此致、

    Klas

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

    你(们)好,Klas

    我刚刚开始使用 TI 我和我在 TI 的软件和产品方面没有太多经验 这是我的问题、或许它会让您了解我的方法有什么问题。

    为了将我的项目移植到 BLE5、我从 CCS 提供的简单 BLE 外设示例开始、我添加了传感器标签示例中的所有驱动程序、板级文件和修改后的应用。 CC2640R2正在按应有的方式进行广播、直到我在 simpleBLEPeripheral_init ()函数中为 bsp_i2c (bspI2cInit())驱动程序和 SensorTaginit()进行初始化。

    此外,我已经完成了不同的测试,当我将这些行放在 main.c 文件中时,项目将停止工作:

    SensorTagTmp_createTask();
    SensorTagHum_createTask();
    SensorTagBar_createTask();

    您有什么想法吗?
    谢谢

    编辑:我发现了 bsp_init()和 SensorTag_init()的错误,缺少引脚定义。 当我添加: SensorTagTmp_createTask();SensorTagHum_createTask();和 SensorTagBar_createTask();

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

    如果您注释掉非工作任务、器件是否会广播并读取 IMU 数据? 这似乎与其他任务类似。 我建议您使用示波器或逻辑分析仪检查 I2C 线路是否正常工作、然后确保在这些不工作的任务中使用相同的 I2C 引脚。

    此致、

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

    是的、如果我注释掉非工作任务、器件将广播和读取数据。 我将使用和示波器检查 I2C 线路、并观察代码中是否有错误的线路。

    感谢您的建议、
    此致、

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

    您好!

    如果它能够读取加速计和陀螺仪、则移动任务中的 I2C 和引脚编号至少有效、因此无需检查 I2C 线路。 但是、您是否确定在非工作任务中使用的 PIN 码与在移动任务中使用的 PIN 码相同? 您能否设置断点并查看任务停止工作的确切位置?

    此致、

    Klas

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

    您好!

    我已经完成了一些测试,当我到达以下行时,任务停止工作,芯片组停止广播:
    SensorTagBar_reset();它位于 SensorTag_Bar.c 文件的 sensorTaskInit()中。

    此致、

    Sebastien

    以下是代码的一部分:

    静态空 sensorTaskInit (空)

    //使用 BLE 堆栈注册任务
    iCall_registerApp (&sensorSelfEntity、&sensorEvent);

    //添加服务
    barometer_addService();

    //使用配置文件注册回调
    barometer_registerAppCs (&sensorCallbacks);

    //初始化模块状态变量

    sensorConfig = ST_CFG_SENSOR_DISABLE;
    sensorPeriod = sensor_default_period;
    SensorTagBar_reset ()
    initCharacteristicValue (sensor_peri、sensor_default_period
    / sensor_period_resolution、sizeof (uint8_t);

    之后,我们有:  

    /*********
    *@fn WibiUnoBar_reset
    *
    *@简要重置特性并禁用传感器
    *
    *@param none
    *
    *@返回无
    *
    void WibiUnoBar_reset (void)

    sensorConfig = ST_CFG_SENSOR_DISABLE;
    initCharacteristicValue (sensor_data、0、sensor_data_LEN);
    initCharacteristicValue (sensor_CONF、ST_CFG_SENSOR_DISABLE、sizeof (uint8_t));
    sensorBme280Init();

    在 sensor_Bme280.c 中,我们有:

    /*********
    *@fn sensorBme280Init
    *
    *@简要初始化传感器
    *
    *@如果成功则返回 true
    *
    bool sensorBme280Init (空)

    bool ret;
    uint8_t val;

    如果(!sensor_select())
    返回 false;

    //读取并存储校准数据
    RET = sensorBme280_getCalibParam();

    IF (RET)

    //重置传感器
    Val = VAL_RESET_EXECUTE;
    sensorWriteReg (ADDR_RESET、&val、sizeof (val));

    sensor_deleset();

    sensorBme280Enable (1);
    回程;