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.

[参考译文] SIMPLELINK-CC2640R2-SDK:V1.35 I2C LIS3DH 加速计自检仅通过10项中的1项测试?

Guru**** 2589280 points
Other Parts Discussed in Thread: CC2640R2F, SIMPLELINK-CC2640R2-SDK

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/600454/simplelink-cc2640r2-sdk-v1-35-i2c-lis3dh-accelerometer-self-test-passes-only-1-out-of-10-test

器件型号:SIMPLELINK-CC2640R2-SDK
主题中讨论的其他器件:CC2640R2F

您好!

  我们有一个 I2C LIS3DH 加速计自检、使用 CC2640R2 SDK 1.00中基于简单外设的程序通过了10/10测试。 我们将代码移植到 CC2640R2SDK V1.35简单外设、现在它仅通过1/10的测试。 我已经使用了 CC2640R2SDK V 1.35中的 SensorI2C.c 文件、但它仍然仅通过1/10。

  行为类似于我使用 CC2640R2 SDK 1.00使 I2C LIS3DH 加速计自检正常工作所遇到的问题、在该问题中、应用程序进入睡眠和待机状态、测试将失败。 解决 方案是布置事件、然后在主任务中调用 I2C LIS3DH 加速计自检。

  我已将此解决方案移植到 CC2640R2SDK V1.35简单外设中、但现在 I2C LIS3DH 加速计自检仅通过了1/10。 为了确认应用是否正常运行 、I2C LIS3DH 加速计自检的原因是应用程序进入待机状态、我在 主任务事件处理程序中调用 I2C LIS3DH 加速计自检。

//
(;)
{
uint32_t 事件;

//等待与调用线程关联的事件被发布。
//请注意,与线程关联的事件在时发布
//消息在线程的消息接收队列中排队
事件= Event_pend (syncEvent、Event_ID_NONE、SBP_ALL_EVENGS、ICALL_TIMEOUT_FOREVE);

IF (事件)
{
iCall_EntityID dest;
iCall_ServiceEnum src;
iCall_HciExtEvt *pMsg =空;

TestApp__Accelerometer();

if (iCall_fetchServiceMsg (&src、&dest、(void **)&pMsg)=ICALL_errno_Success) 

I2C 加速计测试仅通过1/3中的1。

SDK 1.00和 SDK 1.35之间的 I2C、电源管理是否存在任何会导致此问题的差异?

-克尔

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

    您好!

      为了进行比较、我在下面设置了这两个程序。 我使用了我们基于 CC2640R2F 5xD 的电路板进行测试。

    1. 使用 SDK 1.00中的 simple_peripheral 每3秒执行一次 I2C LIS3DH 加速计自检
    2. 使用 SDK 1.35中的 BLE 5 simple_peripheral 每3秒执行一次 I2C LIS3DH 加速计自检

      下面是周期性任务 、它每3秒执行一次 I2C LIS3DH 加速计自检。  

    静态空 XXXXBLEPeripheral__PerformPeriodicTask (void)
    {
    PowerUpSelfTest_t Testdata ={0};
    Acc_powerOn ();
    Acc_IsSelfTestOK (&Testdata);
    Acc_poweroff ();
    } 

      测试结果:

    1. 使用 SDK 1.00中的 simple_peripheral 每3秒执行一次 I2C LIS3DH 加速计自检-通过10分10秒
    2. 使用 SDK 1.35中的 BLE 5 simple_peripheral 每3秒执行一次 I2C LIS3DH 加速计自检-仅通过10分之一

       周期任务每3秒从待机模式唤醒一次主任务、以执行 I2C LIS3DH 加速计测试。 但是、对于"SDK 1.35中的 BLE 5 simple_peripheral"、即使存在事件过帐应用仍处于待机模式、也会导致 I2C LIS3DH 加速计自检失败。

       是否需要进行任何设置才能避免这种情况发生?

    -克尔

       

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

    如果您使用 SimpleLink CC2640R2 SDK v 1.35.00中的 BLE 4.2 simple_peripheral 项目(位于 examples->rtos->CC2640R2_LAUNCHXL->blestack 中)进行测试、会发生什么情况?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    器件型号:SIMPLELINK-CC2640R2-SDK

    您好!

       我们有一个基于 SDK 1.00的程序功能、可在 Tera Term 键入命令后测试加速计。 我已经使用此功能来测试加速计一个多月了、它每次都能正常工作。 SDK 1.35发布后、我们将代码移植到 BLE 5简单外设、 加速计现在仅通过1次、然后未通过后续测试。 我已经找出加速计测试失败的根本原因是 UART。 在注释掉 UART 初始化和 UART 写入后、加速计自检 始终通过。 为了进行测试、我修改了 SDK 1.00和 SDK 1.35 BLE 5中的代码。  

    下面的测试代码我在我们的计划中实施、该计划基于 SDK 1.00和 SDK 1.35 BLE 5

    初始化:

    Util_constructClock (&periodicClock、BridgeblePeripheral_ClockHandler、3000、0、true、 SBP_ACC_TEST_EVT);//由 Markel 添加的临时
    
    //配置 UART */
    UartApp_Init();//由 Markel 添加的测试 

    主任务应用程序主循环:

    IF (事件和 SBP_ACC_TEST_EVT)
    {
    Util_startClock (周期时钟);
    TestApp__Accelerometer();
    } 

    TestApp__Accelerometer ()

    void TestApp__Accelerometer (void)
    {
    PowerUpSelfTest_t Testdata ={0};
    字节 txdata[30]={0};
    
    ACC_POWEROn();
    
    if (ACC_IsSelfTestOK (&Testdata)== ACC_NO_ERROR)
    {
    
    sprintf ((char *) txdata、"ID:%d、X=%d、Y=%d、Z=%d"、Testdata.acc_whoami、
    Testdata.acc_data.axis _X、
    Testdata.acc_data.axis _Y、
    Testdata.acc_data.axis _Z);
    
    UartApp_WriteString (txdata);
    UartApp_WriteString ("\r\n");
    UartApp_WriteString ("加速计测试通过。\r\n);
    }
    其他
    {
    UartApp_WriteString ("加速计测试失败。\r\n);
    }
    
    acc_poweroff();
    
    返回;
    } 

    测试结果:

    1. SDK 1.00的软件包。 I2C LIS3DH 自检通过10/10。
    2.   基于 SDK 1.35 BLE 5的程序。 I2C LIS3DH 自检通过1/10。
    3. 在对 UART 相关代码进行注释后、 我们的程序  基于 SDK 1.35 BLE 5。 I2C LIS3DH 自检通过10/10。

    结论:

    从这些测试结果中、我怀疑在 SDK 1.35 BLE 5上、TI-RTOS 上发生了一些变化、导致当 UART 也被初始化时 I2C LIS3DH 自检失败。

    此问题的解决方法是什么?  

    -克尔

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

    您好!

      我进一步将问题的根本原因简化为 UART 初始化代码处的 UART_READ()。 如果我注释掉 UART_READ(),则 I2C LIS3DH 加速器自检通过10/10。 UART 初始化配置为连续 RX 回调。 此代码在我们基于 SDK 1.00的程序中有效。  

    void UartApp_Init (void)
    {
    const char echoPrompt[]="UART initialized! !! !\r\n";
    UART_Params uartParams;
    
    /*调用驱动程序初始化函数*/
    UART_init();
    
    /*创建一个数据处理关闭的 UART。 */
    UART_PARAMS_INIT (uartParams);
    
    uartParams.readMode = UART_MODE_CALLBACK;
    uartParams.writeMode = UART_MODE_CALLBACK;
    uartParams.readCallback = UartApp__UartRxCB;
    uartParams.writeCallback = UartApp__UartTxEcho;
    uartParams.readEcho = UART_OFF;
    uartParams.baudrate = 115200;
    
    uartParams.readDataMode = UART_DATA_binary;
    uartParams.writeDataMode = UART_DATA_binary;
    uartParams.dataLength = UART_LEN_8;
    uartParams.readReturnMode = UART_Return_Full;
    
    hUART = UART_open (Board_UART0、&uartParams);
    
    if (hUART == NULL){
    /* UART_open()失败*/
    while (1);
    }
    
    UART_WRITE (hUART、echoPrompt、sizeof (echoPrompt));
    //UART_read (hUART、&RxBuf、 sizeof (RxBuf)/sizeof (BUFTYPE);
    
    charcount = 0;
    } 

    -克尔

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

    另一个观察结果是,在我调用 UartApp__Init()后,Event_post 和消息队列不再起作用。

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

    您好!

      我回退我之前回答的内容:"在我调用 UartApp__Init()后,Event_post 和消息队列不再起作用。"

      在我调用 HCI_EXT_EnablePTMCmd()后,事件 POST 和消息队列不再发生。 在我们基于 SDK 1.00的程序中,调用 HCI_EXT_EnablePTMCmd()后会发生此事件发布和消息队列;因此这是 SDK 1.35 BLE 5的另一个问题。  

    -克尔

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

    器件型号:SIMPLELINK-CC2640R2-SDK

    您好!

      调用 HCI_EXT_EnablePTMCmd()会导致事件发布和消息队列无法正常工作。 我已经多次确认过这一点。 测试代码。 SDK 1.00中不会发生这种情况。

    初始化:

    Util_constructClock (&periodicClock、BridgeblePeripheral_ClockHandler、
    3000、0、true、SBP_Periode_EVT);
    
    
    //为 HCI/主机消息 GAP_RegisterForMsgs
    (selfEntity)注册 GAP;
    
    //为 GATT 本地事件和待发送的 ATT 响应注册
    GATT_RegisterForMsgs (selfEntity);
    
    HCI_EXT_SetTxPowerCmd (HCI_EXT_TX_POWER_4_DBM);/*将 TX 功率设置为4 DBM */
    HCI_EXT_SetRxGainCmd (HCI_EXT_RX_GAIN_HIGH);//启用高增益模式
    
    HCI_EXT_EnablePTMCmd ();//临时用于测试 

    主任务:

    IF (事件和 SBP_Periode_EVT)
    {
    Util_startClock (周期时钟);
    
    //执行周期性应用任务
    XXXXBLEPeripheral__PerformPeriodicTask();
    } 

    XXXXBLEPeripheral_PerformPeriodicTask():

    静态空 XXXXBLEPeripheral__PerformPeriodicTask (空)
    {
    LED_advon (GLED_ACTIVE、2000);
    } 

    测试步骤:

    在  XXXXBLEPeripheral__PerformPeriodicTask()和 XXXXBLEPeripheral_ProcessAppMsg()放置断点

    结论:

    如果我 在初始化时注释掉 HCI_EXT_EnablePTMCmd(),程序将转至 XXXXBLEPeripheral_PerformPeriodicTask()和 XXXXBLEPeripheral_ProcessAppMsg()。 事件 POST 和消息队列工作

    如果我 在初始化时调用 HCI_EXT_EnablePTMCmd(),程序将不会转至 XXXXBLEPeripheral_PerformPeriodicTask()和 XXXXBLEPeripheral_ProcessAppMsg()。 事件 POST 和消息队列不起作用。

    -克尔

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    HCI_EXT_EnablePTMCmd()问题的详细信息如下所示。

    e2e.ti.com/.../601029

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

    下面的文章详细介绍了问题的原因。

    e2e.ti.com/.../600959

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

    我合并了您的线程、因为它们似乎与同一个问题相关。 我将查看您提供的信息、并查看我可以提出的其他建议。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、kel、

    您能否从简单的外设开箱即用开始介绍重现此问题的步骤?

    当您启用 PTM 模式时、您是否使用了 PTM 指南中的说明? processors.wiki.ti.com/.../PTM_cc2640
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    在 SDK 1.00中、I2C 和 UART 可以正常协同工作。 但在 SDK 1.35 BLE 5中、I2C 和 UART 不能协同工作、此帖子中提到了该问题的详细信息。 我一直在比较 SDK 1.00和 SDK 1.35中的 I2C、UART 和电源驱动程序、并进行了更改。 这些代码文件中可能存在错误。

    另一个问题是 SDK 1.35中的 HCI_EXT_EnablePTMCmd(),这会导致事件发布和消息队列无法正常工作。 我需要调用 HCI_EXT_EnablePTMCmd();以执行连续传输和数据包错误率测试。

    -克尔

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

    [报价用户="RCachelP">启用 PTM 模式时、是否使用了 PTM 指南中的说明? processors.wiki.ti.com/.../PTM_cc2640

    不,我没有。 我是否需要更改堆栈库中的.opt 文件以使 PTM 模式正常工作。 但是、在我们 SDK 1.00的程序库中、我只需调用 HCI_EXT_EnablePTMCmd ();然后调用 HCI_EXT_ModemTestTxCmd (HCI_EXT_TX_UNTUNTUNTUNGAND_CARRIER、39);我可以看到它使用 SmartRF Studio 连续 RX 工作。

    但不能确定的是,在调用 HCI_EXT_EnablePTMCmd()之后,事件发布和消息队列不起作用。  

    -克尔

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

    尊敬的 RachelIP:

      无论如何、我能够找到 I2C LIS3DH 加速计故障的修复方法。 最初、下面这是 I2C LIS3DH 加速计自检的代码流程。

    1.调用 Acc_powerOn()

    void Acc_powerOn()
    {
    /*打开电源*/
    PIN_setOutputValue (hAccPin、ACC_POWER、ACC_POWER_ON);
    
    //Task_sleep (200);
    DELAY_MS (25);
    
    SensorI2C_open ();
    
    PIN_setInterrupt (hAccPin、PIN_ID (ACC_INT)|PIN_IRQ_POedge);
    } 

    2.执行 I2C LIS3DH 加速器自检。

    3.调用 Acc_poweroff()

    void Acc_poweroff (void)
    {
    /*确保禁用引脚中断*/
    PIN_setInterrupt (hAccPin、PIN_ID (ACC_INT)|PIN_IRQ_DIS);
    
    SensorI2C_Close ();
    
    /*关闭电源*/
    PIN_setOutputValue (hAccPin、ACC_POWER、ACC_POWER_OFF);
    
    //Task_sleep (200);
    DELAY_MS (25);
    } 

    因此 、I2C LIS3DH 加速计自检的代码流在我们基于 SDK 1.00的程序中工作、在基于 SDK 1.35 BLE 5的程序中失败。

    下面是在我们基于 SDK 1.35 BLE 的计划中使 I2C LIS3DH 加速计自检正常工作的修复方法。

    板级测试模式初始化:

    UartApp__Init();
    
    ACC_POWEROn(); 

    然后在 I2C LIS3DH 加速计自检时,不要调用 Acc_poweroff()。

    当我们的测试引脚在启动时接地短路时、我们的程序进入板级测试。 板级测试 UART 用于输入命令、I2C 用于 I2C 加速计。 在我们的主应用中、仅使用 I2C。 因此、对于该特定产品、该修复程序在板级测试中对我们有效。 但是、如果我们需要在主应用程序中创建另一个需要 UART 和 I2C 加速计工作的程序、这将是一个问题。

    -克尔

     

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

    如果已确认有问题,或者我需要做些什么才能使事件发布和消息队列不起作用,我只想跟进。

    -克尔