Part Number:CC2642ROther Parts Discussed in Thread:SYSCONFIG
问题环境:
- 协议栈: Simplink6
- IDE:CCS11
- 调试工具:Jlink V9
- 主控芯片:CC2642R1F
现象描述:
我司通过自制测试手机APP对蓝牙进行断链和连接循环操作(程序通过simple_peripheral修改而成),在挂机24小时左右会出现死机现象。
具体的连接断链操作手法描述如下:
- APP连接CC2642成功之后通过指定的Charateristic发送和接收部分数据并等待 10S;
- APP 主动释放连接并等待 20S。
- 重复步骤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测试蓝牙示例看是否还有死机的情况