TI中文支持网
TI专业的中文技术问题搜集分享网站

CC2642R: 设备出现LL_LastCmdDoneCback_ADV_CONN_CFG错误

Part Number:CC2642ROther Parts Discussed in Thread:SYSCONFIG

问题环境:

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

现象描述:

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

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

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

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

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

Kevin Qiu1:

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

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

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

,

user5991153:

我的调用方法如下:

#include <driverlib/aon_ioc.h>

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

程序运行报如下错误

,

Kevin Qiu1:

将DIO_27改为IOID27试一下

,

user5991153:

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

,

Kevin Qiu1:

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

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

,

user5991153:

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

 

问题描述:

协议栈: Simplink6

IDE:CCS11

 

问题描述:

我司在将原有的SDK(4_10_00_78)更新到SDK(6_10_00_29)的过程中发现程序会卡死在SPI flash(GD25Q32CN2GR)的数据发送接收接口中,在原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 还有数据但是读取不到,一直卡死在SSIDataGet中while死等。

 

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);

}

,

user5991153:

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

,

Kevin Qiu1:

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

例程在SDK

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

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

,

user5991153:

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

,

Kevin Qiu1:

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

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

,

user5991153:

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

,

user5991153:

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

,

Kevin Qiu1:

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

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

赞(0)
未经允许不得转载:TI中文支持网 » CC2642R: 设备出现LL_LastCmdDoneCback_ADV_CONN_CFG错误
分享到: 更多 (0)

© 2024 TI中文支持网   网站地图 鲁ICP备2022002796号-1