求助,FR5989+CC2564B,蓝牙协议栈移植中出现HCI初始化失败。
问题背景: 硬件平台是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函数中被调用的吗?