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.

CC2642R: 设备出现LL_LastCmdDoneCback_ADV_CONN_CFG错误

Part Number: CC2642R
Other Parts Discussed in Thread: SYSCONFIG

问题环境:

  • 协议栈: Simplink6
  • IDECCS11
  • 调试工具:Jlink V9
  • 主控芯片:CC2642R1F

现象描述:

       我司通过自制测试手机APP对蓝牙进行断链和连接循环操作(程序通过simple_peripheral修改而成),在挂机24小时左右会出现死机现象。

具体的连接断链操作手法描述如下:

  1. APP连接CC2642成功之后通过指定的Charateristic发送和接收部分数据并等待 10S
  2. APP 主动释放连接并等待 20S
  3. 重复步骤1

在死机时可以观察到程序一直在LL_LastCmdDoneCback_ADV_CONN_CFG 中运行无法退出。

请官方工程师帮忙看下,在论坛我们也看到有类似的问题但是没有很详细的后续。

  • 这可能与32.768k时钟频率不准确有关

    使用下面代码将信号映射到IO上用频率计测一下频率是否准确:

    #include <driverlib/aon_ioc.h>
    IOCPortConfigureSet(IOIDn, IOC_PORT_AON_CLK32K, IOC_STD_OUTPUT);
    AONIOC32kHzOutputEnable();

  • 我的调用方法如下:

    #include <driverlib/aon_ioc.h>

    IOCPortConfigureSet(DIO_27, IOC_PORT_AON_CLK32K, IOC_STD_OUTPUT);
    AONIOC32kHzOutputEnable();

    程序运行报如下错误

  • 将DIO_27改为IOID27试一下

  • 你好问题依然是存在的。我甚至将这个编号修改为数字7依然不行。前面的描述出现了点错误 我采用的版本为simplelink_cc13x2_26x2_sdk_4_10_00_78

  • 对于LL_LastCmdDoneCback_ADV_CONN_CFG问题可以升级为最新的SDK6.10试一下

    测频率代码我试了一下编译没有问题,也可以用Empty例程中添加代码来测试

  • SDK6.10 版本我们之前测试出现了如下问题:

     

    问题描述:

    协议栈: Simplink6

    IDECCS11

     

    问题描述:

    我司在将原有的SDK4_10_00_78)更新到SDK6_10_00_29)的过程中发现程序会卡死在SPI flashGD25Q32CN2GR)的数据发送接收接口中,在原4_10_00_78 环境下稳定运行。

     

    问题等级:

    在如下参数下为必现:

        SPI_init();

        SPI_Params_init(&spiParams);

        spiParams.dataSize = 8;

        spiParams.transferMode = SPI_MODE_BLOCKING;

        spiParams.transferTimeout = 1000;

        spiParams.bitRate = 4000000;

        //spiParams.bitRate = 40000;

        spiParams.frameFormat = SPI_POL0_PHA0;

     

    当降速到 40000 问题有所改善,但是依然偶现卡死。

     

     

     

     

     

    代码片段:

    1.我司数据发送和接收接口:

    static Std_ReturnType Gd25q_Cfg_SpiTransferTwice(const uint8 *sendBuffer1, uint8 *rcvBuffer1, uint32 size1, const uint8 *sendBuffer2, uint8 *rcvBuffer2, uint32 size2)

    {

        SPI_Transaction *p;

        bool res;

        char buf[128] = {0};

        char index = 0;

        char i = 0;

     

        p = &spiTransaction;

    #if 1

        GPIO_write(GD25Q32_CS, 0);

     

        p->count = size1;

        p->rxBuf = rcvBuffer1;

        p->txBuf = (void*)sendBuffer1;

        (void)SPI_transfer(g_Gd25q_Spi,p);

       

        p->count = size2;

        p->rxBuf = rcvBuffer2;

        p->txBuf = (void*)sendBuffer2;

        res = SPI_transfer(g_Gd25q_Spi,p);

     

        GPIO_write(GD25Q32_CS, 1);

    #endif

     

        return (res==TRUE) ? E_OK : E_NOT_OK;

    }

     

    2.Debug看到程序卡死位置:

    RxCount 还有数据但是读取不到,一直卡死在SSIDataGetwhile死等。

     

    static inline void spiPollingTransfer(SPICC26X2DMA_Object *object,

                                          SPICC26X2DMA_HWAttrs const *hwAttrs,

                                          SPI_Transaction *transaction)

    {

        uint8_t   txIncrement, rxIncrement;

        uint32_t  dummyBuffer;

        size_t    rxCount, txCount;

        void      *rxBuf;

        void      *txBuf;

        bool      put;

     

        /* Only increment src/destination pointers if buffers were provided */

        if (transaction->rxBuf) {

            rxBuf = transaction->rxBuf;

            rxIncrement = (object->dataSize < 9) ? sizeof(uint8_t) : sizeof(uint16_t);

        }

        else {

            rxBuf = &(object->rxScratchBuf);

            rxIncrement = 0;

        }

     

        if (transaction->txBuf) {

            txBuf = transaction->txBuf;

            txIncrement = (object->dataSize < 9) ? sizeof(uint8_t) : sizeof(uint16_t);

        }

        else {

            txBuf = (void *) &(object->txScratchBuf);

            txIncrement = 0;

        }

     

        rxCount = transaction->count;

        txCount = rxCount;

     

        SSIEnable(hwAttrs->baseAddr);

     

        /* Fill the TX FIFO as much as we can before reading */

        while (rxCount--) {

            if (object->dataSize < 9) {

                put = true;

                while(txCount > 0 && put) {

                    put = SSIDataPutNonBlocking(hwAttrs->baseAddr, *((uint8_t *) txBuf));

                    if (put) {

                        txBuf = (void *) (((uint32_t) txBuf) + txIncrement);

                        txCount--;

                    }

                }

                SSIDataGet(hwAttrs->baseAddr, &dummyBuffer);

                *((uint8_t *) rxBuf) = (uint8_t) dummyBuffer;

            }

            else {

                put = true;

                while(txCount > 0 && put) {

                    put = SSIDataPutNonBlocking(hwAttrs->baseAddr, *((uint16_t *) txBuf));

                    if (put) {

                        txBuf = (void *) (((uint32_t) txBuf) + txIncrement);

                        txCount--;

                    }

                }

                SSIDataGet(hwAttrs->baseAddr, &dummyBuffer);

                *((uint16_t *) rxBuf) = (uint16_t) dummyBuffer;

            }

     

            /* Update rxBuf position */

            rxBuf = (void *) (((uint32_t) rxBuf) + rxIncrement);

        }

     

        while (spiBusy(object, hwAttrs)) {}

     

        /*

         * For this driver implementation the peripheral is kept active until

         * either a FIFO-overrun occurs or SPI_transferCancel() is executed.

         *

         * SSIDisable(hwAttrs->baseAddr);

         */

    }

     

     

    void SSIDataGet(uint32_t ui32Base, uint32_t *pui32Data) {

        // Check the arguments.

        ASSERT(SSIBaseValid(ui32Base));

     

        // Wait until there is data to be read.

        while(!(HWREG(ui32Base + SSI_O_SR) & SSI_SR_RNE))

        {

        }

     

        // Read data from SSI.

        *pui32Data = HWREG(ui32Base + SSI_O_DR);

    }

  • 您所述的Empty例程是哪个,我这边在SDK中没有找到,可否直接上传一份可用的工程给我我这边进行测试。十分感谢!

  • 您所述的Empty例程是哪个,我这边在SDK中没有找到,可否直接上传一份可用的工程给我我这边进行测试。

    例程在SDK

    C:\ti\simplelink_cc13xx_cc26xx_sdk_6_10_00_29\examples\rtos\CC26X2R1_LAUNCHXL\drivers\empty

    SDK6.10的SPI问题看到你使用了多个驱动库程序,你可以在launchpad上复现这个问题吗

  • 你好,我在sdk6下测试实际频率如下图所示

  • 频率不准确,这可能也与示波器的分辨率不够有关,换频率计测试看一下

    也可以在sysconfig文件中配置为内部RC,然后看一下是否依旧有问题:

  • 使用频率计算 内部晶振和外部晶振频率都在32.74x-32.8xxkhz左右

  • ,SPI的问题在我们的开发板上极其容易复现,Launchpad 上没有外挂的SPI外设。不太清楚是否会出现。我们是在使用SPI flash 时候出现的此问题。

  • launchpad上也有SPI flash的示例C:\ti\simplelink_cc13xx_cc26xx_sdk_6_10_00_29\examples\rtos\CC26X2R1_LAUNCHXL\drivers\nvsexternal

    频率计应该可以看到准确的频率值,你测试结果不准确的话可以直接切换为内部RC测试蓝牙示例看是否还有死机的情况