微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI蓝牙设计交流 > 求助,FR5989+CC2564B,蓝牙协议栈移植中出现HCI初始化失败。

求助,FR5989+CC2564B,蓝牙协议栈移植中出现HCI初始化失败。

时间:10-02 整理:3721RD 点击:

问题背景: 硬件平台是FR5989 + CC2564B,期望实现SPP。 采用的开发方案是基于TI提供的5438的SPP Demo进行移植。

问题简述:在打开协议栈时,调用了函数BSC_Initialize,不过该函数返回失败(失败原因 -4, BTPS_ERROR_HCI_INITIALIZATION_ERROR),使得后续的初始化工作无法进行。

硬件问题排查:

1、  CC2564B的 32K慢时钟、26M时钟是OK的。

2、  CC2564B 的HCI_RTS输出了有效电平。(我理解这应该意味着CC2564B已经启动成功了)

3、  FR5989的波特率设置与手册中的说明吻合。(后续的软件排查中可以看到,UART接口已经能够发送和接收数据,所以这个接口也应该是OK的)

软件问题排查:

1、  通过增加函数轨迹跟踪发现,初始化过程中调用了HCITR_COMOpen,这其中涉及到的UART相关的初始化工作我们进行了仔细的排查,发现的问题已经基本解决。

2、  接口初始化完成之后,我们观察到程序调用了HCITR_COMWrite,给CC2564B发送了4个字节的数据(0x1,0x3,0xC,0x0)。之后接收到了一个字节的回复数据(0x0)。

3、  程序通过HCITR_COMProcess调用RxProcess对接收到的数据进行处理。具体完成数据处理的是函数指针_COMDataCallback。这个函数原型没有源码,看不到都做了一些什么事情。

4、  在处理完接收到的1个数据之后。程序调用了HCITR_COMClose,协议栈初始化终止。可以推测在_COMDataCallback中处理出现了异常,但是到底是返回的数据有问题还是其他原因,我们无法定位。

由于看不到协议栈执行的过程,也没有看到有明显的异常,所以分析和解决该问题遇到了一些困难。

发帖求助,谢谢指点~~~

在上一封邮件中提到,MSP430给CC2564B发送了4个字节的数据(0x1,0x3,0xC,0x0),且收到了一个字节的响应(0x0)。通过向TI工程师求助,在连接http://processors.wiki.ti.com/index.php/CC256x_Testing_Guide 中找到了这四个字节数据的解析方式:

根据所述的消息格式,结合我们在调试中跟踪到的数据。这条消息的对应的OGF= 0x3,OCF= 0x3. 结合蓝牙协议栈文档《Core_v4.2.pdf》  P645的说明(如下图),这条消息对应的是HCI_Reset命令。其返回值,0x0代表成功。就是说,上电之后,MSP430向CC2564B发送了一条HCI_Reset的指令,CC2564B返回了成功。

通过我们添加的轨迹跟踪,程序调用了HCI_VS_InitializeBeforeHCIReset,但是在在想CC2564B发送了HCI_RESET指令并接收到成功之后,没有调用HCI_VS_InitializeAfterHCIReset.而是调用了HCITR_COMClose。

结合以上信息,这个时候程序是准备复位HCI,向对端发送了复位指令且收到了成功响应。不过因为某种原因,没有继续走下去,导致协议栈初始化失败。

如果能够知道程序为何不能往下走,这个问题就好解决了。是还需要进一步的消息?还是内部运行出现了异常?

FuncRecord FuncName Description
0xAA00 HCI_VS_InitializeBeforeHCIOpen
0x5010 BTPS_AllocateMemory AllocateMemory 1st
0x5003 _Malloc
0x5002 HeapInit
0x5010 BTPS_AllocateMemory AllocateMemory 2nd
0x5003 _Malloc
0x5010 BTPS_AllocateMemory AllocateMemory 3rd
0x5003 _Malloc
0x5A01 HCITR_COMOpen
0xAA01 HCI_VS_InitializeAfterHCIOpen
0x5010 BTPS_AllocateMemory AllocateMemory 4th
0x5003 _Malloc
0x5015 BTPS_CreateMailbox
0x5010 BTPS_AllocateMemory AllocateMemory 5th
0x5003 _Malloc
0xAA02 HCI_VS_InitializeBeforeHCIReset
0x5010 BTPS_AllocateMemory AllocateMemory 6th
0x5003 _Malloc
0x5A05 HCITR_COMWrite
0x5A10 TxTransmit Tx 1st: The Tx content is 0x1
0x0001 Tx content
0x5502 UartInterrupt Tx 2nd: The Tx content is 0x3
0x5A10 TxTransmit
0x0003 Tx content
0x5A04 HCITR_COMProcess try to call RxProcess
0x5502 UartInterrupt Tx 3rd: The Tx content is 0xc
0x5A10 TxTransmit
0x000C Tx content
0x5502 UartInterrupt Tx 4th: The Tx content is 0x0
0x5A10 TxTransmit
0x0000 Tx content
0x5A04 HCITR_COMProcess try to call RxProcess
0x5502 UartInterrupt USCI_UART_UCRXIFG
The complete of the Tx 4th. Did not transmit any data this time
0x5501 UartInterrupt USCI_UART_UCTXIFG
Uart Receive . The receive data is 0x0
0x5A14 RxProcess Before call _COMDataCallback
0x5A30 RxProcess After call _COMDataCallback
0x5011 BTPS_FreeMemory Who did this?
Why ??
0x5019 BTPS_DeleteMailbox
0x5011 BTPS_FreeMemory
0x5011 BTPS_FreeMemory
0x5A02 HCITR_COMClose
0x5011 BTPS_FreeMemory
0x5011 BTPS_FreeMemory
0x5011 BTPS_FreeMemory
0x5000 ConsoleWrite

Stack Init Failed: -4

详细的轨迹跟踪。

可以看到在接收消息处理完成之后(RxProcess),就开始释放内存,删除邮箱。可以肯定问题就出在这里了。

可是从轨迹跟踪看,所有的内存申请都是成功的,发送给CC2564B的消息返回的也是成功。

那么到底是什么导致的这个问题呢?

问题解决了。

在MSP430发送HCI_RET(0x1,0x3,0xc,0x0)消息之后。

CC2564B反馈的消息不只一个字节,而应该是类似(0x4,0xe,0x4,0x1,0x3,0xc,0x0)这样的一条消息。

排查发现,我们MSP430接口电平3.3V,而CC2564B电平1.8V。

通过示波器看到CC2564B的TX管脚上有发送消息。但是MSP430没有接收到。

你好,WindOrPig

请问HCITR_COMOpen这个函数是在哪里被调用的?是在BSC_Initialize函数中被调用的吗?

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top