CYW20719的debug可以分为两种:UART调试和Arm Debug Port(SWD)调试
一.UART调试
在wice蓝牙芯片中通常有两种UART:外设UART (PUART)和HCI UART。
外围UART (PUART)
外设UART (PUART)用于应用程序发送/接收任何UART数据。在CYW920819上,这个外设UART (PUART)通过USB-UART桥接到您的PC上。
HCI UART
HCI UART有四个主要用途:
- 发送/接收WICED HCI消息
- 镜像HCI命令到PC
- 下载固件到Controller Stack进行编程
- 连接Controller Stack与远行Host Stack的PC或者MCU(如: PSoC 6 + CYW43012中看到这一点)
通常有6种类型的数据通过这两个uart传输:
- Raw data -应用程序发送/接收到PC任何格式的数据
- Debug Trace-从应用程序调试信息
- WiCED HCI Msg- PC和蓝牙应用程序之间用Cypress WICED HCI格式打包的数据包
- HCI Spy-在支持WICED系列的芯片中HCI的数据包的镜像
- HCI命令-在PC或MCU (当芯片处于Controller模式时)上运行的Host stack与controller之间的HCI命令
- 固件-从PC下载的固件时,通过HCI格式化后的固件数据包
调试Trace
在本文中,我们一般使用API WICED_BT_TRACE来打印调试消息,以纯文本发送给PUART。事实上,您可以以两种格式打印消息(纯文本或WICED HCI),可以把打印信息输出三个出口中的其中一个(PUART, HCI UART或NONE)。当调用函数wiced_set_debug_uart()时,参数wiced_debug_uart_types_t指定目标UART和格式的组合。
注意,有些组合是无效的。例如,您不能打印WICED HCI消息PUART。您应该小心使用枚举名称,因为它们可能有点令人困惑。
注意,这个配置结构只针对WICED_BT_TRACE消息。其他那人机交互使用不同的机制发送/接收消息,我们将在下文中讨论。通常你会想当对WICED HCI消息使用HCI UART时,向PUART发送WICED_BT_TRACE消息,正如您将看到的。
WICED HCI
WICED HCI是一种基于包的格式,用于PC应用程序与WICED蓝牙设备中的应用程序之间的交互。WICED HCI数据包有3个标准字段,外加一个可选的payload字节数。包看起来像这样:
- 0x19 -表示WICED HCI数据包的初始字节
- 2字节的小端操作码,由1字节的控制组(即组码)和1字节的子命令(即命令码)组成
- 额外字节的2字节小端长度
- 负载的额外字节数(可选)
Control Group是预定义的事务类别列表之一,包括Device=0x00, BLE=0x01, GATT=0x02等。这些组在hci_control_api.h中定义。可以在wiced_btsdk/dev-kit/btsdk-include中找到。每个Control Group都有一个或多个可选的子命令。例如,设备控制组有子命令Reset=0x01, Trace Enable=0x02等。
控制组加上子命令被称为“命令”或“操作码”,是一个16位的数字。例如:Device Reset = 0x0001。在实际的数据包中,操作码以小端序表示。例如:Device Reset = 19 01 00 00 00。
传输配置
要发送和接收WICEDHCI消息,您需要为HCI UART配置传输系统。要做到这一点,你需要做以下事情:
- 包含wiced_transport.h和hci_control_api.h。
- 声明一个指向wiced_transport_buffer_pool_t的指针。
- 创建一个wiced_transport_cfg_t类型的全局结构,其中包含HCI UART配置,包括接收和传输缓冲区的大小,一个指向状态处理程序函数的指针,一个指向RX处理程序函数的指针和一个指向TX完整回调函数的指针(如果需要)。
- 调用wiced_transport_init(使用指向配置结构的指针)。
- 调用wiced_transport_create_buffer_pool创建供传输系统使用的缓冲区。
- 创建HCI RX处理函数和TX处理函数(如果需要)。
下面的示例显示了上面的6个点。
包括头文件:
# include“wiced_transport.h”
# include“hci_control_api.h”
传输缓冲池指针
像这样添加一个指向wiced_transport_buffer_pool_t的全局指针:
静态wiced_transport_buffer_pool_t* transport_pool = NULL;
Transport Configuration Structure的配置
HCI的传输配置结构示例如下所示。“HCI_UART_DEFAULT_BAUD”的值为3000000。在这个例子中,没有实现HCI TX处理程序,所以它被指定为NULL。
Transport Init and Buffer Pools
一旦设置好结构,就必须初始化传输并创建缓冲池。这通常在application_start的正上方完成。
/*初始化传输配置
wiced_transport_init (&transport_cfg);
/*初始化传输缓冲池
transport_pool = wiced_transport_create_buffer_pool (TRANS_UART_BUFFER_SIZE,TRANS_UART_BUFFER_COUNT);
RX处理程序
应用程序负责处理发送到应用程序的HCI命令。当一个新命令被发送时,你的RX处理函数将被调用。这个函数应该只是确保向它发送了一个合法的数据包,然后做正确的事情。
下面的示例RX处理程序只是验证数据包是否合法,提取Command(即Opcode),可选的数据长度和可选的负载。然后它打印一条消息,并将一条消息发送回主机,该消息格式为WICED HCI命令HCI_CONTROL_EVENT_COMMAND_STATUS,数据值为HCI_CONTROL_STATUS_UNKNOWN_GROUP。
WICED HCI TX
在应用程序内部,通过使用16位操作码调用wiced_transport_send_data,指向可选数据和数据长度的指针,可以向主机发送WICED HCI消息。在你有WICED_BT_TRACE设置发送WICED HCI Trace消息的情况下,当你调用WICED_BT_TRACE API时,它所做的只是格式化你的数据,然后它调用这个:
sprintf(string,…);
wiced_transport_send_data(HCI_CONTROL_EVENT_WICED_TRACE,&string,strlen(string));
例如,如果您调用WICED_BT_TRACE(" abc ");它会发送:19 02 00 03 00 41 42 43
19 = HCI报文
02 =命令代码(Trace)
00 =组码(设备)
0300 =额外字节数(小端数)
41 = ' '
42 = ' b '
43 = ' c '
下一篇将介绍“通过Arm调试端口SWD和J-Link调试”
评论